bindgen 0.25.2

Automatically generates Rust FFI bindings to C and C++ libraries.
Documentation
# 1 "stylo-structs.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 352 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h"
#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wreserved-id-macro"
# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h"
#pragma clang diagnostic pop
# 223 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Char16.h" 1
# 184 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Char16.h"
typedef const char16_t* char16ptr_t;



static_assert(sizeof(char16_t) == 2, "Is char16_t type 16 bits?");
static_assert(char16_t(-1) > char16_t(0), "Is char16_t type unsigned?");
static_assert(sizeof(u'A') == 2, "Is unicode char literal 16 bits?");
static_assert(sizeof(u""[0]) == 2, "Is unicode string char 16 bits?");
# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla-config.h" 2
# 2 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClasses.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClasses.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringFwd.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringFwd.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcom-config.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 1 3


# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 4 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 2 3
# 2106 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 3
namespace std
{
  typedef long unsigned int size_t;
  typedef long int ptrdiff_t;


  typedef decltype(nullptr) nullptr_t;

}
# 2128 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 3
namespace std
{
  inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
}
namespace __gnu_cxx
{
  inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
}
# 2414 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/os_defines.h" 1 3
# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/os_defines.h" 3
# 1 "/usr/include/features.h" 1 3 4
# 346 "/usr/include/features.h" 3 4
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 347 "/usr/include/features.h" 2 3 4
# 368 "/usr/include/features.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 415 "/usr/include/sys/cdefs.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 416 "/usr/include/sys/cdefs.h" 2 3 4
# 369 "/usr/include/features.h" 2 3 4
# 392 "/usr/include/features.h" 3 4
# 1 "/usr/include/gnu/stubs.h" 1 3 4
# 10 "/usr/include/gnu/stubs.h" 3 4
# 1 "/usr/include/gnu/stubs-64.h" 1 3 4
# 11 "/usr/include/gnu/stubs.h" 2 3 4
# 393 "/usr/include/features.h" 2 3 4
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/os_defines.h" 2 3
# 2415 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 2 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/cpu_defines.h" 1 3
# 2418 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++config.h" 2 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3

#pragma GCC visibility push(default)



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_lockfree_defines.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_lockfree_defines.h" 3
# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 2 3

extern "C++" {

namespace std
{
# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3
  class exception
  {
  public:
    exception() noexcept { }
    virtual ~exception() noexcept;



    virtual const char*
    what() const noexcept;
  };



  class bad_exception : public exception
  {
  public:
    bad_exception() noexcept { }



    virtual ~bad_exception() noexcept;


    virtual const char*
    what() const noexcept;
  };


  typedef void (*terminate_handler) ();


  typedef void (*unexpected_handler) ();


  terminate_handler set_terminate(terminate_handler) noexcept;



  terminate_handler get_terminate() noexcept;




  void terminate() noexcept __attribute__ ((__noreturn__));


  unexpected_handler set_unexpected(unexpected_handler) noexcept;



  unexpected_handler get_unexpected() noexcept;




  void unexpected() __attribute__ ((__noreturn__));
# 129 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3
  bool uncaught_exception() noexcept __attribute__ ((__pure__));
# 138 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3
}

namespace __gnu_cxx
{
# 160 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 3
  void __verbose_terminate_handler();


}

}

#pragma GCC visibility pop



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 3
#pragma GCC visibility push(default)



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_defines.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 2 3





extern "C++" {

namespace std
{
  class type_info;





  namespace __exception_ptr
  {
    class exception_ptr;
  }

  using __exception_ptr::exception_ptr;





  exception_ptr current_exception() noexcept;


  void rethrow_exception(exception_ptr) __attribute__ ((__noreturn__));

  namespace __exception_ptr
  {
    using std::rethrow_exception;





    class exception_ptr
    {
      void* _M_exception_object;

      explicit exception_ptr(void* __e) noexcept;

      void _M_addref() noexcept;
      void _M_release() noexcept;

      void *_M_get() const noexcept __attribute__ ((__pure__));

      friend exception_ptr std::current_exception() noexcept;
      friend void std::rethrow_exception(exception_ptr);

    public:
      exception_ptr() noexcept;

      exception_ptr(const exception_ptr&) noexcept;


      exception_ptr(nullptr_t) noexcept
      : _M_exception_object(0)
      { }

      exception_ptr(exception_ptr&& __o) noexcept
      : _M_exception_object(__o._M_exception_object)
      { __o._M_exception_object = 0; }
# 113 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 3
      exception_ptr&
      operator=(const exception_ptr&) noexcept;


      exception_ptr&
      operator=(exception_ptr&& __o) noexcept
      {
        exception_ptr(static_cast<exception_ptr&&>(__o)).swap(*this);
        return *this;
      }


      ~exception_ptr() noexcept;

      void
      swap(exception_ptr&) noexcept;
# 140 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/exception_ptr.h" 3
      explicit operator bool() const
      { return _M_exception_object; }


      friend bool
      operator==(const exception_ptr&, const exception_ptr&)
 noexcept __attribute__ ((__pure__));

      const class std::type_info*
      __cxa_exception_type() const noexcept
 __attribute__ ((__pure__));
    };

    bool
    operator==(const exception_ptr&, const exception_ptr&)
      noexcept __attribute__ ((__pure__));

    bool
    operator!=(const exception_ptr&, const exception_ptr&)
      noexcept __attribute__ ((__pure__));

    inline void
    swap(exception_ptr& __lhs, exception_ptr& __rhs)
    { __lhs.swap(__rhs); }

  }



  template<typename _Ex>
    exception_ptr
    make_exception_ptr(_Ex __ex) noexcept
    {

      try
 {
   throw __ex;
 }
      catch(...)
 {
   return current_exception();
 }



    }





  template<typename _Ex>
    exception_ptr
    copy_exception(_Ex __ex) noexcept __attribute__ ((__deprecated__));

  template<typename _Ex>
    exception_ptr
    copy_exception(_Ex __ex) noexcept
    { return std::make_exception_ptr<_Ex>(__ex); }


}

}

#pragma GCC visibility pop
# 171 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/nested_exception.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/nested_exception.h" 3
#pragma GCC visibility push(default)







# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/concept_check.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/concept_check.h" 3
# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{







  template<typename _Tp>
    inline _Tp*
    __addressof(_Tp& __r) noexcept
    {
      return reinterpret_cast<_Tp*>
 (&const_cast<char&>(reinterpret_cast<const volatile char&>(__r)));
    }


}



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
namespace std
{
  typedef unsigned short uint_least16_t;
  typedef unsigned int uint_least32_t;
}





namespace std __attribute__ ((__visibility__ ("default")))
{
# 68 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<typename _Tp, _Tp __v>
    struct integral_constant
    {
      static constexpr _Tp value = __v;
      typedef _Tp value_type;
      typedef integral_constant<_Tp, __v> type;
      constexpr operator value_type() const { return value; }




      constexpr value_type operator()() const { return value; }

    };

  template<typename _Tp, _Tp __v>
    constexpr _Tp integral_constant<_Tp, __v>::value;


  typedef integral_constant<bool, true> true_type;


  typedef integral_constant<bool, false> false_type;

  template<bool __v>
    using __bool_constant = integral_constant<bool, __v>;
# 103 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<bool, typename, typename>
    struct conditional;

  template<typename...>
    struct __or_;

  template<>
    struct __or_<>
    : public false_type
    { };

  template<typename _B1>
    struct __or_<_B1>
    : public _B1
    { };

  template<typename _B1, typename _B2>
    struct __or_<_B1, _B2>
    : public conditional<_B1::value, _B1, _B2>::type
    { };

  template<typename _B1, typename _B2, typename _B3, typename... _Bn>
    struct __or_<_B1, _B2, _B3, _Bn...>
    : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type
    { };

  template<typename...>
    struct __and_;

  template<>
    struct __and_<>
    : public true_type
    { };

  template<typename _B1>
    struct __and_<_B1>
    : public _B1
    { };

  template<typename _B1, typename _B2>
    struct __and_<_B1, _B2>
    : public conditional<_B1::value, _B2, _B1>::type
    { };

  template<typename _B1, typename _B2, typename _B3, typename... _Bn>
    struct __and_<_B1, _B2, _B3, _Bn...>
    : public conditional<_B1::value, __and_<_B2, _B3, _Bn...>, _B1>::type
    { };

  template<typename _Pp>
    struct __not_
    : public integral_constant<bool, !_Pp::value>
    { };

  struct __nonesuch {
    __nonesuch() = delete;
    ~__nonesuch() = delete;
    __nonesuch(__nonesuch const&) = delete;
    void operator=(__nonesuch const&) = delete;
  };
# 189 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<typename _Tp>
    struct __success_type
    { typedef _Tp type; };

  struct __failure_type
  { };



  template<typename>
    struct remove_cv;

  template<typename>
    struct __is_void_helper
    : public false_type { };

  template<>
    struct __is_void_helper<void>
    : public true_type { };


  template<typename _Tp>
    struct is_void
    : public __is_void_helper<typename remove_cv<_Tp>::type>::type
    { };

  template<typename>
    struct __is_integral_helper
    : public false_type { };

  template<>
    struct __is_integral_helper<bool>
    : public true_type { };

  template<>
    struct __is_integral_helper<char>
    : public true_type { };

  template<>
    struct __is_integral_helper<signed char>
    : public true_type { };

  template<>
    struct __is_integral_helper<unsigned char>
    : public true_type { };


  template<>
    struct __is_integral_helper<wchar_t>
    : public true_type { };


  template<>
    struct __is_integral_helper<char16_t>
    : public true_type { };

  template<>
    struct __is_integral_helper<char32_t>
    : public true_type { };

  template<>
    struct __is_integral_helper<short>
    : public true_type { };

  template<>
    struct __is_integral_helper<unsigned short>
    : public true_type { };

  template<>
    struct __is_integral_helper<int>
    : public true_type { };

  template<>
    struct __is_integral_helper<unsigned int>
    : public true_type { };

  template<>
    struct __is_integral_helper<long>
    : public true_type { };

  template<>
    struct __is_integral_helper<unsigned long>
    : public true_type { };

  template<>
    struct __is_integral_helper<long long>
    : public true_type { };

  template<>
    struct __is_integral_helper<unsigned long long>
    : public true_type { };
# 321 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<typename _Tp>
    struct is_integral
    : public __is_integral_helper<typename remove_cv<_Tp>::type>::type
    { };

  template<typename>
    struct __is_floating_point_helper
    : public false_type { };

  template<>
    struct __is_floating_point_helper<float>
    : public true_type { };

  template<>
    struct __is_floating_point_helper<double>
    : public true_type { };

  template<>
    struct __is_floating_point_helper<long double>
    : public true_type { };
# 349 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<typename _Tp>
    struct is_floating_point
    : public __is_floating_point_helper<typename remove_cv<_Tp>::type>::type
    { };


  template<typename>
    struct is_array
    : public false_type { };

  template<typename _Tp, std::size_t _Size>
    struct is_array<_Tp[_Size]>
    : public true_type { };

  template<typename _Tp>
    struct is_array<_Tp[]>
    : public true_type { };

  template<typename>
    struct __is_pointer_helper
    : public false_type { };

  template<typename _Tp>
    struct __is_pointer_helper<_Tp*>
    : public true_type { };


  template<typename _Tp>
    struct is_pointer
    : public __is_pointer_helper<typename remove_cv<_Tp>::type>::type
    { };


  template<typename>
    struct is_lvalue_reference
    : public false_type { };

  template<typename _Tp>
    struct is_lvalue_reference<_Tp&>
    : public true_type { };


  template<typename>
    struct is_rvalue_reference
    : public false_type { };

  template<typename _Tp>
    struct is_rvalue_reference<_Tp&&>
    : public true_type { };

  template<typename>
    struct is_function;

  template<typename>
    struct __is_member_object_pointer_helper
    : public false_type { };

  template<typename _Tp, typename _Cp>
    struct __is_member_object_pointer_helper<_Tp _Cp::*>
    : public integral_constant<bool, !is_function<_Tp>::value> { };


  template<typename _Tp>
    struct is_member_object_pointer
    : public __is_member_object_pointer_helper<
    typename remove_cv<_Tp>::type>::type
    { };

  template<typename>
    struct __is_member_function_pointer_helper
    : public false_type { };

  template<typename _Tp, typename _Cp>
    struct __is_member_function_pointer_helper<_Tp _Cp::*>
    : public integral_constant<bool, is_function<_Tp>::value> { };


  template<typename _Tp>
    struct is_member_function_pointer
    : public __is_member_function_pointer_helper<
    typename remove_cv<_Tp>::type>::type
    { };


  template<typename _Tp>
    struct is_enum
    : public integral_constant<bool, __is_enum(_Tp)>
    { };


  template<typename _Tp>
    struct is_union
    : public integral_constant<bool, __is_union(_Tp)>
    { };


  template<typename _Tp>
    struct is_class
    : public integral_constant<bool, __is_class(_Tp)>
    { };


  template<typename>
    struct is_function
    : public false_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...)>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......)>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) const>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) const &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) const &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) const>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) const &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) const &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) volatile>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) volatile &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) volatile &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) volatile>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) volatile &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) volatile &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) const volatile>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) const volatile &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) const volatile &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) const volatile>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) const volatile &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) const volatile &&>
    : public true_type { };



  template<typename>
    struct __is_null_pointer_helper
    : public false_type { };

  template<>
    struct __is_null_pointer_helper<std::nullptr_t>
    : public true_type { };


  template<typename _Tp>
    struct is_null_pointer
    : public __is_null_pointer_helper<typename remove_cv<_Tp>::type>::type
    { };


  template<typename _Tp>
    struct __is_nullptr_t
    : public is_null_pointer<_Tp>
    { };




  template<typename _Tp>
    struct is_reference
    : public __or_<is_lvalue_reference<_Tp>,
                   is_rvalue_reference<_Tp>>::type
    { };


  template<typename _Tp>
    struct is_arithmetic
    : public __or_<is_integral<_Tp>, is_floating_point<_Tp>>::type
    { };


  template<typename _Tp>
    struct is_fundamental
    : public __or_<is_arithmetic<_Tp>, is_void<_Tp>,
     is_null_pointer<_Tp>>::type
    { };


  template<typename _Tp>
    struct is_object
    : public __not_<__or_<is_function<_Tp>, is_reference<_Tp>,
                          is_void<_Tp>>>::type
    { };

  template<typename>
    struct is_member_pointer;


  template<typename _Tp>
    struct is_scalar
    : public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
                   is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type
    { };


  template<typename _Tp>
    struct is_compound
    : public integral_constant<bool, !is_fundamental<_Tp>::value> { };

  template<typename _Tp>
    struct __is_member_pointer_helper
    : public false_type { };

  template<typename _Tp, typename _Cp>
    struct __is_member_pointer_helper<_Tp _Cp::*>
    : public true_type { };


  template<typename _Tp>
    struct is_member_pointer
    : public __is_member_pointer_helper<typename remove_cv<_Tp>::type>::type
    { };



  template<typename _Tp>
    struct __is_referenceable
    : public __or_<is_object<_Tp>, is_reference<_Tp>>::type
    { };

  template<typename _Res, typename... _Args>
    struct __is_referenceable<_Res(_Args...)>
    : public true_type
    { };

  template<typename _Res, typename... _Args>
    struct __is_referenceable<_Res(_Args......)>
    : public true_type
    { };




  template<typename>
    struct is_const
    : public false_type { };

  template<typename _Tp>
    struct is_const<_Tp const>
    : public true_type { };


  template<typename>
    struct is_volatile
    : public false_type { };

  template<typename _Tp>
    struct is_volatile<_Tp volatile>
    : public true_type { };


  template<typename _Tp>
    struct is_trivial
    : public integral_constant<bool, __is_trivial(_Tp)>
    { };


  template<typename _Tp>
    struct is_trivially_copyable
    : public integral_constant<bool, __is_trivially_copyable(_Tp)>
    { };


  template<typename _Tp>
    struct is_standard_layout
    : public integral_constant<bool, __is_standard_layout(_Tp)>
    { };



  template<typename _Tp>
    struct is_pod
    : public integral_constant<bool, __is_pod(_Tp)>
    { };


  template<typename _Tp>
    struct is_literal_type
    : public integral_constant<bool, __is_literal_type(_Tp)>
    { };


  template<typename _Tp>
    struct is_empty
    : public integral_constant<bool, __is_empty(_Tp)>
    { };


  template<typename _Tp>
    struct is_polymorphic
    : public integral_constant<bool, __is_polymorphic(_Tp)>
    { };




  template<typename _Tp>
    struct is_final
    : public integral_constant<bool, __is_final(_Tp)>
    { };



  template<typename _Tp>
    struct is_abstract
    : public integral_constant<bool, __is_abstract(_Tp)>
    { };

  template<typename _Tp,
    bool = is_arithmetic<_Tp>::value>
    struct __is_signed_helper
    : public false_type { };

  template<typename _Tp>
    struct __is_signed_helper<_Tp, true>
    : public integral_constant<bool, _Tp(-1) < _Tp(0)>
    { };


  template<typename _Tp>
    struct is_signed
    : public __is_signed_helper<_Tp>::type
    { };


  template<typename _Tp>
    struct is_unsigned
    : public __and_<is_arithmetic<_Tp>, __not_<is_signed<_Tp>>>
    { };




  template<typename>
    struct add_rvalue_reference;





  template<typename _Tp>
    typename add_rvalue_reference<_Tp>::type declval() noexcept;

  template<typename, unsigned = 0>
    struct extent;

  template<typename>
    struct remove_all_extents;

  template<typename _Tp>
    struct __is_array_known_bounds
    : public integral_constant<bool, (extent<_Tp>::value > 0)>
    { };

  template<typename _Tp>
    struct __is_array_unknown_bounds
    : public __and_<is_array<_Tp>, __not_<extent<_Tp>>>
    { };






  struct __do_is_destructible_impl
  {
    template<typename _Tp, typename = decltype(declval<_Tp&>().~_Tp())>
      static true_type __test(int);

    template<typename>
      static false_type __test(...);
  };

  template<typename _Tp>
    struct __is_destructible_impl
    : public __do_is_destructible_impl
    {
      typedef decltype(__test<_Tp>(0)) type;
    };

  template<typename _Tp,
           bool = __or_<is_void<_Tp>,
                        __is_array_unknown_bounds<_Tp>,
                        is_function<_Tp>>::value,
           bool = __or_<is_reference<_Tp>, is_scalar<_Tp>>::value>
    struct __is_destructible_safe;

  template<typename _Tp>
    struct __is_destructible_safe<_Tp, false, false>
    : public __is_destructible_impl<typename
               remove_all_extents<_Tp>::type>::type
    { };

  template<typename _Tp>
    struct __is_destructible_safe<_Tp, true, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_destructible_safe<_Tp, false, true>
    : public true_type { };


  template<typename _Tp>
    struct is_destructible
    : public __is_destructible_safe<_Tp>::type
    { };





  struct __do_is_nt_destructible_impl
  {
    template<typename _Tp>
      static integral_constant<bool, noexcept(declval<_Tp&>().~_Tp())>
        __test(int);

    template<typename>
      static false_type __test(...);
  };

  template<typename _Tp>
    struct __is_nt_destructible_impl
    : public __do_is_nt_destructible_impl
    {
      typedef decltype(__test<_Tp>(0)) type;
    };

  template<typename _Tp,
           bool = __or_<is_void<_Tp>,
                        __is_array_unknown_bounds<_Tp>,
                        is_function<_Tp>>::value,
           bool = __or_<is_reference<_Tp>, is_scalar<_Tp>>::value>
    struct __is_nt_destructible_safe;

  template<typename _Tp>
    struct __is_nt_destructible_safe<_Tp, false, false>
    : public __is_nt_destructible_impl<typename
               remove_all_extents<_Tp>::type>::type
    { };

  template<typename _Tp>
    struct __is_nt_destructible_safe<_Tp, true, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_nt_destructible_safe<_Tp, false, true>
    : public true_type { };


  template<typename _Tp>
    struct is_nothrow_destructible
    : public __is_nt_destructible_safe<_Tp>::type
    { };

  struct __do_is_default_constructible_impl
  {
    template<typename _Tp, typename = decltype(_Tp())>
      static true_type __test(int);

    template<typename>
      static false_type __test(...);
  };

  template<typename _Tp>
    struct __is_default_constructible_impl
    : public __do_is_default_constructible_impl
    {
      typedef decltype(__test<_Tp>(0)) type;
    };

  template<typename _Tp>
    struct __is_default_constructible_atom
    : public __and_<__not_<is_void<_Tp>>,
                    __is_default_constructible_impl<_Tp>>
    { };

  template<typename _Tp, bool = is_array<_Tp>::value>
    struct __is_default_constructible_safe;






  template<typename _Tp>
    struct __is_default_constructible_safe<_Tp, true>
    : public __and_<__is_array_known_bounds<_Tp>,
      __is_default_constructible_atom<typename
                      remove_all_extents<_Tp>::type>>
    { };

  template<typename _Tp>
    struct __is_default_constructible_safe<_Tp, false>
    : public __is_default_constructible_atom<_Tp>::type
    { };


  template<typename _Tp>
    struct is_default_constructible
    : public __is_default_constructible_safe<_Tp>::type
    { };
# 933 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  struct __do_is_static_castable_impl
  {
    template<typename _From, typename _To, typename
             = decltype(static_cast<_To>(declval<_From>()))>
      static true_type __test(int);

    template<typename, typename>
      static false_type __test(...);
  };

  template<typename _From, typename _To>
    struct __is_static_castable_impl
    : public __do_is_static_castable_impl
    {
      typedef decltype(__test<_From, _To>(0)) type;
    };

  template<typename _From, typename _To>
    struct __is_static_castable_safe
    : public __is_static_castable_impl<_From, _To>::type
    { };


  template<typename _From, typename _To>
    struct __is_static_castable
    : public integral_constant<bool, (__is_static_castable_safe<
          _From, _To>::value)>
    { };






  struct __do_is_direct_constructible_impl
  {
    template<typename _Tp, typename _Arg, typename
      = decltype(::new _Tp(declval<_Arg>()))>
      static true_type __test(int);

    template<typename, typename>
      static false_type __test(...);
  };

  template<typename _Tp, typename _Arg>
    struct __is_direct_constructible_impl
    : public __do_is_direct_constructible_impl
    {
      typedef decltype(__test<_Tp, _Arg>(0)) type;
    };

  template<typename _Tp, typename _Arg>
    struct __is_direct_constructible_new_safe
    : public __and_<is_destructible<_Tp>,
                    __is_direct_constructible_impl<_Tp, _Arg>>
    { };

  template<typename, typename>
    struct is_same;

  template<typename, typename>
    struct is_base_of;

  template<typename>
    struct remove_reference;

  template<typename _From, typename _To, bool
           = __not_<__or_<is_void<_From>,
                          is_function<_From>>>::value>
    struct __is_base_to_derived_ref;

  template<typename _Tp, typename... _Args>
    struct is_constructible;



  template<typename _From, typename _To>
    struct __is_base_to_derived_ref<_From, _To, true>
    {
      typedef typename remove_cv<typename remove_reference<_From
        >::type>::type __src_t;
      typedef typename remove_cv<typename remove_reference<_To
        >::type>::type __dst_t;
      typedef __and_<__not_<is_same<__src_t, __dst_t>>,
       is_base_of<__src_t, __dst_t>,
       __not_<is_constructible<__dst_t, _From>>> type;
      static constexpr bool value = type::value;
    };

  template<typename _From, typename _To>
    struct __is_base_to_derived_ref<_From, _To, false>
    : public false_type
    { };

  template<typename _From, typename _To, bool
           = __and_<is_lvalue_reference<_From>,
                    is_rvalue_reference<_To>>::value>
    struct __is_lvalue_to_rvalue_ref;



  template<typename _From, typename _To>
    struct __is_lvalue_to_rvalue_ref<_From, _To, true>
    {
      typedef typename remove_cv<typename remove_reference<
        _From>::type>::type __src_t;
      typedef typename remove_cv<typename remove_reference<
        _To>::type>::type __dst_t;
      typedef __and_<__not_<is_function<__src_t>>,
        __or_<is_same<__src_t, __dst_t>,
      is_base_of<__dst_t, __src_t>>> type;
      static constexpr bool value = type::value;
    };

  template<typename _From, typename _To>
    struct __is_lvalue_to_rvalue_ref<_From, _To, false>
    : public false_type
    { };







  template<typename _Tp, typename _Arg>
    struct __is_direct_constructible_ref_cast
    : public __and_<__is_static_castable<_Arg, _Tp>,
                    __not_<__or_<__is_base_to_derived_ref<_Arg, _Tp>,
                                 __is_lvalue_to_rvalue_ref<_Arg, _Tp>
                   >>>
    { };

  template<typename _Tp, typename _Arg>
    struct __is_direct_constructible_new
    : public conditional<is_reference<_Tp>::value,
    __is_direct_constructible_ref_cast<_Tp, _Arg>,
    __is_direct_constructible_new_safe<_Tp, _Arg>
    >::type
    { };

  template<typename _Tp, typename _Arg>
    struct __is_direct_constructible
    : public __is_direct_constructible_new<_Tp, _Arg>::type
    { };






  struct __do_is_nary_constructible_impl
  {
    template<typename _Tp, typename... _Args, typename
             = decltype(_Tp(declval<_Args>()...))>
      static true_type __test(int);

    template<typename, typename...>
      static false_type __test(...);
  };

  template<typename _Tp, typename... _Args>
    struct __is_nary_constructible_impl
    : public __do_is_nary_constructible_impl
    {
      typedef decltype(__test<_Tp, _Args...>(0)) type;
    };

  template<typename _Tp, typename... _Args>
    struct __is_nary_constructible
    : public __is_nary_constructible_impl<_Tp, _Args...>::type
    {
      static_assert(sizeof...(_Args) > 1,
                    "Only useful for > 1 arguments");
    };

  template<typename _Tp, typename... _Args>
    struct __is_constructible_impl
    : public __is_nary_constructible<_Tp, _Args...>
    { };

  template<typename _Tp, typename _Arg>
    struct __is_constructible_impl<_Tp, _Arg>
    : public __is_direct_constructible<_Tp, _Arg>
    { };

  template<typename _Tp>
    struct __is_constructible_impl<_Tp>
    : public is_default_constructible<_Tp>
    { };


  template<typename _Tp, typename... _Args>
    struct is_constructible
    : public __is_constructible_impl<_Tp, _Args...>::type
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_copy_constructible_impl;

  template<typename _Tp>
    struct __is_copy_constructible_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_copy_constructible_impl<_Tp, true>
    : public is_constructible<_Tp, const _Tp&>
    { };


  template<typename _Tp>
    struct is_copy_constructible
    : public __is_copy_constructible_impl<_Tp>
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_move_constructible_impl;

  template<typename _Tp>
    struct __is_move_constructible_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_move_constructible_impl<_Tp, true>
    : public is_constructible<_Tp, _Tp&&>
    { };


  template<typename _Tp>
    struct is_move_constructible
    : public __is_move_constructible_impl<_Tp>
    { };

  template<typename _Tp>
    struct __is_nt_default_constructible_atom
    : public integral_constant<bool, noexcept(_Tp())>
    { };

  template<typename _Tp, bool = is_array<_Tp>::value>
    struct __is_nt_default_constructible_impl;

  template<typename _Tp>
    struct __is_nt_default_constructible_impl<_Tp, true>
    : public __and_<__is_array_known_bounds<_Tp>,
      __is_nt_default_constructible_atom<typename
                      remove_all_extents<_Tp>::type>>
    { };

  template<typename _Tp>
    struct __is_nt_default_constructible_impl<_Tp, false>
    : public __is_nt_default_constructible_atom<_Tp>
    { };


  template<typename _Tp>
    struct is_nothrow_default_constructible
    : public __and_<is_default_constructible<_Tp>,
                    __is_nt_default_constructible_impl<_Tp>>
    { };

  template<typename _Tp, typename... _Args>
    struct __is_nt_constructible_impl
    : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))>
    { };

  template<typename _Tp, typename _Arg>
    struct __is_nt_constructible_impl<_Tp, _Arg>
    : public integral_constant<bool,
                               noexcept(static_cast<_Tp>(declval<_Arg>()))>
    { };

  template<typename _Tp>
    struct __is_nt_constructible_impl<_Tp>
    : public is_nothrow_default_constructible<_Tp>
    { };


  template<typename _Tp, typename... _Args>
    struct is_nothrow_constructible
    : public __and_<is_constructible<_Tp, _Args...>,
      __is_nt_constructible_impl<_Tp, _Args...>>
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_nothrow_copy_constructible_impl;

  template<typename _Tp>
    struct __is_nothrow_copy_constructible_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_nothrow_copy_constructible_impl<_Tp, true>
    : public is_nothrow_constructible<_Tp, const _Tp&>
    { };


  template<typename _Tp>
    struct is_nothrow_copy_constructible
    : public __is_nothrow_copy_constructible_impl<_Tp>
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_nothrow_move_constructible_impl;

  template<typename _Tp>
    struct __is_nothrow_move_constructible_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_nothrow_move_constructible_impl<_Tp, true>
    : public is_nothrow_constructible<_Tp, _Tp&&>
    { };


  template<typename _Tp>
    struct is_nothrow_move_constructible
    : public __is_nothrow_move_constructible_impl<_Tp>
    { };

  template<typename _Tp, typename _Up>
    class __is_assignable_helper
    {
      template<typename _Tp1, typename _Up1,
        typename = decltype(declval<_Tp1>() = declval<_Up1>())>
 static true_type
 __test(int);

      template<typename, typename>
 static false_type
 __test(...);

    public:
      typedef decltype(__test<_Tp, _Up>(0)) type;
    };


  template<typename _Tp, typename _Up>
    struct is_assignable
      : public __is_assignable_helper<_Tp, _Up>::type
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_copy_assignable_impl;

  template<typename _Tp>
    struct __is_copy_assignable_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_copy_assignable_impl<_Tp, true>
    : public is_assignable<_Tp&, const _Tp&>
    { };


  template<typename _Tp>
    struct is_copy_assignable
    : public __is_copy_assignable_impl<_Tp>
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_move_assignable_impl;

  template<typename _Tp>
    struct __is_move_assignable_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_move_assignable_impl<_Tp, true>
    : public is_assignable<_Tp&, _Tp&&>
    { };


  template<typename _Tp>
    struct is_move_assignable
    : public __is_move_assignable_impl<_Tp>
    { };

  template<typename _Tp, typename _Up>
    struct __is_nt_assignable_impl
    : public integral_constant<bool, noexcept(declval<_Tp>() = declval<_Up>())>
    { };


  template<typename _Tp, typename _Up>
    struct is_nothrow_assignable
    : public __and_<is_assignable<_Tp, _Up>,
      __is_nt_assignable_impl<_Tp, _Up>>
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_nt_copy_assignable_impl;

  template<typename _Tp>
    struct __is_nt_copy_assignable_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_nt_copy_assignable_impl<_Tp, true>
    : public is_nothrow_assignable<_Tp&, const _Tp&>
    { };


  template<typename _Tp>
    struct is_nothrow_copy_assignable
    : public __is_nt_copy_assignable_impl<_Tp>
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __is_nt_move_assignable_impl;

  template<typename _Tp>
    struct __is_nt_move_assignable_impl<_Tp, false>
    : public false_type { };

  template<typename _Tp>
    struct __is_nt_move_assignable_impl<_Tp, true>
    : public is_nothrow_assignable<_Tp&, _Tp&&>
    { };


  template<typename _Tp>
    struct is_nothrow_move_assignable
    : public __is_nt_move_assignable_impl<_Tp>
    { };


  template<typename _Tp, typename... _Args>
    struct is_trivially_constructible
    : public __and_<is_constructible<_Tp, _Args...>, integral_constant<bool,
   __is_trivially_constructible(_Tp, _Args...)>>
    { };


  template<typename _Tp>
    struct is_trivially_default_constructible
    : public is_trivially_constructible<_Tp>::type
    { };

  struct __do_is_implicitly_default_constructible_impl
  {
    template <typename _Tp>
    static void __helper(const _Tp&);

    template <typename _Tp>
    static true_type __test(const _Tp&,
                            decltype(__helper<const _Tp&>({}))* = 0);

    static false_type __test(...);
  };

  template<typename _Tp>
    struct __is_implicitly_default_constructible_impl
      : public __do_is_implicitly_default_constructible_impl
  {
    typedef decltype(__test(declval<_Tp>())) type;
  };

  template<typename _Tp>
    struct __is_implicitly_default_constructible_safe
      : public __is_implicitly_default_constructible_impl<_Tp>::type
  { };

  template <typename _Tp>
    struct __is_implicitly_default_constructible
      : public __and_<is_default_constructible<_Tp>,
                      __is_implicitly_default_constructible_safe<_Tp>>
  { };


  template<typename _Tp>
    struct is_trivially_copy_constructible
    : public __and_<is_copy_constructible<_Tp>,
      integral_constant<bool,
   __is_trivially_constructible(_Tp, const _Tp&)>>
    { };


  template<typename _Tp>
    struct is_trivially_move_constructible
    : public __and_<is_move_constructible<_Tp>,
      integral_constant<bool,
   __is_trivially_constructible(_Tp, _Tp&&)>>
    { };


  template<typename _Tp, typename _Up>
    struct is_trivially_assignable
    : public __and_<is_assignable<_Tp, _Up>,
      integral_constant<bool,
   __is_trivially_assignable(_Tp, _Up)>>
    { };


  template<typename _Tp>
    struct is_trivially_copy_assignable
    : public __and_<is_copy_assignable<_Tp>,
      integral_constant<bool,
   __is_trivially_assignable(_Tp&, const _Tp&)>>
    { };


  template<typename _Tp>
    struct is_trivially_move_assignable
    : public __and_<is_move_assignable<_Tp>,
      integral_constant<bool,
   __is_trivially_assignable(_Tp&, _Tp&&)>>
    { };


  template<typename _Tp>
    struct is_trivially_destructible
    : public __and_<is_destructible<_Tp>, integral_constant<bool,
         __has_trivial_destructor(_Tp)>>
    { };


  template<typename _Tp>
    struct has_trivial_default_constructor
    : public integral_constant<bool, __has_trivial_constructor(_Tp)>
    { } __attribute__ ((__deprecated__));


  template<typename _Tp>
    struct has_trivial_copy_constructor
    : public integral_constant<bool, __has_trivial_copy(_Tp)>
    { } __attribute__ ((__deprecated__));


  template<typename _Tp>
    struct has_trivial_copy_assign
    : public integral_constant<bool, __has_trivial_assign(_Tp)>
    { } __attribute__ ((__deprecated__));


  template<typename _Tp>
    struct has_virtual_destructor
    : public integral_constant<bool, __has_virtual_destructor(_Tp)>
    { };





  template<typename _Tp>
    struct alignment_of
    : public integral_constant<std::size_t, __alignof__(_Tp)> { };


  template<typename>
    struct rank
    : public integral_constant<std::size_t, 0> { };

  template<typename _Tp, std::size_t _Size>
    struct rank<_Tp[_Size]>
    : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };

  template<typename _Tp>
    struct rank<_Tp[]>
    : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };


  template<typename, unsigned _Uint>
    struct extent
    : public integral_constant<std::size_t, 0> { };

  template<typename _Tp, unsigned _Uint, std::size_t _Size>
    struct extent<_Tp[_Size], _Uint>
    : public integral_constant<std::size_t,
          _Uint == 0 ? _Size : extent<_Tp,
          _Uint - 1>::value>
    { };

  template<typename _Tp, unsigned _Uint>
    struct extent<_Tp[], _Uint>
    : public integral_constant<std::size_t,
          _Uint == 0 ? 0 : extent<_Tp,
             _Uint - 1>::value>
    { };





  template<typename, typename>
    struct is_same
    : public false_type { };

  template<typename _Tp>
    struct is_same<_Tp, _Tp>
    : public true_type { };


  template<typename _Base, typename _Derived>
    struct is_base_of
    : public integral_constant<bool, __is_base_of(_Base, _Derived)>
    { };

  template<typename _From, typename _To,
           bool = __or_<is_void<_From>, is_function<_To>,
                        is_array<_To>>::value>
    struct __is_convertible_helper
    { typedef typename is_void<_To>::type type; };

  template<typename _From, typename _To>
    class __is_convertible_helper<_From, _To, false>
    {
       template<typename _To1>
 static void __test_aux(_To1);

      template<typename _From1, typename _To1,
        typename = decltype(__test_aux<_To1>(std::declval<_From1>()))>
 static true_type
 __test(int);

      template<typename, typename>
 static false_type
 __test(...);

    public:
      typedef decltype(__test<_From, _To>(0)) type;
    };



  template<typename _From, typename _To>
    struct is_convertible
    : public __is_convertible_helper<_From, _To>::type
    { };





  template<typename _Tp>
    struct remove_const
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_const<_Tp const>
    { typedef _Tp type; };


  template<typename _Tp>
    struct remove_volatile
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_volatile<_Tp volatile>
    { typedef _Tp type; };


  template<typename _Tp>
    struct remove_cv
    {
      typedef typename
      remove_const<typename remove_volatile<_Tp>::type>::type type;
    };


  template<typename _Tp>
    struct add_const
    { typedef _Tp const type; };


  template<typename _Tp>
    struct add_volatile
    { typedef _Tp volatile type; };


  template<typename _Tp>
    struct add_cv
    {
      typedef typename
      add_const<typename add_volatile<_Tp>::type>::type type;
    };






  template<typename _Tp>
    using remove_const_t = typename remove_const<_Tp>::type;


  template<typename _Tp>
    using remove_volatile_t = typename remove_volatile<_Tp>::type;


  template<typename _Tp>
    using remove_cv_t = typename remove_cv<_Tp>::type;


  template<typename _Tp>
    using add_const_t = typename add_const<_Tp>::type;


  template<typename _Tp>
    using add_volatile_t = typename add_volatile<_Tp>::type;


  template<typename _Tp>
    using add_cv_t = typename add_cv<_Tp>::type;





  template<typename _Tp>
    struct remove_reference
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_reference<_Tp&>
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_reference<_Tp&&>
    { typedef _Tp type; };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __add_lvalue_reference_helper
    { typedef _Tp type; };

  template<typename _Tp>
    struct __add_lvalue_reference_helper<_Tp, true>
    { typedef _Tp& type; };


  template<typename _Tp>
    struct add_lvalue_reference
    : public __add_lvalue_reference_helper<_Tp>
    { };

  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
    struct __add_rvalue_reference_helper
    { typedef _Tp type; };

  template<typename _Tp>
    struct __add_rvalue_reference_helper<_Tp, true>
    { typedef _Tp&& type; };


  template<typename _Tp>
    struct add_rvalue_reference
    : public __add_rvalue_reference_helper<_Tp>
    { };



  template<typename _Tp>
    using remove_reference_t = typename remove_reference<_Tp>::type;


  template<typename _Tp>
    using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;


  template<typename _Tp>
    using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;





  template<typename _Unqualified, bool _IsConst, bool _IsVol>
    struct __cv_selector;

  template<typename _Unqualified>
    struct __cv_selector<_Unqualified, false, false>
    { typedef _Unqualified __type; };

  template<typename _Unqualified>
    struct __cv_selector<_Unqualified, false, true>
    { typedef volatile _Unqualified __type; };

  template<typename _Unqualified>
    struct __cv_selector<_Unqualified, true, false>
    { typedef const _Unqualified __type; };

  template<typename _Unqualified>
    struct __cv_selector<_Unqualified, true, true>
    { typedef const volatile _Unqualified __type; };

  template<typename _Qualified, typename _Unqualified,
    bool _IsConst = is_const<_Qualified>::value,
    bool _IsVol = is_volatile<_Qualified>::value>
    class __match_cv_qualifiers
    {
      typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match;

    public:
      typedef typename __match::__type __type;
    };


  template<typename _Tp>
    struct __make_unsigned
    { typedef _Tp __type; };

  template<>
    struct __make_unsigned<char>
    { typedef unsigned char __type; };

  template<>
    struct __make_unsigned<signed char>
    { typedef unsigned char __type; };

  template<>
    struct __make_unsigned<short>
    { typedef unsigned short __type; };

  template<>
    struct __make_unsigned<int>
    { typedef unsigned int __type; };

  template<>
    struct __make_unsigned<long>
    { typedef unsigned long __type; };

  template<>
    struct __make_unsigned<long long>
    { typedef unsigned long long __type; };


  template<>
    struct __make_unsigned<wchar_t> : __make_unsigned<int>
    { };
# 1785 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<typename _Tp,
    bool _IsInt = is_integral<_Tp>::value,
    bool _IsEnum = is_enum<_Tp>::value>
    class __make_unsigned_selector;

  template<typename _Tp>
    class __make_unsigned_selector<_Tp, true, false>
    {
      typedef __make_unsigned<typename remove_cv<_Tp>::type> __unsignedt;
      typedef typename __unsignedt::__type __unsigned_type;
      typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;

    public:
      typedef typename __cv_unsigned::__type __type;
    };

  template<typename _Tp>
    class __make_unsigned_selector<_Tp, false, true>
    {

      typedef unsigned char __smallest;
      static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
      static const bool __b1 = sizeof(_Tp) <= sizeof(unsigned short);
      static const bool __b2 = sizeof(_Tp) <= sizeof(unsigned int);
      static const bool __b3 = sizeof(_Tp) <= sizeof(unsigned long);
      typedef conditional<__b3, unsigned long, unsigned long long> __cond3;
      typedef typename __cond3::type __cond3_type;
      typedef conditional<__b2, unsigned int, __cond3_type> __cond2;
      typedef typename __cond2::type __cond2_type;
      typedef conditional<__b1, unsigned short, __cond2_type> __cond1;
      typedef typename __cond1::type __cond1_type;

      typedef typename conditional<__b0, __smallest, __cond1_type>::type
 __unsigned_type;
      typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;

    public:
      typedef typename __cv_unsigned::__type __type;
    };





  template<typename _Tp>
    struct make_unsigned
    { typedef typename __make_unsigned_selector<_Tp>::__type type; };


  template<>
    struct make_unsigned<bool>;



  template<typename _Tp>
    struct __make_signed
    { typedef _Tp __type; };

  template<>
    struct __make_signed<char>
    { typedef signed char __type; };

  template<>
    struct __make_signed<unsigned char>
    { typedef signed char __type; };

  template<>
    struct __make_signed<unsigned short>
    { typedef signed short __type; };

  template<>
    struct __make_signed<unsigned int>
    { typedef signed int __type; };

  template<>
    struct __make_signed<unsigned long>
    { typedef signed long __type; };

  template<>
    struct __make_signed<unsigned long long>
    { typedef signed long long __type; };
# 1874 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<>
    struct __make_signed<char16_t> : __make_signed<uint_least16_t>
    { };
  template<>
    struct __make_signed<char32_t> : __make_signed<uint_least32_t>
    { };
# 1904 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<typename _Tp,
    bool _IsInt = is_integral<_Tp>::value,
    bool _IsEnum = is_enum<_Tp>::value>
    class __make_signed_selector;

  template<typename _Tp>
    class __make_signed_selector<_Tp, true, false>
    {
      typedef __make_signed<typename remove_cv<_Tp>::type> __signedt;
      typedef typename __signedt::__type __signed_type;
      typedef __match_cv_qualifiers<_Tp, __signed_type> __cv_signed;

    public:
      typedef typename __cv_signed::__type __type;
    };

  template<typename _Tp>
    class __make_signed_selector<_Tp, false, true>
    {
      typedef typename __make_unsigned_selector<_Tp>::__type __unsigned_type;

    public:
      typedef typename __make_signed_selector<__unsigned_type>::__type __type;
    };





  template<typename _Tp>
    struct make_signed
    { typedef typename __make_signed_selector<_Tp>::__type type; };


  template<>
    struct make_signed<bool>;



  template<typename _Tp>
    using make_signed_t = typename make_signed<_Tp>::type;


  template<typename _Tp>
    using make_unsigned_t = typename make_unsigned<_Tp>::type;





  template<typename _Tp>
    struct remove_extent
    { typedef _Tp type; };

  template<typename _Tp, std::size_t _Size>
    struct remove_extent<_Tp[_Size]>
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_extent<_Tp[]>
    { typedef _Tp type; };


  template<typename _Tp>
    struct remove_all_extents
    { typedef _Tp type; };

  template<typename _Tp, std::size_t _Size>
    struct remove_all_extents<_Tp[_Size]>
    { typedef typename remove_all_extents<_Tp>::type type; };

  template<typename _Tp>
    struct remove_all_extents<_Tp[]>
    { typedef typename remove_all_extents<_Tp>::type type; };



  template<typename _Tp>
    using remove_extent_t = typename remove_extent<_Tp>::type;


  template<typename _Tp>
    using remove_all_extents_t = typename remove_all_extents<_Tp>::type;




  template<typename _Tp, typename>
    struct __remove_pointer_helper
    { typedef _Tp type; };

  template<typename _Tp, typename _Up>
    struct __remove_pointer_helper<_Tp, _Up*>
    { typedef _Up type; };


  template<typename _Tp>
    struct remove_pointer
    : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type>
    { };


  template<typename _Tp, bool = __or_<__is_referenceable<_Tp>,
          is_void<_Tp>>::value>
    struct __add_pointer_helper
    { typedef _Tp type; };

  template<typename _Tp>
    struct __add_pointer_helper<_Tp, true>
    { typedef typename remove_reference<_Tp>::type* type; };

  template<typename _Tp>
    struct add_pointer
    : public __add_pointer_helper<_Tp>
    { };



  template<typename _Tp>
    using remove_pointer_t = typename remove_pointer<_Tp>::type;


  template<typename _Tp>
    using add_pointer_t = typename add_pointer<_Tp>::type;


  template<std::size_t _Len>
    struct __aligned_storage_msa
    {
      union __type
      {
 unsigned char __data[_Len];
 struct __attribute__((__aligned__)) { } __align;
      };
    };
# 2050 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<std::size_t _Len, std::size_t _Align =
    __alignof__(typename __aligned_storage_msa<_Len>::__type)>
    struct aligned_storage
    {
      union type
      {
 unsigned char __data[_Len];
 struct __attribute__((__aligned__((_Align)))) { } __align;
      };
    };

  template <typename... _Types>
    struct __strictest_alignment
    {
      static const size_t _S_alignment = 0;
      static const size_t _S_size = 0;
    };

  template <typename _Tp, typename... _Types>
    struct __strictest_alignment<_Tp, _Types...>
    {
      static const size_t _S_alignment =
        alignof(_Tp) > __strictest_alignment<_Types...>::_S_alignment
 ? alignof(_Tp) : __strictest_alignment<_Types...>::_S_alignment;
      static const size_t _S_size =
        sizeof(_Tp) > __strictest_alignment<_Types...>::_S_size
 ? sizeof(_Tp) : __strictest_alignment<_Types...>::_S_size;
    };
# 2089 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template <size_t _Len, typename... _Types>
    struct aligned_union
    {
    private:
      static_assert(sizeof...(_Types) != 0, "At least one type is required");

      using __strictest = __strictest_alignment<_Types...>;
      static const size_t _S_len = _Len > __strictest::_S_size
 ? _Len : __strictest::_S_size;
    public:

      static const size_t alignment_value = __strictest::_S_alignment;

      typedef typename aligned_storage<_S_len, alignment_value>::type type;
    };

  template <size_t _Len, typename... _Types>
    const size_t aligned_union<_Len, _Types...>::alignment_value;



  template<typename _Up,
    bool _IsArray = is_array<_Up>::value,
    bool _IsFunction = is_function<_Up>::value>
    struct __decay_selector;


  template<typename _Up>
    struct __decay_selector<_Up, false, false>
    { typedef typename remove_cv<_Up>::type __type; };

  template<typename _Up>
    struct __decay_selector<_Up, true, false>
    { typedef typename remove_extent<_Up>::type* __type; };

  template<typename _Up>
    struct __decay_selector<_Up, false, true>
    { typedef typename add_pointer<_Up>::type __type; };


  template<typename _Tp>
    class decay
    {
      typedef typename remove_reference<_Tp>::type __remove_type;

    public:
      typedef typename __decay_selector<__remove_type>::__type type;
    };

  template<typename _Tp>
    class reference_wrapper;


  template<typename _Tp>
    struct __strip_reference_wrapper
    {
      typedef _Tp __type;
    };

  template<typename _Tp>
    struct __strip_reference_wrapper<reference_wrapper<_Tp> >
    {
      typedef _Tp& __type;
    };

  template<typename _Tp>
    struct __decay_and_strip
    {
      typedef typename __strip_reference_wrapper<
 typename decay<_Tp>::type>::__type __type;
    };




  template<bool, typename _Tp = void>
    struct enable_if
    { };


  template<typename _Tp>
    struct enable_if<true, _Tp>
    { typedef _Tp type; };

  template<typename... _Cond>
    using _Require = typename enable_if<__and_<_Cond...>::value>::type;



  template<bool _Cond, typename _Iftrue, typename _Iffalse>
    struct conditional
    { typedef _Iftrue type; };


  template<typename _Iftrue, typename _Iffalse>
    struct conditional<false, _Iftrue, _Iffalse>
    { typedef _Iffalse type; };


  template<typename... _Tp>
    struct common_type;



  struct __do_common_type_impl
  {
    template<typename _Tp, typename _Up>
      static __success_type<typename decay<decltype
       (true ? std::declval<_Tp>()
        : std::declval<_Up>())>::type> _S_test(int);

    template<typename, typename>
      static __failure_type _S_test(...);
  };

  template<typename _Tp, typename _Up>
    struct __common_type_impl
    : private __do_common_type_impl
    {
      typedef decltype(_S_test<_Tp, _Up>(0)) type;
    };

  struct __do_member_type_wrapper
  {
    template<typename _Tp>
      static __success_type<typename _Tp::type> _S_test(int);

    template<typename>
      static __failure_type _S_test(...);
  };

  template<typename _Tp>
    struct __member_type_wrapper
    : private __do_member_type_wrapper
    {
      typedef decltype(_S_test<_Tp>(0)) type;
    };

  template<typename _CTp, typename... _Args>
    struct __expanded_common_type_wrapper
    {
      typedef common_type<typename _CTp::type, _Args...> type;
    };

  template<typename... _Args>
    struct __expanded_common_type_wrapper<__failure_type, _Args...>
    { typedef __failure_type type; };

  template<typename _Tp>
    struct common_type<_Tp>
    { typedef typename decay<_Tp>::type type; };

  template<typename _Tp, typename _Up>
    struct common_type<_Tp, _Up>
    : public __common_type_impl<_Tp, _Up>::type
    { };

  template<typename _Tp, typename _Up, typename... _Vp>
    struct common_type<_Tp, _Up, _Vp...>
    : public __expanded_common_type_wrapper<typename __member_type_wrapper<
               common_type<_Tp, _Up>>::type, _Vp...>::type
    { };


  template<typename _Tp>
    struct underlying_type
    {
      typedef __underlying_type(_Tp) type;
    };

  template<typename _Tp>
    struct __declval_protector
    {
      static const bool __stop = false;
      static typename add_rvalue_reference<_Tp>::type __delegate();
    };

  template<typename _Tp>
    inline typename add_rvalue_reference<_Tp>::type
    declval() noexcept
    {
      static_assert(__declval_protector<_Tp>::__stop,
      "declval() must not be used!");
      return __declval_protector<_Tp>::__delegate();
    }


  template<typename _Signature>
    class result_of;





  struct __invoke_memfun_ref { };
  struct __invoke_memfun_deref { };
  struct __invoke_memobj_ref { };
  struct __invoke_memobj_deref { };
  struct __invoke_other { };


  template<typename _Tp, typename _Tag>
    struct __result_of_success : __success_type<_Tp>
    { using __invoke_type = _Tag; };


  struct __result_of_memfun_ref_impl
  {
    template<typename _Fp, typename _Tp1, typename... _Args>
      static __result_of_success<decltype(
      (std::declval<_Tp1>().*std::declval<_Fp>())(std::declval<_Args>()...)
      ), __invoke_memfun_ref> _S_test(int);

    template<typename...>
      static __failure_type _S_test(...);
  };

  template<typename _MemPtr, typename _Arg, typename... _Args>
    struct __result_of_memfun_ref
    : private __result_of_memfun_ref_impl
    {
      typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type;
    };


  struct __result_of_memfun_deref_impl
  {
    template<typename _Fp, typename _Tp1, typename... _Args>
      static __result_of_success<decltype(
      ((*std::declval<_Tp1>()).*std::declval<_Fp>())(std::declval<_Args>()...)
      ), __invoke_memfun_deref> _S_test(int);

    template<typename...>
      static __failure_type _S_test(...);
  };

  template<typename _MemPtr, typename _Arg, typename... _Args>
    struct __result_of_memfun_deref
    : private __result_of_memfun_deref_impl
    {
      typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type;
    };


  struct __result_of_memobj_ref_impl
  {
    template<typename _Fp, typename _Tp1>
      static __result_of_success<decltype(
      std::declval<_Tp1>().*std::declval<_Fp>()
      ), __invoke_memobj_ref> _S_test(int);

    template<typename, typename>
      static __failure_type _S_test(...);
  };

  template<typename _MemPtr, typename _Arg>
    struct __result_of_memobj_ref
    : private __result_of_memobj_ref_impl
    {
      typedef decltype(_S_test<_MemPtr, _Arg>(0)) type;
    };


  struct __result_of_memobj_deref_impl
  {
    template<typename _Fp, typename _Tp1>
      static __result_of_success<decltype(
      (*std::declval<_Tp1>()).*std::declval<_Fp>()
      ), __invoke_memobj_deref> _S_test(int);

    template<typename, typename>
      static __failure_type _S_test(...);
  };

  template<typename _MemPtr, typename _Arg>
    struct __result_of_memobj_deref
    : private __result_of_memobj_deref_impl
    {
      typedef decltype(_S_test<_MemPtr, _Arg>(0)) type;
    };

  template<typename _MemPtr, typename _Arg>
    struct __result_of_memobj;

  template<typename _Res, typename _Class, typename _Arg>
    struct __result_of_memobj<_Res _Class::*, _Arg>
    {
      typedef typename remove_cv<typename remove_reference<
        _Arg>::type>::type _Argval;
      typedef _Res _Class::* _MemPtr;
      typedef typename conditional<__or_<is_same<_Argval, _Class>,
        is_base_of<_Class, _Argval>>::value,
        __result_of_memobj_ref<_MemPtr, _Arg>,
        __result_of_memobj_deref<_MemPtr, _Arg>
      >::type::type type;
    };

  template<typename _MemPtr, typename _Arg, typename... _Args>
    struct __result_of_memfun;

  template<typename _Res, typename _Class, typename _Arg, typename... _Args>
    struct __result_of_memfun<_Res _Class::*, _Arg, _Args...>
    {
      typedef typename remove_cv<typename remove_reference<
        _Arg>::type>::type _Argval;
      typedef _Res _Class::* _MemPtr;
      typedef typename conditional<__or_<is_same<_Argval, _Class>,
        is_base_of<_Class, _Argval>>::value,
        __result_of_memfun_ref<_MemPtr, _Arg, _Args...>,
        __result_of_memfun_deref<_MemPtr, _Arg, _Args...>
      >::type::type type;
    };





  template<typename _Res, typename _Class, typename _Arg>
    struct __result_of_memobj<_Res _Class::*, reference_wrapper<_Arg>>
    : __result_of_memobj_ref<_Res _Class::*, _Arg&>
    { };

  template<typename _Res, typename _Class, typename _Arg>
    struct __result_of_memobj<_Res _Class::*, reference_wrapper<_Arg>&>
    : __result_of_memobj_ref<_Res _Class::*, _Arg&>
    { };

  template<typename _Res, typename _Class, typename _Arg>
    struct __result_of_memobj<_Res _Class::*, const reference_wrapper<_Arg>&>
    : __result_of_memobj_ref<_Res _Class::*, _Arg&>
    { };

  template<typename _Res, typename _Class, typename _Arg>
    struct __result_of_memobj<_Res _Class::*, reference_wrapper<_Arg>&&>
    : __result_of_memobj_ref<_Res _Class::*, _Arg&>
    { };

  template<typename _Res, typename _Class, typename _Arg>
    struct __result_of_memobj<_Res _Class::*, const reference_wrapper<_Arg>&&>
    : __result_of_memobj_ref<_Res _Class::*, _Arg&>
    { };

  template<typename _Res, typename _Class, typename _Arg, typename... _Args>
    struct __result_of_memfun<_Res _Class::*, reference_wrapper<_Arg>, _Args...>
    : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...>
    { };

  template<typename _Res, typename _Class, typename _Arg, typename... _Args>
    struct __result_of_memfun<_Res _Class::*, reference_wrapper<_Arg>&,
         _Args...>
    : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...>
    { };

  template<typename _Res, typename _Class, typename _Arg, typename... _Args>
    struct __result_of_memfun<_Res _Class::*, const reference_wrapper<_Arg>&,
         _Args...>
    : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...>
    { };

  template<typename _Res, typename _Class, typename _Arg, typename... _Args>
    struct __result_of_memfun<_Res _Class::*, reference_wrapper<_Arg>&&,
         _Args...>
    : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...>
    { };

  template<typename _Res, typename _Class, typename _Arg, typename... _Args>
    struct __result_of_memfun<_Res _Class::*, const reference_wrapper<_Arg>&&,
         _Args...>
    : __result_of_memfun_ref<_Res _Class::*, _Arg&, _Args...>
    { };

  template<bool, bool, typename _Functor, typename... _ArgTypes>
    struct __result_of_impl
    {
      typedef __failure_type type;
    };

  template<typename _MemPtr, typename _Arg>
    struct __result_of_impl<true, false, _MemPtr, _Arg>
    : public __result_of_memobj<typename decay<_MemPtr>::type, _Arg>
    { };

  template<typename _MemPtr, typename _Arg, typename... _Args>
    struct __result_of_impl<false, true, _MemPtr, _Arg, _Args...>
    : public __result_of_memfun<typename decay<_MemPtr>::type, _Arg, _Args...>
    { };


  struct __result_of_other_impl
  {
    template<typename _Fn, typename... _Args>
      static __result_of_success<decltype(
      std::declval<_Fn>()(std::declval<_Args>()...)
      ), __invoke_other> _S_test(int);

    template<typename...>
      static __failure_type _S_test(...);
  };

  template<typename _Functor, typename... _ArgTypes>
    struct __result_of_impl<false, false, _Functor, _ArgTypes...>
    : private __result_of_other_impl
    {
      typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type;
    };

  template<typename _Functor, typename... _ArgTypes>
    struct result_of<_Functor(_ArgTypes...)>
    : public __result_of_impl<
        is_member_object_pointer<
          typename remove_reference<_Functor>::type
        >::value,
        is_member_function_pointer<
          typename remove_reference<_Functor>::type
        >::value,
     _Functor, _ArgTypes...
      >::type
    { };



  template<size_t _Len, size_t _Align =
     __alignof__(typename __aligned_storage_msa<_Len>::__type)>
    using aligned_storage_t = typename aligned_storage<_Len, _Align>::type;

  template <size_t _Len, typename... _Types>
    using aligned_union_t = typename aligned_union<_Len, _Types...>::type;


  template<typename _Tp>
    using decay_t = typename decay<_Tp>::type;


  template<bool _Cond, typename _Tp = void>
    using enable_if_t = typename enable_if<_Cond, _Tp>::type;


  template<bool _Cond, typename _Iftrue, typename _Iffalse>
    using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type;


  template<typename... _Tp>
    using common_type_t = typename common_type<_Tp...>::type;


  template<typename _Tp>
    using underlying_type_t = typename underlying_type<_Tp>::type;


  template<typename _Tp>
    using result_of_t = typename result_of<_Tp>::type;


  template<typename...> using __void_t = void;
# 2551 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template<typename _Default, typename _AlwaysVoid,
    template<typename...> class _Op, typename... _Args>
    struct __detector
    {
      using value_t = false_type;
      using type = _Default;
    };


  template<typename _Default, template<typename...> class _Op,
     typename... _Args>
    struct __detector<_Default, __void_t<_Op<_Args...>>, _Op, _Args...>
    {
      using value_t = true_type;
      using type = _Op<_Args...>;
    };


  template<typename _Default, template<typename...> class _Op,
    typename... _Args>
    using __detected_or = __detector<_Default, void, _Op, _Args...>;


  template<typename _Default, template<typename...> class _Op,
    typename... _Args>
    using __detected_or_t
      = typename __detected_or<_Default, _Op, _Args...>::type;


  template<template<typename...> class _Default,
    template<typename...> class _Op, typename... _Args>
    using __detected_or_t_ =
      __detected_or_t<_Default<_Args...>, _Op, _Args...>;
# 2601 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/type_traits" 3
  template <typename _Tp>
    struct __is_swappable;

  template <typename _Tp>
    struct __is_nothrow_swappable;

  template<typename _Tp>
    inline
    typename enable_if<__and_<is_move_constructible<_Tp>,
         is_move_assignable<_Tp>>::value>::type
    swap(_Tp&, _Tp&)
    noexcept(__and_<is_nothrow_move_constructible<_Tp>,
             is_nothrow_move_assignable<_Tp>>::value);

  template<typename _Tp, size_t _Nm>
    inline
    typename enable_if<__is_swappable<_Tp>::value>::type
    swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
    noexcept(__is_nothrow_swappable<_Tp>::value);

  namespace __swappable_details {
    using std::swap;

    struct __do_is_swappable_impl
    {
      template<typename _Tp, typename
               = decltype(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))>
        static true_type __test(int);

      template<typename>
        static false_type __test(...);
    };

    struct __do_is_nothrow_swappable_impl
    {
      template<typename _Tp>
        static __bool_constant<
          noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))
        > __test(int);

      template<typename>
        static false_type __test(...);
    };

  }

  template<typename _Tp>
    struct __is_swappable_impl
    : public __swappable_details::__do_is_swappable_impl
    {
      typedef decltype(__test<_Tp>(0)) type;
    };

  template<typename _Tp>
    struct __is_nothrow_swappable_impl
    : public __swappable_details::__do_is_nothrow_swappable_impl
    {
      typedef decltype(__test<_Tp>(0)) type;
    };

  template<typename _Tp>
    struct __is_swappable
    : public __is_swappable_impl<_Tp>::type
    { };

  template<typename _Tp>
    struct __is_nothrow_swappable
    : public __is_nothrow_swappable_impl<_Tp>::type
    { };


}
# 58 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 74 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3
  template<typename _Tp>
    constexpr _Tp&&
    forward(typename std::remove_reference<_Tp>::type& __t) noexcept
    { return static_cast<_Tp&&>(__t); }







  template<typename _Tp>
    constexpr _Tp&&
    forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
    {
      static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument"
      " substituting _Tp is an lvalue reference type");
      return static_cast<_Tp&&>(__t);
    }






  template<typename _Tp>
    constexpr typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t) noexcept
    { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }


  template<typename _Tp>
    struct __move_if_noexcept_cond
    : public __and_<__not_<is_nothrow_move_constructible<_Tp>>,
                    is_copy_constructible<_Tp>>::type { };
# 118 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3
  template<typename _Tp>
    constexpr typename
    conditional<__move_if_noexcept_cond<_Tp>::value, const _Tp&, _Tp&&>::type
    move_if_noexcept(_Tp& __x) noexcept
    { return std::move(__x); }
# 133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3
  template<typename _Tp>
    inline _Tp*
    addressof(_Tp& __r) noexcept
    { return std::__addressof(__r); }


  template <typename _Tp, typename _Up = _Tp>
    inline _Tp
    __exchange(_Tp& __obj, _Up&& __new_val)
    {
      _Tp __old_val = std::move(__obj);
      __obj = std::forward<_Up>(__new_val);
      return __old_val;
    }



}
# 159 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 174 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/move.h" 3
  template<typename _Tp>
    inline

    typename enable_if<__and_<is_move_constructible<_Tp>,
         is_move_assignable<_Tp>>::value>::type
    swap(_Tp& __a, _Tp& __b)
    noexcept(__and_<is_nothrow_move_constructible<_Tp>,
             is_nothrow_move_assignable<_Tp>>::value)




    {



      _Tp __tmp = std::move(__a);
      __a = std::move(__b);
      __b = std::move(__tmp);
    }




  template<typename _Tp, size_t _Nm>
    inline

    typename enable_if<__is_swappable<_Tp>::value>::type
    swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
    noexcept(__is_nothrow_swappable<_Tp>::value)




    {
      for (size_t __n = 0; __n < _Nm; ++__n)
 swap(__a[__n], __b[__n]);
    }



}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/nested_exception.h" 2 3





extern "C++" {

namespace std
{






  class nested_exception
  {
    exception_ptr _M_ptr;

  public:
    nested_exception() noexcept : _M_ptr(current_exception()) { }

    nested_exception(const nested_exception&) noexcept = default;

    nested_exception& operator=(const nested_exception&) noexcept = default;

    virtual ~nested_exception() noexcept;

    [[noreturn]]
    void
    rethrow_nested() const
    {
      if (_M_ptr)
 rethrow_exception(_M_ptr);
      std::terminate();
    }

    exception_ptr
    nested_ptr() const noexcept
    { return _M_ptr; }
  };

  template<typename _Except>
    struct _Nested_exception : public _Except, public nested_exception
    {
      explicit _Nested_exception(const _Except& __ex)
      : _Except(__ex)
      { }

      explicit _Nested_exception(_Except&& __ex)
      : _Except(static_cast<_Except&&>(__ex))
      { }
    };




  template<typename _Tp>
    inline void
    __throw_with_nested_impl(_Tp&& __t, true_type)
    {
      using _Up = typename remove_reference<_Tp>::type;
      throw _Nested_exception<_Up>{std::forward<_Tp>(__t)};
    }

  template<typename _Tp>
    inline void
    __throw_with_nested_impl(_Tp&& __t, false_type)
    { throw std::forward<_Tp>(__t); }



  template<typename _Tp>
    [[noreturn]]
    inline void
    throw_with_nested(_Tp&& __t)
    {
      using _Up = typename remove_reference<_Tp>::type;
      using _CopyConstructible
 = __and_<is_copy_constructible<_Up>, is_move_constructible<_Up>>;
      static_assert(_CopyConstructible::value,
   "throw_with_nested argument must be CopyConstructible");
      using __nest = __and_<is_class<_Up>, __bool_constant<!__is_final(_Up)>,
       __not_<is_base_of<nested_exception, _Up>>>;
      std::__throw_with_nested_impl(std::forward<_Tp>(__t), __nest{});
    }


  template<typename _Tp>
    using __rethrow_if_nested_cond = typename enable_if<
      __and_<is_polymorphic<_Tp>,
      __or_<__not_<is_base_of<nested_exception, _Tp>>,
     is_convertible<_Tp*, nested_exception*>>>::value
    >::type;


  template<typename _Ex>
    inline __rethrow_if_nested_cond<_Ex>
    __rethrow_if_nested_impl(const _Ex* __ptr)
    {
      if (auto __ne_ptr = dynamic_cast<const nested_exception*>(__ptr))
 __ne_ptr->rethrow_nested();
    }


  inline void
  __rethrow_if_nested_impl(const void*)
  { }


  template<typename _Ex>
    inline void
    rethrow_if_nested(const _Ex& __ex)
    { std::__rethrow_if_nested_impl(std::__addressof(__ex)); }


}

}



#pragma GCC visibility pop
# 172 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/exception" 2 3
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 2 3

#pragma GCC visibility push(default)

extern "C++" {

namespace std
{






  class bad_alloc : public exception
  {
  public:
    bad_alloc() throw() { }



    virtual ~bad_alloc() throw();


    virtual const char* what() const throw();
  };


  class bad_array_new_length : public bad_alloc
  {
  public:
    bad_array_new_length() throw() { };



    virtual ~bad_array_new_length() throw();


    virtual const char* what() const throw();
  };


  struct nothrow_t
  {

    explicit nothrow_t() = default;

  };

  extern const nothrow_t nothrow;



  typedef void (*new_handler)();



  new_handler set_new_handler(new_handler) throw();



  new_handler get_new_handler() noexcept;

}
# 116 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 3
void* operator new(std::size_t)
  __attribute__((__externally_visible__));
void* operator new[](std::size_t)
  __attribute__((__externally_visible__));
void operator delete(void*) noexcept
  __attribute__((__externally_visible__));
void operator delete[](void*) noexcept
  __attribute__((__externally_visible__));






void* operator new(std::size_t, const std::nothrow_t&) noexcept
  __attribute__((__externally_visible__));
void* operator new[](std::size_t, const std::nothrow_t&) noexcept
  __attribute__((__externally_visible__));
void operator delete(void*, const std::nothrow_t&) noexcept
  __attribute__((__externally_visible__));
void operator delete[](void*, const std::nothrow_t&) noexcept
  __attribute__((__externally_visible__));
# 146 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/new" 3
inline void* operator new(std::size_t, void* __p) noexcept
{ return __p; }
inline void* operator new[](std::size_t, void* __p) noexcept
{ return __p; }


inline void operator delete (void*, void*) noexcept { }
inline void operator delete[](void*, void*) noexcept { }

}

#pragma GCC visibility pop
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2




# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
# 75 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
# 1 "/usr/include/stdlib.h" 1 3 4
# 32 "/usr/include/stdlib.h" 3 4
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 62 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3 4
typedef long unsigned int size_t;
# 33 "/usr/include/stdlib.h" 2 3 4

extern "C" {







# 1 "/usr/include/bits/waitflags.h" 1 3 4
# 42 "/usr/include/stdlib.h" 2 3 4
# 1 "/usr/include/bits/waitstatus.h" 1 3 4
# 43 "/usr/include/stdlib.h" 2 3 4
# 58 "/usr/include/stdlib.h" 3 4
typedef struct
  {
    int quot;
    int rem;
  } div_t;



typedef struct
  {
    long int quot;
    long int rem;
  } ldiv_t;







__extension__ typedef struct
  {
    long long int quot;
    long long int rem;
  } lldiv_t;
# 100 "/usr/include/stdlib.h" 3 4
extern size_t __ctype_get_mb_cur_max (void) throw () ;




extern double atof (const char *__nptr)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;

extern int atoi (const char *__nptr)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;

extern long int atol (const char *__nptr)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;





__extension__ extern long long int atoll (const char *__nptr)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;





extern double strtod (const char *__restrict __nptr,
        char **__restrict __endptr)
     throw () __attribute__ ((__nonnull__ (1)));





extern float strtof (const char *__restrict __nptr,
       char **__restrict __endptr) throw () __attribute__ ((__nonnull__ (1)));

extern long double strtold (const char *__restrict __nptr,
       char **__restrict __endptr)
     throw () __attribute__ ((__nonnull__ (1)));





extern long int strtol (const char *__restrict __nptr,
   char **__restrict __endptr, int __base)
     throw () __attribute__ ((__nonnull__ (1)));

extern unsigned long int strtoul (const char *__restrict __nptr,
      char **__restrict __endptr, int __base)
     throw () __attribute__ ((__nonnull__ (1)));




__extension__
extern long long int strtoq (const char *__restrict __nptr,
        char **__restrict __endptr, int __base)
     throw () __attribute__ ((__nonnull__ (1)));

__extension__
extern unsigned long long int strtouq (const char *__restrict __nptr,
           char **__restrict __endptr, int __base)
     throw () __attribute__ ((__nonnull__ (1)));





__extension__
extern long long int strtoll (const char *__restrict __nptr,
         char **__restrict __endptr, int __base)
     throw () __attribute__ ((__nonnull__ (1)));

__extension__
extern unsigned long long int strtoull (const char *__restrict __nptr,
     char **__restrict __endptr, int __base)
     throw () __attribute__ ((__nonnull__ (1)));
# 196 "/usr/include/stdlib.h" 3 4
# 1 "/usr/include/xlocale.h" 1 3 4
# 27 "/usr/include/xlocale.h" 3 4
typedef struct __locale_struct
{

  struct __locale_data *__locales[13];


  const unsigned short int *__ctype_b;
  const int *__ctype_tolower;
  const int *__ctype_toupper;


  const char *__names[13];
} *__locale_t;


typedef __locale_t locale_t;
# 197 "/usr/include/stdlib.h" 2 3 4



extern long int strtol_l (const char *__restrict __nptr,
     char **__restrict __endptr, int __base,
     __locale_t __loc) throw () __attribute__ ((__nonnull__ (1, 4)));

extern unsigned long int strtoul_l (const char *__restrict __nptr,
        char **__restrict __endptr,
        int __base, __locale_t __loc)
     throw () __attribute__ ((__nonnull__ (1, 4)));

__extension__
extern long long int strtoll_l (const char *__restrict __nptr,
    char **__restrict __endptr, int __base,
    __locale_t __loc)
     throw () __attribute__ ((__nonnull__ (1, 4)));

__extension__
extern unsigned long long int strtoull_l (const char *__restrict __nptr,
       char **__restrict __endptr,
       int __base, __locale_t __loc)
     throw () __attribute__ ((__nonnull__ (1, 4)));

extern double strtod_l (const char *__restrict __nptr,
   char **__restrict __endptr, __locale_t __loc)
     throw () __attribute__ ((__nonnull__ (1, 3)));

extern float strtof_l (const char *__restrict __nptr,
         char **__restrict __endptr, __locale_t __loc)
     throw () __attribute__ ((__nonnull__ (1, 3)));

extern long double strtold_l (const char *__restrict __nptr,
         char **__restrict __endptr,
         __locale_t __loc)
     throw () __attribute__ ((__nonnull__ (1, 3)));
# 266 "/usr/include/stdlib.h" 3 4
extern char *l64a (long int __n) throw () ;


extern long int a64l (const char *__s)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;





# 1 "/usr/include/sys/types.h" 1 3 4
# 27 "/usr/include/sys/types.h" 3 4
extern "C" {


# 1 "/usr/include/bits/types.h" 1 3 4
# 27 "/usr/include/bits/types.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 28 "/usr/include/bits/types.h" 2 3 4


typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
typedef unsigned long int __u_long;


typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;

typedef signed long int __int64_t;
typedef unsigned long int __uint64_t;







typedef long int __quad_t;
typedef unsigned long int __u_quad_t;
# 121 "/usr/include/bits/types.h" 3 4
# 1 "/usr/include/bits/typesizes.h" 1 3 4
# 122 "/usr/include/bits/types.h" 2 3 4


typedef unsigned long int __dev_t;
typedef unsigned int __uid_t;
typedef unsigned int __gid_t;
typedef unsigned long int __ino_t;
typedef unsigned long int __ino64_t;
typedef unsigned int __mode_t;
typedef unsigned long int __nlink_t;
typedef long int __off_t;
typedef long int __off64_t;
typedef int __pid_t;
typedef struct { int __val[2]; } __fsid_t;
typedef long int __clock_t;
typedef unsigned long int __rlim_t;
typedef unsigned long int __rlim64_t;
typedef unsigned int __id_t;
typedef long int __time_t;
typedef unsigned int __useconds_t;
typedef long int __suseconds_t;

typedef int __daddr_t;
typedef int __key_t;


typedef int __clockid_t;


typedef void * __timer_t;


typedef long int __blksize_t;




typedef long int __blkcnt_t;
typedef long int __blkcnt64_t;


typedef unsigned long int __fsblkcnt_t;
typedef unsigned long int __fsblkcnt64_t;


typedef unsigned long int __fsfilcnt_t;
typedef unsigned long int __fsfilcnt64_t;


typedef long int __fsword_t;

typedef long int __ssize_t;


typedef long int __syscall_slong_t;

typedef unsigned long int __syscall_ulong_t;



typedef __off64_t __loff_t;
typedef __quad_t *__qaddr_t;
typedef char *__caddr_t;


typedef long int __intptr_t;


typedef unsigned int __socklen_t;
# 30 "/usr/include/sys/types.h" 2 3 4



typedef __u_char u_char;
typedef __u_short u_short;
typedef __u_int u_int;
typedef __u_long u_long;
typedef __quad_t quad_t;
typedef __u_quad_t u_quad_t;
typedef __fsid_t fsid_t;




typedef __loff_t loff_t;



typedef __ino_t ino_t;






typedef __ino64_t ino64_t;




typedef __dev_t dev_t;




typedef __gid_t gid_t;




typedef __mode_t mode_t;




typedef __nlink_t nlink_t;




typedef __uid_t uid_t;





typedef __off_t off_t;






typedef __off64_t off64_t;




typedef __pid_t pid_t;





typedef __id_t id_t;




typedef __ssize_t ssize_t;





typedef __daddr_t daddr_t;
typedef __caddr_t caddr_t;





typedef __key_t key_t;
# 132 "/usr/include/sys/types.h" 3 4
# 1 "/usr/include/time.h" 1 3 4
# 59 "/usr/include/time.h" 3 4
typedef __clock_t clock_t;
# 75 "/usr/include/time.h" 3 4
typedef __time_t time_t;
# 91 "/usr/include/time.h" 3 4
typedef __clockid_t clockid_t;
# 103 "/usr/include/time.h" 3 4
typedef __timer_t timer_t;
# 133 "/usr/include/sys/types.h" 2 3 4



typedef __useconds_t useconds_t;



typedef __suseconds_t suseconds_t;






# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 147 "/usr/include/sys/types.h" 2 3 4



typedef unsigned long int ulong;
typedef unsigned short int ushort;
typedef unsigned int uint;
# 194 "/usr/include/sys/types.h" 3 4
typedef int int8_t __attribute__ ((__mode__ (__QI__)));
typedef int int16_t __attribute__ ((__mode__ (__HI__)));
typedef int int32_t __attribute__ ((__mode__ (__SI__)));
typedef int int64_t __attribute__ ((__mode__ (__DI__)));


typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__)));
typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__)));

typedef int register_t __attribute__ ((__mode__ (__word__)));
# 216 "/usr/include/sys/types.h" 3 4
# 1 "/usr/include/endian.h" 1 3 4
# 36 "/usr/include/endian.h" 3 4
# 1 "/usr/include/bits/endian.h" 1 3 4
# 37 "/usr/include/endian.h" 2 3 4
# 60 "/usr/include/endian.h" 3 4
# 1 "/usr/include/bits/byteswap.h" 1 3 4
# 28 "/usr/include/bits/byteswap.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 29 "/usr/include/bits/byteswap.h" 2 3 4






# 1 "/usr/include/bits/byteswap-16.h" 1 3 4
# 36 "/usr/include/bits/byteswap.h" 2 3 4
# 61 "/usr/include/endian.h" 2 3 4
# 217 "/usr/include/sys/types.h" 2 3 4


# 1 "/usr/include/sys/select.h" 1 3 4
# 30 "/usr/include/sys/select.h" 3 4
# 1 "/usr/include/bits/select.h" 1 3 4
# 22 "/usr/include/bits/select.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 23 "/usr/include/bits/select.h" 2 3 4
# 31 "/usr/include/sys/select.h" 2 3 4


# 1 "/usr/include/bits/sigset.h" 1 3 4
# 22 "/usr/include/bits/sigset.h" 3 4
typedef int __sig_atomic_t;




typedef struct
  {
    unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))];
  } __sigset_t;
# 34 "/usr/include/sys/select.h" 2 3 4



typedef __sigset_t sigset_t;








# 1 "/usr/include/time.h" 1 3 4
# 120 "/usr/include/time.h" 3 4
struct timespec
  {
    __time_t tv_sec;
    __syscall_slong_t tv_nsec;
  };
# 46 "/usr/include/sys/select.h" 2 3 4

# 1 "/usr/include/bits/time.h" 1 3 4
# 30 "/usr/include/bits/time.h" 3 4
struct timeval
  {
    __time_t tv_sec;
    __suseconds_t tv_usec;
  };
# 48 "/usr/include/sys/select.h" 2 3 4








typedef long int __fd_mask;
# 66 "/usr/include/sys/select.h" 3 4
typedef struct
  {



    __fd_mask fds_bits[1024 / (8 * (int) sizeof (__fd_mask))];





  } fd_set;






typedef __fd_mask fd_mask;
# 98 "/usr/include/sys/select.h" 3 4
extern "C" {
# 108 "/usr/include/sys/select.h" 3 4
extern int select (int __nfds, fd_set *__restrict __readfds,
     fd_set *__restrict __writefds,
     fd_set *__restrict __exceptfds,
     struct timeval *__restrict __timeout);
# 120 "/usr/include/sys/select.h" 3 4
extern int pselect (int __nfds, fd_set *__restrict __readfds,
      fd_set *__restrict __writefds,
      fd_set *__restrict __exceptfds,
      const struct timespec *__restrict __timeout,
      const __sigset_t *__restrict __sigmask);
# 133 "/usr/include/sys/select.h" 3 4
}
# 220 "/usr/include/sys/types.h" 2 3 4


# 1 "/usr/include/sys/sysmacros.h" 1 3 4
# 24 "/usr/include/sys/sysmacros.h" 3 4
extern "C" {

__extension__
extern unsigned int gnu_dev_major (unsigned long long int __dev)
     throw () __attribute__ ((__const__));
__extension__
extern unsigned int gnu_dev_minor (unsigned long long int __dev)
     throw () __attribute__ ((__const__));
__extension__
extern unsigned long long int gnu_dev_makedev (unsigned int __major,
            unsigned int __minor)
     throw () __attribute__ ((__const__));
# 58 "/usr/include/sys/sysmacros.h" 3 4
}
# 223 "/usr/include/sys/types.h" 2 3 4





typedef __blksize_t blksize_t;






typedef __blkcnt_t blkcnt_t;



typedef __fsblkcnt_t fsblkcnt_t;



typedef __fsfilcnt_t fsfilcnt_t;
# 262 "/usr/include/sys/types.h" 3 4
typedef __blkcnt64_t blkcnt64_t;
typedef __fsblkcnt64_t fsblkcnt64_t;
typedef __fsfilcnt64_t fsfilcnt64_t;






# 1 "/usr/include/bits/pthreadtypes.h" 1 3 4
# 21 "/usr/include/bits/pthreadtypes.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 22 "/usr/include/bits/pthreadtypes.h" 2 3 4
# 60 "/usr/include/bits/pthreadtypes.h" 3 4
typedef unsigned long int pthread_t;


union pthread_attr_t
{
  char __size[56];
  long int __align;
};

typedef union pthread_attr_t pthread_attr_t;





typedef struct __pthread_internal_list
{
  struct __pthread_internal_list *__prev;
  struct __pthread_internal_list *__next;
} __pthread_list_t;
# 90 "/usr/include/bits/pthreadtypes.h" 3 4
typedef union
{
  struct __pthread_mutex_s
  {
    int __lock;
    unsigned int __count;
    int __owner;

    unsigned int __nusers;



    int __kind;

    short __spins;
    short __elision;
    __pthread_list_t __list;
# 125 "/usr/include/bits/pthreadtypes.h" 3 4
  } __data;
  char __size[40];
  long int __align;
} pthread_mutex_t;

typedef union
{
  char __size[4];
  int __align;
} pthread_mutexattr_t;




typedef union
{
  struct
  {
    int __lock;
    unsigned int __futex;
    __extension__ unsigned long long int __total_seq;
    __extension__ unsigned long long int __wakeup_seq;
    __extension__ unsigned long long int __woken_seq;
    void *__mutex;
    unsigned int __nwaiters;
    unsigned int __broadcast_seq;
  } __data;
  char __size[48];
  __extension__ long long int __align;
} pthread_cond_t;

typedef union
{
  char __size[4];
  int __align;
} pthread_condattr_t;



typedef unsigned int pthread_key_t;



typedef int pthread_once_t;





typedef union
{

  struct
  {
    int __lock;
    unsigned int __nr_readers;
    unsigned int __readers_wakeup;
    unsigned int __writer_wakeup;
    unsigned int __nr_readers_queued;
    unsigned int __nr_writers_queued;
    int __writer;
    int __shared;
    signed char __rwelision;




    unsigned char __pad1[7];


    unsigned long int __pad2;


    unsigned int __flags;

  } __data;
# 220 "/usr/include/bits/pthreadtypes.h" 3 4
  char __size[56];
  long int __align;
} pthread_rwlock_t;

typedef union
{
  char __size[8];
  long int __align;
} pthread_rwlockattr_t;





typedef volatile int pthread_spinlock_t;




typedef union
{
  char __size[32];
  long int __align;
} pthread_barrier_t;

typedef union
{
  char __size[4];
  int __align;
} pthread_barrierattr_t;
# 271 "/usr/include/sys/types.h" 2 3 4


}
# 276 "/usr/include/stdlib.h" 2 3 4






extern long int random (void) throw ();


extern void srandom (unsigned int __seed) throw ();





extern char *initstate (unsigned int __seed, char *__statebuf,
   size_t __statelen) throw () __attribute__ ((__nonnull__ (2)));



extern char *setstate (char *__statebuf) throw () __attribute__ ((__nonnull__ (1)));







struct random_data
  {
    int32_t *fptr;
    int32_t *rptr;
    int32_t *state;
    int rand_type;
    int rand_deg;
    int rand_sep;
    int32_t *end_ptr;
  };

extern int random_r (struct random_data *__restrict __buf,
       int32_t *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2)));

extern int srandom_r (unsigned int __seed, struct random_data *__buf)
     throw () __attribute__ ((__nonnull__ (2)));

extern int initstate_r (unsigned int __seed, char *__restrict __statebuf,
   size_t __statelen,
   struct random_data *__restrict __buf)
     throw () __attribute__ ((__nonnull__ (2, 4)));

extern int setstate_r (char *__restrict __statebuf,
         struct random_data *__restrict __buf)
     throw () __attribute__ ((__nonnull__ (1, 2)));






extern int rand (void) throw ();

extern void srand (unsigned int __seed) throw ();




extern int rand_r (unsigned int *__seed) throw ();







extern double drand48 (void) throw ();
extern double erand48 (unsigned short int __xsubi[3]) throw () __attribute__ ((__nonnull__ (1)));


extern long int lrand48 (void) throw ();
extern long int nrand48 (unsigned short int __xsubi[3])
     throw () __attribute__ ((__nonnull__ (1)));


extern long int mrand48 (void) throw ();
extern long int jrand48 (unsigned short int __xsubi[3])
     throw () __attribute__ ((__nonnull__ (1)));


extern void srand48 (long int __seedval) throw ();
extern unsigned short int *seed48 (unsigned short int __seed16v[3])
     throw () __attribute__ ((__nonnull__ (1)));
extern void lcong48 (unsigned short int __param[7]) throw () __attribute__ ((__nonnull__ (1)));





struct drand48_data
  {
    unsigned short int __x[3];
    unsigned short int __old_x[3];
    unsigned short int __c;
    unsigned short int __init;
    __extension__ unsigned long long int __a;

  };


extern int drand48_r (struct drand48_data *__restrict __buffer,
        double *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2)));
extern int erand48_r (unsigned short int __xsubi[3],
        struct drand48_data *__restrict __buffer,
        double *__restrict __result) throw () __attribute__ ((__nonnull__ (1, 2)));


extern int lrand48_r (struct drand48_data *__restrict __buffer,
        long int *__restrict __result)
     throw () __attribute__ ((__nonnull__ (1, 2)));
extern int nrand48_r (unsigned short int __xsubi[3],
        struct drand48_data *__restrict __buffer,
        long int *__restrict __result)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int mrand48_r (struct drand48_data *__restrict __buffer,
        long int *__restrict __result)
     throw () __attribute__ ((__nonnull__ (1, 2)));
extern int jrand48_r (unsigned short int __xsubi[3],
        struct drand48_data *__restrict __buffer,
        long int *__restrict __result)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
     throw () __attribute__ ((__nonnull__ (2)));

extern int seed48_r (unsigned short int __seed16v[3],
       struct drand48_data *__buffer) throw () __attribute__ ((__nonnull__ (1, 2)));

extern int lcong48_r (unsigned short int __param[7],
        struct drand48_data *__buffer)
     throw () __attribute__ ((__nonnull__ (1, 2)));
# 427 "/usr/include/stdlib.h" 3 4
extern void *malloc (size_t __size) throw () __attribute__ ((__malloc__)) ;

extern void *calloc (size_t __nmemb, size_t __size)
     throw () __attribute__ ((__malloc__)) ;
# 441 "/usr/include/stdlib.h" 3 4
extern void *realloc (void *__ptr, size_t __size)
     throw () __attribute__ ((__warn_unused_result__));

extern void free (void *__ptr) throw ();




extern void cfree (void *__ptr) throw ();




# 1 "/usr/include/alloca.h" 1 3 4
# 24 "/usr/include/alloca.h" 3 4
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 25 "/usr/include/alloca.h" 2 3 4

extern "C" {





extern void *alloca (size_t __size) throw ();





}
# 454 "/usr/include/stdlib.h" 2 3 4





extern void *valloc (size_t __size) throw () __attribute__ ((__malloc__)) ;




extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size)
     throw () __attribute__ ((__nonnull__ (1))) ;




extern void *aligned_alloc (size_t __alignment, size_t __size)
     throw () __attribute__ ((__malloc__)) ;




extern void abort (void) throw () __attribute__ ((__noreturn__));



extern int atexit (void (*__func) (void)) throw () __attribute__ ((__nonnull__ (1)));




extern "C++" int at_quick_exit (void (*__func) (void))
     throw () __asm ("at_quick_exit") __attribute__ ((__nonnull__ (1)));
# 496 "/usr/include/stdlib.h" 3 4
extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg)
     throw () __attribute__ ((__nonnull__ (1)));






extern void exit (int __status) throw () __attribute__ ((__noreturn__));





extern void quick_exit (int __status) throw () __attribute__ ((__noreturn__));







extern void _Exit (int __status) throw () __attribute__ ((__noreturn__));






extern char *getenv (const char *__name) throw () __attribute__ ((__nonnull__ (1))) ;





extern char *secure_getenv (const char *__name)
     throw () __attribute__ ((__nonnull__ (1))) ;






extern int putenv (char *__string) throw () __attribute__ ((__nonnull__ (1)));





extern int setenv (const char *__name, const char *__value, int __replace)
     throw () __attribute__ ((__nonnull__ (2)));


extern int unsetenv (const char *__name) throw () __attribute__ ((__nonnull__ (1)));






extern int clearenv (void) throw ();
# 567 "/usr/include/stdlib.h" 3 4
extern char *mktemp (char *__template) throw () __attribute__ ((__nonnull__ (1)));
# 580 "/usr/include/stdlib.h" 3 4
extern int mkstemp (char *__template) __attribute__ ((__nonnull__ (1))) ;
# 590 "/usr/include/stdlib.h" 3 4
extern int mkstemp64 (char *__template) __attribute__ ((__nonnull__ (1))) ;
# 602 "/usr/include/stdlib.h" 3 4
extern int mkstemps (char *__template, int __suffixlen) __attribute__ ((__nonnull__ (1))) ;
# 612 "/usr/include/stdlib.h" 3 4
extern int mkstemps64 (char *__template, int __suffixlen)
     __attribute__ ((__nonnull__ (1))) ;
# 623 "/usr/include/stdlib.h" 3 4
extern char *mkdtemp (char *__template) throw () __attribute__ ((__nonnull__ (1))) ;
# 634 "/usr/include/stdlib.h" 3 4
extern int mkostemp (char *__template, int __flags) __attribute__ ((__nonnull__ (1))) ;
# 644 "/usr/include/stdlib.h" 3 4
extern int mkostemp64 (char *__template, int __flags) __attribute__ ((__nonnull__ (1))) ;
# 654 "/usr/include/stdlib.h" 3 4
extern int mkostemps (char *__template, int __suffixlen, int __flags)
     __attribute__ ((__nonnull__ (1))) ;
# 666 "/usr/include/stdlib.h" 3 4
extern int mkostemps64 (char *__template, int __suffixlen, int __flags)
     __attribute__ ((__nonnull__ (1))) ;
# 677 "/usr/include/stdlib.h" 3 4
extern int system (const char *__command) ;






extern char *canonicalize_file_name (const char *__name)
     throw () __attribute__ ((__nonnull__ (1))) ;
# 694 "/usr/include/stdlib.h" 3 4
extern char *realpath (const char *__restrict __name,
         char *__restrict __resolved) throw () ;






typedef int (*__compar_fn_t) (const void *, const void *);


typedef __compar_fn_t comparison_fn_t;



typedef int (*__compar_d_fn_t) (const void *, const void *, void *);





extern void *bsearch (const void *__key, const void *__base,
        size_t __nmemb, size_t __size, __compar_fn_t __compar)
     __attribute__ ((__nonnull__ (1, 2, 5))) ;







extern void qsort (void *__base, size_t __nmemb, size_t __size,
     __compar_fn_t __compar) __attribute__ ((__nonnull__ (1, 4)));

extern void qsort_r (void *__base, size_t __nmemb, size_t __size,
       __compar_d_fn_t __compar, void *__arg)
  __attribute__ ((__nonnull__ (1, 4)));




extern int abs (int __x) throw () __attribute__ ((__const__)) ;
extern long int labs (long int __x) throw () __attribute__ ((__const__)) ;



__extension__ extern long long int llabs (long long int __x)
     throw () __attribute__ ((__const__)) ;







extern div_t div (int __numer, int __denom)
     throw () __attribute__ ((__const__)) ;
extern ldiv_t ldiv (long int __numer, long int __denom)
     throw () __attribute__ ((__const__)) ;




__extension__ extern lldiv_t lldiv (long long int __numer,
        long long int __denom)
     throw () __attribute__ ((__const__)) ;
# 772 "/usr/include/stdlib.h" 3 4
extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt,
     int *__restrict __sign) throw () __attribute__ ((__nonnull__ (3, 4))) ;




extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt,
     int *__restrict __sign) throw () __attribute__ ((__nonnull__ (3, 4))) ;




extern char *gcvt (double __value, int __ndigit, char *__buf)
     throw () __attribute__ ((__nonnull__ (3))) ;




extern char *qecvt (long double __value, int __ndigit,
      int *__restrict __decpt, int *__restrict __sign)
     throw () __attribute__ ((__nonnull__ (3, 4))) ;
extern char *qfcvt (long double __value, int __ndigit,
      int *__restrict __decpt, int *__restrict __sign)
     throw () __attribute__ ((__nonnull__ (3, 4))) ;
extern char *qgcvt (long double __value, int __ndigit, char *__buf)
     throw () __attribute__ ((__nonnull__ (3))) ;




extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt,
     int *__restrict __sign, char *__restrict __buf,
     size_t __len) throw () __attribute__ ((__nonnull__ (3, 4, 5)));
extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt,
     int *__restrict __sign, char *__restrict __buf,
     size_t __len) throw () __attribute__ ((__nonnull__ (3, 4, 5)));

extern int qecvt_r (long double __value, int __ndigit,
      int *__restrict __decpt, int *__restrict __sign,
      char *__restrict __buf, size_t __len)
     throw () __attribute__ ((__nonnull__ (3, 4, 5)));
extern int qfcvt_r (long double __value, int __ndigit,
      int *__restrict __decpt, int *__restrict __sign,
      char *__restrict __buf, size_t __len)
     throw () __attribute__ ((__nonnull__ (3, 4, 5)));






extern int mblen (const char *__s, size_t __n) throw ();


extern int mbtowc (wchar_t *__restrict __pwc,
     const char *__restrict __s, size_t __n) throw ();


extern int wctomb (char *__s, wchar_t __wchar) throw ();



extern size_t mbstowcs (wchar_t *__restrict __pwcs,
   const char *__restrict __s, size_t __n) throw ();

extern size_t wcstombs (char *__restrict __s,
   const wchar_t *__restrict __pwcs, size_t __n)
     throw ();
# 848 "/usr/include/stdlib.h" 3 4
extern int rpmatch (const char *__response) throw () __attribute__ ((__nonnull__ (1))) ;
# 859 "/usr/include/stdlib.h" 3 4
extern int getsubopt (char **__restrict __optionp,
        char *const *__restrict __tokens,
        char **__restrict __valuep)
     throw () __attribute__ ((__nonnull__ (1, 2, 3))) ;





extern void setkey (const char *__key) throw () __attribute__ ((__nonnull__ (1)));







extern int posix_openpt (int __oflag) ;







extern int grantpt (int __fd) throw ();



extern int unlockpt (int __fd) throw ();




extern char *ptsname (int __fd) throw () ;






extern int ptsname_r (int __fd, char *__buf, size_t __buflen)
     throw () __attribute__ ((__nonnull__ (2)));


extern int getpt (void);






extern int getloadavg (double __loadavg[], int __nelem)
     throw () __attribute__ ((__nonnull__ (1)));
# 921 "/usr/include/stdlib.h" 3 4
# 1 "/usr/include/bits/stdlib-float.h" 1 3 4
# 922 "/usr/include/stdlib.h" 2 3 4
# 934 "/usr/include/stdlib.h" 3 4
}
# 76 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 2 3
# 118 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
extern "C++"
{
namespace std __attribute__ ((__visibility__ ("default")))
{


  using ::div_t;
  using ::ldiv_t;

  using ::abort;
  using ::abs;
  using ::atexit;


  using ::at_quick_exit;


  using ::atof;
  using ::atoi;
  using ::atol;
  using ::bsearch;
  using ::calloc;
  using ::div;
  using ::exit;
  using ::free;
  using ::getenv;
  using ::labs;
  using ::ldiv;
  using ::malloc;

  using ::mblen;
  using ::mbstowcs;
  using ::mbtowc;

  using ::qsort;


  using ::quick_exit;


  using ::rand;
  using ::realloc;
  using ::srand;
  using ::strtod;
  using ::strtol;
  using ::strtoul;
  using ::system;

  using ::wcstombs;
  using ::wctomb;



  inline long
  abs(long __i) { return __builtin_labs(__i); }

  inline ldiv_t
  div(long __i, long __j) { return ldiv(__i, __j); }



  inline long long
  abs(long long __x) { return __builtin_llabs (__x); }
# 202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
}
# 215 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{



  using ::lldiv_t;





  using ::_Exit;



  using ::llabs;

  inline lldiv_t
  div(long long __n, long long __d)
  { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }

  using ::lldiv;
# 247 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
  using ::atoll;
  using ::strtoll;
  using ::strtoull;

  using ::strtof;
  using ::strtold;


}

namespace std
{

  using ::__gnu_cxx::lldiv_t;

  using ::__gnu_cxx::_Exit;

  using ::__gnu_cxx::llabs;
  using ::__gnu_cxx::div;
  using ::__gnu_cxx::lldiv;

  using ::__gnu_cxx::atoll;
  using ::__gnu_cxx::strtof;
  using ::__gnu_cxx::strtoll;
  using ::__gnu_cxx::strtoull;
  using ::__gnu_cxx::strtold;
}



}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 3


# 1 "/usr/include/string.h" 1 3 4
# 27 "/usr/include/string.h" 3 4
extern "C" {





# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 33 "/usr/include/string.h" 2 3 4
# 42 "/usr/include/string.h" 3 4
extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
       size_t __n) throw () __attribute__ ((__nonnull__ (1, 2)));


extern void *memmove (void *__dest, const void *__src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));






extern void *memccpy (void *__restrict __dest, const void *__restrict __src,
        int __c, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));





extern void *memset (void *__s, int __c, size_t __n) throw () __attribute__ ((__nonnull__ (1)));


extern int memcmp (const void *__s1, const void *__s2, size_t __n)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 92 "/usr/include/string.h" 3 4
extern void *memchr (const void *__s, int __c, size_t __n)
      throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 106 "/usr/include/string.h" 3 4
extern void *rawmemchr (const void *__s, int __c)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 117 "/usr/include/string.h" 3 4
extern void *memrchr (const void *__s, int __c, size_t __n)
      throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));






extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
     throw () __attribute__ ((__nonnull__ (1, 2)));

extern char *strncpy (char *__restrict __dest,
        const char *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern char *strcat (char *__restrict __dest, const char *__restrict __src)
     throw () __attribute__ ((__nonnull__ (1, 2)));

extern char *strncat (char *__restrict __dest, const char *__restrict __src,
        size_t __n) throw () __attribute__ ((__nonnull__ (1, 2)));


extern int strcmp (const char *__s1, const char *__s2)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));

extern int strncmp (const char *__s1, const char *__s2, size_t __n)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern int strcoll (const char *__s1, const char *__s2)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));

extern size_t strxfrm (char *__restrict __dest,
         const char *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (2)));
# 162 "/usr/include/string.h" 3 4
extern int strcoll_l (const char *__s1, const char *__s2, __locale_t __l)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3)));

extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n,
    __locale_t __l) throw () __attribute__ ((__nonnull__ (2, 4)));




extern char *strdup (const char *__s)
     throw () __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));






extern char *strndup (const char *__string, size_t __n)
     throw () __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));
# 231 "/usr/include/string.h" 3 4
extern char *strchr (const char *__s, int __c)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 258 "/usr/include/string.h" 3 4
extern char *strrchr (const char *__s, int __c)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 272 "/usr/include/string.h" 3 4
extern char *strchrnul (const char *__s, int __c)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));






extern size_t strcspn (const char *__s, const char *__reject)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern size_t strspn (const char *__s, const char *__accept)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 310 "/usr/include/string.h" 3 4
extern char *strpbrk (const char *__s, const char *__accept)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 337 "/usr/include/string.h" 3 4
extern char *strstr (const char *__haystack, const char *__needle)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));




extern char *strtok (char *__restrict __s, const char *__restrict __delim)
     throw () __attribute__ ((__nonnull__ (2)));




extern char *__strtok_r (char *__restrict __s,
    const char *__restrict __delim,
    char **__restrict __save_ptr)
     throw () __attribute__ ((__nonnull__ (2, 3)));

extern char *strtok_r (char *__restrict __s, const char *__restrict __delim,
         char **__restrict __save_ptr)
     throw () __attribute__ ((__nonnull__ (2, 3)));
# 368 "/usr/include/string.h" 3 4
extern char *strcasestr (const char *__haystack, const char *__needle)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));







extern void *memmem (const void *__haystack, size_t __haystacklen,
       const void *__needle, size_t __needlelen)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 3)));



extern void *__mempcpy (void *__restrict __dest,
   const void *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));
extern void *mempcpy (void *__restrict __dest,
        const void *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));





extern size_t strlen (const char *__s)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));





extern size_t strnlen (const char *__string, size_t __maxlen)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));





extern char *strerror (int __errnum) throw ();
# 433 "/usr/include/string.h" 3 4
extern char *strerror_r (int __errnum, char *__buf, size_t __buflen)
     throw () __attribute__ ((__nonnull__ (2))) ;





extern char *strerror_l (int __errnum, __locale_t __l) throw ();





extern void __bzero (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1)));



extern void bcopy (const void *__src, void *__dest, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern void bzero (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1)));


extern int bcmp (const void *__s1, const void *__s2, size_t __n)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 484 "/usr/include/string.h" 3 4
extern char *index (const char *__s, int __c)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 512 "/usr/include/string.h" 3 4
extern char *rindex (const char *__s, int __c)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));




extern int ffs (int __i) throw () __attribute__ ((__const__));




extern int ffsl (long int __l) throw () __attribute__ ((__const__));
__extension__ extern int ffsll (long long int __ll)
     throw () __attribute__ ((__const__));



extern int strcasecmp (const char *__s1, const char *__s2)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern int strncasecmp (const char *__s1, const char *__s2, size_t __n)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));





extern int strcasecmp_l (const char *__s1, const char *__s2,
    __locale_t __loc)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3)));

extern int strncasecmp_l (const char *__s1, const char *__s2,
     size_t __n, __locale_t __loc)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 4)));





extern char *strsep (char **__restrict __stringp,
       const char *__restrict __delim)
     throw () __attribute__ ((__nonnull__ (1, 2)));




extern char *strsignal (int __sig) throw ();


extern char *__stpcpy (char *__restrict __dest, const char *__restrict __src)
     throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *stpcpy (char *__restrict __dest, const char *__restrict __src)
     throw () __attribute__ ((__nonnull__ (1, 2)));



extern char *__stpncpy (char *__restrict __dest,
   const char *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));
extern char *stpncpy (char *__restrict __dest,
        const char *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));




extern int strverscmp (const char *__s1, const char *__s2)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern char *strfry (char *__string) throw () __attribute__ ((__nonnull__ (1)));


extern void *memfrob (void *__s, size_t __n) throw () __attribute__ ((__nonnull__ (1)));
# 599 "/usr/include/string.h" 3 4
extern char *basename (const char *__filename) throw () __attribute__ ((__nonnull__ (1)));
# 656 "/usr/include/string.h" 3 4
}
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 2 3
# 71 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  using ::memchr;
  using ::memcmp;
  using ::memcpy;
  using ::memmove;
  using ::memset;
  using ::strcat;
  using ::strcmp;
  using ::strcoll;
  using ::strcpy;
  using ::strcspn;
  using ::strerror;
  using ::strlen;
  using ::strncat;
  using ::strncmp;
  using ::strncpy;
  using ::strspn;
  using ::strtok;
  using ::strxfrm;
  using ::strchr;
  using ::strpbrk;
  using ::strrchr;
  using ::strstr;


  inline void*
  memchr(void* __s, int __c, size_t __n)
  { return __builtin_memchr(__s, __c, __n); }

  inline char*
  strchr(char* __s, int __n)
  { return __builtin_strchr(__s, __n); }

  inline char*
  strpbrk(char* __s1, const char* __s2)
  { return __builtin_strpbrk(__s1, __s2); }

  inline char*
  strrchr(char* __s, int __n)
  { return __builtin_strrchr(__s, __n); }

  inline char*
  strstr(char* __s1, const char* __s2)
  { return __builtin_strstr(__s1, __s2); }



}
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/fallible.h" 1
# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/fallible.h"
namespace mozilla {

struct fallible_t { };
# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/fallible.h"
extern const fallible_t fallible;

}
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc_abort.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc_abort.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Attributes.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Attributes.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Compiler.h" 1
# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Compiler.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstddef" 1 3
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstddef" 3







# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 51 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3
typedef long int ptrdiff_t;
# 118 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/__stddef_max_align_t.h" 1 3
# 35 "/usr/local/bin/../lib/clang/3.9.1/include/__stddef_max_align_t.h" 3
typedef struct {
  long long __clang_max_align_nonce1
      __attribute__((__aligned__(__alignof__(long long))));
  long double __clang_max_align_nonce2
      __attribute__((__aligned__(__alignof__(long double))));
} max_align_t;
# 119 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 2 3
# 51 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstddef" 2 3


namespace std
{

  using ::max_align_t;
}
# 50 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Compiler.h" 2
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Attributes.h" 2
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc_abort.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Types.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Types.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Types.h" 2
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stdint.h" 1 3
# 63 "/usr/local/bin/../lib/clang/3.9.1/include/stdint.h" 3
# 1 "/usr/include/stdint.h" 1 3 4
# 26 "/usr/include/stdint.h" 3 4
# 1 "/usr/include/bits/wchar.h" 1 3 4
# 27 "/usr/include/stdint.h" 2 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 28 "/usr/include/stdint.h" 2 3 4
# 48 "/usr/include/stdint.h" 3 4
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;

typedef unsigned int uint32_t;



typedef unsigned long int uint64_t;
# 65 "/usr/include/stdint.h" 3 4
typedef signed char int_least8_t;
typedef short int int_least16_t;
typedef int int_least32_t;

typedef long int int_least64_t;






typedef unsigned char uint_least8_t;
typedef unsigned short int uint_least16_t;
typedef unsigned int uint_least32_t;

typedef unsigned long int uint_least64_t;
# 90 "/usr/include/stdint.h" 3 4
typedef signed char int_fast8_t;

typedef long int int_fast16_t;
typedef long int int_fast32_t;
typedef long int int_fast64_t;
# 103 "/usr/include/stdint.h" 3 4
typedef unsigned char uint_fast8_t;

typedef unsigned long int uint_fast16_t;
typedef unsigned long int uint_fast32_t;
typedef unsigned long int uint_fast64_t;
# 119 "/usr/include/stdint.h" 3 4
typedef long int intptr_t;


typedef unsigned long int uintptr_t;
# 134 "/usr/include/stdint.h" 3 4
typedef long int intmax_t;
typedef unsigned long int uintmax_t;
# 64 "/usr/local/bin/../lib/clang/3.9.1/include/stdint.h" 2 3
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Types.h" 2
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc_abort.h" 2








__attribute__((weak)) __attribute__((visibility("default")))

  __attribute__((noreturn))

  void mozalloc_abort(const char* const msg);
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/limits.h" 1 3
# 37 "/usr/local/bin/../lib/clang/3.9.1/include/limits.h" 3
# 1 "/usr/include/limits.h" 1 3 4
# 143 "/usr/include/limits.h" 3 4
# 1 "/usr/include/bits/posix1_lim.h" 1 3 4
# 160 "/usr/include/bits/posix1_lim.h" 3 4
# 1 "/usr/include/bits/local_lim.h" 1 3 4
# 38 "/usr/include/bits/local_lim.h" 3 4
# 1 "/usr/include/linux/limits.h" 1 3 4
# 39 "/usr/include/bits/local_lim.h" 2 3 4
# 161 "/usr/include/bits/posix1_lim.h" 2 3 4
# 144 "/usr/include/limits.h" 2 3 4



# 1 "/usr/include/bits/posix2_lim.h" 1 3 4
# 148 "/usr/include/limits.h" 2 3 4



# 1 "/usr/include/bits/xopen_lim.h" 1 3 4
# 33 "/usr/include/bits/xopen_lim.h" 3 4
# 1 "/usr/include/bits/stdio_lim.h" 1 3 4
# 34 "/usr/include/bits/xopen_lim.h" 2 3 4
# 152 "/usr/include/limits.h" 2 3 4
# 38 "/usr/local/bin/../lib/clang/3.9.1/include/limits.h" 2 3
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" 2
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
# 1 "/usr/include/wchar.h" 1 3 4
# 36 "/usr/include/wchar.h" 3 4
# 1 "/usr/include/stdio.h" 1 3 4
# 44 "/usr/include/stdio.h" 3 4
struct _IO_FILE;



typedef struct _IO_FILE FILE;
# 64 "/usr/include/stdio.h" 3 4
typedef struct _IO_FILE __FILE;
# 37 "/usr/include/wchar.h" 2 3 4


# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stdarg.h" 1 3 4
# 30 "/usr/local/bin/../lib/clang/3.9.1/include/stdarg.h" 3 4
typedef __builtin_va_list va_list;
# 50 "/usr/local/bin/../lib/clang/3.9.1/include/stdarg.h" 3 4
typedef __builtin_va_list __gnuc_va_list;
# 40 "/usr/include/wchar.h" 2 3 4
# 51 "/usr/include/wchar.h" 3 4
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 132 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 3 4
typedef unsigned int wint_t;
# 52 "/usr/include/wchar.h" 2 3 4
# 82 "/usr/include/wchar.h" 3 4
typedef struct
{
  int __count;
  union
  {

    unsigned int __wch;



    char __wchb[4];
  } __value;
} __mbstate_t;
# 106 "/usr/include/wchar.h" 3 4
typedef __mbstate_t mbstate_t;
# 132 "/usr/include/wchar.h" 3 4
extern "C" {




struct tm;
# 147 "/usr/include/wchar.h" 3 4
extern wchar_t *wcscpy (wchar_t *__restrict __dest,
   const wchar_t *__restrict __src)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern wchar_t *wcsncpy (wchar_t *__restrict __dest,
    const wchar_t *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern wchar_t *wcscat (wchar_t *__restrict __dest,
   const wchar_t *__restrict __src)
     throw () __attribute__ ((__nonnull__ (1, 2)));

extern wchar_t *wcsncat (wchar_t *__restrict __dest,
    const wchar_t *__restrict __src, size_t __n)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int wcscmp (const wchar_t *__s1, const wchar_t *__s2)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));

extern int wcsncmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n)
     throw () __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));




extern int wcscasecmp (const wchar_t *__s1, const wchar_t *__s2) throw ();


extern int wcsncasecmp (const wchar_t *__s1, const wchar_t *__s2,
   size_t __n) throw ();





extern int wcscasecmp_l (const wchar_t *__s1, const wchar_t *__s2,
    __locale_t __loc) throw ();

extern int wcsncasecmp_l (const wchar_t *__s1, const wchar_t *__s2,
     size_t __n, __locale_t __loc) throw ();





extern int wcscoll (const wchar_t *__s1, const wchar_t *__s2) throw ();



extern size_t wcsxfrm (wchar_t *__restrict __s1,
         const wchar_t *__restrict __s2, size_t __n) throw ();
# 209 "/usr/include/wchar.h" 3 4
extern int wcscoll_l (const wchar_t *__s1, const wchar_t *__s2,
        __locale_t __loc) throw ();




extern size_t wcsxfrm_l (wchar_t *__s1, const wchar_t *__s2,
    size_t __n, __locale_t __loc) throw ();


extern wchar_t *wcsdup (const wchar_t *__s) throw () __attribute__ ((__malloc__));
# 230 "/usr/include/wchar.h" 3 4
extern wchar_t *wcschr (const wchar_t *__wcs, wchar_t __wc)
     throw () __attribute__ ((__pure__));
# 240 "/usr/include/wchar.h" 3 4
extern wchar_t *wcsrchr (const wchar_t *__wcs, wchar_t __wc)
     throw () __attribute__ ((__pure__));






extern wchar_t *wcschrnul (const wchar_t *__s, wchar_t __wc)
     throw () __attribute__ ((__pure__));





extern size_t wcscspn (const wchar_t *__wcs, const wchar_t *__reject)
     throw () __attribute__ ((__pure__));


extern size_t wcsspn (const wchar_t *__wcs, const wchar_t *__accept)
     throw () __attribute__ ((__pure__));
# 269 "/usr/include/wchar.h" 3 4
extern wchar_t *wcspbrk (const wchar_t *__wcs, const wchar_t *__accept)
     throw () __attribute__ ((__pure__));
# 280 "/usr/include/wchar.h" 3 4
extern wchar_t *wcsstr (const wchar_t *__haystack, const wchar_t *__needle)
     throw () __attribute__ ((__pure__));



extern wchar_t *wcstok (wchar_t *__restrict __s,
   const wchar_t *__restrict __delim,
   wchar_t **__restrict __ptr) throw ();


extern size_t wcslen (const wchar_t *__s) throw () __attribute__ ((__pure__));
# 302 "/usr/include/wchar.h" 3 4
extern wchar_t *wcswcs (const wchar_t *__haystack, const wchar_t *__needle)
     throw () __attribute__ ((__pure__));





extern size_t wcsnlen (const wchar_t *__s, size_t __maxlen)
     throw () __attribute__ ((__pure__));
# 323 "/usr/include/wchar.h" 3 4
extern wchar_t *wmemchr (const wchar_t *__s, wchar_t __c, size_t __n)
     throw () __attribute__ ((__pure__));



extern int wmemcmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n)
     throw () __attribute__ ((__pure__));


extern wchar_t *wmemcpy (wchar_t *__restrict __s1,
    const wchar_t *__restrict __s2, size_t __n) throw ();



extern wchar_t *wmemmove (wchar_t *__s1, const wchar_t *__s2, size_t __n)
     throw ();


extern wchar_t *wmemset (wchar_t *__s, wchar_t __c, size_t __n) throw ();





extern wchar_t *wmempcpy (wchar_t *__restrict __s1,
     const wchar_t *__restrict __s2, size_t __n)
     throw ();






extern wint_t btowc (int __c) throw ();



extern int wctob (wint_t __c) throw ();



extern int mbsinit (const mbstate_t *__ps) throw () __attribute__ ((__pure__));



extern size_t mbrtowc (wchar_t *__restrict __pwc,
         const char *__restrict __s, size_t __n,
         mbstate_t *__restrict __p) throw ();


extern size_t wcrtomb (char *__restrict __s, wchar_t __wc,
         mbstate_t *__restrict __ps) throw ();


extern size_t __mbrlen (const char *__restrict __s, size_t __n,
   mbstate_t *__restrict __ps) throw ();
extern size_t mbrlen (const char *__restrict __s, size_t __n,
        mbstate_t *__restrict __ps) throw ();
# 411 "/usr/include/wchar.h" 3 4
extern size_t mbsrtowcs (wchar_t *__restrict __dst,
    const char **__restrict __src, size_t __len,
    mbstate_t *__restrict __ps) throw ();



extern size_t wcsrtombs (char *__restrict __dst,
    const wchar_t **__restrict __src, size_t __len,
    mbstate_t *__restrict __ps) throw ();






extern size_t mbsnrtowcs (wchar_t *__restrict __dst,
     const char **__restrict __src, size_t __nmc,
     size_t __len, mbstate_t *__restrict __ps) throw ();



extern size_t wcsnrtombs (char *__restrict __dst,
     const wchar_t **__restrict __src,
     size_t __nwc, size_t __len,
     mbstate_t *__restrict __ps) throw ();






extern int wcwidth (wchar_t __c) throw ();



extern int wcswidth (const wchar_t *__s, size_t __n) throw ();






extern double wcstod (const wchar_t *__restrict __nptr,
        wchar_t **__restrict __endptr) throw ();





extern float wcstof (const wchar_t *__restrict __nptr,
       wchar_t **__restrict __endptr) throw ();
extern long double wcstold (const wchar_t *__restrict __nptr,
       wchar_t **__restrict __endptr) throw ();







extern long int wcstol (const wchar_t *__restrict __nptr,
   wchar_t **__restrict __endptr, int __base) throw ();



extern unsigned long int wcstoul (const wchar_t *__restrict __nptr,
      wchar_t **__restrict __endptr, int __base)
     throw ();






__extension__
extern long long int wcstoll (const wchar_t *__restrict __nptr,
         wchar_t **__restrict __endptr, int __base)
     throw ();



__extension__
extern unsigned long long int wcstoull (const wchar_t *__restrict __nptr,
     wchar_t **__restrict __endptr,
     int __base) throw ();






__extension__
extern long long int wcstoq (const wchar_t *__restrict __nptr,
        wchar_t **__restrict __endptr, int __base)
     throw ();



__extension__
extern unsigned long long int wcstouq (const wchar_t *__restrict __nptr,
           wchar_t **__restrict __endptr,
           int __base) throw ();
# 533 "/usr/include/wchar.h" 3 4
extern long int wcstol_l (const wchar_t *__restrict __nptr,
     wchar_t **__restrict __endptr, int __base,
     __locale_t __loc) throw ();

extern unsigned long int wcstoul_l (const wchar_t *__restrict __nptr,
        wchar_t **__restrict __endptr,
        int __base, __locale_t __loc) throw ();

__extension__
extern long long int wcstoll_l (const wchar_t *__restrict __nptr,
    wchar_t **__restrict __endptr,
    int __base, __locale_t __loc) throw ();

__extension__
extern unsigned long long int wcstoull_l (const wchar_t *__restrict __nptr,
       wchar_t **__restrict __endptr,
       int __base, __locale_t __loc)
     throw ();

extern double wcstod_l (const wchar_t *__restrict __nptr,
   wchar_t **__restrict __endptr, __locale_t __loc)
     throw ();

extern float wcstof_l (const wchar_t *__restrict __nptr,
         wchar_t **__restrict __endptr, __locale_t __loc)
     throw ();

extern long double wcstold_l (const wchar_t *__restrict __nptr,
         wchar_t **__restrict __endptr,
         __locale_t __loc) throw ();






extern wchar_t *wcpcpy (wchar_t *__restrict __dest,
   const wchar_t *__restrict __src) throw ();



extern wchar_t *wcpncpy (wchar_t *__restrict __dest,
    const wchar_t *__restrict __src, size_t __n)
     throw ();






extern __FILE *open_wmemstream (wchar_t **__bufloc, size_t *__sizeloc) throw ();






extern int fwide (__FILE *__fp, int __mode) throw ();






extern int fwprintf (__FILE *__restrict __stream,
       const wchar_t *__restrict __format, ...)
                                                           ;




extern int wprintf (const wchar_t *__restrict __format, ...)
                                                           ;

extern int swprintf (wchar_t *__restrict __s, size_t __n,
       const wchar_t *__restrict __format, ...)
     throw () ;





extern int vfwprintf (__FILE *__restrict __s,
        const wchar_t *__restrict __format,
        __gnuc_va_list __arg)
                                                           ;




extern int vwprintf (const wchar_t *__restrict __format,
       __gnuc_va_list __arg)
                                                           ;


extern int vswprintf (wchar_t *__restrict __s, size_t __n,
        const wchar_t *__restrict __format,
        __gnuc_va_list __arg)
     throw () ;






extern int fwscanf (__FILE *__restrict __stream,
      const wchar_t *__restrict __format, ...)
                                                          ;




extern int wscanf (const wchar_t *__restrict __format, ...)
                                                          ;

extern int swscanf (const wchar_t *__restrict __s,
      const wchar_t *__restrict __format, ...)
     throw () ;
# 692 "/usr/include/wchar.h" 3 4
extern int vfwscanf (__FILE *__restrict __s,
       const wchar_t *__restrict __format,
       __gnuc_va_list __arg)
                                                          ;




extern int vwscanf (const wchar_t *__restrict __format,
      __gnuc_va_list __arg)
                                                          ;

extern int vswscanf (const wchar_t *__restrict __s,
       const wchar_t *__restrict __format,
       __gnuc_va_list __arg)
     throw () ;
# 748 "/usr/include/wchar.h" 3 4
extern wint_t fgetwc (__FILE *__stream);
extern wint_t getwc (__FILE *__stream);





extern wint_t getwchar (void);






extern wint_t fputwc (wchar_t __wc, __FILE *__stream);
extern wint_t putwc (wchar_t __wc, __FILE *__stream);





extern wint_t putwchar (wchar_t __wc);







extern wchar_t *fgetws (wchar_t *__restrict __ws, int __n,
   __FILE *__restrict __stream);





extern int fputws (const wchar_t *__restrict __ws,
     __FILE *__restrict __stream);






extern wint_t ungetwc (wint_t __wc, __FILE *__stream);
# 804 "/usr/include/wchar.h" 3 4
extern wint_t getwc_unlocked (__FILE *__stream);
extern wint_t getwchar_unlocked (void);







extern wint_t fgetwc_unlocked (__FILE *__stream);







extern wint_t fputwc_unlocked (wchar_t __wc, __FILE *__stream);
# 830 "/usr/include/wchar.h" 3 4
extern wint_t putwc_unlocked (wchar_t __wc, __FILE *__stream);
extern wint_t putwchar_unlocked (wchar_t __wc);
# 840 "/usr/include/wchar.h" 3 4
extern wchar_t *fgetws_unlocked (wchar_t *__restrict __ws, int __n,
     __FILE *__restrict __stream);







extern int fputws_unlocked (const wchar_t *__restrict __ws,
       __FILE *__restrict __stream);







extern size_t wcsftime (wchar_t *__restrict __s, size_t __maxsize,
   const wchar_t *__restrict __format,
   const struct tm *__restrict __tp) throw ();







extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize,
     const wchar_t *__restrict __format,
     const struct tm *__restrict __tp,
     __locale_t __loc) throw ();
# 894 "/usr/include/wchar.h" 3 4
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h" 2

namespace mozilla {



template<typename> struct RemoveCV;
template<typename> struct AddRvalueReference;
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
typename AddRvalueReference<T>::Type DeclVal();







template<typename T, T Value>
struct IntegralConstant
{
  static constexpr T value = Value;
  typedef T ValueType;
  typedef IntegralConstant<T, Value> Type;
};


typedef IntegralConstant<bool, true> TrueType;
typedef IntegralConstant<bool, false> FalseType;





namespace detail {

template<typename T>
struct IsVoidHelper : FalseType {};

template<>
struct IsVoidHelper<void> : TrueType {};

}
# 80 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsVoid : detail::IsVoidHelper<typename RemoveCV<T>::Type> {};

namespace detail {

template <typename T>
struct IsIntegralHelper : FalseType {};

template<> struct IsIntegralHelper<char> : TrueType {};
template<> struct IsIntegralHelper<signed char> : TrueType {};
template<> struct IsIntegralHelper<unsigned char> : TrueType {};
template<> struct IsIntegralHelper<short> : TrueType {};
template<> struct IsIntegralHelper<unsigned short> : TrueType {};
template<> struct IsIntegralHelper<int> : TrueType {};
template<> struct IsIntegralHelper<unsigned int> : TrueType {};
template<> struct IsIntegralHelper<long> : TrueType {};
template<> struct IsIntegralHelper<unsigned long> : TrueType {};
template<> struct IsIntegralHelper<long long> : TrueType {};
template<> struct IsIntegralHelper<unsigned long long> : TrueType {};
template<> struct IsIntegralHelper<bool> : TrueType {};
template<> struct IsIntegralHelper<wchar_t> : TrueType {};
template<> struct IsIntegralHelper<char16_t> : TrueType {};

}
# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsIntegral : detail::IsIntegralHelper<typename RemoveCV<T>::Type>
{};

template<typename T, typename U>
struct IsSame;

namespace detail {

template<typename T>
struct IsFloatingPointHelper
  : IntegralConstant<bool,
                     IsSame<T, float>::value ||
                     IsSame<T, double>::value ||
                     IsSame<T, long double>::value>
{};

}
# 142 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsFloatingPoint
  : detail::IsFloatingPointHelper<typename RemoveCV<T>::Type>
{};

namespace detail {

template<typename T>
struct IsArrayHelper : FalseType {};

template<typename T, decltype(sizeof(1)) N>
struct IsArrayHelper<T[N]> : TrueType {};

template<typename T>
struct IsArrayHelper<T[]> : TrueType {};

}
# 168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsArray : detail::IsArrayHelper<typename RemoveCV<T>::Type>
{};

namespace detail {

template<typename T>
struct IsFunPtr;

template<typename>
struct IsFunPtr
  : public FalseType
{};

template<typename Result, typename... ArgTypes>
struct IsFunPtr<Result(*)(ArgTypes...)>
  : public TrueType
{};

};
# 201 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsFunction
  : public detail::IsFunPtr<typename RemoveCV<T>::Type *>
{};

namespace detail {

template<typename T>
struct IsPointerHelper : FalseType {};

template<typename T>
struct IsPointerHelper<T*> : TrueType {};

}
# 231 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsPointer : detail::IsPointerHelper<typename RemoveCV<T>::Type>
{};
# 246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsLvalueReference : FalseType {};

template<typename T>
struct IsLvalueReference<T&> : TrueType {};
# 263 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsRvalueReference : FalseType {};

template<typename T>
struct IsRvalueReference<T&&> : TrueType {};

namespace detail {


template<typename T>
struct IsEnumHelper
  : IntegralConstant<bool, __is_enum(T)>
{};

}
# 286 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsEnum
  : detail::IsEnumHelper<typename RemoveCV<T>::Type>
{};

namespace detail {





template<typename T>
struct IsClassHelper
  : IntegralConstant<bool, __is_class(T)>
{};

}
# 313 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsClass
  : detail::IsClassHelper<typename RemoveCV<T>::Type>
{};
# 334 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsReference
  : IntegralConstant<bool,
                     IsLvalueReference<T>::value || IsRvalueReference<T>::value>
{};
# 348 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsArithmetic
  : IntegralConstant<bool, IsIntegral<T>::value || IsFloatingPoint<T>::value>
{};

namespace detail {

template<typename T>
struct IsMemberPointerHelper : FalseType {};

template<typename T, typename U>
struct IsMemberPointerHelper<T U::*> : TrueType {};

}
# 370 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsMemberPointer
  : detail::IsMemberPointerHelper<typename RemoveCV<T>::Type>
{};
# 382 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsScalar
  : IntegralConstant<bool, IsArithmetic<T>::value || IsEnum<T>::value ||
                     IsPointer<T>::value || IsMemberPointer<T>::value>
{};
# 397 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsConst : FalseType {};

template<typename T>
struct IsConst<const T> : TrueType {};
# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsVolatile : FalseType {};

template<typename T>
struct IsVolatile<volatile T> : TrueType {};
# 424 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsPod : public FalseType {};

template<> struct IsPod<char> : TrueType {};
template<> struct IsPod<signed char> : TrueType {};
template<> struct IsPod<unsigned char> : TrueType {};
template<> struct IsPod<short> : TrueType {};
template<> struct IsPod<unsigned short> : TrueType {};
template<> struct IsPod<int> : TrueType {};
template<> struct IsPod<unsigned int> : TrueType {};
template<> struct IsPod<long> : TrueType {};
template<> struct IsPod<unsigned long> : TrueType {};
template<> struct IsPod<long long> : TrueType {};
template<> struct IsPod<unsigned long long> : TrueType {};
template<> struct IsPod<bool> : TrueType {};
template<> struct IsPod<float> : TrueType {};
template<> struct IsPod<double> : TrueType {};
template<> struct IsPod<wchar_t> : TrueType {};
template<> struct IsPod<char16_t> : TrueType {};
template<typename T> struct IsPod<T*> : TrueType {};

namespace detail {





template<typename T>
struct IsEmptyHelper
  : IntegralConstant<bool, IsClass<T>::value && __is_empty(T)>
{};

}
# 498 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsEmpty : detail::IsEmptyHelper<typename RemoveCV<T>::Type>
{};


namespace detail {

template<typename T,
         bool = IsFloatingPoint<T>::value,
         bool = IsIntegral<T>::value,
         typename NoCV = typename RemoveCV<T>::Type>
struct IsSignedHelper;


template<typename T, typename NoCV>
struct IsSignedHelper<T, true, false, NoCV> : TrueType {};


template<typename T, typename NoCV>
struct IsSignedHelper<T, false, true, NoCV>
  : IntegralConstant<bool, bool(NoCV(-1) < NoCV(1))>
{};


template<typename T, typename NoCV>
struct IsSignedHelper<T, false, false, NoCV> : FalseType {};

}
# 536 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsSigned : detail::IsSignedHelper<T> {};

namespace detail {

template<typename T,
         bool = IsFloatingPoint<T>::value,
         bool = IsIntegral<T>::value,
         typename NoCV = typename RemoveCV<T>::Type>
struct IsUnsignedHelper;


template<typename T, typename NoCV>
struct IsUnsignedHelper<T, true, false, NoCV> : FalseType {};


template<typename T, typename NoCV>
struct IsUnsignedHelper<T, false, true, NoCV>
  : IntegralConstant<bool,
                     (IsSame<NoCV, bool>::value || bool(NoCV(1) < NoCV(-1)))>
{};


template<typename T, typename NoCV>
struct IsUnsignedHelper<T, false, false, NoCV> : FalseType {};

}
# 572 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsUnsigned : detail::IsUnsignedHelper<T> {};

namespace detail {

struct DoIsDefaultConstructibleImpl
{
  template<typename T, typename = decltype(T())>
  static TrueType test(int);
  template<typename T>
  static FalseType test(...);
};

template<typename T>
struct IsDefaultConstructibleImpl : public DoIsDefaultConstructibleImpl
{
  typedef decltype(test<T>(0)) Type;
};

}
# 611 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsDefaultConstructible
  : public detail::IsDefaultConstructibleImpl<T>::Type
{};

namespace detail {

struct DoIsDestructibleImpl
{
  template<typename T, typename = decltype(DeclVal<T&>().~T())>
  static TrueType test(int);
  template<typename T>
  static FalseType test(...);
};

template<typename T>
struct IsDestructibleImpl : public DoIsDestructibleImpl
{
  typedef decltype(test<T>(0)) Type;
};

}
# 645 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct IsDestructible : public detail::IsDestructibleImpl<T>::Type {};
# 662 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T, typename U>
struct IsSame : FalseType {};

template<typename T>
struct IsSame<T, T> : TrueType {};

namespace detail {



template<class Base, class Derived>
struct BaseOfTester : IntegralConstant<bool, __is_base_of(Base, Derived)> {};
# 727 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
}
# 741 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<class Base, class Derived>
struct IsBaseOf
  : IntegralConstant<bool, detail::BaseOfTester<Base, Derived>::value>
{};

namespace detail {

template<typename From, typename To>
struct ConvertibleTester
{
private:
  template<typename To1>
  static char test_helper(To1);

  template<typename From1, typename To1>
  static decltype(test_helper<To1>(DeclVal<From1>())) test(int);

  template<typename From1, typename To1>
  static int test(...);

public:
  static const bool value =
    sizeof(test<From, To>(0)) == sizeof(char);
};

}
# 793 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename From, typename To>
struct IsConvertible
  : IntegralConstant<bool, detail::ConvertibleTester<From, To>::value>
{};

template<typename B>
struct IsConvertible<void, B>
  : IntegralConstant<bool, IsVoid<B>::value>
{};

template<typename A>
struct IsConvertible<A, void>
  : IntegralConstant<bool, IsVoid<A>::value>
{};

template<>
struct IsConvertible<void, void>
  : TrueType
{};
# 825 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct RemoveConst
{
  typedef T Type;
};

template<typename T>
struct RemoveConst<const T>
{
  typedef T Type;
};
# 845 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct RemoveVolatile
{
  typedef T Type;
};

template<typename T>
struct RemoveVolatile<volatile T>
{
  typedef T Type;
};
# 865 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct RemoveCV
{
  typedef typename RemoveConst<typename RemoveVolatile<T>::Type>::Type Type;
};
# 881 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct RemoveReference
{
  typedef T Type;
};

template<typename T>
struct RemoveReference<T&>
{
  typedef T Type;
};

template<typename T>
struct RemoveReference<T&&>
{
  typedef T Type;
};

template<bool Condition, typename A, typename B>
struct Conditional;

namespace detail {

enum Voidness { TIsVoid, TIsNotVoid };

template<typename T, Voidness V = IsVoid<T>::value ? TIsVoid : TIsNotVoid>
struct AddLvalueReferenceHelper;

template<typename T>
struct AddLvalueReferenceHelper<T, TIsVoid>
{
  typedef void Type;
};

template<typename T>
struct AddLvalueReferenceHelper<T, TIsNotVoid>
{
  typedef T& Type;
};

}
# 937 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct AddLvalueReference
  : detail::AddLvalueReferenceHelper<T>
{};

namespace detail {

template<typename T, Voidness V = IsVoid<T>::value ? TIsVoid : TIsNotVoid>
struct AddRvalueReferenceHelper;

template<typename T>
struct AddRvalueReferenceHelper<T, TIsVoid>
{
  typedef void Type;
};

template<typename T>
struct AddRvalueReferenceHelper<T, TIsNotVoid>
{
  typedef T&& Type;
};

}
# 976 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct AddRvalueReference
  : detail::AddRvalueReferenceHelper<T>
{};



template<bool B, typename T = void>
struct EnableIf;

namespace detail {

template<bool MakeConst, typename T>
struct WithC : Conditional<MakeConst, const T, T>
{};

template<bool MakeVolatile, typename T>
struct WithV : Conditional<MakeVolatile, volatile T, T>
{};


template<bool MakeConst, bool MakeVolatile, typename T>
struct WithCV : WithC<MakeConst, typename WithV<MakeVolatile, T>::Type>
{};

template<typename T>
struct CorrespondingSigned;

template<>
struct CorrespondingSigned<char> { typedef signed char Type; };
template<>
struct CorrespondingSigned<unsigned char> { typedef signed char Type; };
template<>
struct CorrespondingSigned<unsigned short> { typedef short Type; };
template<>
struct CorrespondingSigned<unsigned int> { typedef int Type; };
template<>
struct CorrespondingSigned<unsigned long> { typedef long Type; };
template<>
struct CorrespondingSigned<unsigned long long> { typedef long long Type; };

template<typename T,
         typename CVRemoved = typename RemoveCV<T>::Type,
         bool IsSignedIntegerType = IsSigned<CVRemoved>::value &&
                                    !IsSame<char, CVRemoved>::value>
struct MakeSigned;

template<typename T, typename CVRemoved>
struct MakeSigned<T, CVRemoved, true>
{
  typedef T Type;
};

template<typename T, typename CVRemoved>
struct MakeSigned<T, CVRemoved, false>
  : WithCV<IsConst<T>::value, IsVolatile<T>::value,
           typename CorrespondingSigned<CVRemoved>::Type>
{};

}
# 1059 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct MakeSigned
  : EnableIf<IsIntegral<T>::value &&
             !IsSame<bool, typename RemoveCV<T>::Type>::value,
             typename detail::MakeSigned<T>
            >::Type
{};

namespace detail {

template<typename T>
struct CorrespondingUnsigned;

template<>
struct CorrespondingUnsigned<char> { typedef unsigned char Type; };
template<>
struct CorrespondingUnsigned<signed char> { typedef unsigned char Type; };
template<>
struct CorrespondingUnsigned<short> { typedef unsigned short Type; };
template<>
struct CorrespondingUnsigned<int> { typedef unsigned int Type; };
template<>
struct CorrespondingUnsigned<long> { typedef unsigned long Type; };
template<>
struct CorrespondingUnsigned<long long> { typedef unsigned long long Type; };


template<typename T,
         typename CVRemoved = typename RemoveCV<T>::Type,
         bool IsUnsignedIntegerType = IsUnsigned<CVRemoved>::value &&
                                      !IsSame<char, CVRemoved>::value>
struct MakeUnsigned;

template<typename T, typename CVRemoved>
struct MakeUnsigned<T, CVRemoved, true>
{
  typedef T Type;
};

template<typename T, typename CVRemoved>
struct MakeUnsigned<T, CVRemoved, false>
  : WithCV<IsConst<T>::value, IsVolatile<T>::value,
           typename CorrespondingUnsigned<CVRemoved>::Type>
{};

}
# 1128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct MakeUnsigned
  : EnableIf<IsIntegral<T>::value &&
             !IsSame<bool, typename RemoveCV<T>::Type>::value,
             typename detail::MakeUnsigned<T>
            >::Type
{};
# 1147 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct RemoveExtent
{
  typedef T Type;
};

template<typename T>
struct RemoveExtent<T[]>
{
  typedef T Type;
};

template<typename T, decltype(sizeof(1)) N>
struct RemoveExtent<T[N]>
{
  typedef T Type;
};



namespace detail {

template<typename T, typename CVRemoved>
struct RemovePointerHelper
{
  typedef T Type;
};

template<typename T, typename Pointee>
struct RemovePointerHelper<T, Pointee*>
{
  typedef Pointee Type;
};

}
# 1198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct RemovePointer
  : detail::RemovePointerHelper<T, typename RemoveCV<T>::Type>
{};
# 1213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
struct AddPointer
{
  typedef typename RemoveReference<T>::Type* Type;
};
# 1239 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<bool B, typename T>
struct EnableIf
{};

template<typename T>
struct EnableIf<true, T>
{
  typedef T Type;
};







template<bool Condition, typename A, typename B>
struct Conditional
{
  typedef A Type;
};

template<class A, class B>
struct Conditional<false, A, B>
{
  typedef B Type;
};

namespace detail {

template<typename U,
         bool IsArray = IsArray<U>::value,
         bool IsFunction = IsFunction<U>::value>
struct DecaySelector;

template<typename U>
struct DecaySelector<U, false, false>
{
  typedef typename RemoveCV<U>::Type Type;
};

template<typename U>
struct DecaySelector<U, true, false>
{
  typedef typename RemoveExtent<U>::Type* Type;
};

template<typename U>
struct DecaySelector<U, false, true>
{
  typedef typename AddPointer<U>::Type Type;
};

};
# 1306 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypeTraits.h"
template<typename T>
class Decay
  : public detail::DecaySelector<typename RemoveReference<T>::Type>
{
};

}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h" 2

namespace mozilla {

namespace tl {


template<size_t Size, size_t... Rest>
struct Min
{
  static constexpr size_t value =
    Size < Min<Rest...>::value
    ? Size
    : Min<Rest...>::value;
};

template<size_t Size>
struct Min<Size>
{
  static constexpr size_t value = Size;
};

template<size_t Size, size_t... Rest>
struct Max
{
  static constexpr size_t value =
    Size > Max<Rest...>::value
    ? Size
    : Max<Rest...>::value;
};

template<size_t Size>
struct Max<Size>
{
  static constexpr size_t value = Size;
};


template<size_t I>
struct FloorLog2
{
  static const size_t value = 1 + FloorLog2<I / 2>::value;
};
template<> struct FloorLog2<0> { };
template<> struct FloorLog2<1> { static const size_t value = 0; };


template<size_t I>
struct CeilingLog2
{
  static const size_t value = FloorLog2<2 * I - 1>::value;
};


template<size_t I>
struct RoundUpPow2
{
  static const size_t value = size_t(1) << CeilingLog2<I>::value;
};
template<>
struct RoundUpPow2<0>
{
  static const size_t value = 1;
};


template<typename T>
struct BitSize
{
  static const size_t value = sizeof(T) * 8;
};





template<size_t N>
struct NBitMask
{




  static const size_t checkPrecondition =
    0 / size_t(N < BitSize<size_t>::value);
  static const size_t value = (size_t(1) << N) - 1 + checkPrecondition;
};
template<>
struct NBitMask<BitSize<size_t>::value>
{
  static const size_t value = size_t(-1);
};





template<size_t N>
struct MulOverflowMask
{
  static const size_t value =
    ~NBitMask<BitSize<size_t>::value - CeilingLog2<N>::value>::value;
};
template<> struct MulOverflowMask<0> { };
template<> struct MulOverflowMask<1> { static const size_t value = 0; };
# 138 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TemplateLib.h"
template<bool...>
struct And;

template<>
struct And<> : public TrueType { };

template<bool C1, bool... Cn>
struct And<C1, Cn...>
  : public Conditional<C1, And<Cn...>, FalseType>::Type { };

}

}
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h" 2
# 55 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h"
extern "C" {
# 85 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h"
__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xmalloc(size_t size)
    __attribute__ ((malloc, warn_unused_result));

__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xcalloc(size_t nmemb, size_t size)
    __attribute__ ((malloc, warn_unused_result));

__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xrealloc(void* ptr, size_t size)
    __attribute__ ((malloc, warn_unused_result));

__attribute__((weak)) __attribute__((visibility("default"))) char* moz_xstrdup(const char* str)
    __attribute__ ((malloc, warn_unused_result));

__attribute__((weak)) __attribute__((visibility("default"))) size_t moz_malloc_usable_size(void *ptr);

__attribute__((weak)) __attribute__((visibility("default"))) size_t moz_malloc_size_of(const void *ptr);


__attribute__((weak)) __attribute__((visibility("default"))) char* moz_xstrndup(const char* str, size_t strsize)
    __attribute__ ((malloc, warn_unused_result));




__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((warn_unused_result))
int moz_xposix_memalign(void **ptr, size_t alignment, size_t size);

__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((warn_unused_result))
int moz_posix_memalign(void **ptr, size_t alignment, size_t size);




__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xmemalign(size_t boundary, size_t size)
    __attribute__ ((malloc, warn_unused_result));




__attribute__((weak)) __attribute__((visibility("default"))) void* moz_xvalloc(size_t size)
    __attribute__ ((malloc, warn_unused_result));




}
# 190 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h"
__attribute__((always_inline)) inline

void* operator new(size_t size) throw(std::bad_alloc)
{
    return moz_xmalloc(size);
}

                    __attribute__((always_inline)) inline
void* operator new(size_t size, const std::nothrow_t&) throw()
{
    return malloc(size);
}

                    __attribute__((always_inline)) inline
void* operator new[](size_t size) throw(std::bad_alloc)
{
    return moz_xmalloc(size);
}

                    __attribute__((always_inline)) inline
void* operator new[](size_t size, const std::nothrow_t&) throw()
{
    return malloc(size);
}

                    __attribute__((always_inline)) inline
void operator delete(void* ptr) throw()
{
    return free(ptr);
}

                    __attribute__((always_inline)) inline
void operator delete(void* ptr, const std::nothrow_t&) throw()
{
    return free(ptr);
}

                    __attribute__((always_inline)) inline
void operator delete[](void* ptr) throw()
{
    return free(ptr);
}

                    __attribute__((always_inline)) inline
void operator delete[](void* ptr, const std::nothrow_t&) throw()
{
    return free(ptr);
}
# 259 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/mozalloc.h"
__attribute__((always_inline)) inline
void* operator new(size_t size, const mozilla::fallible_t&) throw()
{
    return malloc(size);
}

__attribute__((always_inline)) inline
void* operator new[](size_t size, const mozilla::fallible_t&) throw()
{
    return malloc(size);
}

__attribute__((always_inline)) inline
void operator delete(void* ptr, const mozilla::fallible_t&) throw()
{
    free(ptr);
}

__attribute__((always_inline)) inline
void operator delete[](void* ptr, const mozilla::fallible_t&) throw()
{
    free(ptr);
}







class InfallibleAllocPolicy
{
public:
    template <typename T>
    T* maybe_pod_malloc(size_t aNumElems)
    {
        return pod_malloc<T>(aNumElems);
    }

    template <typename T>
    T* maybe_pod_calloc(size_t aNumElems)
    {
        return pod_calloc<T>(aNumElems);
    }

    template <typename T>
    T* maybe_pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize)
    {
        return pod_realloc<T>(aPtr, aOldSize, aNewSize);
    }

    template <typename T>
    T* pod_malloc(size_t aNumElems)
    {
        if (aNumElems & mozilla::tl::MulOverflowMask<sizeof(T)>::value) {
            reportAllocOverflow();
        }
        return static_cast<T*>(moz_xmalloc(aNumElems * sizeof(T)));
    }

    template <typename T>
    T* pod_calloc(size_t aNumElems)
    {
        return static_cast<T*>(moz_xcalloc(aNumElems, sizeof(T)));
    }

    template <typename T>
    T* pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize)
    {
        if (aNewSize & mozilla::tl::MulOverflowMask<sizeof(T)>::value) {
            reportAllocOverflow();
        }
        return static_cast<T*>(moz_xrealloc(aPtr, aNewSize * sizeof(T)));
    }

    void free_(void* aPtr)
    {
        free(aPtr);
    }

    void reportAllocOverflow() const
    {
        mozalloc_abort("alloc overflow");
    }

    bool checkSimulatedOOM() const
    {
        return true;
    }
};
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2





# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCountType.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCountType.h"
typedef uintptr_t MozRefCountType;
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCountType.h"
typedef uint32_t MozExternalRefCountType;
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2
# 231 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Likely.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h" 1
# 52 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ErrorList.h"
enum class nsresult : uint32_t
{
  NS_OK = 0x0,
  NS_ERROR_BASE = 0xC1F30000,
  NS_ERROR_NOT_INITIALIZED = 0xC1F30001,
  NS_ERROR_ALREADY_INITIALIZED = 0xC1F30002,
  NS_ERROR_NOT_IMPLEMENTED = 0x80004001,
  NS_NOINTERFACE = 0x80004002,
  NS_ERROR_NO_INTERFACE = 0x80004002,
  NS_ERROR_ABORT = 0x80004004,
  NS_ERROR_FAILURE = 0x80004005,
  NS_ERROR_UNEXPECTED = 0x8000FFFF,
  NS_ERROR_OUT_OF_MEMORY = 0x8007000E,
  NS_ERROR_ILLEGAL_VALUE = 0x80070057,
  NS_ERROR_INVALID_ARG = 0x80070057,
  NS_ERROR_INVALID_POINTER = 0x80070057,
  NS_ERROR_NULL_POINTER = 0x80070057,
  NS_ERROR_NO_AGGREGATION = 0x80040110,
  NS_ERROR_NOT_AVAILABLE = 0x80040111,
  NS_ERROR_FACTORY_NOT_REGISTERED = 0x80040154,
  NS_ERROR_FACTORY_REGISTER_AGAIN = 0x80040155,
  NS_ERROR_FACTORY_NOT_LOADED = 0x800401F8,
  NS_ERROR_FACTORY_NO_SIGNATURE_SUPPORT = 0xC1F30101,
  NS_ERROR_FACTORY_EXISTS = 0xC1F30100,
  NS_ERROR_CANNOT_CONVERT_DATA = 0x80460001,
  NS_ERROR_OBJECT_IS_IMMUTABLE = 0x80460002,
  NS_ERROR_LOSS_OF_SIGNIFICANT_DATA = 0x80460003,
  NS_ERROR_NOT_SAME_THREAD = 0x80460004,
  NS_ERROR_ILLEGAL_DURING_SHUTDOWN = 0x8046001E,
  NS_ERROR_SERVICE_NOT_AVAILABLE = 0x80460016,
  NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA = 0x460001,
  NS_SUCCESS_INTERRUPTED_TRAVERSE = 0x460002,
  NS_ERROR_SERVICE_NOT_FOUND = 0x460016,
  NS_ERROR_SERVICE_IN_USE = 0x460017,
  NS_BASE_STREAM_CLOSED = 0x80470002,
  NS_BASE_STREAM_OSERROR = 0x80470003,
  NS_BASE_STREAM_ILLEGAL_ARGS = 0x80470004,
  NS_BASE_STREAM_NO_CONVERTER = 0x80470005,
  NS_BASE_STREAM_BAD_CONVERSION = 0x80470006,
  NS_BASE_STREAM_WOULD_BLOCK = 0x80470007,
  NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE = 0x80480001,
  NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND = 0x80480002,
  NS_ERROR_GFX_PRINTER_COULD_NOT_OPEN_FILE = 0x80480003,
  NS_ERROR_GFX_PRINTER_STARTDOC = 0x80480004,
  NS_ERROR_GFX_PRINTER_ENDDOC = 0x80480005,
  NS_ERROR_GFX_PRINTER_STARTPAGE = 0x80480006,
  NS_ERROR_GFX_PRINTER_DOC_IS_BUSY = 0x80480007,
  NS_ERROR_GFX_CMAP_MALFORMED = 0x80480033,
  NS_SUCCESS_EVENT_CONSUMED = 0x490001,
  NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY = 0x490002,
  NS_BINDING_SUCCEEDED = 0x0,
  NS_BINDING_FAILED = 0x804B0001,
  NS_BINDING_ABORTED = 0x804B0002,
  NS_BINDING_REDIRECTED = 0x804B0003,
  NS_BINDING_RETARGETED = 0x804B0004,
  NS_ERROR_MALFORMED_URI = 0x804B000A,
  NS_ERROR_IN_PROGRESS = 0x804B000F,
  NS_ERROR_NO_CONTENT = 0x804B0011,
  NS_ERROR_UNKNOWN_PROTOCOL = 0x804B0012,
  NS_ERROR_INVALID_CONTENT_ENCODING = 0x804B001B,
  NS_ERROR_CORRUPTED_CONTENT = 0x804B001D,
  NS_ERROR_INVALID_SIGNATURE = 0x804B003A,
  NS_ERROR_FIRST_HEADER_FIELD_COMPONENT_EMPTY = 0x804B0022,
  NS_ERROR_ALREADY_OPENED = 0x804B0049,
  NS_ERROR_ALREADY_CONNECTED = 0x804B000B,
  NS_ERROR_NOT_CONNECTED = 0x804B000C,
  NS_ERROR_CONNECTION_REFUSED = 0x804B000D,
  NS_ERROR_NET_TIMEOUT = 0x804B000E,
  NS_ERROR_OFFLINE = 0x804B0010,
  NS_ERROR_PORT_ACCESS_NOT_ALLOWED = 0x804B0013,
  NS_ERROR_NET_RESET = 0x804B0014,
  NS_ERROR_NET_INTERRUPT = 0x804B0047,
  NS_ERROR_PROXY_CONNECTION_REFUSED = 0x804B0048,
  NS_ERROR_NET_PARTIAL_TRANSFER = 0x804B004C,
  NS_ERROR_NET_INADEQUATE_SECURITY = 0x804B0052,
  NS_ERROR_NOT_RESUMABLE = 0x804B0019,
  NS_ERROR_REDIRECT_LOOP = 0x804B001F,
  NS_ERROR_ENTITY_CHANGED = 0x804B0020,
  NS_ERROR_UNSAFE_CONTENT_TYPE = 0x804B004A,
  NS_ERROR_REMOTE_XUL = 0x804B004B,
  NS_ERROR_LOAD_SHOWED_ERRORPAGE = 0x804B004D,
  NS_ERROR_DOCSHELL_DYING = 0x804B004E,
  NS_ERROR_FTP_LOGIN = 0x804B0015,
  NS_ERROR_FTP_CWD = 0x804B0016,
  NS_ERROR_FTP_PASV = 0x804B0017,
  NS_ERROR_FTP_PWD = 0x804B0018,
  NS_ERROR_FTP_LIST = 0x804B001C,
  NS_ERROR_UNKNOWN_HOST = 0x804B001E,
  NS_ERROR_DNS_LOOKUP_QUEUE_FULL = 0x804B0021,
  NS_ERROR_UNKNOWN_PROXY_HOST = 0x804B002A,
  NS_ERROR_UNKNOWN_SOCKET_TYPE = 0x804B0033,
  NS_ERROR_SOCKET_CREATE_FAILED = 0x804B0034,
  NS_ERROR_SOCKET_ADDRESS_NOT_SUPPORTED = 0x804B0035,
  NS_ERROR_SOCKET_ADDRESS_IN_USE = 0x804B0036,
  NS_ERROR_CACHE_KEY_NOT_FOUND = 0x804B003D,
  NS_ERROR_CACHE_DATA_IS_STREAM = 0x804B003E,
  NS_ERROR_CACHE_DATA_IS_NOT_STREAM = 0x804B003F,
  NS_ERROR_CACHE_WAIT_FOR_VALIDATION = 0x804B0040,
  NS_ERROR_CACHE_ENTRY_DOOMED = 0x804B0041,
  NS_ERROR_CACHE_READ_ACCESS_DENIED = 0x804B0042,
  NS_ERROR_CACHE_WRITE_ACCESS_DENIED = 0x804B0043,
  NS_ERROR_CACHE_IN_USE = 0x804B0044,
  NS_ERROR_DOCUMENT_NOT_CACHED = 0x804B0046,
  NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS = 0x804B0050,
  NS_ERROR_HOST_IS_IP_ADDRESS = 0x804B0051,
  NS_SUCCESS_ADOPTED_DATA = 0x4B005A,
  NS_NET_STATUS_BEGIN_FTP_TRANSACTION = 0x4B001B,
  NS_NET_STATUS_END_FTP_TRANSACTION = 0x4B001C,
  NS_SUCCESS_AUTH_FINISHED = 0x4B0028,
  NS_NET_STATUS_READING = 0x804B0008,
  NS_NET_STATUS_WRITING = 0x804B0009,
  NS_NET_STATUS_RESOLVING_HOST = 0x804B0003,
  NS_NET_STATUS_RESOLVED_HOST = 0x804B000B,
  NS_NET_STATUS_CONNECTING_TO = 0x804B0007,
  NS_NET_STATUS_CONNECTED_TO = 0x804B0004,
  NS_NET_STATUS_TLS_HANDSHAKE_STARTING = 0x804B000C,
  NS_NET_STATUS_TLS_HANDSHAKE_ENDED = 0x804B000D,
  NS_NET_STATUS_SENDING_TO = 0x804B0005,
  NS_NET_STATUS_WAITING_FOR = 0x804B000A,
  NS_NET_STATUS_RECEIVING_FROM = 0x804B0006,
  NS_ERROR_INTERCEPTION_FAILED = 0x804B0064,
  NS_ERROR_HSTS_PRIMING_TIMEOUT = 0x804B006E,
  NS_ERROR_PLUGINS_PLUGINSNOTCHANGED = 0x804C03E8,
  NS_ERROR_PLUGIN_DISABLED = 0x804C03E9,
  NS_ERROR_PLUGIN_BLOCKLISTED = 0x804C03EA,
  NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED = 0x804C03EB,
  NS_ERROR_PLUGIN_CLICKTOPLAY = 0x804C03EC,
  NS_PLUGIN_INIT_PENDING = 0x4C03ED,
  NS_TABLELAYOUT_CELL_NOT_FOUND = 0x4D0000,
  NS_POSITION_BEFORE_TABLE = 0x4D0003,
  NS_STATE_PROPERTY_EXISTS = 0x0,
  NS_STATE_PROPERTY_NOT_THERE = 0x4D0005,
  NS_ERROR_HTMLPARSER_CONTINUE = 0x0,
  NS_ERROR_HTMLPARSER_EOF = 0x804E03E8,
  NS_ERROR_HTMLPARSER_UNKNOWN = 0x804E03E9,
  NS_ERROR_HTMLPARSER_CANTPROPAGATE = 0x804E03EA,
  NS_ERROR_HTMLPARSER_CONTEXTMISMATCH = 0x804E03EB,
  NS_ERROR_HTMLPARSER_BADFILENAME = 0x804E03EC,
  NS_ERROR_HTMLPARSER_BADURL = 0x804E03ED,
  NS_ERROR_HTMLPARSER_INVALIDPARSERCONTEXT = 0x804E03EE,
  NS_ERROR_HTMLPARSER_INTERRUPTED = 0x804E03EF,
  NS_ERROR_HTMLPARSER_BLOCK = 0x804E03F0,
  NS_ERROR_HTMLPARSER_BADTOKENIZER = 0x804E03F1,
  NS_ERROR_HTMLPARSER_BADATTRIBUTE = 0x804E03F2,
  NS_ERROR_HTMLPARSER_UNRESOLVEDDTD = 0x804E03F3,
  NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT = 0x804E03F4,
  NS_ERROR_HTMLPARSER_BADDTD = 0x804E03F5,
  NS_ERROR_HTMLPARSER_BADCONTEXT = 0x804E03F6,
  NS_ERROR_HTMLPARSER_STOPPARSING = 0x804E03F7,
  NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL = 0x804E03F8,
  NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP = 0x804E03F9,
  NS_ERROR_HTMLPARSER_FAKE_ENDTAG = 0x804E03FA,
  NS_ERROR_HTMLPARSER_INVALID_COMMENT = 0x804E03FB,
  NS_HTMLTOKENS_NOT_AN_ENTITY = 0x4E07D0,
  NS_HTMLPARSER_VALID_META_CHARSET = 0x4E0BB8,
  NS_RDF_ASSERTION_ACCEPTED = 0x0,
  NS_RDF_CURSOR_EMPTY = 0x4F0001,
  NS_RDF_NO_VALUE = 0x4F0002,
  NS_RDF_ASSERTION_REJECTED = 0x4F0003,
  NS_RDF_STOP_VISIT = 0x4F0004,
  NS_ERROR_UCONV_NOCONV = 0x80500001,
  NS_ERROR_UDEC_ILLEGALINPUT = 0x8050000E,
  NS_SUCCESS_USING_FALLBACK_LOCALE = 0x500002,
  NS_OK_UDEC_EXACTLENGTH = 0x50000B,
  NS_OK_UDEC_MOREINPUT = 0x50000C,
  NS_OK_UDEC_MOREOUTPUT = 0x50000D,
  NS_OK_UDEC_NOBOMFOUND = 0x50000E,
  NS_OK_UENC_EXACTLENGTH = 0x500021,
  NS_OK_UENC_MOREOUTPUT = 0x500022,
  NS_ERROR_UENC_NOMAPPING = 0x500023,
  NS_OK_UENC_MOREINPUT = 0x500024,
  NS_EXACT_LENGTH = 0x50000B,
  NS_PARTIAL_MORE_INPUT = 0x50000C,
  NS_PARTIAL_MORE_OUTPUT = 0x50000D,
  NS_ERROR_ILLEGAL_INPUT = 0x8050000E,
  NS_ERROR_FILE_UNRECOGNIZED_PATH = 0x80520001,
  NS_ERROR_FILE_UNRESOLVABLE_SYMLINK = 0x80520002,
  NS_ERROR_FILE_EXECUTION_FAILED = 0x80520003,
  NS_ERROR_FILE_UNKNOWN_TYPE = 0x80520004,
  NS_ERROR_FILE_DESTINATION_NOT_DIR = 0x80520005,
  NS_ERROR_FILE_TARGET_DOES_NOT_EXIST = 0x80520006,
  NS_ERROR_FILE_COPY_OR_MOVE_FAILED = 0x80520007,
  NS_ERROR_FILE_ALREADY_EXISTS = 0x80520008,
  NS_ERROR_FILE_INVALID_PATH = 0x80520009,
  NS_ERROR_FILE_DISK_FULL = 0x8052000A,
  NS_ERROR_FILE_CORRUPTED = 0x8052000B,
  NS_ERROR_FILE_NOT_DIRECTORY = 0x8052000C,
  NS_ERROR_FILE_IS_DIRECTORY = 0x8052000D,
  NS_ERROR_FILE_IS_LOCKED = 0x8052000E,
  NS_ERROR_FILE_TOO_BIG = 0x8052000F,
  NS_ERROR_FILE_NO_DEVICE_SPACE = 0x80520010,
  NS_ERROR_FILE_NAME_TOO_LONG = 0x80520011,
  NS_ERROR_FILE_NOT_FOUND = 0x80520012,
  NS_ERROR_FILE_READ_ONLY = 0x80520013,
  NS_ERROR_FILE_DIR_NOT_EMPTY = 0x80520014,
  NS_ERROR_FILE_ACCESS_DENIED = 0x80520015,
  NS_SUCCESS_FILE_DIRECTORY_EMPTY = 0x520001,
  NS_SUCCESS_AGGREGATE_RESULT = 0x520002,
  NS_ERROR_DOM_INDEX_SIZE_ERR = 0x80530001,
  NS_ERROR_DOM_HIERARCHY_REQUEST_ERR = 0x80530003,
  NS_ERROR_DOM_WRONG_DOCUMENT_ERR = 0x80530004,
  NS_ERROR_DOM_INVALID_CHARACTER_ERR = 0x80530005,
  NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR = 0x80530007,
  NS_ERROR_DOM_NOT_FOUND_ERR = 0x80530008,
  NS_ERROR_DOM_NOT_SUPPORTED_ERR = 0x80530009,
  NS_ERROR_DOM_INUSE_ATTRIBUTE_ERR = 0x8053000A,
  NS_ERROR_DOM_INVALID_STATE_ERR = 0x8053000B,
  NS_ERROR_DOM_SYNTAX_ERR = 0x8053000C,
  NS_ERROR_DOM_INVALID_MODIFICATION_ERR = 0x8053000D,
  NS_ERROR_DOM_NAMESPACE_ERR = 0x8053000E,
  NS_ERROR_DOM_INVALID_ACCESS_ERR = 0x8053000F,
  NS_ERROR_DOM_TYPE_MISMATCH_ERR = 0x80530011,
  NS_ERROR_DOM_SECURITY_ERR = 0x80530012,
  NS_ERROR_DOM_NETWORK_ERR = 0x80530013,
  NS_ERROR_DOM_ABORT_ERR = 0x80530014,
  NS_ERROR_DOM_URL_MISMATCH_ERR = 0x80530015,
  NS_ERROR_DOM_QUOTA_EXCEEDED_ERR = 0x80530016,
  NS_ERROR_DOM_TIMEOUT_ERR = 0x80530017,
  NS_ERROR_DOM_INVALID_NODE_TYPE_ERR = 0x80530018,
  NS_ERROR_DOM_DATA_CLONE_ERR = 0x80530019,
  NS_ERROR_TYPE_ERR = 0x8053001A,
  NS_ERROR_RANGE_ERR = 0x8053001B,
  NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR = 0x8053001C,
  NS_ERROR_DOM_INVALID_POINTER_ERR = 0x8053001D,
  NS_ERROR_DOM_UNKNOWN_ERR = 0x8053001E,
  NS_ERROR_DOM_DATA_ERR = 0x8053001F,
  NS_ERROR_DOM_OPERATION_ERR = 0x80530020,
  NS_ERROR_DOM_NOT_ALLOWED_ERR = 0x80530021,
  NS_ERROR_DOM_SECMAN_ERR = 0x805303E9,
  NS_ERROR_DOM_WRONG_TYPE_ERR = 0x805303EA,
  NS_ERROR_DOM_NOT_OBJECT_ERR = 0x805303EB,
  NS_ERROR_DOM_NOT_XPC_OBJECT_ERR = 0x805303EC,
  NS_ERROR_DOM_NOT_NUMBER_ERR = 0x805303ED,
  NS_ERROR_DOM_NOT_BOOLEAN_ERR = 0x805303EE,
  NS_ERROR_DOM_NOT_FUNCTION_ERR = 0x805303EF,
  NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR = 0x805303F0,
  NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN = 0x805303F1,
  NS_ERROR_DOM_PROP_ACCESS_DENIED = 0x805303F2,
  NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED = 0x805303F3,
  NS_ERROR_DOM_BAD_URI = 0x805303F4,
  NS_ERROR_DOM_RETVAL_UNDEFINED = 0x805303F5,
  NS_ERROR_DOM_QUOTA_REACHED = 0x805303F6,
  NS_ERROR_UNCATCHABLE_EXCEPTION = 0x805303F7,
  NS_ERROR_DOM_MALFORMED_URI = 0x805303F8,
  NS_ERROR_DOM_INVALID_HEADER_NAME = 0x805303F9,
  NS_ERROR_DOM_INVALID_STATE_XHR_HAS_INVALID_CONTEXT = 0x805303FA,
  NS_ERROR_DOM_INVALID_STATE_XHR_MUST_BE_OPENED = 0x805303FB,
  NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_SENDING = 0x805303FC,
  NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_LOADING_OR_DONE = 0x805303FD,
  NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSEXML = 0x805303FE,
  NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSETEXT = 0x805303FF,
  NS_ERROR_DOM_INVALID_STATE_XHR_CHUNKED_RESPONSETYPES_UNSUPPORTED_FOR_SYNC = 0x80530400,
  NS_ERROR_DOM_INVALID_ACCESS_XHR_TIMEOUT_AND_RESPONSETYPE_UNSUPPORTED_FOR_SYNC = 0x80530401,
  NS_SUCCESS_DOM_NO_OPERATION = 0x530001,
  NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW = 0x530002,
  NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE = 0x530003,
  NS_IMAGELIB_SUCCESS_LOAD_FINISHED = 0x540000,
  NS_IMAGELIB_CHANGING_OWNER = 0x540001,
  NS_IMAGELIB_ERROR_FAILURE = 0x80540005,
  NS_IMAGELIB_ERROR_NO_DECODER = 0x80540006,
  NS_IMAGELIB_ERROR_NOT_FINISHED = 0x80540007,
  NS_IMAGELIB_ERROR_NO_ENCODER = 0x80540009,
  NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND = 0x560001,
  NS_SUCCESS_EDITOR_FOUND_TARGET = 0x560002,
  NS_ERROR_XPC_NOT_ENOUGH_ARGS = 0x80570001,
  NS_ERROR_XPC_NEED_OUT_OBJECT = 0x80570002,
  NS_ERROR_XPC_CANT_SET_OUT_VAL = 0x80570003,
  NS_ERROR_XPC_NATIVE_RETURNED_FAILURE = 0x80570004,
  NS_ERROR_XPC_CANT_GET_INTERFACE_INFO = 0x80570005,
  NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO = 0x80570006,
  NS_ERROR_XPC_CANT_GET_METHOD_INFO = 0x80570007,
  NS_ERROR_XPC_UNEXPECTED = 0x80570008,
  NS_ERROR_XPC_BAD_CONVERT_JS = 0x80570009,
  NS_ERROR_XPC_BAD_CONVERT_NATIVE = 0x8057000A,
  NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF = 0x8057000B,
  NS_ERROR_XPC_BAD_OP_ON_WN_PROTO = 0x8057000C,
  NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN = 0x8057000D,
  NS_ERROR_XPC_CANT_DEFINE_PROP_ON_WN = 0x8057000E,
  NS_ERROR_XPC_CANT_WATCH_WN_STATIC = 0x8057000F,
  NS_ERROR_XPC_CANT_EXPORT_WN_STATIC = 0x80570010,
  NS_ERROR_XPC_SCRIPTABLE_CALL_FAILED = 0x80570011,
  NS_ERROR_XPC_SCRIPTABLE_CTOR_FAILED = 0x80570012,
  NS_ERROR_XPC_CANT_CALL_WO_SCRIPTABLE = 0x80570013,
  NS_ERROR_XPC_CANT_CTOR_WO_SCRIPTABLE = 0x80570014,
  NS_ERROR_XPC_CI_RETURNED_FAILURE = 0x80570015,
  NS_ERROR_XPC_GS_RETURNED_FAILURE = 0x80570016,
  NS_ERROR_XPC_BAD_CID = 0x80570017,
  NS_ERROR_XPC_BAD_IID = 0x80570018,
  NS_ERROR_XPC_CANT_CREATE_WN = 0x80570019,
  NS_ERROR_XPC_JS_THREW_EXCEPTION = 0x8057001A,
  NS_ERROR_XPC_JS_THREW_NATIVE_OBJECT = 0x8057001B,
  NS_ERROR_XPC_JS_THREW_JS_OBJECT = 0x8057001C,
  NS_ERROR_XPC_JS_THREW_NULL = 0x8057001D,
  NS_ERROR_XPC_JS_THREW_STRING = 0x8057001E,
  NS_ERROR_XPC_JS_THREW_NUMBER = 0x8057001F,
  NS_ERROR_XPC_JAVASCRIPT_ERROR = 0x80570020,
  NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS = 0x80570021,
  NS_ERROR_XPC_CANT_CONVERT_PRIMITIVE_TO_ARRAY = 0x80570022,
  NS_ERROR_XPC_CANT_CONVERT_OBJECT_TO_ARRAY = 0x80570023,
  NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY = 0x80570024,
  NS_ERROR_XPC_CANT_GET_ARRAY_INFO = 0x80570025,
  NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING = 0x80570026,
  NS_ERROR_XPC_SECURITY_MANAGER_VETO = 0x80570027,
  NS_ERROR_XPC_INTERFACE_NOT_SCRIPTABLE = 0x80570028,
  NS_ERROR_XPC_INTERFACE_NOT_FROM_NSISUPPORTS = 0x80570029,
  NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT = 0x8057002A,
  NS_ERROR_XPC_CANT_SET_READ_ONLY_CONSTANT = 0x8057002B,
  NS_ERROR_XPC_CANT_SET_READ_ONLY_ATTRIBUTE = 0x8057002C,
  NS_ERROR_XPC_CANT_SET_READ_ONLY_METHOD = 0x8057002D,
  NS_ERROR_XPC_CANT_ADD_PROP_TO_WRAPPED_NATIVE = 0x8057002E,
  NS_ERROR_XPC_CALL_TO_SCRIPTABLE_FAILED = 0x8057002F,
  NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED = 0x80570030,
  NS_ERROR_XPC_BAD_ID_STRING = 0x80570031,
  NS_ERROR_XPC_BAD_INITIALIZER_NAME = 0x80570032,
  NS_ERROR_XPC_HAS_BEEN_SHUTDOWN = 0x80570033,
  NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN = 0x80570034,
  NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL = 0x80570035,
  NS_ERROR_XPC_CANT_PASS_CPOW_TO_NATIVE = 0x80570036,
  NS_ERROR_LAUNCHED_CHILD_PROCESS = 0x805800C8,
  NS_ERROR_CSP_FORM_ACTION_VIOLATION = 0x805A0062,
  NS_ERROR_CSP_FRAME_ANCESTOR_VIOLATION = 0x805A0063,
  NS_ERROR_SRI_CORRUPT = 0x805A00C8,
  NS_ERROR_SRI_DISABLED = 0x805A00C9,
  NS_ERROR_SRI_NOT_ELIGIBLE = 0x805A00CA,
  NS_ERROR_SRI_UNEXPECTED_HASH_TYPE = 0x805A00CB,
  NS_ERROR_SRI_IMPORT = 0x805A00CC,
  NS_ERROR_CMS_VERIFY_NOT_SIGNED = 0x805A0400,
  NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO = 0x805A0401,
  NS_ERROR_CMS_VERIFY_BAD_DIGEST = 0x805A0402,
  NS_ERROR_CMS_VERIFY_NOCERT = 0x805A0404,
  NS_ERROR_CMS_VERIFY_UNTRUSTED = 0x805A0405,
  NS_ERROR_CMS_VERIFY_ERROR_UNVERIFIED = 0x805A0407,
  NS_ERROR_CMS_VERIFY_ERROR_PROCESSING = 0x805A0408,
  NS_ERROR_CMS_VERIFY_BAD_SIGNATURE = 0x805A0409,
  NS_ERROR_CMS_VERIFY_DIGEST_MISMATCH = 0x805A040A,
  NS_ERROR_CMS_VERIFY_UNKNOWN_ALGO = 0x805A040B,
  NS_ERROR_CMS_VERIFY_UNSUPPORTED_ALGO = 0x805A040C,
  NS_ERROR_CMS_VERIFY_MALFORMED_SIGNATURE = 0x805A040D,
  NS_ERROR_CMS_VERIFY_HEADER_MISMATCH = 0x805A040E,
  NS_ERROR_CMS_VERIFY_NOT_YET_ATTEMPTED = 0x805A040F,
  NS_ERROR_CMS_VERIFY_CERT_WITHOUT_ADDRESS = 0x805A0410,
  NS_ERROR_CMS_ENCRYPT_NO_BULK_ALG = 0x805A0420,
  NS_ERROR_CMS_ENCRYPT_INCOMPLETE = 0x805A0421,
  NS_ERROR_DOM_INVALID_EXPRESSION_ERR = 0x805B0033,
  NS_ERROR_DOM_TYPE_ERR = 0x805B0034,
  NS_ERROR_WONT_HANDLE_CONTENT = 0x805D0001,
  NS_ERROR_MALWARE_URI = 0x805D001E,
  NS_ERROR_PHISHING_URI = 0x805D001F,
  NS_ERROR_TRACKING_URI = 0x805D0022,
  NS_ERROR_UNWANTED_URI = 0x805D0023,
  NS_ERROR_BLOCKED_URI = 0x805D0025,
  NS_ERROR_SAVE_LINK_AS_TIMEOUT = 0x805D0020,
  NS_ERROR_PARSED_DATA_CACHED = 0x805D0021,
  NS_REFRESHURI_HEADER_FOUND = 0x5D0002,
  NS_ERROR_IMAGE_SRC_CHANGED = 0x805E0004,
  NS_ERROR_IMAGE_BLOCKED = 0x805E0005,
  NS_ERROR_CONTENT_BLOCKED = 0x805E0006,
  NS_ERROR_CONTENT_BLOCKED_SHOW_ALT = 0x805E0007,
  NS_PROPTABLE_PROP_NOT_THERE = 0x805E000A,
  NS_ERROR_XBL_BLOCKED = 0x805E000F,
  NS_ERROR_CONTENT_CRASHED = 0x805E0010,
  NS_HTML_STYLE_PROPERTY_NOT_THERE = 0x5E0002,
  NS_CONTENT_BLOCKED = 0x5E0008,
  NS_CONTENT_BLOCKED_SHOW_ALT = 0x5E0009,
  NS_PROPTABLE_PROP_OVERWRITTEN = 0x5E000B,
  NS_FINDBROADCASTER_NOT_FOUND = 0x5E000C,
  NS_FINDBROADCASTER_FOUND = 0x5E000D,
  NS_FINDBROADCASTER_AWAIT_OVERLAYS = 0x5E000E,
  NS_ERROR_XPATH_INVALID_ARG = 0x80070057,
  NS_ERROR_XSLT_PARSE_FAILURE = 0x80600001,
  NS_ERROR_XPATH_PARSE_FAILURE = 0x80600002,
  NS_ERROR_XSLT_ALREADY_SET = 0x80600003,
  NS_ERROR_XSLT_EXECUTION_FAILURE = 0x80600004,
  NS_ERROR_XPATH_UNKNOWN_FUNCTION = 0x80600005,
  NS_ERROR_XSLT_BAD_RECURSION = 0x80600006,
  NS_ERROR_XSLT_BAD_VALUE = 0x80600007,
  NS_ERROR_XSLT_NODESET_EXPECTED = 0x80600008,
  NS_ERROR_XSLT_ABORTED = 0x80600009,
  NS_ERROR_XSLT_NETWORK_ERROR = 0x8060000A,
  NS_ERROR_XSLT_WRONG_MIME_TYPE = 0x8060000B,
  NS_ERROR_XSLT_LOAD_RECURSION = 0x8060000C,
  NS_ERROR_XPATH_BAD_ARGUMENT_COUNT = 0x8060000D,
  NS_ERROR_XPATH_BAD_EXTENSION_FUNCTION = 0x8060000E,
  NS_ERROR_XPATH_PAREN_EXPECTED = 0x8060000F,
  NS_ERROR_XPATH_INVALID_AXIS = 0x80600010,
  NS_ERROR_XPATH_NO_NODE_TYPE_TEST = 0x80600011,
  NS_ERROR_XPATH_BRACKET_EXPECTED = 0x80600012,
  NS_ERROR_XPATH_INVALID_VAR_NAME = 0x80600013,
  NS_ERROR_XPATH_UNEXPECTED_END = 0x80600014,
  NS_ERROR_XPATH_OPERATOR_EXPECTED = 0x80600015,
  NS_ERROR_XPATH_UNCLOSED_LITERAL = 0x80600016,
  NS_ERROR_XPATH_BAD_COLON = 0x80600017,
  NS_ERROR_XPATH_BAD_BANG = 0x80600018,
  NS_ERROR_XPATH_ILLEGAL_CHAR = 0x80600019,
  NS_ERROR_XPATH_BINARY_EXPECTED = 0x8060001A,
  NS_ERROR_XSLT_LOAD_BLOCKED_ERROR = 0x8060001B,
  NS_ERROR_XPATH_INVALID_EXPRESSION_EVALUATED = 0x8060001C,
  NS_ERROR_XPATH_UNBALANCED_CURLY_BRACE = 0x8060001D,
  NS_ERROR_XSLT_BAD_NODE_NAME = 0x8060001E,
  NS_ERROR_XSLT_VAR_ALREADY_SET = 0x8060001F,
  NS_ERROR_XSLT_CALL_TO_KEY_NOT_ALLOWED = 0x80600020,
  NS_XSLT_GET_NEW_HANDLER = 0x600001,
  NS_ERROR_TRANSPORT_INIT = 0x80610001,
  NS_ERROR_DUPLICATE_HANDLE = 0x80610002,
  NS_ERROR_BRIDGE_OPEN_PARENT = 0x80610003,
  NS_ERROR_BRIDGE_OPEN_CHILD = 0x80610004,
  NS_ERROR_DOM_SVG_WRONG_TYPE_ERR = 0x80620000,
  NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE = 0x80620002,
  NS_ERROR_STORAGE_BUSY = 0x80630001,
  NS_ERROR_STORAGE_IOERR = 0x80630002,
  NS_ERROR_STORAGE_CONSTRAINT = 0x80630003,
  NS_ERROR_DOM_FILE_NOT_FOUND_ERR = 0x80650000,
  NS_ERROR_DOM_FILE_NOT_READABLE_ERR = 0x80650001,
  NS_ERROR_DOM_FILE_ABORT_ERR = 0x80650002,
  NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR = 0x80660001,
  NS_ERROR_DOM_INDEXEDDB_NOT_FOUND_ERR = 0x80660003,
  NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR = 0x80660004,
  NS_ERROR_DOM_INDEXEDDB_DATA_ERR = 0x80660005,
  NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR = 0x80660006,
  NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR = 0x80660007,
  NS_ERROR_DOM_INDEXEDDB_ABORT_ERR = 0x80660008,
  NS_ERROR_DOM_INDEXEDDB_READ_ONLY_ERR = 0x80660009,
  NS_ERROR_DOM_INDEXEDDB_TIMEOUT_ERR = 0x8066000A,
  NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR = 0x8066000B,
  NS_ERROR_DOM_INDEXEDDB_VERSION_ERR = 0x8066000C,
  NS_ERROR_DOM_INDEXEDDB_RECOVERABLE_ERR = 0x806603E9,
  NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR = 0x80670001,
  NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR = 0x80670002,
  NS_ERROR_DOM_FILEHANDLE_INACTIVE_ERR = 0x80670003,
  NS_ERROR_DOM_FILEHANDLE_ABORT_ERR = 0x80670004,
  NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR = 0x80670005,
  NS_ERROR_DOM_FILEHANDLE_QUOTA_ERR = 0x80670006,
  NS_ERROR_SIGNED_JAR_NOT_SIGNED = 0x80680001,
  NS_ERROR_SIGNED_JAR_MODIFIED_ENTRY = 0x80680002,
  NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY = 0x80680003,
  NS_ERROR_SIGNED_JAR_ENTRY_MISSING = 0x80680004,
  NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE = 0x80680005,
  NS_ERROR_SIGNED_JAR_ENTRY_TOO_LARGE = 0x80680006,
  NS_ERROR_SIGNED_JAR_ENTRY_INVALID = 0x80680007,
  NS_ERROR_SIGNED_JAR_MANIFEST_INVALID = 0x80680008,
  NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR = 0x80690001,
  NS_ERROR_DOM_FILESYSTEM_INVALID_MODIFICATION_ERR = 0x80690002,
  NS_ERROR_DOM_FILESYSTEM_NO_MODIFICATION_ALLOWED_ERR = 0x80690003,
  NS_ERROR_DOM_FILESYSTEM_PATH_EXISTS_ERR = 0x80690004,
  NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR = 0x80690005,
  NS_ERROR_DOM_FILESYSTEM_UNKNOWN_ERR = 0x80690006,
  NS_ERROR_SIGNED_APP_MANIFEST_INVALID = 0x806B0001,
  NS_ERROR_DOM_ANIM_MISSING_PROPS_ERR = 0x806C0001,
  NS_ERROR_DOM_PUSH_INVALID_REGISTRATION_ERR = 0x806D0001,
  NS_ERROR_DOM_PUSH_DENIED_ERR = 0x806D0002,
  NS_ERROR_DOM_PUSH_ABORT_ERR = 0x806D0003,
  NS_ERROR_DOM_PUSH_SERVICE_UNREACHABLE = 0x806D0004,
  NS_ERROR_DOM_PUSH_INVALID_KEY_ERR = 0x806D0005,
  NS_ERROR_DOM_PUSH_MISMATCHED_KEY_ERR = 0x806D0006,
  NS_ERROR_DOM_MEDIA_ABORT_ERR = 0x806E0001,
  NS_ERROR_DOM_MEDIA_NOT_ALLOWED_ERR = 0x806E0002,
  NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR = 0x806E0003,
  NS_ERROR_DOM_MEDIA_DECODE_ERR = 0x806E0004,
  NS_ERROR_DOM_MEDIA_FATAL_ERR = 0x806E0005,
  NS_ERROR_DOM_MEDIA_METADATA_ERR = 0x806E0006,
  NS_ERROR_DOM_MEDIA_OVERFLOW_ERR = 0x806E0007,
  NS_ERROR_DOM_MEDIA_END_OF_STREAM = 0x806E0008,
  NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA = 0x806E0009,
  NS_ERROR_DOM_MEDIA_CANCELED = 0x806E000A,
  NS_ERROR_DOM_MEDIA_MEDIASINK_ERR = 0x806E000B,
  NS_ERROR_DOM_MEDIA_DEMUXER_ERR = 0x806E000C,
  NS_ERROR_DOM_MEDIA_CDM_ERR = 0x806E000D,
  NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER = 0x806E000E,
  NS_ERROR_DOM_MEDIA_INITIALIZING_DECODER = 0x806E000F,
  NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR = 0x806E0065,
  NS_ERROR_UC_UPDATE_UNKNOWN = 0x806F0001,
  NS_ERROR_UC_UPDATE_DUPLICATE_PREFIX = 0x806F0002,
  NS_ERROR_UC_UPDATE_INFINITE_LOOP = 0x806F0003,
  NS_ERROR_UC_UPDATE_WRONG_REMOVAL_INDICES = 0x806F0004,
  NS_ERROR_UC_UPDATE_CHECKSUM_MISMATCH = 0x806F0005,
  NS_ERROR_UC_UPDATE_MISSING_CHECKSUM = 0x806F0006,
  NS_ERROR_UC_UPDATE_SHUTDOWNING = 0x806F0007,
  NS_ERROR_UC_UPDATE_TABLE_NOT_FOUND = 0x806F0008,
  NS_ERROR_UC_UPDATE_BUILD_PREFIX_FAILURE = 0x806F0009,
  NS_ERROR_UC_UPDATE_FAIL_TO_WRITE_DISK = 0x806F000A,
  NS_ERROR_UC_UPDATE_PROTOCOL_PARSER_ERROR = 0x806F000B,
  NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION = 0x80700001,
  NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION = 0x80700002,
  NS_ERROR_INTERNAL_ERRORRESULT_EXCEPTION_ON_JSCONTEXT = 0x80700003,
  NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR = 0x80700004,
  NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR = 0x80700005,
  NS_ERROR_DOWNLOAD_COMPLETE = 0x80780001,
  NS_ERROR_DOWNLOAD_NOT_PARTIAL = 0x80780002,
  NS_ERROR_UNORM_MOREOUTPUT = 0x80780021,
  NS_ERROR_DOCSHELL_REQUEST_REJECTED = 0x807803E9,
  NS_ERROR_DOCUMENT_IS_PRINTMODE = 0x807807D1,
  NS_SUCCESS_DONT_FIXUP = 0x780001,
  NS_SUCCESS_RESTART_APP = 0x780001,
  NS_SUCCESS_RESTART_APP_NOT_SAME_PROFILE = 0x780003,
  NS_SUCCESS_UNORM_NOTFOUND = 0x780011,
  NS_ERROR_NOT_IN_TREE = 0x80780026,
  NS_OK_NO_NAME_CLAUSE_HANDLED = 0x780022
};


const nsresult
  NS_OK = nsresult::NS_OK,
  NS_ERROR_BASE = nsresult::NS_ERROR_BASE,
  NS_ERROR_NOT_INITIALIZED = nsresult::NS_ERROR_NOT_INITIALIZED,
  NS_ERROR_ALREADY_INITIALIZED = nsresult::NS_ERROR_ALREADY_INITIALIZED,
  NS_ERROR_NOT_IMPLEMENTED = nsresult::NS_ERROR_NOT_IMPLEMENTED,
  NS_NOINTERFACE = nsresult::NS_NOINTERFACE,
  NS_ERROR_NO_INTERFACE = nsresult::NS_ERROR_NO_INTERFACE,
  NS_ERROR_ABORT = nsresult::NS_ERROR_ABORT,
  NS_ERROR_FAILURE = nsresult::NS_ERROR_FAILURE,
  NS_ERROR_UNEXPECTED = nsresult::NS_ERROR_UNEXPECTED,
  NS_ERROR_OUT_OF_MEMORY = nsresult::NS_ERROR_OUT_OF_MEMORY,
  NS_ERROR_ILLEGAL_VALUE = nsresult::NS_ERROR_ILLEGAL_VALUE,
  NS_ERROR_INVALID_ARG = nsresult::NS_ERROR_INVALID_ARG,
  NS_ERROR_INVALID_POINTER = nsresult::NS_ERROR_INVALID_POINTER,
  NS_ERROR_NULL_POINTER = nsresult::NS_ERROR_NULL_POINTER,
  NS_ERROR_NO_AGGREGATION = nsresult::NS_ERROR_NO_AGGREGATION,
  NS_ERROR_NOT_AVAILABLE = nsresult::NS_ERROR_NOT_AVAILABLE,
  NS_ERROR_FACTORY_NOT_REGISTERED = nsresult::NS_ERROR_FACTORY_NOT_REGISTERED,
  NS_ERROR_FACTORY_REGISTER_AGAIN = nsresult::NS_ERROR_FACTORY_REGISTER_AGAIN,
  NS_ERROR_FACTORY_NOT_LOADED = nsresult::NS_ERROR_FACTORY_NOT_LOADED,
  NS_ERROR_FACTORY_NO_SIGNATURE_SUPPORT = nsresult::NS_ERROR_FACTORY_NO_SIGNATURE_SUPPORT,
  NS_ERROR_FACTORY_EXISTS = nsresult::NS_ERROR_FACTORY_EXISTS,
  NS_ERROR_CANNOT_CONVERT_DATA = nsresult::NS_ERROR_CANNOT_CONVERT_DATA,
  NS_ERROR_OBJECT_IS_IMMUTABLE = nsresult::NS_ERROR_OBJECT_IS_IMMUTABLE,
  NS_ERROR_LOSS_OF_SIGNIFICANT_DATA = nsresult::NS_ERROR_LOSS_OF_SIGNIFICANT_DATA,
  NS_ERROR_NOT_SAME_THREAD = nsresult::NS_ERROR_NOT_SAME_THREAD,
  NS_ERROR_ILLEGAL_DURING_SHUTDOWN = nsresult::NS_ERROR_ILLEGAL_DURING_SHUTDOWN,
  NS_ERROR_SERVICE_NOT_AVAILABLE = nsresult::NS_ERROR_SERVICE_NOT_AVAILABLE,
  NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA = nsresult::NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA,
  NS_SUCCESS_INTERRUPTED_TRAVERSE = nsresult::NS_SUCCESS_INTERRUPTED_TRAVERSE,
  NS_ERROR_SERVICE_NOT_FOUND = nsresult::NS_ERROR_SERVICE_NOT_FOUND,
  NS_ERROR_SERVICE_IN_USE = nsresult::NS_ERROR_SERVICE_IN_USE,
  NS_BASE_STREAM_CLOSED = nsresult::NS_BASE_STREAM_CLOSED,
  NS_BASE_STREAM_OSERROR = nsresult::NS_BASE_STREAM_OSERROR,
  NS_BASE_STREAM_ILLEGAL_ARGS = nsresult::NS_BASE_STREAM_ILLEGAL_ARGS,
  NS_BASE_STREAM_NO_CONVERTER = nsresult::NS_BASE_STREAM_NO_CONVERTER,
  NS_BASE_STREAM_BAD_CONVERSION = nsresult::NS_BASE_STREAM_BAD_CONVERSION,
  NS_BASE_STREAM_WOULD_BLOCK = nsresult::NS_BASE_STREAM_WOULD_BLOCK,
  NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE = nsresult::NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE,
  NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND = nsresult::NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND,
  NS_ERROR_GFX_PRINTER_COULD_NOT_OPEN_FILE = nsresult::NS_ERROR_GFX_PRINTER_COULD_NOT_OPEN_FILE,
  NS_ERROR_GFX_PRINTER_STARTDOC = nsresult::NS_ERROR_GFX_PRINTER_STARTDOC,
  NS_ERROR_GFX_PRINTER_ENDDOC = nsresult::NS_ERROR_GFX_PRINTER_ENDDOC,
  NS_ERROR_GFX_PRINTER_STARTPAGE = nsresult::NS_ERROR_GFX_PRINTER_STARTPAGE,
  NS_ERROR_GFX_PRINTER_DOC_IS_BUSY = nsresult::NS_ERROR_GFX_PRINTER_DOC_IS_BUSY,
  NS_ERROR_GFX_CMAP_MALFORMED = nsresult::NS_ERROR_GFX_CMAP_MALFORMED,
  NS_SUCCESS_EVENT_CONSUMED = nsresult::NS_SUCCESS_EVENT_CONSUMED,
  NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY = nsresult::NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY,
  NS_BINDING_SUCCEEDED = nsresult::NS_BINDING_SUCCEEDED,
  NS_BINDING_FAILED = nsresult::NS_BINDING_FAILED,
  NS_BINDING_ABORTED = nsresult::NS_BINDING_ABORTED,
  NS_BINDING_REDIRECTED = nsresult::NS_BINDING_REDIRECTED,
  NS_BINDING_RETARGETED = nsresult::NS_BINDING_RETARGETED,
  NS_ERROR_MALFORMED_URI = nsresult::NS_ERROR_MALFORMED_URI,
  NS_ERROR_IN_PROGRESS = nsresult::NS_ERROR_IN_PROGRESS,
  NS_ERROR_NO_CONTENT = nsresult::NS_ERROR_NO_CONTENT,
  NS_ERROR_UNKNOWN_PROTOCOL = nsresult::NS_ERROR_UNKNOWN_PROTOCOL,
  NS_ERROR_INVALID_CONTENT_ENCODING = nsresult::NS_ERROR_INVALID_CONTENT_ENCODING,
  NS_ERROR_CORRUPTED_CONTENT = nsresult::NS_ERROR_CORRUPTED_CONTENT,
  NS_ERROR_INVALID_SIGNATURE = nsresult::NS_ERROR_INVALID_SIGNATURE,
  NS_ERROR_FIRST_HEADER_FIELD_COMPONENT_EMPTY = nsresult::NS_ERROR_FIRST_HEADER_FIELD_COMPONENT_EMPTY,
  NS_ERROR_ALREADY_OPENED = nsresult::NS_ERROR_ALREADY_OPENED,
  NS_ERROR_ALREADY_CONNECTED = nsresult::NS_ERROR_ALREADY_CONNECTED,
  NS_ERROR_NOT_CONNECTED = nsresult::NS_ERROR_NOT_CONNECTED,
  NS_ERROR_CONNECTION_REFUSED = nsresult::NS_ERROR_CONNECTION_REFUSED,
  NS_ERROR_NET_TIMEOUT = nsresult::NS_ERROR_NET_TIMEOUT,
  NS_ERROR_OFFLINE = nsresult::NS_ERROR_OFFLINE,
  NS_ERROR_PORT_ACCESS_NOT_ALLOWED = nsresult::NS_ERROR_PORT_ACCESS_NOT_ALLOWED,
  NS_ERROR_NET_RESET = nsresult::NS_ERROR_NET_RESET,
  NS_ERROR_NET_INTERRUPT = nsresult::NS_ERROR_NET_INTERRUPT,
  NS_ERROR_PROXY_CONNECTION_REFUSED = nsresult::NS_ERROR_PROXY_CONNECTION_REFUSED,
  NS_ERROR_NET_PARTIAL_TRANSFER = nsresult::NS_ERROR_NET_PARTIAL_TRANSFER,
  NS_ERROR_NET_INADEQUATE_SECURITY = nsresult::NS_ERROR_NET_INADEQUATE_SECURITY,
  NS_ERROR_NOT_RESUMABLE = nsresult::NS_ERROR_NOT_RESUMABLE,
  NS_ERROR_REDIRECT_LOOP = nsresult::NS_ERROR_REDIRECT_LOOP,
  NS_ERROR_ENTITY_CHANGED = nsresult::NS_ERROR_ENTITY_CHANGED,
  NS_ERROR_UNSAFE_CONTENT_TYPE = nsresult::NS_ERROR_UNSAFE_CONTENT_TYPE,
  NS_ERROR_REMOTE_XUL = nsresult::NS_ERROR_REMOTE_XUL,
  NS_ERROR_LOAD_SHOWED_ERRORPAGE = nsresult::NS_ERROR_LOAD_SHOWED_ERRORPAGE,
  NS_ERROR_DOCSHELL_DYING = nsresult::NS_ERROR_DOCSHELL_DYING,
  NS_ERROR_FTP_LOGIN = nsresult::NS_ERROR_FTP_LOGIN,
  NS_ERROR_FTP_CWD = nsresult::NS_ERROR_FTP_CWD,
  NS_ERROR_FTP_PASV = nsresult::NS_ERROR_FTP_PASV,
  NS_ERROR_FTP_PWD = nsresult::NS_ERROR_FTP_PWD,
  NS_ERROR_FTP_LIST = nsresult::NS_ERROR_FTP_LIST,
  NS_ERROR_UNKNOWN_HOST = nsresult::NS_ERROR_UNKNOWN_HOST,
  NS_ERROR_DNS_LOOKUP_QUEUE_FULL = nsresult::NS_ERROR_DNS_LOOKUP_QUEUE_FULL,
  NS_ERROR_UNKNOWN_PROXY_HOST = nsresult::NS_ERROR_UNKNOWN_PROXY_HOST,
  NS_ERROR_UNKNOWN_SOCKET_TYPE = nsresult::NS_ERROR_UNKNOWN_SOCKET_TYPE,
  NS_ERROR_SOCKET_CREATE_FAILED = nsresult::NS_ERROR_SOCKET_CREATE_FAILED,
  NS_ERROR_SOCKET_ADDRESS_NOT_SUPPORTED = nsresult::NS_ERROR_SOCKET_ADDRESS_NOT_SUPPORTED,
  NS_ERROR_SOCKET_ADDRESS_IN_USE = nsresult::NS_ERROR_SOCKET_ADDRESS_IN_USE,
  NS_ERROR_CACHE_KEY_NOT_FOUND = nsresult::NS_ERROR_CACHE_KEY_NOT_FOUND,
  NS_ERROR_CACHE_DATA_IS_STREAM = nsresult::NS_ERROR_CACHE_DATA_IS_STREAM,
  NS_ERROR_CACHE_DATA_IS_NOT_STREAM = nsresult::NS_ERROR_CACHE_DATA_IS_NOT_STREAM,
  NS_ERROR_CACHE_WAIT_FOR_VALIDATION = nsresult::NS_ERROR_CACHE_WAIT_FOR_VALIDATION,
  NS_ERROR_CACHE_ENTRY_DOOMED = nsresult::NS_ERROR_CACHE_ENTRY_DOOMED,
  NS_ERROR_CACHE_READ_ACCESS_DENIED = nsresult::NS_ERROR_CACHE_READ_ACCESS_DENIED,
  NS_ERROR_CACHE_WRITE_ACCESS_DENIED = nsresult::NS_ERROR_CACHE_WRITE_ACCESS_DENIED,
  NS_ERROR_CACHE_IN_USE = nsresult::NS_ERROR_CACHE_IN_USE,
  NS_ERROR_DOCUMENT_NOT_CACHED = nsresult::NS_ERROR_DOCUMENT_NOT_CACHED,
  NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS = nsresult::NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS,
  NS_ERROR_HOST_IS_IP_ADDRESS = nsresult::NS_ERROR_HOST_IS_IP_ADDRESS,
  NS_SUCCESS_ADOPTED_DATA = nsresult::NS_SUCCESS_ADOPTED_DATA,
  NS_NET_STATUS_BEGIN_FTP_TRANSACTION = nsresult::NS_NET_STATUS_BEGIN_FTP_TRANSACTION,
  NS_NET_STATUS_END_FTP_TRANSACTION = nsresult::NS_NET_STATUS_END_FTP_TRANSACTION,
  NS_SUCCESS_AUTH_FINISHED = nsresult::NS_SUCCESS_AUTH_FINISHED,
  NS_NET_STATUS_READING = nsresult::NS_NET_STATUS_READING,
  NS_NET_STATUS_WRITING = nsresult::NS_NET_STATUS_WRITING,
  NS_NET_STATUS_RESOLVING_HOST = nsresult::NS_NET_STATUS_RESOLVING_HOST,
  NS_NET_STATUS_RESOLVED_HOST = nsresult::NS_NET_STATUS_RESOLVED_HOST,
  NS_NET_STATUS_CONNECTING_TO = nsresult::NS_NET_STATUS_CONNECTING_TO,
  NS_NET_STATUS_CONNECTED_TO = nsresult::NS_NET_STATUS_CONNECTED_TO,
  NS_NET_STATUS_TLS_HANDSHAKE_STARTING = nsresult::NS_NET_STATUS_TLS_HANDSHAKE_STARTING,
  NS_NET_STATUS_TLS_HANDSHAKE_ENDED = nsresult::NS_NET_STATUS_TLS_HANDSHAKE_ENDED,
  NS_NET_STATUS_SENDING_TO = nsresult::NS_NET_STATUS_SENDING_TO,
  NS_NET_STATUS_WAITING_FOR = nsresult::NS_NET_STATUS_WAITING_FOR,
  NS_NET_STATUS_RECEIVING_FROM = nsresult::NS_NET_STATUS_RECEIVING_FROM,
  NS_ERROR_INTERCEPTION_FAILED = nsresult::NS_ERROR_INTERCEPTION_FAILED,
  NS_ERROR_HSTS_PRIMING_TIMEOUT = nsresult::NS_ERROR_HSTS_PRIMING_TIMEOUT,
  NS_ERROR_PLUGINS_PLUGINSNOTCHANGED = nsresult::NS_ERROR_PLUGINS_PLUGINSNOTCHANGED,
  NS_ERROR_PLUGIN_DISABLED = nsresult::NS_ERROR_PLUGIN_DISABLED,
  NS_ERROR_PLUGIN_BLOCKLISTED = nsresult::NS_ERROR_PLUGIN_BLOCKLISTED,
  NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED = nsresult::NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED,
  NS_ERROR_PLUGIN_CLICKTOPLAY = nsresult::NS_ERROR_PLUGIN_CLICKTOPLAY,
  NS_PLUGIN_INIT_PENDING = nsresult::NS_PLUGIN_INIT_PENDING,
  NS_TABLELAYOUT_CELL_NOT_FOUND = nsresult::NS_TABLELAYOUT_CELL_NOT_FOUND,
  NS_POSITION_BEFORE_TABLE = nsresult::NS_POSITION_BEFORE_TABLE,
  NS_STATE_PROPERTY_EXISTS = nsresult::NS_STATE_PROPERTY_EXISTS,
  NS_STATE_PROPERTY_NOT_THERE = nsresult::NS_STATE_PROPERTY_NOT_THERE,
  NS_ERROR_HTMLPARSER_CONTINUE = nsresult::NS_ERROR_HTMLPARSER_CONTINUE,
  NS_ERROR_HTMLPARSER_EOF = nsresult::NS_ERROR_HTMLPARSER_EOF,
  NS_ERROR_HTMLPARSER_UNKNOWN = nsresult::NS_ERROR_HTMLPARSER_UNKNOWN,
  NS_ERROR_HTMLPARSER_CANTPROPAGATE = nsresult::NS_ERROR_HTMLPARSER_CANTPROPAGATE,
  NS_ERROR_HTMLPARSER_CONTEXTMISMATCH = nsresult::NS_ERROR_HTMLPARSER_CONTEXTMISMATCH,
  NS_ERROR_HTMLPARSER_BADFILENAME = nsresult::NS_ERROR_HTMLPARSER_BADFILENAME,
  NS_ERROR_HTMLPARSER_BADURL = nsresult::NS_ERROR_HTMLPARSER_BADURL,
  NS_ERROR_HTMLPARSER_INVALIDPARSERCONTEXT = nsresult::NS_ERROR_HTMLPARSER_INVALIDPARSERCONTEXT,
  NS_ERROR_HTMLPARSER_INTERRUPTED = nsresult::NS_ERROR_HTMLPARSER_INTERRUPTED,
  NS_ERROR_HTMLPARSER_BLOCK = nsresult::NS_ERROR_HTMLPARSER_BLOCK,
  NS_ERROR_HTMLPARSER_BADTOKENIZER = nsresult::NS_ERROR_HTMLPARSER_BADTOKENIZER,
  NS_ERROR_HTMLPARSER_BADATTRIBUTE = nsresult::NS_ERROR_HTMLPARSER_BADATTRIBUTE,
  NS_ERROR_HTMLPARSER_UNRESOLVEDDTD = nsresult::NS_ERROR_HTMLPARSER_UNRESOLVEDDTD,
  NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT = nsresult::NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT,
  NS_ERROR_HTMLPARSER_BADDTD = nsresult::NS_ERROR_HTMLPARSER_BADDTD,
  NS_ERROR_HTMLPARSER_BADCONTEXT = nsresult::NS_ERROR_HTMLPARSER_BADCONTEXT,
  NS_ERROR_HTMLPARSER_STOPPARSING = nsresult::NS_ERROR_HTMLPARSER_STOPPARSING,
  NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL = nsresult::NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL,
  NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP = nsresult::NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP,
  NS_ERROR_HTMLPARSER_FAKE_ENDTAG = nsresult::NS_ERROR_HTMLPARSER_FAKE_ENDTAG,
  NS_ERROR_HTMLPARSER_INVALID_COMMENT = nsresult::NS_ERROR_HTMLPARSER_INVALID_COMMENT,
  NS_HTMLTOKENS_NOT_AN_ENTITY = nsresult::NS_HTMLTOKENS_NOT_AN_ENTITY,
  NS_HTMLPARSER_VALID_META_CHARSET = nsresult::NS_HTMLPARSER_VALID_META_CHARSET,
  NS_RDF_ASSERTION_ACCEPTED = nsresult::NS_RDF_ASSERTION_ACCEPTED,
  NS_RDF_CURSOR_EMPTY = nsresult::NS_RDF_CURSOR_EMPTY,
  NS_RDF_NO_VALUE = nsresult::NS_RDF_NO_VALUE,
  NS_RDF_ASSERTION_REJECTED = nsresult::NS_RDF_ASSERTION_REJECTED,
  NS_RDF_STOP_VISIT = nsresult::NS_RDF_STOP_VISIT,
  NS_ERROR_UCONV_NOCONV = nsresult::NS_ERROR_UCONV_NOCONV,
  NS_ERROR_UDEC_ILLEGALINPUT = nsresult::NS_ERROR_UDEC_ILLEGALINPUT,
  NS_SUCCESS_USING_FALLBACK_LOCALE = nsresult::NS_SUCCESS_USING_FALLBACK_LOCALE,
  NS_OK_UDEC_EXACTLENGTH = nsresult::NS_OK_UDEC_EXACTLENGTH,
  NS_OK_UDEC_MOREINPUT = nsresult::NS_OK_UDEC_MOREINPUT,
  NS_OK_UDEC_MOREOUTPUT = nsresult::NS_OK_UDEC_MOREOUTPUT,
  NS_OK_UDEC_NOBOMFOUND = nsresult::NS_OK_UDEC_NOBOMFOUND,
  NS_OK_UENC_EXACTLENGTH = nsresult::NS_OK_UENC_EXACTLENGTH,
  NS_OK_UENC_MOREOUTPUT = nsresult::NS_OK_UENC_MOREOUTPUT,
  NS_ERROR_UENC_NOMAPPING = nsresult::NS_ERROR_UENC_NOMAPPING,
  NS_OK_UENC_MOREINPUT = nsresult::NS_OK_UENC_MOREINPUT,
  NS_EXACT_LENGTH = nsresult::NS_EXACT_LENGTH,
  NS_PARTIAL_MORE_INPUT = nsresult::NS_PARTIAL_MORE_INPUT,
  NS_PARTIAL_MORE_OUTPUT = nsresult::NS_PARTIAL_MORE_OUTPUT,
  NS_ERROR_ILLEGAL_INPUT = nsresult::NS_ERROR_ILLEGAL_INPUT,
  NS_ERROR_FILE_UNRECOGNIZED_PATH = nsresult::NS_ERROR_FILE_UNRECOGNIZED_PATH,
  NS_ERROR_FILE_UNRESOLVABLE_SYMLINK = nsresult::NS_ERROR_FILE_UNRESOLVABLE_SYMLINK,
  NS_ERROR_FILE_EXECUTION_FAILED = nsresult::NS_ERROR_FILE_EXECUTION_FAILED,
  NS_ERROR_FILE_UNKNOWN_TYPE = nsresult::NS_ERROR_FILE_UNKNOWN_TYPE,
  NS_ERROR_FILE_DESTINATION_NOT_DIR = nsresult::NS_ERROR_FILE_DESTINATION_NOT_DIR,
  NS_ERROR_FILE_TARGET_DOES_NOT_EXIST = nsresult::NS_ERROR_FILE_TARGET_DOES_NOT_EXIST,
  NS_ERROR_FILE_COPY_OR_MOVE_FAILED = nsresult::NS_ERROR_FILE_COPY_OR_MOVE_FAILED,
  NS_ERROR_FILE_ALREADY_EXISTS = nsresult::NS_ERROR_FILE_ALREADY_EXISTS,
  NS_ERROR_FILE_INVALID_PATH = nsresult::NS_ERROR_FILE_INVALID_PATH,
  NS_ERROR_FILE_DISK_FULL = nsresult::NS_ERROR_FILE_DISK_FULL,
  NS_ERROR_FILE_CORRUPTED = nsresult::NS_ERROR_FILE_CORRUPTED,
  NS_ERROR_FILE_NOT_DIRECTORY = nsresult::NS_ERROR_FILE_NOT_DIRECTORY,
  NS_ERROR_FILE_IS_DIRECTORY = nsresult::NS_ERROR_FILE_IS_DIRECTORY,
  NS_ERROR_FILE_IS_LOCKED = nsresult::NS_ERROR_FILE_IS_LOCKED,
  NS_ERROR_FILE_TOO_BIG = nsresult::NS_ERROR_FILE_TOO_BIG,
  NS_ERROR_FILE_NO_DEVICE_SPACE = nsresult::NS_ERROR_FILE_NO_DEVICE_SPACE,
  NS_ERROR_FILE_NAME_TOO_LONG = nsresult::NS_ERROR_FILE_NAME_TOO_LONG,
  NS_ERROR_FILE_NOT_FOUND = nsresult::NS_ERROR_FILE_NOT_FOUND,
  NS_ERROR_FILE_READ_ONLY = nsresult::NS_ERROR_FILE_READ_ONLY,
  NS_ERROR_FILE_DIR_NOT_EMPTY = nsresult::NS_ERROR_FILE_DIR_NOT_EMPTY,
  NS_ERROR_FILE_ACCESS_DENIED = nsresult::NS_ERROR_FILE_ACCESS_DENIED,
  NS_SUCCESS_FILE_DIRECTORY_EMPTY = nsresult::NS_SUCCESS_FILE_DIRECTORY_EMPTY,
  NS_SUCCESS_AGGREGATE_RESULT = nsresult::NS_SUCCESS_AGGREGATE_RESULT,
  NS_ERROR_DOM_INDEX_SIZE_ERR = nsresult::NS_ERROR_DOM_INDEX_SIZE_ERR,
  NS_ERROR_DOM_HIERARCHY_REQUEST_ERR = nsresult::NS_ERROR_DOM_HIERARCHY_REQUEST_ERR,
  NS_ERROR_DOM_WRONG_DOCUMENT_ERR = nsresult::NS_ERROR_DOM_WRONG_DOCUMENT_ERR,
  NS_ERROR_DOM_INVALID_CHARACTER_ERR = nsresult::NS_ERROR_DOM_INVALID_CHARACTER_ERR,
  NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR = nsresult::NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR,
  NS_ERROR_DOM_NOT_FOUND_ERR = nsresult::NS_ERROR_DOM_NOT_FOUND_ERR,
  NS_ERROR_DOM_NOT_SUPPORTED_ERR = nsresult::NS_ERROR_DOM_NOT_SUPPORTED_ERR,
  NS_ERROR_DOM_INUSE_ATTRIBUTE_ERR = nsresult::NS_ERROR_DOM_INUSE_ATTRIBUTE_ERR,
  NS_ERROR_DOM_INVALID_STATE_ERR = nsresult::NS_ERROR_DOM_INVALID_STATE_ERR,
  NS_ERROR_DOM_SYNTAX_ERR = nsresult::NS_ERROR_DOM_SYNTAX_ERR,
  NS_ERROR_DOM_INVALID_MODIFICATION_ERR = nsresult::NS_ERROR_DOM_INVALID_MODIFICATION_ERR,
  NS_ERROR_DOM_NAMESPACE_ERR = nsresult::NS_ERROR_DOM_NAMESPACE_ERR,
  NS_ERROR_DOM_INVALID_ACCESS_ERR = nsresult::NS_ERROR_DOM_INVALID_ACCESS_ERR,
  NS_ERROR_DOM_TYPE_MISMATCH_ERR = nsresult::NS_ERROR_DOM_TYPE_MISMATCH_ERR,
  NS_ERROR_DOM_SECURITY_ERR = nsresult::NS_ERROR_DOM_SECURITY_ERR,
  NS_ERROR_DOM_NETWORK_ERR = nsresult::NS_ERROR_DOM_NETWORK_ERR,
  NS_ERROR_DOM_ABORT_ERR = nsresult::NS_ERROR_DOM_ABORT_ERR,
  NS_ERROR_DOM_URL_MISMATCH_ERR = nsresult::NS_ERROR_DOM_URL_MISMATCH_ERR,
  NS_ERROR_DOM_QUOTA_EXCEEDED_ERR = nsresult::NS_ERROR_DOM_QUOTA_EXCEEDED_ERR,
  NS_ERROR_DOM_TIMEOUT_ERR = nsresult::NS_ERROR_DOM_TIMEOUT_ERR,
  NS_ERROR_DOM_INVALID_NODE_TYPE_ERR = nsresult::NS_ERROR_DOM_INVALID_NODE_TYPE_ERR,
  NS_ERROR_DOM_DATA_CLONE_ERR = nsresult::NS_ERROR_DOM_DATA_CLONE_ERR,
  NS_ERROR_TYPE_ERR = nsresult::NS_ERROR_TYPE_ERR,
  NS_ERROR_RANGE_ERR = nsresult::NS_ERROR_RANGE_ERR,
  NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR = nsresult::NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR,
  NS_ERROR_DOM_INVALID_POINTER_ERR = nsresult::NS_ERROR_DOM_INVALID_POINTER_ERR,
  NS_ERROR_DOM_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_UNKNOWN_ERR,
  NS_ERROR_DOM_DATA_ERR = nsresult::NS_ERROR_DOM_DATA_ERR,
  NS_ERROR_DOM_OPERATION_ERR = nsresult::NS_ERROR_DOM_OPERATION_ERR,
  NS_ERROR_DOM_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_NOT_ALLOWED_ERR,
  NS_ERROR_DOM_SECMAN_ERR = nsresult::NS_ERROR_DOM_SECMAN_ERR,
  NS_ERROR_DOM_WRONG_TYPE_ERR = nsresult::NS_ERROR_DOM_WRONG_TYPE_ERR,
  NS_ERROR_DOM_NOT_OBJECT_ERR = nsresult::NS_ERROR_DOM_NOT_OBJECT_ERR,
  NS_ERROR_DOM_NOT_XPC_OBJECT_ERR = nsresult::NS_ERROR_DOM_NOT_XPC_OBJECT_ERR,
  NS_ERROR_DOM_NOT_NUMBER_ERR = nsresult::NS_ERROR_DOM_NOT_NUMBER_ERR,
  NS_ERROR_DOM_NOT_BOOLEAN_ERR = nsresult::NS_ERROR_DOM_NOT_BOOLEAN_ERR,
  NS_ERROR_DOM_NOT_FUNCTION_ERR = nsresult::NS_ERROR_DOM_NOT_FUNCTION_ERR,
  NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR = nsresult::NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR,
  NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN = nsresult::NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN,
  NS_ERROR_DOM_PROP_ACCESS_DENIED = nsresult::NS_ERROR_DOM_PROP_ACCESS_DENIED,
  NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED = nsresult::NS_ERROR_DOM_XPCONNECT_ACCESS_DENIED,
  NS_ERROR_DOM_BAD_URI = nsresult::NS_ERROR_DOM_BAD_URI,
  NS_ERROR_DOM_RETVAL_UNDEFINED = nsresult::NS_ERROR_DOM_RETVAL_UNDEFINED,
  NS_ERROR_DOM_QUOTA_REACHED = nsresult::NS_ERROR_DOM_QUOTA_REACHED,
  NS_ERROR_UNCATCHABLE_EXCEPTION = nsresult::NS_ERROR_UNCATCHABLE_EXCEPTION,
  NS_ERROR_DOM_MALFORMED_URI = nsresult::NS_ERROR_DOM_MALFORMED_URI,
  NS_ERROR_DOM_INVALID_HEADER_NAME = nsresult::NS_ERROR_DOM_INVALID_HEADER_NAME,
  NS_ERROR_DOM_INVALID_STATE_XHR_HAS_INVALID_CONTEXT = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_HAS_INVALID_CONTEXT,
  NS_ERROR_DOM_INVALID_STATE_XHR_MUST_BE_OPENED = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_MUST_BE_OPENED,
  NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_SENDING = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_SENDING,
  NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_LOADING_OR_DONE = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_MUST_NOT_BE_LOADING_OR_DONE,
  NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSEXML = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSEXML,
  NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSETEXT = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_HAS_WRONG_RESPONSETYPE_FOR_RESPONSETEXT,
  NS_ERROR_DOM_INVALID_STATE_XHR_CHUNKED_RESPONSETYPES_UNSUPPORTED_FOR_SYNC = nsresult::NS_ERROR_DOM_INVALID_STATE_XHR_CHUNKED_RESPONSETYPES_UNSUPPORTED_FOR_SYNC,
  NS_ERROR_DOM_INVALID_ACCESS_XHR_TIMEOUT_AND_RESPONSETYPE_UNSUPPORTED_FOR_SYNC = nsresult::NS_ERROR_DOM_INVALID_ACCESS_XHR_TIMEOUT_AND_RESPONSETYPE_UNSUPPORTED_FOR_SYNC,
  NS_SUCCESS_DOM_NO_OPERATION = nsresult::NS_SUCCESS_DOM_NO_OPERATION,
  NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW = nsresult::NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW,
  NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE = nsresult::NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE,
  NS_IMAGELIB_SUCCESS_LOAD_FINISHED = nsresult::NS_IMAGELIB_SUCCESS_LOAD_FINISHED,
  NS_IMAGELIB_CHANGING_OWNER = nsresult::NS_IMAGELIB_CHANGING_OWNER,
  NS_IMAGELIB_ERROR_FAILURE = nsresult::NS_IMAGELIB_ERROR_FAILURE,
  NS_IMAGELIB_ERROR_NO_DECODER = nsresult::NS_IMAGELIB_ERROR_NO_DECODER,
  NS_IMAGELIB_ERROR_NOT_FINISHED = nsresult::NS_IMAGELIB_ERROR_NOT_FINISHED,
  NS_IMAGELIB_ERROR_NO_ENCODER = nsresult::NS_IMAGELIB_ERROR_NO_ENCODER,
  NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND = nsresult::NS_SUCCESS_EDITOR_ELEMENT_NOT_FOUND,
  NS_SUCCESS_EDITOR_FOUND_TARGET = nsresult::NS_SUCCESS_EDITOR_FOUND_TARGET,
  NS_ERROR_XPC_NOT_ENOUGH_ARGS = nsresult::NS_ERROR_XPC_NOT_ENOUGH_ARGS,
  NS_ERROR_XPC_NEED_OUT_OBJECT = nsresult::NS_ERROR_XPC_NEED_OUT_OBJECT,
  NS_ERROR_XPC_CANT_SET_OUT_VAL = nsresult::NS_ERROR_XPC_CANT_SET_OUT_VAL,
  NS_ERROR_XPC_NATIVE_RETURNED_FAILURE = nsresult::NS_ERROR_XPC_NATIVE_RETURNED_FAILURE,
  NS_ERROR_XPC_CANT_GET_INTERFACE_INFO = nsresult::NS_ERROR_XPC_CANT_GET_INTERFACE_INFO,
  NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO = nsresult::NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO,
  NS_ERROR_XPC_CANT_GET_METHOD_INFO = nsresult::NS_ERROR_XPC_CANT_GET_METHOD_INFO,
  NS_ERROR_XPC_UNEXPECTED = nsresult::NS_ERROR_XPC_UNEXPECTED,
  NS_ERROR_XPC_BAD_CONVERT_JS = nsresult::NS_ERROR_XPC_BAD_CONVERT_JS,
  NS_ERROR_XPC_BAD_CONVERT_NATIVE = nsresult::NS_ERROR_XPC_BAD_CONVERT_NATIVE,
  NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF = nsresult::NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF,
  NS_ERROR_XPC_BAD_OP_ON_WN_PROTO = nsresult::NS_ERROR_XPC_BAD_OP_ON_WN_PROTO,
  NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN = nsresult::NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN,
  NS_ERROR_XPC_CANT_DEFINE_PROP_ON_WN = nsresult::NS_ERROR_XPC_CANT_DEFINE_PROP_ON_WN,
  NS_ERROR_XPC_CANT_WATCH_WN_STATIC = nsresult::NS_ERROR_XPC_CANT_WATCH_WN_STATIC,
  NS_ERROR_XPC_CANT_EXPORT_WN_STATIC = nsresult::NS_ERROR_XPC_CANT_EXPORT_WN_STATIC,
  NS_ERROR_XPC_SCRIPTABLE_CALL_FAILED = nsresult::NS_ERROR_XPC_SCRIPTABLE_CALL_FAILED,
  NS_ERROR_XPC_SCRIPTABLE_CTOR_FAILED = nsresult::NS_ERROR_XPC_SCRIPTABLE_CTOR_FAILED,
  NS_ERROR_XPC_CANT_CALL_WO_SCRIPTABLE = nsresult::NS_ERROR_XPC_CANT_CALL_WO_SCRIPTABLE,
  NS_ERROR_XPC_CANT_CTOR_WO_SCRIPTABLE = nsresult::NS_ERROR_XPC_CANT_CTOR_WO_SCRIPTABLE,
  NS_ERROR_XPC_CI_RETURNED_FAILURE = nsresult::NS_ERROR_XPC_CI_RETURNED_FAILURE,
  NS_ERROR_XPC_GS_RETURNED_FAILURE = nsresult::NS_ERROR_XPC_GS_RETURNED_FAILURE,
  NS_ERROR_XPC_BAD_CID = nsresult::NS_ERROR_XPC_BAD_CID,
  NS_ERROR_XPC_BAD_IID = nsresult::NS_ERROR_XPC_BAD_IID,
  NS_ERROR_XPC_CANT_CREATE_WN = nsresult::NS_ERROR_XPC_CANT_CREATE_WN,
  NS_ERROR_XPC_JS_THREW_EXCEPTION = nsresult::NS_ERROR_XPC_JS_THREW_EXCEPTION,
  NS_ERROR_XPC_JS_THREW_NATIVE_OBJECT = nsresult::NS_ERROR_XPC_JS_THREW_NATIVE_OBJECT,
  NS_ERROR_XPC_JS_THREW_JS_OBJECT = nsresult::NS_ERROR_XPC_JS_THREW_JS_OBJECT,
  NS_ERROR_XPC_JS_THREW_NULL = nsresult::NS_ERROR_XPC_JS_THREW_NULL,
  NS_ERROR_XPC_JS_THREW_STRING = nsresult::NS_ERROR_XPC_JS_THREW_STRING,
  NS_ERROR_XPC_JS_THREW_NUMBER = nsresult::NS_ERROR_XPC_JS_THREW_NUMBER,
  NS_ERROR_XPC_JAVASCRIPT_ERROR = nsresult::NS_ERROR_XPC_JAVASCRIPT_ERROR,
  NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS = nsresult::NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS,
  NS_ERROR_XPC_CANT_CONVERT_PRIMITIVE_TO_ARRAY = nsresult::NS_ERROR_XPC_CANT_CONVERT_PRIMITIVE_TO_ARRAY,
  NS_ERROR_XPC_CANT_CONVERT_OBJECT_TO_ARRAY = nsresult::NS_ERROR_XPC_CANT_CONVERT_OBJECT_TO_ARRAY,
  NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY = nsresult::NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY,
  NS_ERROR_XPC_CANT_GET_ARRAY_INFO = nsresult::NS_ERROR_XPC_CANT_GET_ARRAY_INFO,
  NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING = nsresult::NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING,
  NS_ERROR_XPC_SECURITY_MANAGER_VETO = nsresult::NS_ERROR_XPC_SECURITY_MANAGER_VETO,
  NS_ERROR_XPC_INTERFACE_NOT_SCRIPTABLE = nsresult::NS_ERROR_XPC_INTERFACE_NOT_SCRIPTABLE,
  NS_ERROR_XPC_INTERFACE_NOT_FROM_NSISUPPORTS = nsresult::NS_ERROR_XPC_INTERFACE_NOT_FROM_NSISUPPORTS,
  NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT = nsresult::NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT,
  NS_ERROR_XPC_CANT_SET_READ_ONLY_CONSTANT = nsresult::NS_ERROR_XPC_CANT_SET_READ_ONLY_CONSTANT,
  NS_ERROR_XPC_CANT_SET_READ_ONLY_ATTRIBUTE = nsresult::NS_ERROR_XPC_CANT_SET_READ_ONLY_ATTRIBUTE,
  NS_ERROR_XPC_CANT_SET_READ_ONLY_METHOD = nsresult::NS_ERROR_XPC_CANT_SET_READ_ONLY_METHOD,
  NS_ERROR_XPC_CANT_ADD_PROP_TO_WRAPPED_NATIVE = nsresult::NS_ERROR_XPC_CANT_ADD_PROP_TO_WRAPPED_NATIVE,
  NS_ERROR_XPC_CALL_TO_SCRIPTABLE_FAILED = nsresult::NS_ERROR_XPC_CALL_TO_SCRIPTABLE_FAILED,
  NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED = nsresult::NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED,
  NS_ERROR_XPC_BAD_ID_STRING = nsresult::NS_ERROR_XPC_BAD_ID_STRING,
  NS_ERROR_XPC_BAD_INITIALIZER_NAME = nsresult::NS_ERROR_XPC_BAD_INITIALIZER_NAME,
  NS_ERROR_XPC_HAS_BEEN_SHUTDOWN = nsresult::NS_ERROR_XPC_HAS_BEEN_SHUTDOWN,
  NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN = nsresult::NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN,
  NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL = nsresult::NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL,
  NS_ERROR_XPC_CANT_PASS_CPOW_TO_NATIVE = nsresult::NS_ERROR_XPC_CANT_PASS_CPOW_TO_NATIVE,
  NS_ERROR_LAUNCHED_CHILD_PROCESS = nsresult::NS_ERROR_LAUNCHED_CHILD_PROCESS,
  NS_ERROR_CSP_FORM_ACTION_VIOLATION = nsresult::NS_ERROR_CSP_FORM_ACTION_VIOLATION,
  NS_ERROR_CSP_FRAME_ANCESTOR_VIOLATION = nsresult::NS_ERROR_CSP_FRAME_ANCESTOR_VIOLATION,
  NS_ERROR_SRI_CORRUPT = nsresult::NS_ERROR_SRI_CORRUPT,
  NS_ERROR_SRI_DISABLED = nsresult::NS_ERROR_SRI_DISABLED,
  NS_ERROR_SRI_NOT_ELIGIBLE = nsresult::NS_ERROR_SRI_NOT_ELIGIBLE,
  NS_ERROR_SRI_UNEXPECTED_HASH_TYPE = nsresult::NS_ERROR_SRI_UNEXPECTED_HASH_TYPE,
  NS_ERROR_SRI_IMPORT = nsresult::NS_ERROR_SRI_IMPORT,
  NS_ERROR_CMS_VERIFY_NOT_SIGNED = nsresult::NS_ERROR_CMS_VERIFY_NOT_SIGNED,
  NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO = nsresult::NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO,
  NS_ERROR_CMS_VERIFY_BAD_DIGEST = nsresult::NS_ERROR_CMS_VERIFY_BAD_DIGEST,
  NS_ERROR_CMS_VERIFY_NOCERT = nsresult::NS_ERROR_CMS_VERIFY_NOCERT,
  NS_ERROR_CMS_VERIFY_UNTRUSTED = nsresult::NS_ERROR_CMS_VERIFY_UNTRUSTED,
  NS_ERROR_CMS_VERIFY_ERROR_UNVERIFIED = nsresult::NS_ERROR_CMS_VERIFY_ERROR_UNVERIFIED,
  NS_ERROR_CMS_VERIFY_ERROR_PROCESSING = nsresult::NS_ERROR_CMS_VERIFY_ERROR_PROCESSING,
  NS_ERROR_CMS_VERIFY_BAD_SIGNATURE = nsresult::NS_ERROR_CMS_VERIFY_BAD_SIGNATURE,
  NS_ERROR_CMS_VERIFY_DIGEST_MISMATCH = nsresult::NS_ERROR_CMS_VERIFY_DIGEST_MISMATCH,
  NS_ERROR_CMS_VERIFY_UNKNOWN_ALGO = nsresult::NS_ERROR_CMS_VERIFY_UNKNOWN_ALGO,
  NS_ERROR_CMS_VERIFY_UNSUPPORTED_ALGO = nsresult::NS_ERROR_CMS_VERIFY_UNSUPPORTED_ALGO,
  NS_ERROR_CMS_VERIFY_MALFORMED_SIGNATURE = nsresult::NS_ERROR_CMS_VERIFY_MALFORMED_SIGNATURE,
  NS_ERROR_CMS_VERIFY_HEADER_MISMATCH = nsresult::NS_ERROR_CMS_VERIFY_HEADER_MISMATCH,
  NS_ERROR_CMS_VERIFY_NOT_YET_ATTEMPTED = nsresult::NS_ERROR_CMS_VERIFY_NOT_YET_ATTEMPTED,
  NS_ERROR_CMS_VERIFY_CERT_WITHOUT_ADDRESS = nsresult::NS_ERROR_CMS_VERIFY_CERT_WITHOUT_ADDRESS,
  NS_ERROR_CMS_ENCRYPT_NO_BULK_ALG = nsresult::NS_ERROR_CMS_ENCRYPT_NO_BULK_ALG,
  NS_ERROR_CMS_ENCRYPT_INCOMPLETE = nsresult::NS_ERROR_CMS_ENCRYPT_INCOMPLETE,
  NS_ERROR_DOM_INVALID_EXPRESSION_ERR = nsresult::NS_ERROR_DOM_INVALID_EXPRESSION_ERR,
  NS_ERROR_DOM_TYPE_ERR = nsresult::NS_ERROR_DOM_TYPE_ERR,
  NS_ERROR_WONT_HANDLE_CONTENT = nsresult::NS_ERROR_WONT_HANDLE_CONTENT,
  NS_ERROR_MALWARE_URI = nsresult::NS_ERROR_MALWARE_URI,
  NS_ERROR_PHISHING_URI = nsresult::NS_ERROR_PHISHING_URI,
  NS_ERROR_TRACKING_URI = nsresult::NS_ERROR_TRACKING_URI,
  NS_ERROR_UNWANTED_URI = nsresult::NS_ERROR_UNWANTED_URI,
  NS_ERROR_BLOCKED_URI = nsresult::NS_ERROR_BLOCKED_URI,
  NS_ERROR_SAVE_LINK_AS_TIMEOUT = nsresult::NS_ERROR_SAVE_LINK_AS_TIMEOUT,
  NS_ERROR_PARSED_DATA_CACHED = nsresult::NS_ERROR_PARSED_DATA_CACHED,
  NS_REFRESHURI_HEADER_FOUND = nsresult::NS_REFRESHURI_HEADER_FOUND,
  NS_ERROR_IMAGE_SRC_CHANGED = nsresult::NS_ERROR_IMAGE_SRC_CHANGED,
  NS_ERROR_IMAGE_BLOCKED = nsresult::NS_ERROR_IMAGE_BLOCKED,
  NS_ERROR_CONTENT_BLOCKED = nsresult::NS_ERROR_CONTENT_BLOCKED,
  NS_ERROR_CONTENT_BLOCKED_SHOW_ALT = nsresult::NS_ERROR_CONTENT_BLOCKED_SHOW_ALT,
  NS_PROPTABLE_PROP_NOT_THERE = nsresult::NS_PROPTABLE_PROP_NOT_THERE,
  NS_ERROR_XBL_BLOCKED = nsresult::NS_ERROR_XBL_BLOCKED,
  NS_ERROR_CONTENT_CRASHED = nsresult::NS_ERROR_CONTENT_CRASHED,
  NS_HTML_STYLE_PROPERTY_NOT_THERE = nsresult::NS_HTML_STYLE_PROPERTY_NOT_THERE,
  NS_CONTENT_BLOCKED = nsresult::NS_CONTENT_BLOCKED,
  NS_CONTENT_BLOCKED_SHOW_ALT = nsresult::NS_CONTENT_BLOCKED_SHOW_ALT,
  NS_PROPTABLE_PROP_OVERWRITTEN = nsresult::NS_PROPTABLE_PROP_OVERWRITTEN,
  NS_FINDBROADCASTER_NOT_FOUND = nsresult::NS_FINDBROADCASTER_NOT_FOUND,
  NS_FINDBROADCASTER_FOUND = nsresult::NS_FINDBROADCASTER_FOUND,
  NS_FINDBROADCASTER_AWAIT_OVERLAYS = nsresult::NS_FINDBROADCASTER_AWAIT_OVERLAYS,
  NS_ERROR_XPATH_INVALID_ARG = nsresult::NS_ERROR_XPATH_INVALID_ARG,
  NS_ERROR_XSLT_PARSE_FAILURE = nsresult::NS_ERROR_XSLT_PARSE_FAILURE,
  NS_ERROR_XPATH_PARSE_FAILURE = nsresult::NS_ERROR_XPATH_PARSE_FAILURE,
  NS_ERROR_XSLT_ALREADY_SET = nsresult::NS_ERROR_XSLT_ALREADY_SET,
  NS_ERROR_XSLT_EXECUTION_FAILURE = nsresult::NS_ERROR_XSLT_EXECUTION_FAILURE,
  NS_ERROR_XPATH_UNKNOWN_FUNCTION = nsresult::NS_ERROR_XPATH_UNKNOWN_FUNCTION,
  NS_ERROR_XSLT_BAD_RECURSION = nsresult::NS_ERROR_XSLT_BAD_RECURSION,
  NS_ERROR_XSLT_BAD_VALUE = nsresult::NS_ERROR_XSLT_BAD_VALUE,
  NS_ERROR_XSLT_NODESET_EXPECTED = nsresult::NS_ERROR_XSLT_NODESET_EXPECTED,
  NS_ERROR_XSLT_ABORTED = nsresult::NS_ERROR_XSLT_ABORTED,
  NS_ERROR_XSLT_NETWORK_ERROR = nsresult::NS_ERROR_XSLT_NETWORK_ERROR,
  NS_ERROR_XSLT_WRONG_MIME_TYPE = nsresult::NS_ERROR_XSLT_WRONG_MIME_TYPE,
  NS_ERROR_XSLT_LOAD_RECURSION = nsresult::NS_ERROR_XSLT_LOAD_RECURSION,
  NS_ERROR_XPATH_BAD_ARGUMENT_COUNT = nsresult::NS_ERROR_XPATH_BAD_ARGUMENT_COUNT,
  NS_ERROR_XPATH_BAD_EXTENSION_FUNCTION = nsresult::NS_ERROR_XPATH_BAD_EXTENSION_FUNCTION,
  NS_ERROR_XPATH_PAREN_EXPECTED = nsresult::NS_ERROR_XPATH_PAREN_EXPECTED,
  NS_ERROR_XPATH_INVALID_AXIS = nsresult::NS_ERROR_XPATH_INVALID_AXIS,
  NS_ERROR_XPATH_NO_NODE_TYPE_TEST = nsresult::NS_ERROR_XPATH_NO_NODE_TYPE_TEST,
  NS_ERROR_XPATH_BRACKET_EXPECTED = nsresult::NS_ERROR_XPATH_BRACKET_EXPECTED,
  NS_ERROR_XPATH_INVALID_VAR_NAME = nsresult::NS_ERROR_XPATH_INVALID_VAR_NAME,
  NS_ERROR_XPATH_UNEXPECTED_END = nsresult::NS_ERROR_XPATH_UNEXPECTED_END,
  NS_ERROR_XPATH_OPERATOR_EXPECTED = nsresult::NS_ERROR_XPATH_OPERATOR_EXPECTED,
  NS_ERROR_XPATH_UNCLOSED_LITERAL = nsresult::NS_ERROR_XPATH_UNCLOSED_LITERAL,
  NS_ERROR_XPATH_BAD_COLON = nsresult::NS_ERROR_XPATH_BAD_COLON,
  NS_ERROR_XPATH_BAD_BANG = nsresult::NS_ERROR_XPATH_BAD_BANG,
  NS_ERROR_XPATH_ILLEGAL_CHAR = nsresult::NS_ERROR_XPATH_ILLEGAL_CHAR,
  NS_ERROR_XPATH_BINARY_EXPECTED = nsresult::NS_ERROR_XPATH_BINARY_EXPECTED,
  NS_ERROR_XSLT_LOAD_BLOCKED_ERROR = nsresult::NS_ERROR_XSLT_LOAD_BLOCKED_ERROR,
  NS_ERROR_XPATH_INVALID_EXPRESSION_EVALUATED = nsresult::NS_ERROR_XPATH_INVALID_EXPRESSION_EVALUATED,
  NS_ERROR_XPATH_UNBALANCED_CURLY_BRACE = nsresult::NS_ERROR_XPATH_UNBALANCED_CURLY_BRACE,
  NS_ERROR_XSLT_BAD_NODE_NAME = nsresult::NS_ERROR_XSLT_BAD_NODE_NAME,
  NS_ERROR_XSLT_VAR_ALREADY_SET = nsresult::NS_ERROR_XSLT_VAR_ALREADY_SET,
  NS_ERROR_XSLT_CALL_TO_KEY_NOT_ALLOWED = nsresult::NS_ERROR_XSLT_CALL_TO_KEY_NOT_ALLOWED,
  NS_XSLT_GET_NEW_HANDLER = nsresult::NS_XSLT_GET_NEW_HANDLER,
  NS_ERROR_TRANSPORT_INIT = nsresult::NS_ERROR_TRANSPORT_INIT,
  NS_ERROR_DUPLICATE_HANDLE = nsresult::NS_ERROR_DUPLICATE_HANDLE,
  NS_ERROR_BRIDGE_OPEN_PARENT = nsresult::NS_ERROR_BRIDGE_OPEN_PARENT,
  NS_ERROR_BRIDGE_OPEN_CHILD = nsresult::NS_ERROR_BRIDGE_OPEN_CHILD,
  NS_ERROR_DOM_SVG_WRONG_TYPE_ERR = nsresult::NS_ERROR_DOM_SVG_WRONG_TYPE_ERR,
  NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE = nsresult::NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE,
  NS_ERROR_STORAGE_BUSY = nsresult::NS_ERROR_STORAGE_BUSY,
  NS_ERROR_STORAGE_IOERR = nsresult::NS_ERROR_STORAGE_IOERR,
  NS_ERROR_STORAGE_CONSTRAINT = nsresult::NS_ERROR_STORAGE_CONSTRAINT,
  NS_ERROR_DOM_FILE_NOT_FOUND_ERR = nsresult::NS_ERROR_DOM_FILE_NOT_FOUND_ERR,
  NS_ERROR_DOM_FILE_NOT_READABLE_ERR = nsresult::NS_ERROR_DOM_FILE_NOT_READABLE_ERR,
  NS_ERROR_DOM_FILE_ABORT_ERR = nsresult::NS_ERROR_DOM_FILE_ABORT_ERR,
  NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR,
  NS_ERROR_DOM_INDEXEDDB_NOT_FOUND_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_NOT_FOUND_ERR,
  NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_CONSTRAINT_ERR,
  NS_ERROR_DOM_INDEXEDDB_DATA_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_DATA_ERR,
  NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR,
  NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_TRANSACTION_INACTIVE_ERR,
  NS_ERROR_DOM_INDEXEDDB_ABORT_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_ABORT_ERR,
  NS_ERROR_DOM_INDEXEDDB_READ_ONLY_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_READ_ONLY_ERR,
  NS_ERROR_DOM_INDEXEDDB_TIMEOUT_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_TIMEOUT_ERR,
  NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_QUOTA_ERR,
  NS_ERROR_DOM_INDEXEDDB_VERSION_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_VERSION_ERR,
  NS_ERROR_DOM_INDEXEDDB_RECOVERABLE_ERR = nsresult::NS_ERROR_DOM_INDEXEDDB_RECOVERABLE_ERR,
  NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR,
  NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR,
  NS_ERROR_DOM_FILEHANDLE_INACTIVE_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_INACTIVE_ERR,
  NS_ERROR_DOM_FILEHANDLE_ABORT_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_ABORT_ERR,
  NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR,
  NS_ERROR_DOM_FILEHANDLE_QUOTA_ERR = nsresult::NS_ERROR_DOM_FILEHANDLE_QUOTA_ERR,
  NS_ERROR_SIGNED_JAR_NOT_SIGNED = nsresult::NS_ERROR_SIGNED_JAR_NOT_SIGNED,
  NS_ERROR_SIGNED_JAR_MODIFIED_ENTRY = nsresult::NS_ERROR_SIGNED_JAR_MODIFIED_ENTRY,
  NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY = nsresult::NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY,
  NS_ERROR_SIGNED_JAR_ENTRY_MISSING = nsresult::NS_ERROR_SIGNED_JAR_ENTRY_MISSING,
  NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE = nsresult::NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE,
  NS_ERROR_SIGNED_JAR_ENTRY_TOO_LARGE = nsresult::NS_ERROR_SIGNED_JAR_ENTRY_TOO_LARGE,
  NS_ERROR_SIGNED_JAR_ENTRY_INVALID = nsresult::NS_ERROR_SIGNED_JAR_ENTRY_INVALID,
  NS_ERROR_SIGNED_JAR_MANIFEST_INVALID = nsresult::NS_ERROR_SIGNED_JAR_MANIFEST_INVALID,
  NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR,
  NS_ERROR_DOM_FILESYSTEM_INVALID_MODIFICATION_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_INVALID_MODIFICATION_ERR,
  NS_ERROR_DOM_FILESYSTEM_NO_MODIFICATION_ALLOWED_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_NO_MODIFICATION_ALLOWED_ERR,
  NS_ERROR_DOM_FILESYSTEM_PATH_EXISTS_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_PATH_EXISTS_ERR,
  NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR,
  NS_ERROR_DOM_FILESYSTEM_UNKNOWN_ERR = nsresult::NS_ERROR_DOM_FILESYSTEM_UNKNOWN_ERR,
  NS_ERROR_SIGNED_APP_MANIFEST_INVALID = nsresult::NS_ERROR_SIGNED_APP_MANIFEST_INVALID,
  NS_ERROR_DOM_ANIM_MISSING_PROPS_ERR = nsresult::NS_ERROR_DOM_ANIM_MISSING_PROPS_ERR,
  NS_ERROR_DOM_PUSH_INVALID_REGISTRATION_ERR = nsresult::NS_ERROR_DOM_PUSH_INVALID_REGISTRATION_ERR,
  NS_ERROR_DOM_PUSH_DENIED_ERR = nsresult::NS_ERROR_DOM_PUSH_DENIED_ERR,
  NS_ERROR_DOM_PUSH_ABORT_ERR = nsresult::NS_ERROR_DOM_PUSH_ABORT_ERR,
  NS_ERROR_DOM_PUSH_SERVICE_UNREACHABLE = nsresult::NS_ERROR_DOM_PUSH_SERVICE_UNREACHABLE,
  NS_ERROR_DOM_PUSH_INVALID_KEY_ERR = nsresult::NS_ERROR_DOM_PUSH_INVALID_KEY_ERR,
  NS_ERROR_DOM_PUSH_MISMATCHED_KEY_ERR = nsresult::NS_ERROR_DOM_PUSH_MISMATCHED_KEY_ERR,
  NS_ERROR_DOM_MEDIA_ABORT_ERR = nsresult::NS_ERROR_DOM_MEDIA_ABORT_ERR,
  NS_ERROR_DOM_MEDIA_NOT_ALLOWED_ERR = nsresult::NS_ERROR_DOM_MEDIA_NOT_ALLOWED_ERR,
  NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR = nsresult::NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR,
  NS_ERROR_DOM_MEDIA_DECODE_ERR = nsresult::NS_ERROR_DOM_MEDIA_DECODE_ERR,
  NS_ERROR_DOM_MEDIA_FATAL_ERR = nsresult::NS_ERROR_DOM_MEDIA_FATAL_ERR,
  NS_ERROR_DOM_MEDIA_METADATA_ERR = nsresult::NS_ERROR_DOM_MEDIA_METADATA_ERR,
  NS_ERROR_DOM_MEDIA_OVERFLOW_ERR = nsresult::NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
  NS_ERROR_DOM_MEDIA_END_OF_STREAM = nsresult::NS_ERROR_DOM_MEDIA_END_OF_STREAM,
  NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA = nsresult::NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA,
  NS_ERROR_DOM_MEDIA_CANCELED = nsresult::NS_ERROR_DOM_MEDIA_CANCELED,
  NS_ERROR_DOM_MEDIA_MEDIASINK_ERR = nsresult::NS_ERROR_DOM_MEDIA_MEDIASINK_ERR,
  NS_ERROR_DOM_MEDIA_DEMUXER_ERR = nsresult::NS_ERROR_DOM_MEDIA_DEMUXER_ERR,
  NS_ERROR_DOM_MEDIA_CDM_ERR = nsresult::NS_ERROR_DOM_MEDIA_CDM_ERR,
  NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER = nsresult::NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER,
  NS_ERROR_DOM_MEDIA_INITIALIZING_DECODER = nsresult::NS_ERROR_DOM_MEDIA_INITIALIZING_DECODER,
  NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR = nsresult::NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR,
  NS_ERROR_UC_UPDATE_UNKNOWN = nsresult::NS_ERROR_UC_UPDATE_UNKNOWN,
  NS_ERROR_UC_UPDATE_DUPLICATE_PREFIX = nsresult::NS_ERROR_UC_UPDATE_DUPLICATE_PREFIX,
  NS_ERROR_UC_UPDATE_INFINITE_LOOP = nsresult::NS_ERROR_UC_UPDATE_INFINITE_LOOP,
  NS_ERROR_UC_UPDATE_WRONG_REMOVAL_INDICES = nsresult::NS_ERROR_UC_UPDATE_WRONG_REMOVAL_INDICES,
  NS_ERROR_UC_UPDATE_CHECKSUM_MISMATCH = nsresult::NS_ERROR_UC_UPDATE_CHECKSUM_MISMATCH,
  NS_ERROR_UC_UPDATE_MISSING_CHECKSUM = nsresult::NS_ERROR_UC_UPDATE_MISSING_CHECKSUM,
  NS_ERROR_UC_UPDATE_SHUTDOWNING = nsresult::NS_ERROR_UC_UPDATE_SHUTDOWNING,
  NS_ERROR_UC_UPDATE_TABLE_NOT_FOUND = nsresult::NS_ERROR_UC_UPDATE_TABLE_NOT_FOUND,
  NS_ERROR_UC_UPDATE_BUILD_PREFIX_FAILURE = nsresult::NS_ERROR_UC_UPDATE_BUILD_PREFIX_FAILURE,
  NS_ERROR_UC_UPDATE_FAIL_TO_WRITE_DISK = nsresult::NS_ERROR_UC_UPDATE_FAIL_TO_WRITE_DISK,
  NS_ERROR_UC_UPDATE_PROTOCOL_PARSER_ERROR = nsresult::NS_ERROR_UC_UPDATE_PROTOCOL_PARSER_ERROR,
  NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION,
  NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION,
  NS_ERROR_INTERNAL_ERRORRESULT_EXCEPTION_ON_JSCONTEXT = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_EXCEPTION_ON_JSCONTEXT,
  NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR,
  NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR = nsresult::NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR,
  NS_ERROR_DOWNLOAD_COMPLETE = nsresult::NS_ERROR_DOWNLOAD_COMPLETE,
  NS_ERROR_DOWNLOAD_NOT_PARTIAL = nsresult::NS_ERROR_DOWNLOAD_NOT_PARTIAL,
  NS_ERROR_UNORM_MOREOUTPUT = nsresult::NS_ERROR_UNORM_MOREOUTPUT,
  NS_ERROR_DOCSHELL_REQUEST_REJECTED = nsresult::NS_ERROR_DOCSHELL_REQUEST_REJECTED,
  NS_ERROR_DOCUMENT_IS_PRINTMODE = nsresult::NS_ERROR_DOCUMENT_IS_PRINTMODE,
  NS_SUCCESS_DONT_FIXUP = nsresult::NS_SUCCESS_DONT_FIXUP,
  NS_SUCCESS_RESTART_APP = nsresult::NS_SUCCESS_RESTART_APP,
  NS_SUCCESS_RESTART_APP_NOT_SAME_PROFILE = nsresult::NS_SUCCESS_RESTART_APP_NOT_SAME_PROFILE,
  NS_SUCCESS_UNORM_NOTFOUND = nsresult::NS_SUCCESS_UNORM_NOTFOUND,
  NS_ERROR_NOT_IN_TREE = nsresult::NS_ERROR_NOT_IN_TREE,
  NS_OK_NO_NAME_CLAUSE_HANDLED = nsresult::NS_OK_NO_NAME_CLAUSE_HANDLED
;
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h" 2






inline uint32_t
NS_FAILED_impl(nsresult aErr)
{
  return static_cast<uint32_t>(aErr) & 0x80000000;
}




static_assert(((nsresult)0) < ((nsresult)-1),
              "nsresult must be an unsigned type");
static_assert(sizeof(nsresult) == sizeof(uint32_t),
              "nsresult must be 32 bits");
# 68 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsError.h"
extern nsresult
NS_ErrorAccordingToNSPR();






inline constexpr uint16_t
NS_ERROR_GET_CODE(nsresult aErr)
{
  return uint32_t(aErr) & 0xffff;
}
inline constexpr uint16_t
NS_ERROR_GET_MODULE(nsresult aErr)
{
  return ((uint32_t(aErr) >> 16) - 69) & 0x1fff;
}
inline bool
NS_ERROR_GET_SEVERITY(nsresult aErr)
{
  return uint32_t(aErr) >> 31;
}
# 232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nscore.h" 2

typedef MozRefCountType nsrefcnt;
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringFwd.h" 2





namespace mozilla {
namespace detail {

class nsStringRepr;
class nsCStringRepr;

}
}





class nsAString;
class nsSubstringTuple;
class nsString;
class nsAutoString;
class nsDependentString;
class nsDependentSubstring;
class nsPromiseFlatString;
class nsStringComparator;
class nsDefaultStringComparator;
class nsXPIDLString;






class nsACString;
class nsCSubstringTuple;
class nsCString;
class nsAutoCString;
class nsDependentCString;
class nsDependentCSubstring;
class nsPromiseFlatCString;
class nsCStringComparator;
class nsDefaultCStringComparator;
class nsXPIDLCString;






typedef nsAString nsSubstring;
typedef nsACString nsCSubstring;

typedef nsString nsAFlatString;
typedef nsSubstring nsASingleFragmentString;

typedef nsCString nsAFlatCString;
typedef nsCSubstring nsASingleFragmentCString;
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClasses.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSEnabledState.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSEnabledState.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerTypeTraits.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerTypeTraits.h"
namespace mozilla {

namespace detail {






template<size_t Size, bool Signedness>
struct StdintTypeForSizeAndSignedness;

template<>
struct StdintTypeForSizeAndSignedness<1, true>
{
  typedef int8_t Type;
};

template<>
struct StdintTypeForSizeAndSignedness<1, false>
{
  typedef uint8_t Type;
};

template<>
struct StdintTypeForSizeAndSignedness<2, true>
{
  typedef int16_t Type;
};

template<>
struct StdintTypeForSizeAndSignedness<2, false>
{
  typedef uint16_t Type;
};

template<>
struct StdintTypeForSizeAndSignedness<4, true>
{
  typedef int32_t Type;
};

template<>
struct StdintTypeForSizeAndSignedness<4, false>
{
  typedef uint32_t Type;
};

template<>
struct StdintTypeForSizeAndSignedness<8, true>
{
  typedef int64_t Type;
};

template<>
struct StdintTypeForSizeAndSignedness<8, false>
{
  typedef uint64_t Type;
};

}

template<size_t Size>
struct UnsignedStdintTypeForSize
  : detail::StdintTypeForSizeAndSignedness<Size, false>
{};

template<size_t Size>
struct SignedStdintTypeForSize
  : detail::StdintTypeForSizeAndSignedness<Size, true>
{};

template<typename IntegerType>
struct PositionOfSignBit
{
  static_assert(IsIntegral<IntegerType>::value,
                "PositionOfSignBit is only for integral types");

  static const size_t value = 8 * sizeof(IntegerType) - 1;
};






template<typename IntegerType>
struct MinValue
{
private:
  static_assert(IsIntegral<IntegerType>::value,
                "MinValue is only for integral types");

  typedef typename MakeUnsigned<IntegerType>::Type UnsignedIntegerType;
  static const size_t PosOfSignBit = PositionOfSignBit<IntegerType>::value;

public:






  static const IntegerType value =
      IsSigned<IntegerType>::value
      ? IntegerType(UnsignedIntegerType(1) << PosOfSignBit)
      : IntegerType(0);
};






template<typename IntegerType>
struct MaxValue
{
  static_assert(IsIntegral<IntegerType>::value,
                "MaxValue is only for integral types");




  static const IntegerType value = ~MinValue<IntegerType>::value;
};

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h" 2

namespace mozilla {
# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h"
template<typename E>
class CastableTypedEnumResult
{
private:
  const E mValue;

public:
  explicit constexpr CastableTypedEnumResult(E aValue)
    : mValue(aValue)
  {}

  constexpr operator E() const { return mValue; }

  template<typename DestinationType>
  explicit constexpr
  operator DestinationType() const { return DestinationType(mValue); }

  constexpr bool operator !() const { return !bool(mValue); }
};
# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h"
template<typename E> constexpr CastableTypedEnumResult<E> operator |(const E& aE, const CastableTypedEnumResult<E>& aR) { return CastableTypedEnumResult<E>(aE | E(aR)); } template<typename E> constexpr CastableTypedEnumResult<E> operator |(const CastableTypedEnumResult<E>& aR, const E& aE) { return CastableTypedEnumResult<E>(E(aR) | aE); } template<typename E> constexpr CastableTypedEnumResult<E> operator |(const CastableTypedEnumResult<E>& aR1, const CastableTypedEnumResult<E>& aR2) { return CastableTypedEnumResult<E>(E(aR1) | E(aR2)); }
template<typename E> constexpr CastableTypedEnumResult<E> operator &(const E& aE, const CastableTypedEnumResult<E>& aR) { return CastableTypedEnumResult<E>(aE & E(aR)); } template<typename E> constexpr CastableTypedEnumResult<E> operator &(const CastableTypedEnumResult<E>& aR, const E& aE) { return CastableTypedEnumResult<E>(E(aR) & aE); } template<typename E> constexpr CastableTypedEnumResult<E> operator &(const CastableTypedEnumResult<E>& aR1, const CastableTypedEnumResult<E>& aR2) { return CastableTypedEnumResult<E>(E(aR1) & E(aR2)); }
template<typename E> constexpr CastableTypedEnumResult<E> operator ^(const E& aE, const CastableTypedEnumResult<E>& aR) { return CastableTypedEnumResult<E>(aE ^ E(aR)); } template<typename E> constexpr CastableTypedEnumResult<E> operator ^(const CastableTypedEnumResult<E>& aR, const E& aE) { return CastableTypedEnumResult<E>(E(aR) ^ aE); } template<typename E> constexpr CastableTypedEnumResult<E> operator ^(const CastableTypedEnumResult<E>& aR1, const CastableTypedEnumResult<E>& aR2) { return CastableTypedEnumResult<E>(E(aR1) ^ E(aR2)); }
template<typename E> constexpr bool operator ==(const E& aE, const CastableTypedEnumResult<E>& aR) { return bool(aE == E(aR)); } template<typename E> constexpr bool operator ==(const CastableTypedEnumResult<E>& aR, const E& aE) { return bool(E(aR) == aE); } template<typename E> constexpr bool operator ==(const CastableTypedEnumResult<E>& aR1, const CastableTypedEnumResult<E>& aR2) { return bool(E(aR1) == E(aR2)); }
template<typename E> constexpr bool operator !=(const E& aE, const CastableTypedEnumResult<E>& aR) { return bool(aE != E(aR)); } template<typename E> constexpr bool operator !=(const CastableTypedEnumResult<E>& aR, const E& aE) { return bool(E(aR) != aE); } template<typename E> constexpr bool operator !=(const CastableTypedEnumResult<E>& aR1, const CastableTypedEnumResult<E>& aR2) { return bool(E(aR1) != E(aR2)); }

template <typename E>
constexpr CastableTypedEnumResult<E>
operator ~(const CastableTypedEnumResult<E>& aR)
{
  return CastableTypedEnumResult<E>(~(E(aR)));
}
# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TypedEnumBits.h"
template<typename E> E& operator &=(E& aR1, const CastableTypedEnumResult<E>& aR2) { return aR1 &= E(aR2); }
template<typename E> E& operator |=(E& aR1, const CastableTypedEnumResult<E>& aR2) { return aR1 |= E(aR2); }
template<typename E> E& operator ^=(E& aR1, const CastableTypedEnumResult<E>& aR2) { return aR1 ^= E(aR2); }





namespace detail {
template<typename E>
struct UnsignedIntegerTypeForEnum
  : UnsignedStdintTypeForSize<sizeof(E)>
{};
}

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSEnabledState.h" 2

namespace mozilla {

enum class CSSEnabledState
{


  eForAllContent = 0,

  eInUASheets = 0x01,

  eInChrome = 0x02,




  eIgnoreEnabledState = 0xff
};

inline constexpr mozilla::CastableTypedEnumResult<CSSEnabledState> operator |(CSSEnabledState a, CSSEnabledState b) { typedef mozilla::CastableTypedEnumResult<CSSEnabledState> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<CSSEnabledState>::Type U; return Result(CSSEnabledState(U(a) | U(b))); } inline CSSEnabledState& operator |=(CSSEnabledState& a, CSSEnabledState b) { return a = a | b; } inline constexpr mozilla::CastableTypedEnumResult<CSSEnabledState> operator &(CSSEnabledState a, CSSEnabledState b) { typedef mozilla::CastableTypedEnumResult<CSSEnabledState> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<CSSEnabledState>::Type U; return Result(CSSEnabledState(U(a) & U(b))); } inline CSSEnabledState& operator &=(CSSEnabledState& a, CSSEnabledState b) { return a = a & b; } inline constexpr mozilla::CastableTypedEnumResult<CSSEnabledState> operator ^(CSSEnabledState a, CSSEnabledState b) { typedef mozilla::CastableTypedEnumResult<CSSEnabledState> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<CSSEnabledState>::Type U; return Result(CSSEnabledState(U(a) ^ U(b))); } inline CSSEnabledState& operator ^=(CSSEnabledState& a, CSSEnabledState b) { return a = a ^ b; } inline constexpr mozilla::CastableTypedEnumResult<CSSEnabledState> operator~(CSSEnabledState a) { typedef mozilla::CastableTypedEnumResult<CSSEnabledState> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<CSSEnabledState>::Type U; return Result(CSSEnabledState(~(U(a)))); }

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClasses.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h" 2


namespace mozilla {





template<typename T>
class AlignmentFinder
{
  struct Aligner
  {
    char mChar;
    T mT;
  };

public:
  static const size_t alignment = sizeof(Aligner) - sizeof(T);
};
# 64 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Alignment.h"
template<size_t Align>
struct AlignedElem;






template<>
struct AlignedElem<1>
{
  uint8_t elem __attribute__((aligned(1)));
};

template<>
struct AlignedElem<2>
{
  uint8_t elem __attribute__((aligned(2)));
};

template<>
struct AlignedElem<4>
{
  uint8_t elem __attribute__((aligned(4)));
};

template<>
struct AlignedElem<8>
{
  uint8_t elem __attribute__((aligned(8)));
};

template<>
struct AlignedElem<16>
{
  uint8_t elem __attribute__((aligned(16)));
};

template<typename T>
struct AlignedStorage2
{
  union U
  {
    char mBytes[sizeof(T)];
    uint64_t mDummy;
  } u;

  const T* addr() const { return reinterpret_cast<const T*>(u.mBytes); }
  T* addr() { return static_cast<T*>(static_cast<void*>(u.mBytes)); }

  AlignedStorage2() = default;



  AlignedStorage2(const AlignedStorage2&) = delete;
  void operator=(const AlignedStorage2&) = delete;
};

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MacroArgs.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticAnalysisFunctions.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTraceRefcnt.h" 1








# 1 "/usr/include/stdio.h" 1 3 4
# 29 "/usr/include/stdio.h" 3 4
extern "C" {




# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 34 "/usr/include/stdio.h" 2 3 4
# 74 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/libio.h" 1 3 4
# 31 "/usr/include/libio.h" 3 4
# 1 "/usr/include/_G_config.h" 1 3 4
# 15 "/usr/include/_G_config.h" 3 4
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 16 "/usr/include/_G_config.h" 2 3 4




# 1 "/usr/include/wchar.h" 1 3 4
# 21 "/usr/include/_G_config.h" 2 3 4
typedef struct
{
  __off_t __pos;
  __mbstate_t __state;
} _G_fpos_t;
typedef struct
{
  __off64_t __pos;
  __mbstate_t __state;
} _G_fpos64_t;
# 32 "/usr/include/libio.h" 2 3 4
# 144 "/usr/include/libio.h" 3 4
struct _IO_jump_t; struct _IO_FILE;





typedef void _IO_lock_t;





struct _IO_marker {
  struct _IO_marker *_next;
  struct _IO_FILE *_sbuf;



  int _pos;
# 173 "/usr/include/libio.h" 3 4
};


enum __codecvt_result
{
  __codecvt_ok,
  __codecvt_partial,
  __codecvt_error,
  __codecvt_noconv
};
# 241 "/usr/include/libio.h" 3 4
struct _IO_FILE {
  int _flags;




  char* _IO_read_ptr;
  char* _IO_read_end;
  char* _IO_read_base;
  char* _IO_write_base;
  char* _IO_write_ptr;
  char* _IO_write_end;
  char* _IO_buf_base;
  char* _IO_buf_end;

  char *_IO_save_base;
  char *_IO_backup_base;
  char *_IO_save_end;

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;



  int _flags2;

  __off_t _old_offset;



  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];



  _IO_lock_t *_lock;
# 289 "/usr/include/libio.h" 3 4
  __off64_t _offset;







  void *__pad1;
  void *__pad2;
  void *__pad3;
  void *__pad4;

  size_t __pad5;
  int _mode;

  char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];

};





struct _IO_FILE_plus;

extern struct _IO_FILE_plus _IO_2_1_stdin_;
extern struct _IO_FILE_plus _IO_2_1_stdout_;
extern struct _IO_FILE_plus _IO_2_1_stderr_;
# 333 "/usr/include/libio.h" 3 4
typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);







typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf,
     size_t __n);







typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);


typedef int __io_close_fn (void *__cookie);




typedef __io_read_fn cookie_read_function_t;
typedef __io_write_fn cookie_write_function_t;
typedef __io_seek_fn cookie_seek_function_t;
typedef __io_close_fn cookie_close_function_t;


typedef struct
{
  __io_read_fn *read;
  __io_write_fn *write;
  __io_seek_fn *seek;
  __io_close_fn *close;
} _IO_cookie_io_functions_t;
typedef _IO_cookie_io_functions_t cookie_io_functions_t;

struct _IO_cookie_file;


extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
        void *__cookie, _IO_cookie_io_functions_t __fns);




extern "C" {


extern int __underflow (_IO_FILE *);
extern int __uflow (_IO_FILE *);
extern int __overflow (_IO_FILE *, int);
# 429 "/usr/include/libio.h" 3 4
extern int _IO_getc (_IO_FILE *__fp);
extern int _IO_putc (int __c, _IO_FILE *__fp);
extern int _IO_feof (_IO_FILE *__fp) throw ();
extern int _IO_ferror (_IO_FILE *__fp) throw ();

extern int _IO_peekc_locked (_IO_FILE *__fp);





extern void _IO_flockfile (_IO_FILE *) throw ();
extern void _IO_funlockfile (_IO_FILE *) throw ();
extern int _IO_ftrylockfile (_IO_FILE *) throw ();
# 459 "/usr/include/libio.h" 3 4
extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
   __gnuc_va_list, int *__restrict);
extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
    __gnuc_va_list);
extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t);
extern size_t _IO_sgetn (_IO_FILE *, void *, size_t);

extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int);
extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int);

extern void _IO_free_backup_area (_IO_FILE *) throw ();
# 521 "/usr/include/libio.h" 3 4
}
# 75 "/usr/include/stdio.h" 2 3 4




typedef __gnuc_va_list va_list;
# 112 "/usr/include/stdio.h" 3 4
typedef _G_fpos_t fpos_t;





typedef _G_fpos64_t fpos64_t;
# 166 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/bits/stdio_lim.h" 1 3 4
# 167 "/usr/include/stdio.h" 2 3 4



extern struct _IO_FILE *stdin;
extern struct _IO_FILE *stdout;
extern struct _IO_FILE *stderr;







extern int remove (const char *__filename) throw ();

extern int rename (const char *__old, const char *__new) throw ();




extern int renameat (int __oldfd, const char *__old, int __newfd,
       const char *__new) throw ();
# 197 "/usr/include/stdio.h" 3 4
extern FILE *tmpfile (void) ;
# 207 "/usr/include/stdio.h" 3 4
extern FILE *tmpfile64 (void) ;



extern char *tmpnam (char *__s) throw () ;





extern char *tmpnam_r (char *__s) throw () ;
# 229 "/usr/include/stdio.h" 3 4
extern char *tempnam (const char *__dir, const char *__pfx)
     throw () __attribute__ ((__malloc__)) ;
# 239 "/usr/include/stdio.h" 3 4
extern int fclose (FILE *__stream);




extern int fflush (FILE *__stream);
# 254 "/usr/include/stdio.h" 3 4
extern int fflush_unlocked (FILE *__stream);
# 264 "/usr/include/stdio.h" 3 4
extern int fcloseall (void);
# 274 "/usr/include/stdio.h" 3 4
extern FILE *fopen (const char *__restrict __filename,
      const char *__restrict __modes) ;




extern FILE *freopen (const char *__restrict __filename,
        const char *__restrict __modes,
        FILE *__restrict __stream) ;
# 299 "/usr/include/stdio.h" 3 4
extern FILE *fopen64 (const char *__restrict __filename,
        const char *__restrict __modes) ;
extern FILE *freopen64 (const char *__restrict __filename,
   const char *__restrict __modes,
   FILE *__restrict __stream) ;




extern FILE *fdopen (int __fd, const char *__modes) throw () ;





extern FILE *fopencookie (void *__restrict __magic_cookie,
     const char *__restrict __modes,
     _IO_cookie_io_functions_t __io_funcs) throw () ;




extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
  throw () ;




extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ;






extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw ();



extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
      int __modes, size_t __n) throw ();





extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
         size_t __size) throw ();


extern void setlinebuf (FILE *__stream) throw ();
# 358 "/usr/include/stdio.h" 3 4
extern int fprintf (FILE *__restrict __stream,
      const char *__restrict __format, ...);




extern int printf (const char *__restrict __format, ...);

extern int sprintf (char *__restrict __s,
      const char *__restrict __format, ...) throw ();





extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
       __gnuc_va_list __arg);




extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg);

extern int vsprintf (char *__restrict __s, const char *__restrict __format,
       __gnuc_va_list __arg) throw ();





extern int snprintf (char *__restrict __s, size_t __maxlen,
       const char *__restrict __format, ...)
     throw () __attribute__ ((__format__ (__printf__, 3, 4)));

extern int vsnprintf (char *__restrict __s, size_t __maxlen,
        const char *__restrict __format, __gnuc_va_list __arg)
     throw () __attribute__ ((__format__ (__printf__, 3, 0)));






extern int vasprintf (char **__restrict __ptr, const char *__restrict __f,
        __gnuc_va_list __arg)
     throw () __attribute__ ((__format__ (__printf__, 2, 0))) ;
extern int __asprintf (char **__restrict __ptr,
         const char *__restrict __fmt, ...)
     throw () __attribute__ ((__format__ (__printf__, 2, 3))) ;
extern int asprintf (char **__restrict __ptr,
       const char *__restrict __fmt, ...)
     throw () __attribute__ ((__format__ (__printf__, 2, 3))) ;




extern int vdprintf (int __fd, const char *__restrict __fmt,
       __gnuc_va_list __arg)
     __attribute__ ((__format__ (__printf__, 2, 0)));
extern int dprintf (int __fd, const char *__restrict __fmt, ...)
     __attribute__ ((__format__ (__printf__, 2, 3)));
# 427 "/usr/include/stdio.h" 3 4
extern int fscanf (FILE *__restrict __stream,
     const char *__restrict __format, ...) ;




extern int scanf (const char *__restrict __format, ...) ;

extern int sscanf (const char *__restrict __s,
     const char *__restrict __format, ...) throw ();
# 473 "/usr/include/stdio.h" 3 4
extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
      __gnuc_va_list __arg)
     __attribute__ ((__format__ (__scanf__, 2, 0))) ;





extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg)
     __attribute__ ((__format__ (__scanf__, 1, 0))) ;


extern int vsscanf (const char *__restrict __s,
      const char *__restrict __format, __gnuc_va_list __arg)
     throw () __attribute__ ((__format__ (__scanf__, 2, 0)));
# 533 "/usr/include/stdio.h" 3 4
extern int fgetc (FILE *__stream);
extern int getc (FILE *__stream);





extern int getchar (void);
# 552 "/usr/include/stdio.h" 3 4
extern int getc_unlocked (FILE *__stream);
extern int getchar_unlocked (void);
# 563 "/usr/include/stdio.h" 3 4
extern int fgetc_unlocked (FILE *__stream);
# 575 "/usr/include/stdio.h" 3 4
extern int fputc (int __c, FILE *__stream);
extern int putc (int __c, FILE *__stream);





extern int putchar (int __c);
# 596 "/usr/include/stdio.h" 3 4
extern int fputc_unlocked (int __c, FILE *__stream);







extern int putc_unlocked (int __c, FILE *__stream);
extern int putchar_unlocked (int __c);






extern int getw (FILE *__stream);


extern int putw (int __w, FILE *__stream);
# 624 "/usr/include/stdio.h" 3 4
extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
          ;
# 651 "/usr/include/stdio.h" 3 4
extern char *fgets_unlocked (char *__restrict __s, int __n,
        FILE *__restrict __stream) ;
# 667 "/usr/include/stdio.h" 3 4
extern __ssize_t __getdelim (char **__restrict __lineptr,
          size_t *__restrict __n, int __delimiter,
          FILE *__restrict __stream) ;
extern __ssize_t getdelim (char **__restrict __lineptr,
        size_t *__restrict __n, int __delimiter,
        FILE *__restrict __stream) ;







extern __ssize_t getline (char **__restrict __lineptr,
       size_t *__restrict __n,
       FILE *__restrict __stream) ;
# 691 "/usr/include/stdio.h" 3 4
extern int fputs (const char *__restrict __s, FILE *__restrict __stream);





extern int puts (const char *__s);






extern int ungetc (int __c, FILE *__stream);






extern size_t fread (void *__restrict __ptr, size_t __size,
       size_t __n, FILE *__restrict __stream) ;




extern size_t fwrite (const void *__restrict __ptr, size_t __size,
        size_t __n, FILE *__restrict __s);
# 728 "/usr/include/stdio.h" 3 4
extern int fputs_unlocked (const char *__restrict __s,
      FILE *__restrict __stream);
# 739 "/usr/include/stdio.h" 3 4
extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
         size_t __n, FILE *__restrict __stream) ;
extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size,
          size_t __n, FILE *__restrict __stream);
# 751 "/usr/include/stdio.h" 3 4
extern int fseek (FILE *__stream, long int __off, int __whence);




extern long int ftell (FILE *__stream) ;




extern void rewind (FILE *__stream);
# 775 "/usr/include/stdio.h" 3 4
extern int fseeko (FILE *__stream, __off_t __off, int __whence);




extern __off_t ftello (FILE *__stream) ;
# 800 "/usr/include/stdio.h" 3 4
extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);




extern int fsetpos (FILE *__stream, const fpos_t *__pos);
# 820 "/usr/include/stdio.h" 3 4
extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence);
extern __off64_t ftello64 (FILE *__stream) ;
extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos);
extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos);




extern void clearerr (FILE *__stream) throw ();

extern int feof (FILE *__stream) throw () ;

extern int ferror (FILE *__stream) throw () ;




extern void clearerr_unlocked (FILE *__stream) throw ();
extern int feof_unlocked (FILE *__stream) throw () ;
extern int ferror_unlocked (FILE *__stream) throw () ;
# 848 "/usr/include/stdio.h" 3 4
extern void perror (const char *__s);







# 1 "/usr/include/bits/sys_errlist.h" 1 3 4
# 26 "/usr/include/bits/sys_errlist.h" 3 4
extern int sys_nerr;
extern const char *const sys_errlist[];


extern int _sys_nerr;
extern const char *const _sys_errlist[];
# 856 "/usr/include/stdio.h" 2 3 4




extern int fileno (FILE *__stream) throw () ;




extern int fileno_unlocked (FILE *__stream) throw () ;
# 874 "/usr/include/stdio.h" 3 4
extern FILE *popen (const char *__command, const char *__modes) ;





extern int pclose (FILE *__stream);





extern char *ctermid (char *__s) throw ();





extern char *cuserid (char *__s);




struct obstack;


extern int obstack_printf (struct obstack *__restrict __obstack,
      const char *__restrict __format, ...)
     throw () __attribute__ ((__format__ (__printf__, 2, 3)));
extern int obstack_vprintf (struct obstack *__restrict __obstack,
       const char *__restrict __format,
       __gnuc_va_list __args)
     throw () __attribute__ ((__format__ (__printf__, 2, 0)));







extern void flockfile (FILE *__stream) throw ();



extern int ftrylockfile (FILE *__stream) throw () ;


extern void funlockfile (FILE *__stream) throw ();
# 944 "/usr/include/stdio.h" 3 4
}
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTraceRefcnt.h" 2


class nsTraceRefcnt
{
public:
  static void Shutdown();

  static nsresult DumpStatistics();

  static void ResetStatistics();

  static void WalkTheStack(FILE* aStream);






  static void SetActivityIsLegal(bool aLegal);
};




extern "C" void
NS_MeanAndStdDev(double aNumberOfValues,
                 double aSumOfValues, double aSumOfSquaredValues,
                 double* aMeanResult, double* aStdDevResult);
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2








extern "C" {
extern __attribute__((weak)) __attribute__((visibility("default"))) const char* gMozCrashReason;
}


static inline void
AnnotateMozCrashReason(const char* reason)
{
  gMozCrashReason = reason;
}






# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 2 3

using std::abort;
using std::atexit;
using std::exit;


  using std::at_quick_exit;


  using std::quick_exit;




using std::div_t;
using std::ldiv_t;

using std::abs;
using std::atof;
using std::atoi;
using std::atol;
using std::bsearch;
using std::calloc;
using std::div;
using std::free;
using std::getenv;
using std::labs;
using std::ldiv;
using std::malloc;

using std::mblen;
using std::mbstowcs;
using std::mbtowc;

using std::qsort;
using std::rand;
using std::realloc;
using std::srand;
using std::strtod;
using std::strtol;
using std::strtoul;
using std::system;

using std::wcstombs;
using std::wctomb;
# 50 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2
# 63 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h"
# 1 "/usr/include/signal.h" 1 3 4
# 30 "/usr/include/signal.h" 3 4
extern "C" {


# 1 "/usr/include/bits/sigset.h" 1 3 4
# 102 "/usr/include/bits/sigset.h" 3 4
extern int __sigismember (const __sigset_t *, int);
extern int __sigaddset (__sigset_t *, int);
extern int __sigdelset (__sigset_t *, int);
# 33 "/usr/include/signal.h" 2 3 4







typedef __sig_atomic_t sig_atomic_t;
# 57 "/usr/include/signal.h" 3 4
# 1 "/usr/include/bits/signum.h" 1 3 4
# 58 "/usr/include/signal.h" 2 3 4
# 75 "/usr/include/signal.h" 3 4
# 1 "/usr/include/time.h" 1 3 4
# 76 "/usr/include/signal.h" 2 3 4




# 1 "/usr/include/bits/siginfo.h" 1 3 4
# 24 "/usr/include/bits/siginfo.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 25 "/usr/include/bits/siginfo.h" 2 3 4







typedef union sigval
  {
    int sival_int;
    void *sival_ptr;
  } sigval_t;
# 58 "/usr/include/bits/siginfo.h" 3 4
typedef __clock_t __sigchld_clock_t;



typedef struct
  {
    int si_signo;
    int si_errno;

    int si_code;

    union
      {
 int _pad[((128 / sizeof (int)) - 4)];


 struct
   {
     __pid_t si_pid;
     __uid_t si_uid;
   } _kill;


 struct
   {
     int si_tid;
     int si_overrun;
     sigval_t si_sigval;
   } _timer;


 struct
   {
     __pid_t si_pid;
     __uid_t si_uid;
     sigval_t si_sigval;
   } _rt;


 struct
   {
     __pid_t si_pid;
     __uid_t si_uid;
     int si_status;
     __sigchld_clock_t si_utime;
     __sigchld_clock_t si_stime;
   } _sigchld;


 struct
   {
     void *si_addr;
     short int si_addr_lsb;
     struct
       {
  void *_lower;
  void *_upper;
       } si_addr_bnd;
   } _sigfault;


 struct
   {
     long int si_band;
     int si_fd;
   } _sigpoll;


 struct
   {
     void *_call_addr;
     int _syscall;
     unsigned int _arch;
   } _sigsys;
      } _sifields;
  } siginfo_t ;
# 160 "/usr/include/bits/siginfo.h" 3 4
enum
{
  SI_ASYNCNL = -60,

  SI_TKILL = -6,

  SI_SIGIO,

  SI_ASYNCIO,

  SI_MESGQ,

  SI_TIMER,

  SI_QUEUE,

  SI_USER,

  SI_KERNEL = 0x80

};




enum
{
  ILL_ILLOPC = 1,

  ILL_ILLOPN,

  ILL_ILLADR,

  ILL_ILLTRP,

  ILL_PRVOPC,

  ILL_PRVREG,

  ILL_COPROC,

  ILL_BADSTK

};


enum
{
  FPE_INTDIV = 1,

  FPE_INTOVF,

  FPE_FLTDIV,

  FPE_FLTOVF,

  FPE_FLTUND,

  FPE_FLTRES,

  FPE_FLTINV,

  FPE_FLTSUB

};


enum
{
  SEGV_MAPERR = 1,

  SEGV_ACCERR

};


enum
{
  BUS_ADRALN = 1,

  BUS_ADRERR,

  BUS_OBJERR,

  BUS_MCEERR_AR,

  BUS_MCEERR_AO

};




enum
{
  TRAP_BRKPT = 1,

  TRAP_TRACE

};




enum
{
  CLD_EXITED = 1,

  CLD_KILLED,

  CLD_DUMPED,

  CLD_TRAPPED,

  CLD_STOPPED,

  CLD_CONTINUED

};


enum
{
  POLL_IN = 1,

  POLL_OUT,

  POLL_MSG,

  POLL_ERR,

  POLL_PRI,

  POLL_HUP

};
# 320 "/usr/include/bits/siginfo.h" 3 4
typedef struct sigevent
  {
    sigval_t sigev_value;
    int sigev_signo;
    int sigev_notify;

    union
      {
 int _pad[((64 / sizeof (int)) - 4)];



 __pid_t _tid;

 struct
   {
     void (*_function) (sigval_t);
     pthread_attr_t *_attribute;
   } _sigev_thread;
      } _sigev_un;
  } sigevent_t;






enum
{
  SIGEV_SIGNAL = 0,

  SIGEV_NONE,

  SIGEV_THREAD,


  SIGEV_THREAD_ID = 4

};
# 81 "/usr/include/signal.h" 2 3 4




typedef void (*__sighandler_t) (int);




extern __sighandler_t __sysv_signal (int __sig, __sighandler_t __handler)
     throw ();

extern __sighandler_t sysv_signal (int __sig, __sighandler_t __handler)
     throw ();







extern __sighandler_t signal (int __sig, __sighandler_t __handler)
     throw ();
# 119 "/usr/include/signal.h" 3 4
extern __sighandler_t bsd_signal (int __sig, __sighandler_t __handler)
     throw ();






extern int kill (__pid_t __pid, int __sig) throw ();






extern int killpg (__pid_t __pgrp, int __sig) throw ();




extern int raise (int __sig) throw ();




extern __sighandler_t ssignal (int __sig, __sighandler_t __handler)
     throw ();
extern int gsignal (int __sig) throw ();




extern void psignal (int __sig, const char *__s);


extern void psiginfo (const siginfo_t *__pinfo, const char *__s);
# 168 "/usr/include/signal.h" 3 4
extern int sigpause (int __sig) __asm__ ("__xpg_sigpause");
# 187 "/usr/include/signal.h" 3 4
extern int sigblock (int __mask) throw () __attribute__ ((__deprecated__));


extern int sigsetmask (int __mask) throw () __attribute__ ((__deprecated__));


extern int siggetmask (void) throw () __attribute__ ((__deprecated__));
# 202 "/usr/include/signal.h" 3 4
typedef __sighandler_t sighandler_t;




typedef __sighandler_t sig_t;





extern int sigemptyset (sigset_t *__set) throw () __attribute__ ((__nonnull__ (1)));


extern int sigfillset (sigset_t *__set) throw () __attribute__ ((__nonnull__ (1)));


extern int sigaddset (sigset_t *__set, int __signo) throw () __attribute__ ((__nonnull__ (1)));


extern int sigdelset (sigset_t *__set, int __signo) throw () __attribute__ ((__nonnull__ (1)));


extern int sigismember (const sigset_t *__set, int __signo)
     throw () __attribute__ ((__nonnull__ (1)));



extern int sigisemptyset (const sigset_t *__set) throw () __attribute__ ((__nonnull__ (1)));


extern int sigandset (sigset_t *__set, const sigset_t *__left,
        const sigset_t *__right) throw () __attribute__ ((__nonnull__ (1, 2, 3)));


extern int sigorset (sigset_t *__set, const sigset_t *__left,
       const sigset_t *__right) throw () __attribute__ ((__nonnull__ (1, 2, 3)));





# 1 "/usr/include/bits/sigaction.h" 1 3 4
# 24 "/usr/include/bits/sigaction.h" 3 4
struct sigaction
  {


    union
      {

 __sighandler_t sa_handler;

 void (*sa_sigaction) (int, siginfo_t *, void *);
      }
    __sigaction_handler;







    __sigset_t sa_mask;


    int sa_flags;


    void (*sa_restorer) (void);
  };
# 244 "/usr/include/signal.h" 2 3 4


extern int sigprocmask (int __how, const sigset_t *__restrict __set,
   sigset_t *__restrict __oset) throw ();






extern int sigsuspend (const sigset_t *__set) __attribute__ ((__nonnull__ (1)));


extern int sigaction (int __sig, const struct sigaction *__restrict __act,
        struct sigaction *__restrict __oact) throw ();


extern int sigpending (sigset_t *__set) throw () __attribute__ ((__nonnull__ (1)));






extern int sigwait (const sigset_t *__restrict __set, int *__restrict __sig)
     __attribute__ ((__nonnull__ (1, 2)));






extern int sigwaitinfo (const sigset_t *__restrict __set,
   siginfo_t *__restrict __info) __attribute__ ((__nonnull__ (1)));






extern int sigtimedwait (const sigset_t *__restrict __set,
    siginfo_t *__restrict __info,
    const struct timespec *__restrict __timeout)
     __attribute__ ((__nonnull__ (1)));



extern int sigqueue (__pid_t __pid, int __sig, const union sigval __val)
     throw ();
# 301 "/usr/include/signal.h" 3 4
extern const char *const _sys_siglist[65];
extern const char *const sys_siglist[65];




# 1 "/usr/include/bits/sigcontext.h" 1 3 4
# 29 "/usr/include/bits/sigcontext.h" 3 4
struct _fpx_sw_bytes
{
  __uint32_t magic1;
  __uint32_t extended_size;
  __uint64_t xstate_bv;
  __uint32_t xstate_size;
  __uint32_t padding[7];
};

struct _fpreg
{
  unsigned short significand[4];
  unsigned short exponent;
};

struct _fpxreg
{
  unsigned short significand[4];
  unsigned short exponent;
  unsigned short padding[3];
};

struct _xmmreg
{
  __uint32_t element[4];
};
# 121 "/usr/include/bits/sigcontext.h" 3 4
struct _fpstate
{

  __uint16_t cwd;
  __uint16_t swd;
  __uint16_t ftw;
  __uint16_t fop;
  __uint64_t rip;
  __uint64_t rdp;
  __uint32_t mxcsr;
  __uint32_t mxcr_mask;
  struct _fpxreg _st[8];
  struct _xmmreg _xmm[16];
  __uint32_t padding[24];
};

struct sigcontext
{
  __uint64_t r8;
  __uint64_t r9;
  __uint64_t r10;
  __uint64_t r11;
  __uint64_t r12;
  __uint64_t r13;
  __uint64_t r14;
  __uint64_t r15;
  __uint64_t rdi;
  __uint64_t rsi;
  __uint64_t rbp;
  __uint64_t rbx;
  __uint64_t rdx;
  __uint64_t rax;
  __uint64_t rcx;
  __uint64_t rsp;
  __uint64_t rip;
  __uint64_t eflags;
  unsigned short cs;
  unsigned short gs;
  unsigned short fs;
  unsigned short __pad0;
  __uint64_t err;
  __uint64_t trapno;
  __uint64_t oldmask;
  __uint64_t cr2;
  __extension__ union
    {
      struct _fpstate * fpstate;
      __uint64_t __fpstate_word;
    };
  __uint64_t __reserved1 [8];
};



struct _xsave_hdr
{
  __uint64_t xstate_bv;
  __uint64_t reserved1[2];
  __uint64_t reserved2[5];
};

struct _ymmh_state
{
  __uint32_t ymmh_space[64];
};

struct _xstate
{
  struct _fpstate fpstate;
  struct _xsave_hdr xstate_hdr;
  struct _ymmh_state ymmh;
};
# 307 "/usr/include/signal.h" 2 3 4


extern int sigreturn (struct sigcontext *__scp) throw ();







# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 317 "/usr/include/signal.h" 2 3 4




extern int siginterrupt (int __sig, int __interrupt) throw ();


# 1 "/usr/include/bits/sigstack.h" 1 3 4
# 25 "/usr/include/bits/sigstack.h" 3 4
struct sigstack
  {
    void *ss_sp;
    int ss_onstack;
  };



enum
{
  SS_ONSTACK = 1,

  SS_DISABLE

};
# 49 "/usr/include/bits/sigstack.h" 3 4
typedef struct sigaltstack
  {
    void *ss_sp;
    int ss_flags;
    size_t ss_size;
  } stack_t;
# 324 "/usr/include/signal.h" 2 3 4


# 1 "/usr/include/sys/ucontext.h" 1 3 4
# 22 "/usr/include/sys/ucontext.h" 3 4
# 1 "/usr/include/signal.h" 1 3 4
# 23 "/usr/include/sys/ucontext.h" 2 3 4








__extension__ typedef long long int greg_t;





typedef greg_t gregset_t[23];



enum
{
  REG_R8 = 0,

  REG_R9,

  REG_R10,

  REG_R11,

  REG_R12,

  REG_R13,

  REG_R14,

  REG_R15,

  REG_RDI,

  REG_RSI,

  REG_RBP,

  REG_RBX,

  REG_RDX,

  REG_RAX,

  REG_RCX,

  REG_RSP,

  REG_RIP,

  REG_EFL,

  REG_CSGSFS,

  REG_ERR,

  REG_TRAPNO,

  REG_OLDMASK,

  REG_CR2

};


struct _libc_fpxreg
{
  unsigned short int significand[4];
  unsigned short int exponent;
  unsigned short int padding[3];
};

struct _libc_xmmreg
{
  __uint32_t element[4];
};

struct _libc_fpstate
{

  __uint16_t cwd;
  __uint16_t swd;
  __uint16_t ftw;
  __uint16_t fop;
  __uint64_t rip;
  __uint64_t rdp;
  __uint32_t mxcsr;
  __uint32_t mxcr_mask;
  struct _libc_fpxreg _st[8];
  struct _libc_xmmreg _xmm[16];
  __uint32_t padding[24];
};


typedef struct _libc_fpstate *fpregset_t;


typedef struct
  {
    gregset_t gregs;

    fpregset_t fpregs;
    __extension__ unsigned long long __reserved1 [8];
} mcontext_t;


typedef struct ucontext
  {
    unsigned long int uc_flags;
    struct ucontext *uc_link;
    stack_t uc_stack;
    mcontext_t uc_mcontext;
    __sigset_t uc_sigmask;
    struct _libc_fpstate __fpregs_mem;
  } ucontext_t;
# 327 "/usr/include/signal.h" 2 3 4





extern int sigstack (struct sigstack *__ss, struct sigstack *__oss)
     throw () __attribute__ ((__deprecated__));



extern int sigaltstack (const struct sigaltstack *__restrict __ss,
   struct sigaltstack *__restrict __oss) throw ();







extern int sighold (int __sig) throw ();


extern int sigrelse (int __sig) throw ();


extern int sigignore (int __sig) throw ();


extern __sighandler_t sigset (int __sig, __sighandler_t __disp) throw ();







# 1 "/usr/include/bits/sigthread.h" 1 3 4
# 30 "/usr/include/bits/sigthread.h" 3 4
extern int pthread_sigmask (int __how,
       const __sigset_t *__restrict __newmask,
       __sigset_t *__restrict __oldmask)throw ();


extern int pthread_kill (pthread_t __threadid, int __signo) throw ();



extern int pthread_sigqueue (pthread_t __threadid, int __signo,
        const union sigval __value) throw ();
# 363 "/usr/include/signal.h" 2 3 4






extern int __libc_current_sigrtmin (void) throw ();

extern int __libc_current_sigrtmax (void) throw ();



}
# 64 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h" 2
# 141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h"
extern "C" {
# 151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h"
__attribute__ ((__unused__)) static __attribute__ ((cold)) __attribute__((noinline)) void
MOZ_ReportAssertionFailure(const char* aStr, const char* aFilename, int aLine)

{





  fprintf(stderr, "Assertion failure: %s, at %s:%d\n", aStr, aFilename, aLine);

  nsTraceRefcnt::WalkTheStack(stderr);

  fflush(stderr);

}

__attribute__ ((__unused__)) static __attribute__ ((cold)) __attribute__((noinline)) void
MOZ_ReportCrash(const char* aStr, const char* aFilename, int aLine)

{




  fprintf(stderr, "Hit MOZ_CRASH(%s) at %s:%d\n", aStr, aFilename, aLine);

  nsTraceRefcnt::WalkTheStack(stderr);

  fflush(stderr);

}
# 283 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h"
__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((cold)) __attribute__((noreturn)) __attribute__((noinline)) void
MOZ_CrashOOL(int aLine, const char* aReason);







static const size_t sPrintfMaxArgs = 4;
static const size_t sPrintfCrashReasonSize = 1024;


__attribute__((weak)) __attribute__((visibility("default"))) __attribute__ ((cold)) __attribute__((noreturn)) __attribute__((noinline)) __attribute__ ((format (printf, 2, 3))) void
MOZ_CrashPrintf(int aLine, const char* aFormat, ...);
# 326 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h"
}
# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Assertions.h"
namespace mozilla {
namespace detail {

template<typename T>
struct AssertionConditionType
{
  typedef typename RemoveReference<T>::Type ValueT;
  static_assert(!IsArray<ValueT>::value,
                "Expected boolean assertion condition, got an array or a "
                "string!");
  static_assert(!IsFunction<ValueT>::value,
                "Expected boolean assertion condition, got a function! Did "
                "you intend to call that function?");
  static_assert(!IsFloatingPoint<ValueT>::value,
                "It's often a bad idea to assert that a floating-point number "
                "is nonzero, because such assertions tend to intermittently "
                "fail. Shouldn't your code gracefully handle this case instead "
                "of asserting? Anyway, if you really want to do that, write an "
                "explicit boolean condition, like !!x or x!=0.");

  static const bool isValid = true;
};

}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Move.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Move.h"
namespace mozilla {
# 199 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Move.h"
template<typename T>
inline typename RemoveReference<T>::Type&&
Move(T&& aX)
{
  return static_cast<typename RemoveReference<T>::Type&&>(aX);
}





template<typename T>
inline T&&
Forward(typename RemoveReference<T>::Type& aX)
{
  return static_cast<T&&>(aX);
}

template<typename T>
inline T&&
Forward(typename RemoveReference<T>::Type&& aX)
{
  static_assert(!IsLvalueReference<T>::value,
                "misuse of Forward detected!  try the other overload");
  return static_cast<T&&>(aX);
}


template<typename T>
inline void
Swap(T& aX, T& aY)
{
  T tmp(Move(aX));
  aX = Move(aY);
  aY = Move(tmp);
}

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OperatorNewExtensions.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OperatorNewExtensions.h"
namespace mozilla {
enum NotNullTag {
  KnownNotNull,
};
}
# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OperatorNewExtensions.h"
inline void*
operator new(size_t, mozilla::NotNullTag, void* p)
{
  do { } while (0);
  return p;
}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" 2



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/memoryfwd.h" 1 3
# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/memoryfwd.h" 3



namespace std __attribute__ ((__visibility__ ("default")))
{
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/memoryfwd.h" 3
  template<typename>
    class allocator;

  template<>
    class allocator<void>;


  template<typename, typename>
    struct uses_allocator;




}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 52 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stringfwd.h" 3
  template<class _CharT>
    struct char_traits;

  template<> struct char_traits<char>;


  template<> struct char_traits<wchar_t>;




  template<> struct char_traits<char16_t>;
  template<> struct char_traits<char32_t>;


namespace __cxx11 {

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
           typename _Alloc = allocator<_CharT> >
    class basic_string;


  typedef basic_string<char> string;



  typedef basic_string<wchar_t> wstring;





  typedef basic_string<char16_t> u16string;


  typedef basic_string<char32_t> u32string;


}




}
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 1 3
# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3




# 1 "/usr/include/wchar.h" 1 3 4
# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 2 3
# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3
namespace std
{
  using ::mbstate_t;
}
# 135 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  using ::wint_t;

  using ::btowc;
  using ::fgetwc;
  using ::fgetws;
  using ::fputwc;
  using ::fputws;
  using ::fwide;
  using ::fwprintf;
  using ::fwscanf;
  using ::getwc;
  using ::getwchar;
  using ::mbrlen;
  using ::mbrtowc;
  using ::mbsinit;
  using ::mbsrtowcs;
  using ::putwc;
  using ::putwchar;

  using ::swprintf;

  using ::swscanf;
  using ::ungetwc;
  using ::vfwprintf;

  using ::vfwscanf;


  using ::vswprintf;


  using ::vswscanf;

  using ::vwprintf;

  using ::vwscanf;

  using ::wcrtomb;
  using ::wcscat;
  using ::wcscmp;
  using ::wcscoll;
  using ::wcscpy;
  using ::wcscspn;
  using ::wcsftime;
  using ::wcslen;
  using ::wcsncat;
  using ::wcsncmp;
  using ::wcsncpy;
  using ::wcsrtombs;
  using ::wcsspn;
  using ::wcstod;

  using ::wcstof;

  using ::wcstok;
  using ::wcstol;
  using ::wcstoul;
  using ::wcsxfrm;
  using ::wctob;
  using ::wmemcmp;
  using ::wmemcpy;
  using ::wmemmove;
  using ::wmemset;
  using ::wprintf;
  using ::wscanf;
  using ::wcschr;
  using ::wcspbrk;
  using ::wcsrchr;
  using ::wcsstr;
  using ::wmemchr;


  inline wchar_t*
  wcschr(wchar_t* __p, wchar_t __c)
  { return wcschr(const_cast<const wchar_t*>(__p), __c); }

  inline wchar_t*
  wcspbrk(wchar_t* __s1, const wchar_t* __s2)
  { return wcspbrk(const_cast<const wchar_t*>(__s1), __s2); }

  inline wchar_t*
  wcsrchr(wchar_t* __p, wchar_t __c)
  { return wcsrchr(const_cast<const wchar_t*>(__p), __c); }

  inline wchar_t*
  wcsstr(wchar_t* __s1, const wchar_t* __s2)
  { return wcsstr(const_cast<const wchar_t*>(__s1), __s2); }

  inline wchar_t*
  wmemchr(wchar_t* __p, wchar_t __c, size_t __n)
  { return wmemchr(const_cast<const wchar_t*>(__p), __c, __n); }



}







namespace __gnu_cxx
{





  using ::wcstold;
# 257 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3
  using ::wcstoll;
  using ::wcstoull;

}

namespace std
{
  using ::__gnu_cxx::wcstold;
  using ::__gnu_cxx::wcstoll;
  using ::__gnu_cxx::wcstoull;
}
# 277 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3
namespace std
{

  using std::wcstof;


  using std::vfwscanf;


  using std::vswscanf;


  using std::vwscanf;



  using std::wcstold;
  using std::wcstoll;
  using std::wcstoull;

}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 2 3
# 68 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 88 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3
  typedef long streamoff;
# 98 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3
  typedef ptrdiff_t streamsize;
# 111 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3
  template<typename _StateT>
    class fpos
    {
    private:
      streamoff _M_off;
      _StateT _M_state;

    public:




      fpos()
      : _M_off(0), _M_state() { }
# 133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/postypes.h" 3
      fpos(streamoff __off)
      : _M_off(__off), _M_state() { }


      operator streamoff() const { return _M_off; }


      void
      state(_StateT __st)
      { _M_state = __st; }


      _StateT
      state() const
      { return _M_state; }





      fpos&
      operator+=(streamoff __off)
      {
 _M_off += __off;
 return *this;
      }





      fpos&
      operator-=(streamoff __off)
      {
 _M_off -= __off;
 return *this;
      }







      fpos
      operator+(streamoff __off) const
      {
 fpos __pos(*this);
 __pos += __off;
 return __pos;
      }







      fpos
      operator-(streamoff __off) const
      {
 fpos __pos(*this);
 __pos -= __off;
 return __pos;
      }






      streamoff
      operator-(const fpos& __other) const
      { return _M_off - __other._M_off; }
    };






  template<typename _StateT>
    inline bool
    operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
    { return streamoff(__lhs) == streamoff(__rhs); }

  template<typename _StateT>
    inline bool
    operator!=(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
    { return streamoff(__lhs) != streamoff(__rhs); }





  typedef fpos<mbstate_t> streampos;

  typedef fpos<mbstate_t> wstreampos;



  typedef fpos<mbstate_t> u16streampos;

  typedef fpos<mbstate_t> u32streampos;



}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 74 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iosfwd" 3
  class ios_base;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_ios;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_streambuf;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_istream;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_ostream;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_iostream;


namespace __cxx11 {

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
     typename _Alloc = allocator<_CharT> >
    class basic_stringbuf;

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
    typename _Alloc = allocator<_CharT> >
    class basic_istringstream;

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
    typename _Alloc = allocator<_CharT> >
    class basic_ostringstream;

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
    typename _Alloc = allocator<_CharT> >
    class basic_stringstream;

}

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_filebuf;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_ifstream;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_ofstream;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class basic_fstream;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class istreambuf_iterator;

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
    class ostreambuf_iterator;



  typedef basic_ios<char> ios;


  typedef basic_streambuf<char> streambuf;


  typedef basic_istream<char> istream;


  typedef basic_ostream<char> ostream;


  typedef basic_iostream<char> iostream;


  typedef basic_stringbuf<char> stringbuf;


  typedef basic_istringstream<char> istringstream;


  typedef basic_ostringstream<char> ostringstream;


  typedef basic_stringstream<char> stringstream;


  typedef basic_filebuf<char> filebuf;


  typedef basic_ifstream<char> ifstream;


  typedef basic_ofstream<char> ofstream;


  typedef basic_fstream<char> fstream;



  typedef basic_ios<wchar_t> wios;


  typedef basic_streambuf<wchar_t> wstreambuf;


  typedef basic_istream<wchar_t> wistream;


  typedef basic_ostream<wchar_t> wostream;


  typedef basic_iostream<wchar_t> wiostream;


  typedef basic_stringbuf<wchar_t> wstringbuf;


  typedef basic_istringstream<wchar_t> wistringstream;


  typedef basic_ostringstream<wchar_t> wostringstream;


  typedef basic_stringstream<wchar_t> wstringstream;


  typedef basic_filebuf<wchar_t> wfilebuf;


  typedef basic_ifstream<wchar_t> wifstream;


  typedef basic_ofstream<wchar_t> wofstream;


  typedef basic_fstream<wchar_t> wfstream;




}
# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 1 3
# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functexcept.h" 1 3
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functexcept.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{



  void
  __throw_bad_exception(void) __attribute__((__noreturn__));


  void
  __throw_bad_alloc(void) __attribute__((__noreturn__));


  void
  __throw_bad_cast(void) __attribute__((__noreturn__));

  void
  __throw_bad_typeid(void) __attribute__((__noreturn__));


  void
  __throw_logic_error(const char*) __attribute__((__noreturn__));

  void
  __throw_domain_error(const char*) __attribute__((__noreturn__));

  void
  __throw_invalid_argument(const char*) __attribute__((__noreturn__));

  void
  __throw_length_error(const char*) __attribute__((__noreturn__));

  void
  __throw_out_of_range(const char*) __attribute__((__noreturn__));

  void
  __throw_out_of_range_fmt(const char*, ...) __attribute__((__noreturn__))
    __attribute__((__format__(__gnu_printf__, 1, 2)));

  void
  __throw_runtime_error(const char*) __attribute__((__noreturn__));

  void
  __throw_range_error(const char*) __attribute__((__noreturn__));

  void
  __throw_overflow_error(const char*) __attribute__((__noreturn__));

  void
  __throw_underflow_error(const char*) __attribute__((__noreturn__));


  void
  __throw_ios_failure(const char*) __attribute__((__noreturn__));

  void
  __throw_system_error(int) __attribute__((__noreturn__));

  void
  __throw_future_error(int) __attribute__((__noreturn__));


  void
  __throw_bad_function_call() __attribute__((__noreturn__));


}
# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 1 3
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 3
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 3
extern "C++" {

namespace std __attribute__ ((__visibility__ ("default")))
{


  struct __true_type { };
  struct __false_type { };

  template<bool>
    struct __truth_type
    { typedef __false_type __type; };

  template<>
    struct __truth_type<true>
    { typedef __true_type __type; };



  template<class _Sp, class _Tp>
    struct __traitor
    {
      enum { __value = bool(_Sp::__value) || bool(_Tp::__value) };
      typedef typename __truth_type<__value>::__type __type;
    };


  template<typename, typename>
    struct __are_same
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };

  template<typename _Tp>
    struct __are_same<_Tp, _Tp>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };


  template<typename _Tp>
    struct __is_void
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };

  template<>
    struct __is_void<void>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };




  template<typename _Tp>
    struct __is_integer
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };





  template<>
    struct __is_integer<bool>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<char>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<signed char>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<unsigned char>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };


  template<>
    struct __is_integer<wchar_t>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };



  template<>
    struct __is_integer<char16_t>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<char32_t>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };


  template<>
    struct __is_integer<short>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<unsigned short>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<int>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<unsigned int>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<long>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<unsigned long>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<long long>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_integer<unsigned long long>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };
# 278 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cpp_type_traits.h" 3
  template<typename _Tp>
    struct __is_floating
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };


  template<>
    struct __is_floating<float>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_floating<double>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_floating<long double>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };




  template<typename _Tp>
    struct __is_pointer
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };

  template<typename _Tp>
    struct __is_pointer<_Tp*>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };




  template<typename _Tp>
    struct __is_arithmetic
    : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> >
    { };




  template<typename _Tp>
    struct __is_scalar
    : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> >
    { };




  template<typename _Tp>
    struct __is_char
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };

  template<>
    struct __is_char<char>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };


  template<>
    struct __is_char<wchar_t>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };


  template<typename _Tp>
    struct __is_byte
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };

  template<>
    struct __is_byte<char>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_byte<signed char>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<>
    struct __is_byte<unsigned char>
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };




  template<typename _Tp>
    struct __is_move_iterator
    {
      enum { __value = 0 };
      typedef __false_type __type;
    };



  template<typename _Iterator>
    inline _Iterator
    __miter_base(_Iterator __it)
    { return __it; }


}
}
# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/type_traits.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/type_traits.h" 3




extern "C++" {

namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{



  template<bool, typename>
    struct __enable_if
    { };

  template<typename _Tp>
    struct __enable_if<true, _Tp>
    { typedef _Tp __type; };



  template<bool _Cond, typename _Iftrue, typename _Iffalse>
    struct __conditional_type
    { typedef _Iftrue __type; };

  template<typename _Iftrue, typename _Iffalse>
    struct __conditional_type<false, _Iftrue, _Iffalse>
    { typedef _Iffalse __type; };



  template<typename _Tp>
    struct __add_unsigned
    {
    private:
      typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;

    public:
      typedef typename __if_type::__type __type;
    };

  template<>
    struct __add_unsigned<char>
    { typedef unsigned char __type; };

  template<>
    struct __add_unsigned<signed char>
    { typedef unsigned char __type; };

  template<>
    struct __add_unsigned<short>
    { typedef unsigned short __type; };

  template<>
    struct __add_unsigned<int>
    { typedef unsigned int __type; };

  template<>
    struct __add_unsigned<long>
    { typedef unsigned long __type; };

  template<>
    struct __add_unsigned<long long>
    { typedef unsigned long long __type; };


  template<>
    struct __add_unsigned<bool>;

  template<>
    struct __add_unsigned<wchar_t>;



  template<typename _Tp>
    struct __remove_unsigned
    {
    private:
      typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;

    public:
      typedef typename __if_type::__type __type;
    };

  template<>
    struct __remove_unsigned<char>
    { typedef signed char __type; };

  template<>
    struct __remove_unsigned<unsigned char>
    { typedef signed char __type; };

  template<>
    struct __remove_unsigned<unsigned short>
    { typedef short __type; };

  template<>
    struct __remove_unsigned<unsigned int>
    { typedef int __type; };

  template<>
    struct __remove_unsigned<unsigned long>
    { typedef long __type; };

  template<>
    struct __remove_unsigned<unsigned long long>
    { typedef long long __type; };


  template<>
    struct __remove_unsigned<bool>;

  template<>
    struct __remove_unsigned<wchar_t>;



  template<typename _Type>
    inline bool
    __is_null_pointer(_Type* __ptr)
    { return __ptr == 0; }

  template<typename _Type>
    inline bool
    __is_null_pointer(_Type)
    { return false; }


  inline bool
  __is_null_pointer(std::nullptr_t)
  { return true; }



  template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
    struct __promote
    { typedef double __type; };




  template<typename _Tp>
    struct __promote<_Tp, false>
    { };

  template<>
    struct __promote<long double>
    { typedef long double __type; };

  template<>
    struct __promote<double>
    { typedef double __type; };

  template<>
    struct __promote<float>
    { typedef float __type; };

  template<typename _Tp, typename _Up,
           typename _Tp2 = typename __promote<_Tp>::__type,
           typename _Up2 = typename __promote<_Up>::__type>
    struct __promote_2
    {
      typedef __typeof__(_Tp2() + _Up2()) __type;
    };

  template<typename _Tp, typename _Up, typename _Vp,
           typename _Tp2 = typename __promote<_Tp>::__type,
           typename _Up2 = typename __promote<_Up>::__type,
           typename _Vp2 = typename __promote<_Vp>::__type>
    struct __promote_3
    {
      typedef __typeof__(_Tp2() + _Up2() + _Vp2()) __type;
    };

  template<typename _Tp, typename _Up, typename _Vp, typename _Wp,
           typename _Tp2 = typename __promote<_Tp>::__type,
           typename _Up2 = typename __promote<_Up>::__type,
           typename _Vp2 = typename __promote<_Vp>::__type,
           typename _Wp2 = typename __promote<_Wp>::__type>
    struct __promote_4
    {
      typedef __typeof__(_Tp2() + _Up2() + _Vp2() + _Wp2()) __type;
    };


}
}
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 3




namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{
# 54 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 3
  template<typename _Value>
    struct __numeric_traits_integer
    {

      static const _Value __min = (((_Value)(-1) < 0) ? (_Value)1 << (sizeof(_Value) * 8 - ((_Value)(-1) < 0)) : (_Value)0);
      static const _Value __max = (((_Value)(-1) < 0) ? (((((_Value)1 << ((sizeof(_Value) * 8 - ((_Value)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(_Value)0);



      static const bool __is_signed = ((_Value)(-1) < 0);
      static const int __digits = (sizeof(_Value) * 8 - ((_Value)(-1) < 0));
    };

  template<typename _Value>
    const _Value __numeric_traits_integer<_Value>::__min;

  template<typename _Value>
    const _Value __numeric_traits_integer<_Value>::__max;

  template<typename _Value>
    const bool __numeric_traits_integer<_Value>::__is_signed;

  template<typename _Value>
    const int __numeric_traits_integer<_Value>::__digits;
# 99 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/numeric_traits.h" 3
  template<typename _Value>
    struct __numeric_traits_floating
    {

      static const int __max_digits10 = (2 + (std::__are_same<_Value, float>::__value ? 24 : std::__are_same<_Value, double>::__value ? 53 : 64) * 643L / 2136);


      static const bool __is_signed = true;
      static const int __digits10 = (std::__are_same<_Value, float>::__value ? 6 : std::__are_same<_Value, double>::__value ? 15 : 18);
      static const int __max_exponent10 = (std::__are_same<_Value, float>::__value ? 38 : std::__are_same<_Value, double>::__value ? 308 : 4932);
    };

  template<typename _Value>
    const int __numeric_traits_floating<_Value>::__max_digits10;

  template<typename _Value>
    const bool __numeric_traits_floating<_Value>::__is_signed;

  template<typename _Value>
    const int __numeric_traits_floating<_Value>::__digits10;

  template<typename _Value>
    const int __numeric_traits_floating<_Value>::__max_exponent10;

  template<typename _Value>
    struct __numeric_traits
    : public __conditional_type<std::__is_integer<_Value>::__value,
    __numeric_traits_integer<_Value>,
    __numeric_traits_floating<_Value> >::__type
    { };


}
# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 1 3
# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 76 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3
  struct piecewise_construct_t { explicit piecewise_construct_t() = default; };


  constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();


  template<typename...>
    class tuple;

  template<std::size_t...>
    struct _Index_tuple;






  template <bool, typename _T1, typename _T2>
    struct _PCC
    {
      template <typename _U1, typename _U2>
      static constexpr bool _ConstructiblePair()
      {
 return __and_<is_constructible<_T1, const _U1&>,
        is_constructible<_T2, const _U2&>>::value;
      }

      template <typename _U1, typename _U2>
      static constexpr bool _ImplicitlyConvertiblePair()
      {
 return __and_<is_convertible<const _U1&, _T1>,
        is_convertible<const _U2&, _T2>>::value;
      }

      template <typename _U1, typename _U2>
      static constexpr bool _MoveConstructiblePair()
      {
 return __and_<is_constructible<_T1, _U1&&>,
        is_constructible<_T2, _U2&&>>::value;
      }

      template <typename _U1, typename _U2>
      static constexpr bool _ImplicitlyMoveConvertiblePair()
      {
 return __and_<is_convertible<_U1&&, _T1>,
        is_convertible<_U2&&, _T2>>::value;
      }

      template <bool __implicit, typename _U1, typename _U2>
      static constexpr bool _CopyMovePair()
      {
 using __do_converts = __and_<is_convertible<const _U1&, _T1>,
      is_convertible<_U2&&, _T2>>;
 using __converts = typename conditional<__implicit,
           __do_converts,
           __not_<__do_converts>>::type;
 return __and_<is_constructible<_T1, const _U1&>,
        is_constructible<_T2, _U2&&>,
        __converts
        >::value;
      }

      template <bool __implicit, typename _U1, typename _U2>
      static constexpr bool _MoveCopyPair()
      {
 using __do_converts = __and_<is_convertible<_U1&&, _T1>,
      is_convertible<const _U2&, _T2>>;
 using __converts = typename conditional<__implicit,
           __do_converts,
           __not_<__do_converts>>::type;
 return __and_<is_constructible<_T1, _U1&&>,
        is_constructible<_T2, const _U2&&>,
        __converts
        >::value;
      }
  };

  template <typename _T1, typename _T2>
    struct _PCC<false, _T1, _T2>
    {
      template <typename _U1, typename _U2>
      static constexpr bool _ConstructiblePair()
      {
 return false;
      }

      template <typename _U1, typename _U2>
      static constexpr bool _ImplicitlyConvertiblePair()
      {
 return false;
      }

      template <typename _U1, typename _U2>
      static constexpr bool _MoveConstructiblePair()
      {
 return false;
      }

      template <typename _U1, typename _U2>
      static constexpr bool _ImplicitlyMoveConvertiblePair()
      {
 return false;
      }
  };
# 189 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3
  template<typename _T1, typename _T2>
    struct pair
    {
      typedef _T1 first_type;
      typedef _T2 second_type;

      _T1 first;
      _T2 second;






      template <typename _U1 = _T1,
                typename _U2 = _T2,
                typename enable_if<__and_<
                                     __is_implicitly_default_constructible<_U1>,
                                     __is_implicitly_default_constructible<_U2>>
                                   ::value, bool>::type = true>

      constexpr pair()
      : first(), second() { }


      template <typename _U1 = _T1,
                typename _U2 = _T2,
                typename enable_if<__and_<
                       is_default_constructible<_U1>,
                       is_default_constructible<_U2>,
                       __not_<
                         __and_<__is_implicitly_default_constructible<_U1>,
                                __is_implicitly_default_constructible<_U2>>>>
                                   ::value, bool>::type = false>
      explicit constexpr pair()
      : first(), second() { }
# 233 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3
      using _PCCP = _PCC<true, _T1, _T2>;

      template<typename _U1 = _T1, typename _U2=_T2, typename
        enable_if<_PCCP::template
      _ConstructiblePair<_U1, _U2>()
                  && _PCCP::template
      _ImplicitlyConvertiblePair<_U1, _U2>(),
                         bool>::type=true>
      constexpr pair(const _T1& __a, const _T2& __b)
      : first(__a), second(__b) { }

       template<typename _U1 = _T1, typename _U2=_T2, typename
  enable_if<_PCCP::template
       _ConstructiblePair<_U1, _U2>()
                   && !_PCCP::template
       _ImplicitlyConvertiblePair<_U1, _U2>(),
                         bool>::type=false>
      explicit constexpr pair(const _T1& __a, const _T2& __b)
      : first(__a), second(__b) { }
# 261 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3
      template <typename _U1, typename _U2>
        using _PCCFP = _PCC<!is_same<_T1, _U1>::value
       || !is_same<_T2, _U2>::value,
       _T1, _T2>;

      template<typename _U1, typename _U2, typename
        enable_if<_PCCFP<_U1, _U2>::template
      _ConstructiblePair<_U1, _U2>()
                  && _PCCFP<_U1, _U2>::template
      _ImplicitlyConvertiblePair<_U1, _U2>(),
     bool>::type=true>
        constexpr pair(const pair<_U1, _U2>& __p)
        : first(__p.first), second(__p.second) { }

      template<typename _U1, typename _U2, typename
        enable_if<_PCCFP<_U1, _U2>::template
      _ConstructiblePair<_U1, _U2>()
    && !_PCCFP<_U1, _U2>::template
      _ImplicitlyConvertiblePair<_U1, _U2>(),
                         bool>::type=false>
 explicit constexpr pair(const pair<_U1, _U2>& __p)
 : first(__p.first), second(__p.second) { }

      constexpr pair(const pair&) = default;
      constexpr pair(pair&&) = default;


      template<typename _U1, typename
        enable_if<_PCCP::template
      _MoveCopyPair<true, _U1, _T2>(),
                         bool>::type=true>
       constexpr pair(_U1&& __x, const _T2& __y)
       : first(std::forward<_U1>(__x)), second(__y) { }

      template<typename _U1, typename
        enable_if<_PCCP::template
      _MoveCopyPair<false, _U1, _T2>(),
                         bool>::type=false>
       explicit constexpr pair(_U1&& __x, const _T2& __y)
       : first(std::forward<_U1>(__x)), second(__y) { }

      template<typename _U2, typename
        enable_if<_PCCP::template
      _CopyMovePair<true, _T1, _U2>(),
                         bool>::type=true>
       constexpr pair(const _T1& __x, _U2&& __y)
       : first(__x), second(std::forward<_U2>(__y)) { }

      template<typename _U2, typename
        enable_if<_PCCP::template
      _CopyMovePair<false, _T1, _U2>(),
                         bool>::type=false>
       explicit pair(const _T1& __x, _U2&& __y)
       : first(__x), second(std::forward<_U2>(__y)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_PCCP::template
      _MoveConstructiblePair<_U1, _U2>()
     && _PCCP::template
      _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
                         bool>::type=true>
 constexpr pair(_U1&& __x, _U2&& __y)
 : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_PCCP::template
      _MoveConstructiblePair<_U1, _U2>()
     && !_PCCP::template
      _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
                         bool>::type=false>
 explicit constexpr pair(_U1&& __x, _U2&& __y)
 : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }


      template<typename _U1, typename _U2, typename
        enable_if<_PCCFP<_U1, _U2>::template
      _MoveConstructiblePair<_U1, _U2>()
     && _PCCFP<_U1, _U2>::template
      _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
                         bool>::type=true>
 constexpr pair(pair<_U1, _U2>&& __p)
 : first(std::forward<_U1>(__p.first)),
   second(std::forward<_U2>(__p.second)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_PCCFP<_U1, _U2>::template
      _MoveConstructiblePair<_U1, _U2>()
     && !_PCCFP<_U1, _U2>::template
      _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
                         bool>::type=false>
 explicit constexpr pair(pair<_U1, _U2>&& __p)
 : first(std::forward<_U1>(__p.first)),
   second(std::forward<_U2>(__p.second)) { }

      template<typename... _Args1, typename... _Args2>
        pair(piecewise_construct_t, tuple<_Args1...>, tuple<_Args2...>);

      pair&
      operator=(typename conditional<
  __and_<is_copy_assignable<_T1>,
         is_copy_assignable<_T2>>::value,
  const pair&, const __nonesuch&>::type __p)
      {
 first = __p.first;
 second = __p.second;
 return *this;
      }

      pair&
      operator=(typename conditional<
  __not_<__and_<is_copy_assignable<_T1>,
                is_copy_assignable<_T2>>>::value,
  const pair&, const __nonesuch&>::type __p) = delete;

      pair&
      operator=(typename conditional<
  __and_<is_move_assignable<_T1>,
         is_move_assignable<_T2>>::value,
  pair&&, __nonesuch&&>::type __p)
      noexcept(__and_<is_nothrow_move_assignable<_T1>,
               is_nothrow_move_assignable<_T2>>::value)
      {
 first = std::forward<first_type>(__p.first);
 second = std::forward<second_type>(__p.second);
 return *this;
      }

      template<typename _U1, typename _U2>
      typename enable_if<__and_<is_assignable<_T1&, const _U1&>,
    is_assignable<_T2&, const _U2&>>::value,
    pair&>::type
 operator=(const pair<_U1, _U2>& __p)
 {
   first = __p.first;
   second = __p.second;
   return *this;
 }

      template<typename _U1, typename _U2>
      typename enable_if<__and_<is_assignable<_T1&, _U1&&>,
    is_assignable<_T2&, _U2&&>>::value,
    pair&>::type
 operator=(pair<_U1, _U2>&& __p)
 {
   first = std::forward<_U1>(__p.first);
   second = std::forward<_U2>(__p.second);
   return *this;
 }

      void
      swap(pair& __p)
      noexcept(__is_nothrow_swappable<_T1>::value
               && __is_nothrow_swappable<_T2>::value)
      {
 using std::swap;
 swap(first, __p.first);
 swap(second, __p.second);
      }

    private:
      template<typename... _Args1, std::size_t... _Indexes1,
               typename... _Args2, std::size_t... _Indexes2>
        pair(tuple<_Args1...>&, tuple<_Args2...>&,
             _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>);

    };


  template<typename _T1, typename _T2>
    inline constexpr bool
    operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return __x.first == __y.first && __x.second == __y.second; }


  template<typename _T1, typename _T2>
    inline constexpr bool
    operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return __x.first < __y.first
      || (!(__y.first < __x.first) && __x.second < __y.second); }


  template<typename _T1, typename _T2>
    inline constexpr bool
    operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return !(__x == __y); }


  template<typename _T1, typename _T2>
    inline constexpr bool
    operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return __y < __x; }


  template<typename _T1, typename _T2>
    inline constexpr bool
    operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return !(__y < __x); }


  template<typename _T1, typename _T2>
    inline constexpr bool
    operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return !(__x < __y); }





  template<typename _T1, typename _T2>
    inline void
    swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }
# 490 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3
  template<typename _T1, typename _T2>
    constexpr pair<typename __decay_and_strip<_T1>::__type,
                   typename __decay_and_strip<_T2>::__type>
    make_pair(_T1&& __x, _T2&& __y)
    {
      typedef typename __decay_and_strip<_T1>::__type __ds_type1;
      typedef typename __decay_and_strip<_T2>::__type __ds_type2;
      typedef pair<__ds_type1, __ds_type2> __pair_type;
      return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));
    }
# 510 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_pair.h" 3
}
# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 1 3
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3







namespace std __attribute__ ((__visibility__ ("default")))
{
# 89 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3
  struct input_iterator_tag { };


  struct output_iterator_tag { };


  struct forward_iterator_tag : public input_iterator_tag { };



  struct bidirectional_iterator_tag : public forward_iterator_tag { };



  struct random_access_iterator_tag : public bidirectional_iterator_tag { };
# 116 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3
  template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
           typename _Pointer = _Tp*, typename _Reference = _Tp&>
    struct iterator
    {

      typedef _Category iterator_category;

      typedef _Tp value_type;

      typedef _Distance difference_type;

      typedef _Pointer pointer;

      typedef _Reference reference;
    };
# 143 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3
  template<typename _Iterator, typename = __void_t<>>
    struct __iterator_traits { };

  template<typename _Iterator>
    struct __iterator_traits<_Iterator,
        __void_t<typename _Iterator::iterator_category,
          typename _Iterator::value_type,
          typename _Iterator::difference_type,
          typename _Iterator::pointer,
          typename _Iterator::reference>>
    {
      typedef typename _Iterator::iterator_category iterator_category;
      typedef typename _Iterator::value_type value_type;
      typedef typename _Iterator::difference_type difference_type;
      typedef typename _Iterator::pointer pointer;
      typedef typename _Iterator::reference reference;
    };

  template<typename _Iterator>
    struct iterator_traits
    : public __iterator_traits<_Iterator> { };
# 177 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3
  template<typename _Tp>
    struct iterator_traits<_Tp*>
    {
      typedef random_access_iterator_tag iterator_category;
      typedef _Tp value_type;
      typedef ptrdiff_t difference_type;
      typedef _Tp* pointer;
      typedef _Tp& reference;
    };


  template<typename _Tp>
    struct iterator_traits<const _Tp*>
    {
      typedef random_access_iterator_tag iterator_category;
      typedef _Tp value_type;
      typedef ptrdiff_t difference_type;
      typedef const _Tp* pointer;
      typedef const _Tp& reference;
    };





  template<typename _Iter>
    inline typename iterator_traits<_Iter>::iterator_category
    __iterator_category(const _Iter&)
    { return typename iterator_traits<_Iter>::iterator_category(); }
# 230 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_types.h" 3
  template<typename _InIter>
    using _RequireInputIter = typename
      enable_if<is_convertible<typename
  iterator_traits<_InIter>::iterator_category,
          input_iterator_tag>::value>::type;



}
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 1 3
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/debug/assertions.h" 1 3
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  template <typename> struct _List_iterator;
  template <typename> struct _List_const_iterator;




  template<typename _InputIterator>
    inline typename iterator_traits<_InputIterator>::difference_type
    __distance(_InputIterator __first, _InputIterator __last,
               input_iterator_tag)
    {



      typename iterator_traits<_InputIterator>::difference_type __n = 0;
      while (__first != __last)
 {
   ++__first;
   ++__n;
 }
      return __n;
    }

  template<typename _RandomAccessIterator>
    inline typename iterator_traits<_RandomAccessIterator>::difference_type
    __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
               random_access_iterator_tag)
    {



      return __last - __first;
    }



  template<typename _Tp>
    ptrdiff_t
    __distance(std::_List_iterator<_Tp>,
        std::_List_iterator<_Tp>,
        input_iterator_tag);

  template<typename _Tp>
    ptrdiff_t
    __distance(std::_List_const_iterator<_Tp>,
        std::_List_const_iterator<_Tp>,
        input_iterator_tag);
# 133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 3
  template<typename _InputIterator>
    inline typename iterator_traits<_InputIterator>::difference_type
    distance(_InputIterator __first, _InputIterator __last)
    {

      return std::__distance(__first, __last,
        std::__iterator_category(__first));
    }

  template<typename _InputIterator, typename _Distance>
    inline void
    __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
    {


                                ;
      while (__n--)
 ++__i;
    }

  template<typename _BidirectionalIterator, typename _Distance>
    inline void
    __advance(_BidirectionalIterator& __i, _Distance __n,
       bidirectional_iterator_tag)
    {



      if (__n > 0)
        while (__n--)
   ++__i;
      else
        while (__n++)
   --__i;
    }

  template<typename _RandomAccessIterator, typename _Distance>
    inline void
    __advance(_RandomAccessIterator& __i, _Distance __n,
              random_access_iterator_tag)
    {



      __i += __n;
    }
# 192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator_base_funcs.h" 3
  template<typename _InputIterator, typename _Distance>
    inline void
    advance(_InputIterator& __i, _Distance __n)
    {

      typename iterator_traits<_InputIterator>::difference_type __d = __n;
      std::__advance(__i, __d, std::__iterator_category(__i));
    }



  template<typename _ForwardIterator>
    inline _ForwardIterator
    next(_ForwardIterator __x, typename
  iterator_traits<_ForwardIterator>::difference_type __n = 1)
    {



      std::advance(__x, __n);
      return __x;
    }

  template<typename _BidirectionalIterator>
    inline _BidirectionalIterator
    prev(_BidirectionalIterator __x, typename
  iterator_traits<_BidirectionalIterator>::difference_type __n = 1)
    {



      std::advance(__x, -__n);
      return __x;
    }




}
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 1 3
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ptr_traits.h" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ptr_traits.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  class __undefined;


  template<typename _Tp>
    struct __get_first_arg
    { using type = __undefined; };

  template<template<typename, typename...> class _Template, typename _Tp,
           typename... _Types>
    struct __get_first_arg<_Template<_Tp, _Types...>>
    { using type = _Tp; };

  template<typename _Tp>
    using __get_first_arg_t = typename __get_first_arg<_Tp>::type;


  template<typename _Tp, typename _Up>
    struct __replace_first_arg
    { using type = __undefined; };

  template<template<typename, typename...> class _Template, typename _Up,
           typename _Tp, typename... _Types>
    struct __replace_first_arg<_Template<_Tp, _Types...>, _Up>
    { using type = _Template<_Up, _Types...>; };

  template<typename _Tp, typename _Up>
    using __replace_first_arg_t = typename __replace_first_arg<_Tp, _Up>::type;

  template<typename _Tp>
    using __make_not_void
      = typename conditional<is_void<_Tp>::value, __undefined, _Tp>::type;





  template<typename _Ptr>
    struct pointer_traits
    {
    private:
      template<typename _Tp>
 using __element_type = typename _Tp::element_type;

      template<typename _Tp>
 using __difference_type = typename _Tp::difference_type;

      template<typename _Tp, typename _Up>
 using __rebind = typename _Tp::template rebind<_Up>;

    public:

      using pointer = _Ptr;


      using element_type
 = __detected_or_t_<__get_first_arg_t, __element_type, _Ptr>;


      using difference_type
 = __detected_or_t<ptrdiff_t, __difference_type, _Ptr>;


      template<typename _Up>
        using rebind
   = __detected_or_t_<__replace_first_arg_t, __rebind, _Ptr, _Up>;

      static _Ptr
      pointer_to(__make_not_void<element_type>& __e)
      { return _Ptr::pointer_to(__e); }

      static_assert(!is_same<element_type, __undefined>::value,
   "pointer type defines element_type or is like SomePointer<T, Args>");
      static_assert(!is_same<rebind<element_type>, __undefined>::value,
   "pointer type defines rebind<U> or is like SomePointer<T, Args>");
    };





  template<typename _Tp>
    struct pointer_traits<_Tp*>
    {

      typedef _Tp* pointer;

      typedef _Tp element_type;

      typedef ptrdiff_t difference_type;

      template<typename _Up>
        using rebind = _Up*;






      static pointer
      pointer_to(__make_not_void<element_type>& __r) noexcept
      { return std::addressof(__r); }
    };


  template<typename _Ptr, typename _Tp>
    using __ptr_rebind = typename pointer_traits<_Ptr>::template rebind<_Tp>;


}
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 96 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Iterator>
    class reverse_iterator
    : public iterator<typename iterator_traits<_Iterator>::iterator_category,
        typename iterator_traits<_Iterator>::value_type,
        typename iterator_traits<_Iterator>::difference_type,
        typename iterator_traits<_Iterator>::pointer,
                      typename iterator_traits<_Iterator>::reference>
    {
    protected:
      _Iterator current;

      typedef iterator_traits<_Iterator> __traits_type;

    public:
      typedef _Iterator iterator_type;
      typedef typename __traits_type::difference_type difference_type;
      typedef typename __traits_type::pointer pointer;
      typedef typename __traits_type::reference reference;







      reverse_iterator() : current() { }




      explicit
      reverse_iterator(iterator_type __x) : current(__x) { }




      reverse_iterator(const reverse_iterator& __x)
      : current(__x.current) { }





      template<typename _Iter>
        reverse_iterator(const reverse_iterator<_Iter>& __x)
 : current(__x.base()) { }




      iterator_type
      base() const
      { return current; }
# 160 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
      reference
      operator*() const
      {
 _Iterator __tmp = current;
 return *--__tmp;
      }






      pointer
      operator->() const
      { return &(operator*()); }






      reverse_iterator&
      operator++()
      {
 --current;
 return *this;
      }






      reverse_iterator
      operator++(int)
      {
 reverse_iterator __tmp = *this;
 --current;
 return __tmp;
      }






      reverse_iterator&
      operator--()
      {
 ++current;
 return *this;
      }






      reverse_iterator
      operator--(int)
      {
 reverse_iterator __tmp = *this;
 ++current;
 return __tmp;
      }






      reverse_iterator
      operator+(difference_type __n) const
      { return reverse_iterator(current - __n); }







      reverse_iterator&
      operator+=(difference_type __n)
      {
 current -= __n;
 return *this;
      }






      reverse_iterator
      operator-(difference_type __n) const
      { return reverse_iterator(current + __n); }







      reverse_iterator&
      operator-=(difference_type __n)
      {
 current += __n;
 return *this;
      }






      reference
      operator[](difference_type __n) const
      { return *(*this + __n); }
    };
# 290 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Iterator>
    inline bool
    operator==(const reverse_iterator<_Iterator>& __x,
        const reverse_iterator<_Iterator>& __y)
    { return __x.base() == __y.base(); }

  template<typename _Iterator>
    inline bool
    operator<(const reverse_iterator<_Iterator>& __x,
       const reverse_iterator<_Iterator>& __y)
    { return __y.base() < __x.base(); }

  template<typename _Iterator>
    inline bool
    operator!=(const reverse_iterator<_Iterator>& __x,
        const reverse_iterator<_Iterator>& __y)
    { return !(__x == __y); }

  template<typename _Iterator>
    inline bool
    operator>(const reverse_iterator<_Iterator>& __x,
       const reverse_iterator<_Iterator>& __y)
    { return __y < __x; }

  template<typename _Iterator>
    inline bool
    operator<=(const reverse_iterator<_Iterator>& __x,
        const reverse_iterator<_Iterator>& __y)
    { return !(__y < __x); }

  template<typename _Iterator>
    inline bool
    operator>=(const reverse_iterator<_Iterator>& __x,
        const reverse_iterator<_Iterator>& __y)
    { return !(__x < __y); }

  template<typename _Iterator>





    inline auto
    operator-(const reverse_iterator<_Iterator>& __x,
       const reverse_iterator<_Iterator>& __y)
    -> decltype(__x.base() - __y.base())

    { return __y.base() - __x.base(); }

  template<typename _Iterator>
    inline reverse_iterator<_Iterator>
    operator+(typename reverse_iterator<_Iterator>::difference_type __n,
       const reverse_iterator<_Iterator>& __x)
    { return reverse_iterator<_Iterator>(__x.base() - __n); }



  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator==(const reverse_iterator<_IteratorL>& __x,
        const reverse_iterator<_IteratorR>& __y)
    { return __x.base() == __y.base(); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator<(const reverse_iterator<_IteratorL>& __x,
       const reverse_iterator<_IteratorR>& __y)
    { return __y.base() < __x.base(); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator!=(const reverse_iterator<_IteratorL>& __x,
        const reverse_iterator<_IteratorR>& __y)
    { return !(__x == __y); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator>(const reverse_iterator<_IteratorL>& __x,
       const reverse_iterator<_IteratorR>& __y)
    { return __y < __x; }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator<=(const reverse_iterator<_IteratorL>& __x,
        const reverse_iterator<_IteratorR>& __y)
    { return !(__y < __x); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator>=(const reverse_iterator<_IteratorL>& __x,
        const reverse_iterator<_IteratorR>& __y)
    { return !(__x < __y); }

  template<typename _IteratorL, typename _IteratorR>


    inline auto
    operator-(const reverse_iterator<_IteratorL>& __x,
       const reverse_iterator<_IteratorR>& __y)
    -> decltype(__y.base() - __x.base())





    { return __y.base() - __x.base(); }




  template<typename _Iterator>
    inline reverse_iterator<_Iterator>
    __make_reverse_iterator(_Iterator __i)
    { return reverse_iterator<_Iterator>(__i); }







  template<typename _Iterator>
    inline reverse_iterator<_Iterator>
    make_reverse_iterator(_Iterator __i)
    { return reverse_iterator<_Iterator>(__i); }




  template<typename _Iterator>
    auto
    __niter_base(reverse_iterator<_Iterator> __it)
    -> decltype(__make_reverse_iterator(__niter_base(__it.base())))
    { return __make_reverse_iterator(__niter_base(__it.base())); }

  template<typename _Iterator>
    struct __is_move_iterator<reverse_iterator<_Iterator> >
      : __is_move_iterator<_Iterator>
    { };

  template<typename _Iterator>
    auto
    __miter_base(reverse_iterator<_Iterator> __it)
    -> decltype(__make_reverse_iterator(__miter_base(__it.base())))
    { return __make_reverse_iterator(__miter_base(__it.base())); }
# 448 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Container>
    class back_insert_iterator
    : public iterator<output_iterator_tag, void, void, void, void>
    {
    protected:
      _Container* container;

    public:

      typedef _Container container_type;


      explicit
      back_insert_iterator(_Container& __x)
      : container(std::__addressof(__x)) { }
# 483 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
      back_insert_iterator&
      operator=(const typename _Container::value_type& __value)
      {
 container->push_back(__value);
 return *this;
      }

      back_insert_iterator&
      operator=(typename _Container::value_type&& __value)
      {
 container->push_back(std::move(__value));
 return *this;
      }



      back_insert_iterator&
      operator*()
      { return *this; }


      back_insert_iterator&
      operator++()
      { return *this; }


      back_insert_iterator
      operator++(int)
      { return *this; }
    };
# 525 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Container>
    inline back_insert_iterator<_Container>
    back_inserter(_Container& __x)
    { return back_insert_iterator<_Container>(__x); }
# 540 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Container>
    class front_insert_iterator
    : public iterator<output_iterator_tag, void, void, void, void>
    {
    protected:
      _Container* container;

    public:

      typedef _Container container_type;


      explicit front_insert_iterator(_Container& __x)
      : container(std::__addressof(__x)) { }
# 574 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
      front_insert_iterator&
      operator=(const typename _Container::value_type& __value)
      {
 container->push_front(__value);
 return *this;
      }

      front_insert_iterator&
      operator=(typename _Container::value_type&& __value)
      {
 container->push_front(std::move(__value));
 return *this;
      }



      front_insert_iterator&
      operator*()
      { return *this; }


      front_insert_iterator&
      operator++()
      { return *this; }


      front_insert_iterator
      operator++(int)
      { return *this; }
    };
# 616 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Container>
    inline front_insert_iterator<_Container>
    front_inserter(_Container& __x)
    { return front_insert_iterator<_Container>(__x); }
# 635 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Container>
    class insert_iterator
    : public iterator<output_iterator_tag, void, void, void, void>
    {
    protected:
      _Container* container;
      typename _Container::iterator iter;

    public:

      typedef _Container container_type;





      insert_iterator(_Container& __x, typename _Container::iterator __i)
      : container(std::__addressof(__x)), iter(__i) {}
# 686 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
      insert_iterator&
      operator=(const typename _Container::value_type& __value)
      {
 iter = container->insert(iter, __value);
 ++iter;
 return *this;
      }

      insert_iterator&
      operator=(typename _Container::value_type&& __value)
      {
 iter = container->insert(iter, std::move(__value));
 ++iter;
 return *this;
      }



      insert_iterator&
      operator*()
      { return *this; }


      insert_iterator&
      operator++()
      { return *this; }


      insert_iterator&
      operator++(int)
      { return *this; }
    };
# 730 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Container, typename _Iterator>
    inline insert_iterator<_Container>
    inserter(_Container& __x, _Iterator __i)
    {
      return insert_iterator<_Container>(__x,
      typename _Container::iterator(__i));
    }




}

namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{
# 754 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  using std::iterator_traits;
  using std::iterator;
  template<typename _Iterator, typename _Container>
    class __normal_iterator
    {
    protected:
      _Iterator _M_current;

      typedef iterator_traits<_Iterator> __traits_type;

    public:
      typedef _Iterator iterator_type;
      typedef typename __traits_type::iterator_category iterator_category;
      typedef typename __traits_type::value_type value_type;
      typedef typename __traits_type::difference_type difference_type;
      typedef typename __traits_type::reference reference;
      typedef typename __traits_type::pointer pointer;

      constexpr __normal_iterator() noexcept
      : _M_current(_Iterator()) { }

      explicit
      __normal_iterator(const _Iterator& __i) noexcept
      : _M_current(__i) { }


      template<typename _Iter>
        __normal_iterator(const __normal_iterator<_Iter,
     typename __enable_if<
              (std::__are_same<_Iter, typename _Container::pointer>::__value),
        _Container>::__type>& __i) noexcept
        : _M_current(__i.base()) { }


      reference
      operator*() const noexcept
      { return *_M_current; }

      pointer
      operator->() const noexcept
      { return _M_current; }

      __normal_iterator&
      operator++() noexcept
      {
 ++_M_current;
 return *this;
      }

      __normal_iterator
      operator++(int) noexcept
      { return __normal_iterator(_M_current++); }


      __normal_iterator&
      operator--() noexcept
      {
 --_M_current;
 return *this;
      }

      __normal_iterator
      operator--(int) noexcept
      { return __normal_iterator(_M_current--); }


      reference
      operator[](difference_type __n) const noexcept
      { return _M_current[__n]; }

      __normal_iterator&
      operator+=(difference_type __n) noexcept
      { _M_current += __n; return *this; }

      __normal_iterator
      operator+(difference_type __n) const noexcept
      { return __normal_iterator(_M_current + __n); }

      __normal_iterator&
      operator-=(difference_type __n) noexcept
      { _M_current -= __n; return *this; }

      __normal_iterator
      operator-(difference_type __n) const noexcept
      { return __normal_iterator(_M_current - __n); }

      const _Iterator&
      base() const noexcept
      { return _M_current; }
    };
# 854 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _IteratorL, typename _IteratorR, typename _Container>
    inline bool
    operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
        const __normal_iterator<_IteratorR, _Container>& __rhs)
    noexcept
    { return __lhs.base() == __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline bool
    operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
        const __normal_iterator<_Iterator, _Container>& __rhs)
    noexcept
    { return __lhs.base() == __rhs.base(); }

  template<typename _IteratorL, typename _IteratorR, typename _Container>
    inline bool
    operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
        const __normal_iterator<_IteratorR, _Container>& __rhs)
    noexcept
    { return __lhs.base() != __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline bool
    operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
        const __normal_iterator<_Iterator, _Container>& __rhs)
    noexcept
    { return __lhs.base() != __rhs.base(); }


  template<typename _IteratorL, typename _IteratorR, typename _Container>
    inline bool
    operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
       const __normal_iterator<_IteratorR, _Container>& __rhs)
    noexcept
    { return __lhs.base() < __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline bool
    operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
       const __normal_iterator<_Iterator, _Container>& __rhs)
    noexcept
    { return __lhs.base() < __rhs.base(); }

  template<typename _IteratorL, typename _IteratorR, typename _Container>
    inline bool
    operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
       const __normal_iterator<_IteratorR, _Container>& __rhs)
    noexcept
    { return __lhs.base() > __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline bool
    operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
       const __normal_iterator<_Iterator, _Container>& __rhs)
    noexcept
    { return __lhs.base() > __rhs.base(); }

  template<typename _IteratorL, typename _IteratorR, typename _Container>
    inline bool
    operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
        const __normal_iterator<_IteratorR, _Container>& __rhs)
    noexcept
    { return __lhs.base() <= __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline bool
    operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
        const __normal_iterator<_Iterator, _Container>& __rhs)
    noexcept
    { return __lhs.base() <= __rhs.base(); }

  template<typename _IteratorL, typename _IteratorR, typename _Container>
    inline bool
    operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
        const __normal_iterator<_IteratorR, _Container>& __rhs)
    noexcept
    { return __lhs.base() >= __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline bool
    operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
        const __normal_iterator<_Iterator, _Container>& __rhs)
    noexcept
    { return __lhs.base() >= __rhs.base(); }





  template<typename _IteratorL, typename _IteratorR, typename _Container>


    inline auto
    operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
       const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
    -> decltype(__lhs.base() - __rhs.base())





    { return __lhs.base() - __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline typename __normal_iterator<_Iterator, _Container>::difference_type
    operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
       const __normal_iterator<_Iterator, _Container>& __rhs)
    noexcept
    { return __lhs.base() - __rhs.base(); }

  template<typename _Iterator, typename _Container>
    inline __normal_iterator<_Iterator, _Container>
    operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
       __n, const __normal_iterator<_Iterator, _Container>& __i)
    noexcept
    { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }


}

namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _Iterator, typename _Container>
    _Iterator
    __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
    { return __it.base(); }


}



namespace std __attribute__ ((__visibility__ ("default")))
{
# 1006 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_iterator.h" 3
  template<typename _Iterator>
    class move_iterator
    {
    protected:
      _Iterator _M_current;

      typedef iterator_traits<_Iterator> __traits_type;
      typedef typename __traits_type::reference __base_ref;

    public:
      typedef _Iterator iterator_type;
      typedef typename __traits_type::iterator_category iterator_category;
      typedef typename __traits_type::value_type value_type;
      typedef typename __traits_type::difference_type difference_type;

      typedef _Iterator pointer;


      typedef typename conditional<is_reference<__base_ref>::value,
    typename remove_reference<__base_ref>::type&&,
    __base_ref>::type reference;

      move_iterator()
      : _M_current() { }

      explicit
      move_iterator(iterator_type __i)
      : _M_current(__i) { }

      template<typename _Iter>
 move_iterator(const move_iterator<_Iter>& __i)
 : _M_current(__i.base()) { }

      iterator_type
      base() const
      { return _M_current; }

      reference
      operator*() const
      { return static_cast<reference>(*_M_current); }

      pointer
      operator->() const
      { return _M_current; }

      move_iterator&
      operator++()
      {
 ++_M_current;
 return *this;
      }

      move_iterator
      operator++(int)
      {
 move_iterator __tmp = *this;
 ++_M_current;
 return __tmp;
      }

      move_iterator&
      operator--()
      {
 --_M_current;
 return *this;
      }

      move_iterator
      operator--(int)
      {
 move_iterator __tmp = *this;
 --_M_current;
 return __tmp;
      }

      move_iterator
      operator+(difference_type __n) const
      { return move_iterator(_M_current + __n); }

      move_iterator&
      operator+=(difference_type __n)
      {
 _M_current += __n;
 return *this;
      }

      move_iterator
      operator-(difference_type __n) const
      { return move_iterator(_M_current - __n); }

      move_iterator&
      operator-=(difference_type __n)
      {
 _M_current -= __n;
 return *this;
      }

      reference
      operator[](difference_type __n) const
      { return std::move(_M_current[__n]); }
    };




  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator==(const move_iterator<_IteratorL>& __x,
        const move_iterator<_IteratorR>& __y)
    { return __x.base() == __y.base(); }

  template<typename _Iterator>
    inline bool
    operator==(const move_iterator<_Iterator>& __x,
        const move_iterator<_Iterator>& __y)
    { return __x.base() == __y.base(); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator!=(const move_iterator<_IteratorL>& __x,
        const move_iterator<_IteratorR>& __y)
    { return !(__x == __y); }

  template<typename _Iterator>
    inline bool
    operator!=(const move_iterator<_Iterator>& __x,
        const move_iterator<_Iterator>& __y)
    { return !(__x == __y); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator<(const move_iterator<_IteratorL>& __x,
       const move_iterator<_IteratorR>& __y)
    { return __x.base() < __y.base(); }

  template<typename _Iterator>
    inline bool
    operator<(const move_iterator<_Iterator>& __x,
       const move_iterator<_Iterator>& __y)
    { return __x.base() < __y.base(); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator<=(const move_iterator<_IteratorL>& __x,
        const move_iterator<_IteratorR>& __y)
    { return !(__y < __x); }

  template<typename _Iterator>
    inline bool
    operator<=(const move_iterator<_Iterator>& __x,
        const move_iterator<_Iterator>& __y)
    { return !(__y < __x); }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator>(const move_iterator<_IteratorL>& __x,
       const move_iterator<_IteratorR>& __y)
    { return __y < __x; }

  template<typename _Iterator>
    inline bool
    operator>(const move_iterator<_Iterator>& __x,
       const move_iterator<_Iterator>& __y)
    { return __y < __x; }

  template<typename _IteratorL, typename _IteratorR>
    inline bool
    operator>=(const move_iterator<_IteratorL>& __x,
        const move_iterator<_IteratorR>& __y)
    { return !(__x < __y); }

  template<typename _Iterator>
    inline bool
    operator>=(const move_iterator<_Iterator>& __x,
        const move_iterator<_Iterator>& __y)
    { return !(__x < __y); }


  template<typename _IteratorL, typename _IteratorR>
    inline auto
    operator-(const move_iterator<_IteratorL>& __x,
       const move_iterator<_IteratorR>& __y)
    -> decltype(__x.base() - __y.base())
    { return __x.base() - __y.base(); }

  template<typename _Iterator>
    inline auto
    operator-(const move_iterator<_Iterator>& __x,
       const move_iterator<_Iterator>& __y)
    -> decltype(__x.base() - __y.base())
    { return __x.base() - __y.base(); }

  template<typename _Iterator>
    inline move_iterator<_Iterator>
    operator+(typename move_iterator<_Iterator>::difference_type __n,
       const move_iterator<_Iterator>& __x)
    { return __x + __n; }

  template<typename _Iterator>
    inline move_iterator<_Iterator>
    make_move_iterator(_Iterator __i)
    { return move_iterator<_Iterator>(__i); }

  template<typename _Iterator, typename _ReturnType
    = typename conditional<__move_if_noexcept_cond
      <typename iterator_traits<_Iterator>::value_type>::value,
                _Iterator, move_iterator<_Iterator>>::type>
    inline _ReturnType
    __make_move_if_noexcept_iterator(_Iterator __i)
    { return _ReturnType(__i); }



  template<typename _Tp, typename _ReturnType
    = typename conditional<__move_if_noexcept_cond<_Tp>::value,
      const _Tp*, move_iterator<_Tp*>>::type>
    inline _ReturnType
    __make_move_if_noexcept_iterator(_Tp* __i)
    { return _ReturnType(__i); }



  template<typename _Iterator>
    auto
    __niter_base(move_iterator<_Iterator> __it)
    -> decltype(make_move_iterator(__niter_base(__it.base())))
    { return make_move_iterator(__niter_base(__it.base())); }

  template<typename _Iterator>
    struct __is_move_iterator<move_iterator<_Iterator> >
    {
      enum { __value = 1 };
      typedef __true_type __type;
    };

  template<typename _Iterator>
    auto
    __miter_base(move_iterator<_Iterator> __it)
    -> decltype(__miter_base(__it.base()))
    { return __miter_base(__it.base()); }


}
# 68 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/debug/debug.h" 1 3
# 48 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/debug/debug.h" 3
namespace std
{
  namespace __debug { }
}




namespace __gnu_debug
{
  using namespace std::__debug;
}
# 70 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/predefined_ops.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/predefined_ops.h" 3
namespace __gnu_cxx
{
namespace __ops
{
  struct _Iter_less_iter
  {
    template<typename _Iterator1, typename _Iterator2>
      constexpr
      bool
      operator()(_Iterator1 __it1, _Iterator2 __it2) const
      { return *__it1 < *__it2; }
  };
  constexpr
  inline _Iter_less_iter
  __iter_less_iter()
  { return _Iter_less_iter(); }

  struct _Iter_less_val
  {
    template<typename _Iterator, typename _Value>
      bool
      operator()(_Iterator __it, _Value& __val) const
      { return *__it < __val; }
    };

  inline _Iter_less_val
  __iter_less_val()
  { return _Iter_less_val(); }

  inline _Iter_less_val
  __iter_comp_val(_Iter_less_iter)
  { return _Iter_less_val(); }

  struct _Val_less_iter
  {
    template<typename _Value, typename _Iterator>
      bool
      operator()(_Value& __val, _Iterator __it) const
      { return __val < *__it; }
    };

  inline _Val_less_iter
  __val_less_iter()
  { return _Val_less_iter(); }

  inline _Val_less_iter
  __val_comp_iter(_Iter_less_iter)
  { return _Val_less_iter(); }

  struct _Iter_equal_to_iter
  {
    template<typename _Iterator1, typename _Iterator2>
      bool
      operator()(_Iterator1 __it1, _Iterator2 __it2) const
      { return *__it1 == *__it2; }
    };

  inline _Iter_equal_to_iter
  __iter_equal_to_iter()
  { return _Iter_equal_to_iter(); }

  struct _Iter_equal_to_val
  {
    template<typename _Iterator, typename _Value>
      bool
      operator()(_Iterator __it, _Value& __val) const
      { return *__it == __val; }
    };

  inline _Iter_equal_to_val
  __iter_equal_to_val()
  { return _Iter_equal_to_val(); }

  inline _Iter_equal_to_val
  __iter_comp_val(_Iter_equal_to_iter)
  { return _Iter_equal_to_val(); }

  template<typename _Compare>
    struct _Iter_comp_iter
    {
      _Compare _M_comp;
      constexpr
      _Iter_comp_iter(_Compare __comp)
 : _M_comp(__comp)
      { }

      template<typename _Iterator1, typename _Iterator2>
        constexpr
        bool
        operator()(_Iterator1 __it1, _Iterator2 __it2)
        { return bool(_M_comp(*__it1, *__it2)); }
    };

  template<typename _Compare>
    constexpr
    inline _Iter_comp_iter<_Compare>
    __iter_comp_iter(_Compare __comp)
    { return _Iter_comp_iter<_Compare>(__comp); }

  template<typename _Compare>
    struct _Iter_comp_val
    {
      _Compare _M_comp;

      _Iter_comp_val(_Compare __comp)
 : _M_comp(__comp)
      { }

      template<typename _Iterator, typename _Value>
 bool
 operator()(_Iterator __it, _Value& __val)
 { return bool(_M_comp(*__it, __val)); }
    };

  template<typename _Compare>
   inline _Iter_comp_val<_Compare>
    __iter_comp_val(_Compare __comp)
    { return _Iter_comp_val<_Compare>(__comp); }

  template<typename _Compare>
    inline _Iter_comp_val<_Compare>
    __iter_comp_val(_Iter_comp_iter<_Compare> __comp)
    { return _Iter_comp_val<_Compare>(__comp._M_comp); }

  template<typename _Compare>
    struct _Val_comp_iter
    {
      _Compare _M_comp;

      _Val_comp_iter(_Compare __comp)
 : _M_comp(__comp)
      { }

      template<typename _Value, typename _Iterator>
 bool
 operator()(_Value& __val, _Iterator __it)
 { return bool(_M_comp(__val, *__it)); }
    };

  template<typename _Compare>
    inline _Val_comp_iter<_Compare>
    __val_comp_iter(_Compare __comp)
    { return _Val_comp_iter<_Compare>(__comp); }

  template<typename _Compare>
    inline _Val_comp_iter<_Compare>
    __val_comp_iter(_Iter_comp_iter<_Compare> __comp)
    { return _Val_comp_iter<_Compare>(__comp._M_comp); }

  template<typename _Value>
    struct _Iter_equals_val
    {
      _Value& _M_value;

      _Iter_equals_val(_Value& __value)
 : _M_value(__value)
      { }

      template<typename _Iterator>
 bool
 operator()(_Iterator __it)
 { return *__it == _M_value; }
    };

  template<typename _Value>
    inline _Iter_equals_val<_Value>
    __iter_equals_val(_Value& __val)
    { return _Iter_equals_val<_Value>(__val); }

  template<typename _Iterator1>
    struct _Iter_equals_iter
    {
      typename std::iterator_traits<_Iterator1>::reference _M_ref;

      _Iter_equals_iter(_Iterator1 __it1)
 : _M_ref(*__it1)
      { }

      template<typename _Iterator2>
 bool
 operator()(_Iterator2 __it2)
 { return *__it2 == _M_ref; }
    };

  template<typename _Iterator>
    inline _Iter_equals_iter<_Iterator>
    __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it)
    { return _Iter_equals_iter<_Iterator>(__it); }

  template<typename _Predicate>
    struct _Iter_pred
    {
      _Predicate _M_pred;

      _Iter_pred(_Predicate __pred)
 : _M_pred(__pred)
      { }

      template<typename _Iterator>
 bool
 operator()(_Iterator __it)
 { return bool(_M_pred(*__it)); }
    };

  template<typename _Predicate>
    inline _Iter_pred<_Predicate>
    __pred_iter(_Predicate __pred)
    { return _Iter_pred<_Predicate>(__pred); }

  template<typename _Compare, typename _Value>
    struct _Iter_comp_to_val
    {
      _Compare _M_comp;
      _Value& _M_value;

      _Iter_comp_to_val(_Compare __comp, _Value& __value)
 : _M_comp(__comp), _M_value(__value)
      { }

      template<typename _Iterator>
 bool
 operator()(_Iterator __it)
 { return bool(_M_comp(*__it, _M_value)); }
    };

  template<typename _Compare, typename _Value>
    _Iter_comp_to_val<_Compare, _Value>
    __iter_comp_val(_Compare __comp, _Value &__val)
    { return _Iter_comp_to_val<_Compare, _Value>(__comp, __val); }

  template<typename _Compare, typename _Iterator1>
    struct _Iter_comp_to_iter
    {
      _Compare _M_comp;
      typename std::iterator_traits<_Iterator1>::reference _M_ref;

      _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)
 : _M_comp(__comp), _M_ref(*__it1)
      { }

      template<typename _Iterator2>
 bool
 operator()(_Iterator2 __it2)
 { return bool(_M_comp(*__it2, _M_ref)); }
    };

  template<typename _Compare, typename _Iterator>
    inline _Iter_comp_to_iter<_Compare, _Iterator>
    __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it)
    { return _Iter_comp_to_iter<_Compare, _Iterator>(__comp._M_comp, __it); }

  template<typename _Predicate>
    struct _Iter_negate
    {
      _Predicate _M_pred;

      _Iter_negate(_Predicate __pred)
 : _M_pred(__pred)
      { }

      template<typename _Iterator>
 bool
 operator()(_Iterator __it)
 { return !bool(_M_pred(*__it)); }
    };

  template<typename _Predicate>
    inline _Iter_negate<_Predicate>
    __negate(_Iter_pred<_Predicate> __pred)
    { return _Iter_negate<_Predicate>(__pred._M_pred); }

}
}
# 72 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 118 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2>
    inline void
    iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
    {
# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
      swap(*__a, *__b);

    }
# 164 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2>
    _ForwardIterator2
    swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
  _ForwardIterator2 __first2)
    {





                                                       ;

      for (; __first1 != __last1; ++__first1, (void)++__first2)
 std::iter_swap(__first1, __first2);
      return __first2;
    }
# 192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _Tp>
    constexpr
    inline const _Tp&
    min(const _Tp& __a, const _Tp& __b)
    {



      if (__b < __a)
 return __b;
      return __a;
    }
# 216 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _Tp>
    constexpr
    inline const _Tp&
    max(const _Tp& __a, const _Tp& __b)
    {



      if (__a < __b)
 return __b;
      return __a;
    }
# 240 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _Tp, typename _Compare>
    constexpr
    inline const _Tp&
    min(const _Tp& __a, const _Tp& __b, _Compare __comp)
    {

      if (__comp(__b, __a))
 return __b;
      return __a;
    }
# 262 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _Tp, typename _Compare>
    constexpr
    inline const _Tp&
    max(const _Tp& __a, const _Tp& __b, _Compare __comp)
    {

      if (__comp(__a, __b))
 return __b;
      return __a;
    }



  template<typename _Iterator>
    inline _Iterator
    __niter_base(_Iterator __it)
    { return __it; }







  template<bool, bool, typename>
    struct __copy_move
    {
      template<typename _II, typename _OI>
        static _OI
        __copy_m(_II __first, _II __last, _OI __result)
        {
   for (; __first != __last; ++__result, (void)++__first)
     *__result = *__first;
   return __result;
 }
    };


  template<typename _Category>
    struct __copy_move<true, false, _Category>
    {
      template<typename _II, typename _OI>
        static _OI
        __copy_m(_II __first, _II __last, _OI __result)
        {
   for (; __first != __last; ++__result, (void)++__first)
     *__result = std::move(*__first);
   return __result;
 }
    };


  template<>
    struct __copy_move<false, false, random_access_iterator_tag>
    {
      template<typename _II, typename _OI>
        static _OI
        __copy_m(_II __first, _II __last, _OI __result)
        {
   typedef typename iterator_traits<_II>::difference_type _Distance;
   for(_Distance __n = __last - __first; __n > 0; --__n)
     {
       *__result = *__first;
       ++__first;
       ++__result;
     }
   return __result;
 }
    };


  template<>
    struct __copy_move<true, false, random_access_iterator_tag>
    {
      template<typename _II, typename _OI>
        static _OI
        __copy_m(_II __first, _II __last, _OI __result)
        {
   typedef typename iterator_traits<_II>::difference_type _Distance;
   for(_Distance __n = __last - __first; __n > 0; --__n)
     {
       *__result = std::move(*__first);
       ++__first;
       ++__result;
     }
   return __result;
 }
    };


  template<bool _IsMove>
    struct __copy_move<_IsMove, true, random_access_iterator_tag>
    {
      template<typename _Tp>
        static _Tp*
        __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
        {

   using __assignable = conditional<_IsMove,
        is_move_assignable<_Tp>,
        is_copy_assignable<_Tp>>;

   static_assert( __assignable::type::value, "type is not assignable" );

   const ptrdiff_t _Num = __last - __first;
   if (_Num)
     __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
   return __result + _Num;
 }
    };

  template<bool _IsMove, typename _II, typename _OI>
    inline _OI
    __copy_move_a(_II __first, _II __last, _OI __result)
    {
      typedef typename iterator_traits<_II>::value_type _ValueTypeI;
      typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
      typedef typename iterator_traits<_II>::iterator_category _Category;
      const bool __simple = (__is_trivial(_ValueTypeI)
                      && __is_pointer<_II>::__value
                      && __is_pointer<_OI>::__value
        && __are_same<_ValueTypeI, _ValueTypeO>::__value);

      return std::__copy_move<_IsMove, __simple,
                       _Category>::__copy_m(__first, __last, __result);
    }



  template<typename _CharT>
    struct char_traits;

  template<typename _CharT, typename _Traits>
    class istreambuf_iterator;

  template<typename _CharT, typename _Traits>
    class ostreambuf_iterator;

  template<bool _IsMove, typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
      ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
    __copy_move_a2(_CharT*, _CharT*,
     ostreambuf_iterator<_CharT, char_traits<_CharT> >);

  template<bool _IsMove, typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
      ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
    __copy_move_a2(const _CharT*, const _CharT*,
     ostreambuf_iterator<_CharT, char_traits<_CharT> >);

  template<bool _IsMove, typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
        _CharT*>::__type
    __copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >,
     istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*);

  template<bool _IsMove, typename _II, typename _OI>
    inline _OI
    __copy_move_a2(_II __first, _II __last, _OI __result)
    {
      return _OI(std::__copy_move_a<_IsMove>(std::__niter_base(__first),
          std::__niter_base(__last),
          std::__niter_base(__result)));
    }
# 444 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _II, typename _OI>
    inline _OI
    copy(_II __first, _II __last, _OI __result)
    {




                                                     ;

      return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
       (std::__miter_base(__first), std::__miter_base(__last),
        __result));
    }
# 477 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _II, typename _OI>
    inline _OI
    move(_II __first, _II __last, _OI __result)
    {




                                                     ;

      return std::__copy_move_a2<true>(std::__miter_base(__first),
           std::__miter_base(__last), __result);
    }






  template<bool, bool, typename>
    struct __copy_move_backward
    {
      template<typename _BI1, typename _BI2>
        static _BI2
        __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
        {
   while (__first != __last)
     *--__result = *--__last;
   return __result;
 }
    };


  template<typename _Category>
    struct __copy_move_backward<true, false, _Category>
    {
      template<typename _BI1, typename _BI2>
        static _BI2
        __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
        {
   while (__first != __last)
     *--__result = std::move(*--__last);
   return __result;
 }
    };


  template<>
    struct __copy_move_backward<false, false, random_access_iterator_tag>
    {
      template<typename _BI1, typename _BI2>
        static _BI2
        __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
        {
   typename iterator_traits<_BI1>::difference_type __n;
   for (__n = __last - __first; __n > 0; --__n)
     *--__result = *--__last;
   return __result;
 }
    };


  template<>
    struct __copy_move_backward<true, false, random_access_iterator_tag>
    {
      template<typename _BI1, typename _BI2>
        static _BI2
        __copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
        {
   typename iterator_traits<_BI1>::difference_type __n;
   for (__n = __last - __first; __n > 0; --__n)
     *--__result = std::move(*--__last);
   return __result;
 }
    };


  template<bool _IsMove>
    struct __copy_move_backward<_IsMove, true, random_access_iterator_tag>
    {
      template<typename _Tp>
        static _Tp*
        __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
        {

   using __assignable = conditional<_IsMove,
        is_move_assignable<_Tp>,
        is_copy_assignable<_Tp>>;

   static_assert( __assignable::type::value, "type is not assignable" );

   const ptrdiff_t _Num = __last - __first;
   if (_Num)
     __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
   return __result - _Num;
 }
    };

  template<bool _IsMove, typename _BI1, typename _BI2>
    inline _BI2
    __copy_move_backward_a(_BI1 __first, _BI1 __last, _BI2 __result)
    {
      typedef typename iterator_traits<_BI1>::value_type _ValueType1;
      typedef typename iterator_traits<_BI2>::value_type _ValueType2;
      typedef typename iterator_traits<_BI1>::iterator_category _Category;
      const bool __simple = (__is_trivial(_ValueType1)
                      && __is_pointer<_BI1>::__value
                      && __is_pointer<_BI2>::__value
        && __are_same<_ValueType1, _ValueType2>::__value);

      return std::__copy_move_backward<_IsMove, __simple,
                                _Category>::__copy_move_b(__first,
         __last,
         __result);
    }

  template<bool _IsMove, typename _BI1, typename _BI2>
    inline _BI2
    __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result)
    {
      return _BI2(std::__copy_move_backward_a<_IsMove>
    (std::__niter_base(__first), std::__niter_base(__last),
     std::__niter_base(__result)));
    }
# 620 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _BI1, typename _BI2>
    inline _BI2
    copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
    {






                                                     ;

      return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
       (std::__miter_base(__first), std::__miter_base(__last),
        __result));
    }
# 656 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _BI1, typename _BI2>
    inline _BI2
    move_backward(_BI1 __first, _BI1 __last, _BI2 __result)
    {






                                                     ;

      return std::__copy_move_backward_a2<true>(std::__miter_base(__first),
      std::__miter_base(__last),
      __result);
    }






  template<typename _ForwardIterator, typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, void>::__type
    __fill_a(_ForwardIterator __first, _ForwardIterator __last,
       const _Tp& __value)
    {
      for (; __first != __last; ++__first)
 *__first = __value;
    }

  template<typename _ForwardIterator, typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
    __fill_a(_ForwardIterator __first, _ForwardIterator __last,
      const _Tp& __value)
    {
      const _Tp __tmp = __value;
      for (; __first != __last; ++__first)
 *__first = __tmp;
    }


  template<typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
    __fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
    {
      const _Tp __tmp = __c;
      if (const size_t __len = __last - __first)
 __builtin_memset(__first, static_cast<unsigned char>(__tmp), __len);
    }
# 722 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _ForwardIterator, typename _Tp>
    inline void
    fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
    {



                                                     ;

      std::__fill_a(std::__niter_base(__first), std::__niter_base(__last),
      __value);
    }

  template<typename _OutputIterator, typename _Size, typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
    __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
    {
      for (__decltype(__n + 0) __niter = __n;
    __niter > 0; --__niter, ++__first)
 *__first = __value;
      return __first;
    }

  template<typename _OutputIterator, typename _Size, typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
    __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
    {
      const _Tp __tmp = __value;
      for (__decltype(__n + 0) __niter = __n;
    __niter > 0; --__niter, ++__first)
 *__first = __tmp;
      return __first;
    }

  template<typename _Size, typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, _Tp*>::__type
    __fill_n_a(_Tp* __first, _Size __n, const _Tp& __c)
    {
      std::__fill_a(__first, __first + __n, __c);
      return __first + __n;
    }
# 782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _OI, typename _Size, typename _Tp>
    inline _OI
    fill_n(_OI __first, _Size __n, const _Tp& __value)
    {



      return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value));
    }

  template<bool _BoolType>
    struct __equal
    {
      template<typename _II1, typename _II2>
        static bool
        equal(_II1 __first1, _II1 __last1, _II2 __first2)
        {
   for (; __first1 != __last1; ++__first1, (void)++__first2)
     if (!(*__first1 == *__first2))
       return false;
   return true;
 }
    };

  template<>
    struct __equal<true>
    {
      template<typename _Tp>
        static bool
        equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
        {
   if (const size_t __len = (__last1 - __first1))
     return !__builtin_memcmp(__first1, __first2, sizeof(_Tp) * __len);
   return true;
 }
    };

  template<typename _II1, typename _II2>
    inline bool
    __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2)
    {
      typedef typename iterator_traits<_II1>::value_type _ValueType1;
      typedef typename iterator_traits<_II2>::value_type _ValueType2;
      const bool __simple = ((__is_integer<_ValueType1>::__value
         || __is_pointer<_ValueType1>::__value)
                      && __is_pointer<_II1>::__value
                      && __is_pointer<_II2>::__value
        && __are_same<_ValueType1, _ValueType2>::__value);

      return std::__equal<__simple>::equal(__first1, __last1, __first2);
    }

  template<typename, typename>
    struct __lc_rai
    {
      template<typename _II1, typename _II2>
        static _II1
        __newlast1(_II1, _II1 __last1, _II2, _II2)
        { return __last1; }

      template<typename _II>
        static bool
        __cnd2(_II __first, _II __last)
        { return __first != __last; }
    };

  template<>
    struct __lc_rai<random_access_iterator_tag, random_access_iterator_tag>
    {
      template<typename _RAI1, typename _RAI2>
        static _RAI1
        __newlast1(_RAI1 __first1, _RAI1 __last1,
     _RAI2 __first2, _RAI2 __last2)
        {
   const typename iterator_traits<_RAI1>::difference_type
     __diff1 = __last1 - __first1;
   const typename iterator_traits<_RAI2>::difference_type
     __diff2 = __last2 - __first2;
   return __diff2 < __diff1 ? __first1 + __diff2 : __last1;
 }

      template<typename _RAI>
        static bool
        __cnd2(_RAI, _RAI)
        { return true; }
    };

  template<typename _II1, typename _II2, typename _Compare>
    bool
    __lexicographical_compare_impl(_II1 __first1, _II1 __last1,
       _II2 __first2, _II2 __last2,
       _Compare __comp)
    {
      typedef typename iterator_traits<_II1>::iterator_category _Category1;
      typedef typename iterator_traits<_II2>::iterator_category _Category2;
      typedef std::__lc_rai<_Category1, _Category2> __rai_type;

      __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
      for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
    ++__first1, (void)++__first2)
 {
   if (__comp(__first1, __first2))
     return true;
   if (__comp(__first2, __first1))
     return false;
 }
      return __first1 == __last1 && __first2 != __last2;
    }

  template<bool _BoolType>
    struct __lexicographical_compare
    {
      template<typename _II1, typename _II2>
        static bool __lc(_II1, _II1, _II2, _II2);
    };

  template<bool _BoolType>
    template<typename _II1, typename _II2>
      bool
      __lexicographical_compare<_BoolType>::
      __lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
      {
 return std::__lexicographical_compare_impl(__first1, __last1,
         __first2, __last2,
     __gnu_cxx::__ops::__iter_less_iter());
      }

  template<>
    struct __lexicographical_compare<true>
    {
      template<typename _Tp, typename _Up>
        static bool
        __lc(const _Tp* __first1, const _Tp* __last1,
      const _Up* __first2, const _Up* __last2)
 {
   const size_t __len1 = __last1 - __first1;
   const size_t __len2 = __last2 - __first2;
   if (const size_t __len = std::min(__len1, __len2))
     if (int __result = __builtin_memcmp(__first1, __first2, __len))
       return __result < 0;
   return __len1 < __len2;
 }
    };

  template<typename _II1, typename _II2>
    inline bool
    __lexicographical_compare_aux(_II1 __first1, _II1 __last1,
      _II2 __first2, _II2 __last2)
    {
      typedef typename iterator_traits<_II1>::value_type _ValueType1;
      typedef typename iterator_traits<_II2>::value_type _ValueType2;
      const bool __simple =
 (__is_byte<_ValueType1>::__value && __is_byte<_ValueType2>::__value
  && !__gnu_cxx::__numeric_traits<_ValueType1>::__is_signed
  && !__gnu_cxx::__numeric_traits<_ValueType2>::__is_signed
  && __is_pointer<_II1>::__value
  && __is_pointer<_II2>::__value);

      return std::__lexicographical_compare<__simple>::__lc(__first1, __last1,
           __first2, __last2);
    }

  template<typename _ForwardIterator, typename _Tp, typename _Compare>
    _ForwardIterator
    __lower_bound(_ForwardIterator __first, _ForwardIterator __last,
    const _Tp& __val, _Compare __comp)
    {
      typedef typename iterator_traits<_ForwardIterator>::difference_type
 _DistanceType;

      _DistanceType __len = std::distance(__first, __last);

      while (__len > 0)
 {
   _DistanceType __half = __len >> 1;
   _ForwardIterator __middle = __first;
   std::advance(__middle, __half);
   if (__comp(__middle, __val))
     {
       __first = __middle;
       ++__first;
       __len = __len - __half - 1;
     }
   else
     __len = __half;
 }
      return __first;
    }
# 982 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _ForwardIterator, typename _Tp>
    inline _ForwardIterator
    lower_bound(_ForwardIterator __first, _ForwardIterator __last,
  const _Tp& __val)
    {




                                                                  ;

      return std::__lower_bound(__first, __last, __val,
    __gnu_cxx::__ops::__iter_less_val());
    }



  inline constexpr int
  __lg(int __n)
  { return sizeof(int) * 8 - 1 - __builtin_clz(__n); }

  inline constexpr unsigned
  __lg(unsigned __n)
  { return sizeof(int) * 8 - 1 - __builtin_clz(__n); }

  inline constexpr long
  __lg(long __n)
  { return sizeof(long) * 8 - 1 - __builtin_clzl(__n); }

  inline constexpr unsigned long
  __lg(unsigned long __n)
  { return sizeof(long) * 8 - 1 - __builtin_clzl(__n); }

  inline constexpr long long
  __lg(long long __n)
  { return sizeof(long long) * 8 - 1 - __builtin_clzll(__n); }

  inline constexpr unsigned long long
  __lg(unsigned long long __n)
  { return sizeof(long long) * 8 - 1 - __builtin_clzll(__n); }
# 1039 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _II1, typename _II2>
    inline bool
    equal(_II1 __first1, _II1 __last1, _II2 __first2)
    {






                                                       ;

      return std::__equal_aux(std::__niter_base(__first1),
         std::__niter_base(__last1),
         std::__niter_base(__first2));
    }
# 1071 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
    inline bool
    equal(_IIter1 __first1, _IIter1 __last1,
   _IIter2 __first2, _BinaryPredicate __binary_pred)
    {



                                                       ;

      for (; __first1 != __last1; ++__first1, (void)++__first2)
 if (!bool(__binary_pred(*__first1, *__first2)))
   return false;
      return true;
    }
# 1104 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _II1, typename _II2>
    inline bool
    equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
    {






                                                       ;
                                                       ;

      using _RATag = random_access_iterator_tag;
      using _Cat1 = typename iterator_traits<_II1>::iterator_category;
      using _Cat2 = typename iterator_traits<_II2>::iterator_category;
      using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
      if (_RAIters())
 {
   auto __d1 = std::distance(__first1, __last1);
   auto __d2 = std::distance(__first2, __last2);
   if (__d1 != __d2)
     return false;
   return std::equal(__first1, __last1, __first2);
 }

      for (; __first1 != __last1 && __first2 != __last2;
   ++__first1, (void)++__first2)
 if (!(*__first1 == *__first2))
   return false;
      return __first1 == __last1 && __first2 == __last2;
    }
# 1153 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
    inline bool
    equal(_IIter1 __first1, _IIter1 __last1,
   _IIter2 __first2, _IIter2 __last2, _BinaryPredicate __binary_pred)
    {



                                                       ;
                                                       ;

      using _RATag = random_access_iterator_tag;
      using _Cat1 = typename iterator_traits<_IIter1>::iterator_category;
      using _Cat2 = typename iterator_traits<_IIter2>::iterator_category;
      using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
      if (_RAIters())
 {
   auto __d1 = std::distance(__first1, __last1);
   auto __d2 = std::distance(__first2, __last2);
   if (__d1 != __d2)
     return false;
   return std::equal(__first1, __last1, __first2,
           __binary_pred);
 }

      for (; __first1 != __last1 && __first2 != __last2;
   ++__first1, (void)++__first2)
 if (!bool(__binary_pred(*__first1, *__first2)))
   return false;
      return __first1 == __last1 && __first2 == __last2;
    }
# 1201 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _II1, typename _II2>
    inline bool
    lexicographical_compare(_II1 __first1, _II1 __last1,
       _II2 __first2, _II2 __last2)
    {
# 1215 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
                                                       ;
                                                       ;

      return std::__lexicographical_compare_aux(std::__niter_base(__first1),
      std::__niter_base(__last1),
      std::__niter_base(__first2),
      std::__niter_base(__last2));
    }
# 1237 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _II1, typename _II2, typename _Compare>
    inline bool
    lexicographical_compare(_II1 __first1, _II1 __last1,
       _II2 __first2, _II2 __last2, _Compare __comp)
    {



                                                       ;
                                                       ;

      return std::__lexicographical_compare_impl
 (__first1, __last1, __first2, __last2,
  __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _InputIterator1, typename _InputIterator2,
    typename _BinaryPredicate>
    pair<_InputIterator1, _InputIterator2>
    __mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
        _InputIterator2 __first2, _BinaryPredicate __binary_pred)
    {
      while (__first1 != __last1 && __binary_pred(__first1, __first2))
        {
   ++__first1;
   ++__first2;
        }
      return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
    }
# 1280 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _InputIterator1, typename _InputIterator2>
    inline pair<_InputIterator1, _InputIterator2>
    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
      _InputIterator2 __first2)
    {






                                                       ;

      return std::__mismatch(__first1, __last1, __first2,
        __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 1313 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _BinaryPredicate>
    inline pair<_InputIterator1, _InputIterator2>
    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
      _InputIterator2 __first2, _BinaryPredicate __binary_pred)
    {



                                                       ;

      return std::__mismatch(__first1, __last1, __first2,
 __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
    }



  template<typename _InputIterator1, typename _InputIterator2,
    typename _BinaryPredicate>
    pair<_InputIterator1, _InputIterator2>
    __mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
        _InputIterator2 __first2, _InputIterator2 __last2,
        _BinaryPredicate __binary_pred)
    {
      while (__first1 != __last1 && __first2 != __last2
      && __binary_pred(__first1, __first2))
        {
   ++__first1;
   ++__first2;
        }
      return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
    }
# 1360 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _InputIterator1, typename _InputIterator2>
    inline pair<_InputIterator1, _InputIterator2>
    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
      _InputIterator2 __first2, _InputIterator2 __last2)
    {






                                                       ;
                                                       ;

      return std::__mismatch(__first1, __last1, __first2, __last2,
        __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 1395 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algobase.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _BinaryPredicate>
    inline pair<_InputIterator1, _InputIterator2>
    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
      _InputIterator2 __first2, _InputIterator2 __last2,
      _BinaryPredicate __binary_pred)
    {



                                                       ;
                                                       ;

      return std::__mismatch(__first1, __last1, __first2, __last2,
        __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
    }



}
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3




# 1 "/usr/include/wchar.h" 1 3 4
# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 2 3
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 2 3

namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{
# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3
  template<typename _CharT>
    struct _Char_types
    {
      typedef unsigned long int_type;
      typedef std::streampos pos_type;
      typedef std::streamoff off_type;
      typedef std::mbstate_t state_type;
    };
# 82 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3
  template<typename _CharT>
    struct char_traits
    {
      typedef _CharT char_type;
      typedef typename _Char_types<_CharT>::int_type int_type;
      typedef typename _Char_types<_CharT>::pos_type pos_type;
      typedef typename _Char_types<_CharT>::off_type off_type;
      typedef typename _Char_types<_CharT>::state_type state_type;

      static void
      assign(char_type& __c1, const char_type& __c2)
      { __c1 = __c2; }

      static constexpr bool
      eq(const char_type& __c1, const char_type& __c2)
      { return __c1 == __c2; }

      static constexpr bool
      lt(const char_type& __c1, const char_type& __c2)
      { return __c1 < __c2; }

      static int
      compare(const char_type* __s1, const char_type* __s2, std::size_t __n);

      static std::size_t
      length(const char_type* __s);

      static const char_type*
      find(const char_type* __s, std::size_t __n, const char_type& __a);

      static char_type*
      move(char_type* __s1, const char_type* __s2, std::size_t __n);

      static char_type*
      copy(char_type* __s1, const char_type* __s2, std::size_t __n);

      static char_type*
      assign(char_type* __s, std::size_t __n, char_type __a);

      static constexpr char_type
      to_char_type(const int_type& __c)
      { return static_cast<char_type>(__c); }

      static constexpr int_type
      to_int_type(const char_type& __c)
      { return static_cast<int_type>(__c); }

      static constexpr bool
      eq_int_type(const int_type& __c1, const int_type& __c2)
      { return __c1 == __c2; }

      static constexpr int_type
      eof()
      { return static_cast<int_type>(-1); }

      static constexpr int_type
      not_eof(const int_type& __c)
      { return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
    };

  template<typename _CharT>
    int
    char_traits<_CharT>::
    compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
    {
      for (std::size_t __i = 0; __i < __n; ++__i)
 if (lt(__s1[__i], __s2[__i]))
   return -1;
 else if (lt(__s2[__i], __s1[__i]))
   return 1;
      return 0;
    }

  template<typename _CharT>
    std::size_t
    char_traits<_CharT>::
    length(const char_type* __p)
    {
      std::size_t __i = 0;
      while (!eq(__p[__i], char_type()))
        ++__i;
      return __i;
    }

  template<typename _CharT>
    const typename char_traits<_CharT>::char_type*
    char_traits<_CharT>::
    find(const char_type* __s, std::size_t __n, const char_type& __a)
    {
      for (std::size_t __i = 0; __i < __n; ++__i)
        if (eq(__s[__i], __a))
          return __s + __i;
      return 0;
    }

  template<typename _CharT>
    typename char_traits<_CharT>::char_type*
    char_traits<_CharT>::
    move(char_type* __s1, const char_type* __s2, std::size_t __n)
    {
      return static_cast<_CharT*>(__builtin_memmove(__s1, __s2,
          __n * sizeof(char_type)));
    }

  template<typename _CharT>
    typename char_traits<_CharT>::char_type*
    char_traits<_CharT>::
    copy(char_type* __s1, const char_type* __s2, std::size_t __n)
    {

      std::copy(__s2, __s2 + __n, __s1);
      return __s1;
    }

  template<typename _CharT>
    typename char_traits<_CharT>::char_type*
    char_traits<_CharT>::
    assign(char_type* __s, std::size_t __n, char_type __a)
    {

      std::fill_n(__s, __n, __a);
      return __s;
    }


}

namespace std __attribute__ ((__visibility__ ("default")))
{
# 226 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 3
  template<class _CharT>
    struct char_traits : public __gnu_cxx::char_traits<_CharT>
    { };



  template<>
    struct char_traits<char>
    {
      typedef char char_type;
      typedef int int_type;
      typedef streampos pos_type;
      typedef streamoff off_type;
      typedef mbstate_t state_type;

      static void
      assign(char_type& __c1, const char_type& __c2) noexcept
      { __c1 = __c2; }

      static constexpr bool
      eq(const char_type& __c1, const char_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr bool
      lt(const char_type& __c1, const char_type& __c2) noexcept
      {

 return (static_cast<unsigned char>(__c1)
  < static_cast<unsigned char>(__c2));
      }

      static int
      compare(const char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return 0;
 return __builtin_memcmp(__s1, __s2, __n);
      }

      static size_t
      length(const char_type* __s)
      { return __builtin_strlen(__s); }

      static const char_type*
      find(const char_type* __s, size_t __n, const char_type& __a)
      {
 if (__n == 0)
   return 0;
 return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n));
      }

      static char_type*
      move(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return static_cast<char_type*>(__builtin_memmove(__s1, __s2, __n));
      }

      static char_type*
      copy(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return static_cast<char_type*>(__builtin_memcpy(__s1, __s2, __n));
      }

      static char_type*
      assign(char_type* __s, size_t __n, char_type __a)
      {
 if (__n == 0)
   return __s;
 return static_cast<char_type*>(__builtin_memset(__s, __a, __n));
      }

      static constexpr char_type
      to_char_type(const int_type& __c) noexcept
      { return static_cast<char_type>(__c); }



      static constexpr int_type
      to_int_type(const char_type& __c) noexcept
      { return static_cast<int_type>(static_cast<unsigned char>(__c)); }

      static constexpr bool
      eq_int_type(const int_type& __c1, const int_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr int_type
      eof() noexcept
      { return static_cast<int_type>(-1); }

      static constexpr int_type
      not_eof(const int_type& __c) noexcept
      { return (__c == eof()) ? 0 : __c; }
  };




  template<>
    struct char_traits<wchar_t>
    {
      typedef wchar_t char_type;
      typedef wint_t int_type;
      typedef streamoff off_type;
      typedef wstreampos pos_type;
      typedef mbstate_t state_type;

      static void
      assign(char_type& __c1, const char_type& __c2) noexcept
      { __c1 = __c2; }

      static constexpr bool
      eq(const char_type& __c1, const char_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr bool
      lt(const char_type& __c1, const char_type& __c2) noexcept
      { return __c1 < __c2; }

      static int
      compare(const char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return 0;
 return wmemcmp(__s1, __s2, __n);
      }

      static size_t
      length(const char_type* __s)
      { return wcslen(__s); }

      static const char_type*
      find(const char_type* __s, size_t __n, const char_type& __a)
      {
 if (__n == 0)
   return 0;
 return wmemchr(__s, __a, __n);
      }

      static char_type*
      move(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return wmemmove(__s1, __s2, __n);
      }

      static char_type*
      copy(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return wmemcpy(__s1, __s2, __n);
      }

      static char_type*
      assign(char_type* __s, size_t __n, char_type __a)
      {
 if (__n == 0)
   return __s;
 return wmemset(__s, __a, __n);
      }

      static constexpr char_type
      to_char_type(const int_type& __c) noexcept
      { return char_type(__c); }

      static constexpr int_type
      to_int_type(const char_type& __c) noexcept
      { return int_type(__c); }

      static constexpr bool
      eq_int_type(const int_type& __c1, const int_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr int_type
      eof() noexcept
      { return static_cast<int_type>((0xffffffffu)); }

      static constexpr int_type
      not_eof(const int_type& __c) noexcept
      { return eq_int_type(__c, eof()) ? 0 : __c; }
  };



}





# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdint" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdint" 3
# 46 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdint" 3
namespace std
{
  using ::int8_t;
  using ::int16_t;
  using ::int32_t;
  using ::int64_t;

  using ::int_fast8_t;
  using ::int_fast16_t;
  using ::int_fast32_t;
  using ::int_fast64_t;

  using ::int_least8_t;
  using ::int_least16_t;
  using ::int_least32_t;
  using ::int_least64_t;

  using ::intmax_t;
  using ::intptr_t;

  using ::uint8_t;
  using ::uint16_t;
  using ::uint32_t;
  using ::uint64_t;

  using ::uint_fast8_t;
  using ::uint_fast16_t;
  using ::uint_fast32_t;
  using ::uint_fast64_t;

  using ::uint_least8_t;
  using ::uint_least16_t;
  using ::uint_least32_t;
  using ::uint_least64_t;

  using ::uintmax_t;
  using ::uintptr_t;
}
# 421 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/char_traits.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  template<>
    struct char_traits<char16_t>
    {
      typedef char16_t char_type;
      typedef uint_least16_t int_type;
      typedef streamoff off_type;
      typedef u16streampos pos_type;
      typedef mbstate_t state_type;

      static void
      assign(char_type& __c1, const char_type& __c2) noexcept
      { __c1 = __c2; }

      static constexpr bool
      eq(const char_type& __c1, const char_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr bool
      lt(const char_type& __c1, const char_type& __c2) noexcept
      { return __c1 < __c2; }

      static int
      compare(const char_type* __s1, const char_type* __s2, size_t __n)
      {
 for (size_t __i = 0; __i < __n; ++__i)
   if (lt(__s1[__i], __s2[__i]))
     return -1;
   else if (lt(__s2[__i], __s1[__i]))
     return 1;
 return 0;
      }

      static size_t
      length(const char_type* __s)
      {
 size_t __i = 0;
 while (!eq(__s[__i], char_type()))
   ++__i;
 return __i;
      }

      static const char_type*
      find(const char_type* __s, size_t __n, const char_type& __a)
      {
 for (size_t __i = 0; __i < __n; ++__i)
   if (eq(__s[__i], __a))
     return __s + __i;
 return 0;
      }

      static char_type*
      move(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return (static_cast<char_type*>
  (__builtin_memmove(__s1, __s2, __n * sizeof(char_type))));
      }

      static char_type*
      copy(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return (static_cast<char_type*>
  (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type))));
      }

      static char_type*
      assign(char_type* __s, size_t __n, char_type __a)
      {
 for (size_t __i = 0; __i < __n; ++__i)
   assign(__s[__i], __a);
 return __s;
      }

      static constexpr char_type
      to_char_type(const int_type& __c) noexcept
      { return char_type(__c); }

      static constexpr int_type
      to_int_type(const char_type& __c) noexcept
      { return int_type(__c); }

      static constexpr bool
      eq_int_type(const int_type& __c1, const int_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr int_type
      eof() noexcept
      { return static_cast<int_type>(-1); }

      static constexpr int_type
      not_eof(const int_type& __c) noexcept
      { return eq_int_type(__c, eof()) ? 0 : __c; }
    };

  template<>
    struct char_traits<char32_t>
    {
      typedef char32_t char_type;
      typedef uint_least32_t int_type;
      typedef streamoff off_type;
      typedef u32streampos pos_type;
      typedef mbstate_t state_type;

      static void
      assign(char_type& __c1, const char_type& __c2) noexcept
      { __c1 = __c2; }

      static constexpr bool
      eq(const char_type& __c1, const char_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr bool
      lt(const char_type& __c1, const char_type& __c2) noexcept
      { return __c1 < __c2; }

      static int
      compare(const char_type* __s1, const char_type* __s2, size_t __n)
      {
 for (size_t __i = 0; __i < __n; ++__i)
   if (lt(__s1[__i], __s2[__i]))
     return -1;
   else if (lt(__s2[__i], __s1[__i]))
     return 1;
 return 0;
      }

      static size_t
      length(const char_type* __s)
      {
 size_t __i = 0;
 while (!eq(__s[__i], char_type()))
   ++__i;
 return __i;
      }

      static const char_type*
      find(const char_type* __s, size_t __n, const char_type& __a)
      {
 for (size_t __i = 0; __i < __n; ++__i)
   if (eq(__s[__i], __a))
     return __s + __i;
 return 0;
      }

      static char_type*
      move(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return (static_cast<char_type*>
  (__builtin_memmove(__s1, __s2, __n * sizeof(char_type))));
      }

      static char_type*
      copy(char_type* __s1, const char_type* __s2, size_t __n)
      {
 if (__n == 0)
   return __s1;
 return (static_cast<char_type*>
  (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type))));
      }

      static char_type*
      assign(char_type* __s, size_t __n, char_type __a)
      {
 for (size_t __i = 0; __i < __n; ++__i)
   assign(__s[__i], __a);
 return __s;
      }

      static constexpr char_type
      to_char_type(const int_type& __c) noexcept
      { return char_type(__c); }

      static constexpr int_type
      to_int_type(const char_type& __c) noexcept
      { return int_type(__c); }

      static constexpr bool
      eq_int_type(const int_type& __c1, const int_type& __c2) noexcept
      { return __c1 == __c2; }

      static constexpr int_type
      eof() noexcept
      { return static_cast<int_type>(-1); }

      static constexpr int_type
      not_eof(const int_type& __c) noexcept
      { return eq_int_type(__c, eof()) ? 0 : __c; }
    };


}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/clocale" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/clocale" 3


# 1 "/usr/include/locale.h" 1 3 4
# 28 "/usr/include/locale.h" 3 4
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 29 "/usr/include/locale.h" 2 3 4
# 1 "/usr/include/bits/locale.h" 1 3 4
# 30 "/usr/include/locale.h" 2 3 4

extern "C" {
# 53 "/usr/include/locale.h" 3 4
struct lconv
{


  char *decimal_point;
  char *thousands_sep;





  char *grouping;





  char *int_curr_symbol;
  char *currency_symbol;
  char *mon_decimal_point;
  char *mon_thousands_sep;
  char *mon_grouping;
  char *positive_sign;
  char *negative_sign;
  char int_frac_digits;
  char frac_digits;

  char p_cs_precedes;

  char p_sep_by_space;

  char n_cs_precedes;

  char n_sep_by_space;






  char p_sign_posn;
  char n_sign_posn;


  char int_p_cs_precedes;

  char int_p_sep_by_space;

  char int_n_cs_precedes;

  char int_n_sep_by_space;






  char int_p_sign_posn;
  char int_n_sign_posn;
# 120 "/usr/include/locale.h" 3 4
};



extern char *setlocale (int __category, const char *__locale) throw ();


extern struct lconv *localeconv (void) throw ();
# 151 "/usr/include/locale.h" 3 4
extern __locale_t newlocale (int __category_mask, const char *__locale,
        __locale_t __base) throw ();
# 186 "/usr/include/locale.h" 3 4
extern __locale_t duplocale (__locale_t __dataset) throw ();



extern void freelocale (__locale_t __dataset) throw ();






extern __locale_t uselocale (__locale_t __dataset) throw ();







}
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/clocale" 2 3








namespace std
{
  using ::lconv;
  using ::setlocale;
  using ::localeconv;
}
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 2 3






namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{


  extern "C" __typeof(uselocale) __uselocale;


}


namespace std __attribute__ ((__visibility__ ("default")))
{


  typedef __locale_t __c_locale;





  inline int
  __convert_from_v(const __c_locale& __cloc __attribute__ ((__unused__)),
     char* __out,
     const int __size __attribute__ ((__unused__)),
     const char* __fmt, ...)
  {

    __c_locale __old = __gnu_cxx::__uselocale(__cloc);
# 88 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++locale.h" 3
    __builtin_va_list __args;
    __builtin_va_start(__args, __fmt);


    const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);




    __builtin_va_end(__args);


    __gnu_cxx::__uselocale(__old);







    return __ret;
  }


}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 3


# 1 "/usr/include/ctype.h" 1 3 4
# 28 "/usr/include/ctype.h" 3 4
extern "C" {
# 46 "/usr/include/ctype.h" 3 4
enum
{
  _ISupper = ((0) < 8 ? ((1 << (0)) << 8) : ((1 << (0)) >> 8)),
  _ISlower = ((1) < 8 ? ((1 << (1)) << 8) : ((1 << (1)) >> 8)),
  _ISalpha = ((2) < 8 ? ((1 << (2)) << 8) : ((1 << (2)) >> 8)),
  _ISdigit = ((3) < 8 ? ((1 << (3)) << 8) : ((1 << (3)) >> 8)),
  _ISxdigit = ((4) < 8 ? ((1 << (4)) << 8) : ((1 << (4)) >> 8)),
  _ISspace = ((5) < 8 ? ((1 << (5)) << 8) : ((1 << (5)) >> 8)),
  _ISprint = ((6) < 8 ? ((1 << (6)) << 8) : ((1 << (6)) >> 8)),
  _ISgraph = ((7) < 8 ? ((1 << (7)) << 8) : ((1 << (7)) >> 8)),
  _ISblank = ((8) < 8 ? ((1 << (8)) << 8) : ((1 << (8)) >> 8)),
  _IScntrl = ((9) < 8 ? ((1 << (9)) << 8) : ((1 << (9)) >> 8)),
  _ISpunct = ((10) < 8 ? ((1 << (10)) << 8) : ((1 << (10)) >> 8)),
  _ISalnum = ((11) < 8 ? ((1 << (11)) << 8) : ((1 << (11)) >> 8))
};
# 79 "/usr/include/ctype.h" 3 4
extern const unsigned short int **__ctype_b_loc (void)
     throw () __attribute__ ((__const__));
extern const __int32_t **__ctype_tolower_loc (void)
     throw () __attribute__ ((__const__));
extern const __int32_t **__ctype_toupper_loc (void)
     throw () __attribute__ ((__const__));
# 110 "/usr/include/ctype.h" 3 4
extern int isalnum (int) throw ();
extern int isalpha (int) throw ();
extern int iscntrl (int) throw ();
extern int isdigit (int) throw ();
extern int islower (int) throw ();
extern int isgraph (int) throw ();
extern int isprint (int) throw ();
extern int ispunct (int) throw ();
extern int isspace (int) throw ();
extern int isupper (int) throw ();
extern int isxdigit (int) throw ();



extern int tolower (int __c) throw ();


extern int toupper (int __c) throw ();
# 136 "/usr/include/ctype.h" 3 4
extern int isblank (int) throw ();






extern int isctype (int __c, int __mask) throw ();






extern int isascii (int __c) throw ();



extern int toascii (int __c) throw ();



extern int _toupper (int) throw ();
extern int _tolower (int) throw ();
# 271 "/usr/include/ctype.h" 3 4
extern int isalnum_l (int, __locale_t) throw ();
extern int isalpha_l (int, __locale_t) throw ();
extern int iscntrl_l (int, __locale_t) throw ();
extern int isdigit_l (int, __locale_t) throw ();
extern int islower_l (int, __locale_t) throw ();
extern int isgraph_l (int, __locale_t) throw ();
extern int isprint_l (int, __locale_t) throw ();
extern int ispunct_l (int, __locale_t) throw ();
extern int isspace_l (int, __locale_t) throw ();
extern int isupper_l (int, __locale_t) throw ();
extern int isxdigit_l (int, __locale_t) throw ();

extern int isblank_l (int, __locale_t) throw ();



extern int __tolower_l (int __c, __locale_t __l) throw ();
extern int tolower_l (int __c, __locale_t __l) throw ();


extern int __toupper_l (int __c, __locale_t __l) throw ();
extern int toupper_l (int __c, __locale_t __l) throw ();
# 347 "/usr/include/ctype.h" 3 4
}
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 2 3
# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 3
namespace std
{
  using ::isalnum;
  using ::isalpha;
  using ::iscntrl;
  using ::isdigit;
  using ::isgraph;
  using ::islower;
  using ::isprint;
  using ::ispunct;
  using ::isspace;
  using ::isupper;
  using ::isxdigit;
  using ::tolower;
  using ::toupper;
}







namespace std
{
  using ::isblank;
}
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 55 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/localefwd.h" 3
  class locale;

  template<typename _Facet>
    bool
    has_facet(const locale&) throw();

  template<typename _Facet>
    const _Facet&
    use_facet(const locale&);


  template<typename _CharT>
    bool
    isspace(_CharT, const locale&);

  template<typename _CharT>
    bool
    isprint(_CharT, const locale&);

  template<typename _CharT>
    bool
    iscntrl(_CharT, const locale&);

  template<typename _CharT>
    bool
    isupper(_CharT, const locale&);

  template<typename _CharT>
    bool
    islower(_CharT, const locale&);

  template<typename _CharT>
    bool
    isalpha(_CharT, const locale&);

  template<typename _CharT>
    bool
    isdigit(_CharT, const locale&);

  template<typename _CharT>
    bool
    ispunct(_CharT, const locale&);

  template<typename _CharT>
    bool
    isxdigit(_CharT, const locale&);

  template<typename _CharT>
    bool
    isalnum(_CharT, const locale&);

  template<typename _CharT>
    bool
    isgraph(_CharT, const locale&);


  template<typename _CharT>
    bool
    isblank(_CharT, const locale&);


  template<typename _CharT>
    _CharT
    toupper(_CharT, const locale&);

  template<typename _CharT>
    _CharT
    tolower(_CharT, const locale&);


  class ctype_base;
  template<typename _CharT>
    class ctype;
  template<> class ctype<char>;

  template<> class ctype<wchar_t>;

  template<typename _CharT>
    class ctype_byname;


  class codecvt_base;
  template<typename _InternT, typename _ExternT, typename _StateT>
    class codecvt;
  template<> class codecvt<char, char, mbstate_t>;

  template<> class codecvt<wchar_t, char, mbstate_t>;

  template<typename _InternT, typename _ExternT, typename _StateT>
    class codecvt_byname;



  template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
    class num_get;
  template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
    class num_put;

namespace __cxx11 {
  template<typename _CharT> class numpunct;
  template<typename _CharT> class numpunct_byname;
}

namespace __cxx11 {

  template<typename _CharT>
    class collate;
  template<typename _CharT>
    class collate_byname;
}


  class time_base;
namespace __cxx11 {
  template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
    class time_get;
  template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
    class time_get_byname;
}
  template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
    class time_put;
  template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
    class time_put_byname;


  class money_base;
namespace __cxx11 {
  template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
    class money_get;
  template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
    class money_put;
}
namespace __cxx11 {
  template<typename _CharT, bool _Intl = false>
    class moneypunct;
  template<typename _CharT, bool _Intl = false>
    class moneypunct_byname;
}


  class messages_base;
namespace __cxx11 {
  template<typename _CharT>
    class messages;
  template<typename _CharT>
    class messages_byname;
}


}
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 1 3
# 30 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 3
#pragma GCC visibility push(default)
# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 1 3
# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
# 1 "/usr/include/pthread.h" 1 3 4
# 23 "/usr/include/pthread.h" 3 4
# 1 "/usr/include/sched.h" 1 3 4
# 28 "/usr/include/sched.h" 3 4
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 29 "/usr/include/sched.h" 2 3 4





# 1 "/usr/include/time.h" 1 3 4
# 35 "/usr/include/sched.h" 2 3 4








# 1 "/usr/include/bits/sched.h" 1 3 4
# 73 "/usr/include/bits/sched.h" 3 4
struct sched_param
  {
    int __sched_priority;
  };

extern "C" {



extern int clone (int (*__fn) (void *__arg), void *__child_stack,
    int __flags, void *__arg, ...) throw ();


extern int unshare (int __flags) throw ();


extern int sched_getcpu (void) throw ();


extern int setns (int __fd, int __nstype) throw ();



}







struct __sched_param
  {
    int __sched_priority;
  };
# 119 "/usr/include/bits/sched.h" 3 4
typedef unsigned long int __cpu_mask;






typedef struct
{
  __cpu_mask __bits[1024 / (8 * sizeof (__cpu_mask))];
} cpu_set_t;
# 202 "/usr/include/bits/sched.h" 3 4
extern "C" {

extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp)
  throw ();
extern cpu_set_t *__sched_cpualloc (size_t __count) throw () ;
extern void __sched_cpufree (cpu_set_t *__set) throw ();

}
# 44 "/usr/include/sched.h" 2 3 4




extern "C" {


extern int sched_setparam (__pid_t __pid, const struct sched_param *__param)
     throw ();


extern int sched_getparam (__pid_t __pid, struct sched_param *__param) throw ();


extern int sched_setscheduler (__pid_t __pid, int __policy,
          const struct sched_param *__param) throw ();


extern int sched_getscheduler (__pid_t __pid) throw ();


extern int sched_yield (void) throw ();


extern int sched_get_priority_max (int __algorithm) throw ();


extern int sched_get_priority_min (int __algorithm) throw ();


extern int sched_rr_get_interval (__pid_t __pid, struct timespec *__t) throw ();
# 118 "/usr/include/sched.h" 3 4
extern int sched_setaffinity (__pid_t __pid, size_t __cpusetsize,
         const cpu_set_t *__cpuset) throw ();


extern int sched_getaffinity (__pid_t __pid, size_t __cpusetsize,
         cpu_set_t *__cpuset) throw ();


}
# 24 "/usr/include/pthread.h" 2 3 4
# 1 "/usr/include/time.h" 1 3 4
# 29 "/usr/include/time.h" 3 4
extern "C" {








# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3 4
# 38 "/usr/include/time.h" 2 3 4



# 1 "/usr/include/bits/time.h" 1 3 4
# 88 "/usr/include/bits/time.h" 3 4
# 1 "/usr/include/bits/timex.h" 1 3 4
# 25 "/usr/include/bits/timex.h" 3 4
struct timex
{
  unsigned int modes;
  __syscall_slong_t offset;
  __syscall_slong_t freq;
  __syscall_slong_t maxerror;
  __syscall_slong_t esterror;
  int status;
  __syscall_slong_t constant;
  __syscall_slong_t precision;
  __syscall_slong_t tolerance;
  struct timeval time;
  __syscall_slong_t tick;
  __syscall_slong_t ppsfreq;
  __syscall_slong_t jitter;
  int shift;
  __syscall_slong_t stabil;
  __syscall_slong_t jitcnt;
  __syscall_slong_t calcnt;
  __syscall_slong_t errcnt;
  __syscall_slong_t stbcnt;

  int tai;


  int :32; int :32; int :32; int :32;
  int :32; int :32; int :32; int :32;
  int :32; int :32; int :32;
};
# 89 "/usr/include/bits/time.h" 2 3 4

extern "C" {


extern int clock_adjtime (__clockid_t __clock_id, struct timex *__utx) throw ();

}
# 42 "/usr/include/time.h" 2 3 4
# 133 "/usr/include/time.h" 3 4
struct tm
{
  int tm_sec;
  int tm_min;
  int tm_hour;
  int tm_mday;
  int tm_mon;
  int tm_year;
  int tm_wday;
  int tm_yday;
  int tm_isdst;


  long int tm_gmtoff;
  const char *tm_zone;




};
# 161 "/usr/include/time.h" 3 4
struct itimerspec
  {
    struct timespec it_interval;
    struct timespec it_value;
  };


struct sigevent;
# 189 "/usr/include/time.h" 3 4
extern clock_t clock (void) throw ();


extern time_t time (time_t *__timer) throw ();


extern double difftime (time_t __time1, time_t __time0)
     throw () __attribute__ ((__const__));


extern time_t mktime (struct tm *__tp) throw ();





extern size_t strftime (char *__restrict __s, size_t __maxsize,
   const char *__restrict __format,
   const struct tm *__restrict __tp) throw ();





extern char *strptime (const char *__restrict __s,
         const char *__restrict __fmt, struct tm *__tp)
     throw ();







extern size_t strftime_l (char *__restrict __s, size_t __maxsize,
     const char *__restrict __format,
     const struct tm *__restrict __tp,
     __locale_t __loc) throw ();



extern char *strptime_l (const char *__restrict __s,
    const char *__restrict __fmt, struct tm *__tp,
    __locale_t __loc) throw ();






extern struct tm *gmtime (const time_t *__timer) throw ();



extern struct tm *localtime (const time_t *__timer) throw ();





extern struct tm *gmtime_r (const time_t *__restrict __timer,
       struct tm *__restrict __tp) throw ();



extern struct tm *localtime_r (const time_t *__restrict __timer,
          struct tm *__restrict __tp) throw ();





extern char *asctime (const struct tm *__tp) throw ();


extern char *ctime (const time_t *__timer) throw ();







extern char *asctime_r (const struct tm *__restrict __tp,
   char *__restrict __buf) throw ();


extern char *ctime_r (const time_t *__restrict __timer,
        char *__restrict __buf) throw ();




extern char *__tzname[2];
extern int __daylight;
extern long int __timezone;




extern char *tzname[2];



extern void tzset (void) throw ();



extern int daylight;
extern long int timezone;





extern int stime (const time_t *__when) throw ();
# 319 "/usr/include/time.h" 3 4
extern time_t timegm (struct tm *__tp) throw ();


extern time_t timelocal (struct tm *__tp) throw ();


extern int dysize (int __year) throw () __attribute__ ((__const__));
# 334 "/usr/include/time.h" 3 4
extern int nanosleep (const struct timespec *__requested_time,
        struct timespec *__remaining);



extern int clock_getres (clockid_t __clock_id, struct timespec *__res) throw ();


extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) throw ();


extern int clock_settime (clockid_t __clock_id, const struct timespec *__tp)
     throw ();






extern int clock_nanosleep (clockid_t __clock_id, int __flags,
       const struct timespec *__req,
       struct timespec *__rem);


extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) throw ();




extern int timer_create (clockid_t __clock_id,
    struct sigevent *__restrict __evp,
    timer_t *__restrict __timerid) throw ();


extern int timer_delete (timer_t __timerid) throw ();


extern int timer_settime (timer_t __timerid, int __flags,
     const struct itimerspec *__restrict __value,
     struct itimerspec *__restrict __ovalue) throw ();


extern int timer_gettime (timer_t __timerid, struct itimerspec *__value)
     throw ();


extern int timer_getoverrun (timer_t __timerid) throw ();





extern int timespec_get (struct timespec *__ts, int __base)
     throw () __attribute__ ((__nonnull__ (1)));
# 403 "/usr/include/time.h" 3 4
extern int getdate_err;
# 412 "/usr/include/time.h" 3 4
extern struct tm *getdate (const char *__string);
# 426 "/usr/include/time.h" 3 4
extern int getdate_r (const char *__restrict __string,
        struct tm *__restrict __resbufp);


}
# 25 "/usr/include/pthread.h" 2 3 4


# 1 "/usr/include/bits/setjmp.h" 1 3 4
# 26 "/usr/include/bits/setjmp.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 27 "/usr/include/bits/setjmp.h" 2 3 4




typedef long int __jmp_buf[8];
# 28 "/usr/include/pthread.h" 2 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 29 "/usr/include/pthread.h" 2 3 4



enum
{
  PTHREAD_CREATE_JOINABLE,

  PTHREAD_CREATE_DETACHED

};



enum
{
  PTHREAD_MUTEX_TIMED_NP,
  PTHREAD_MUTEX_RECURSIVE_NP,
  PTHREAD_MUTEX_ERRORCHECK_NP,
  PTHREAD_MUTEX_ADAPTIVE_NP

  ,
  PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
  PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
  PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
  PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL



  , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP

};




enum
{
  PTHREAD_MUTEX_STALLED,
  PTHREAD_MUTEX_STALLED_NP = PTHREAD_MUTEX_STALLED,
  PTHREAD_MUTEX_ROBUST,
  PTHREAD_MUTEX_ROBUST_NP = PTHREAD_MUTEX_ROBUST
};





enum
{
  PTHREAD_PRIO_NONE,
  PTHREAD_PRIO_INHERIT,
  PTHREAD_PRIO_PROTECT
};
# 114 "/usr/include/pthread.h" 3 4
enum
{
  PTHREAD_RWLOCK_PREFER_READER_NP,
  PTHREAD_RWLOCK_PREFER_WRITER_NP,
  PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
  PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP
};
# 155 "/usr/include/pthread.h" 3 4
enum
{
  PTHREAD_INHERIT_SCHED,

  PTHREAD_EXPLICIT_SCHED

};



enum
{
  PTHREAD_SCOPE_SYSTEM,

  PTHREAD_SCOPE_PROCESS

};



enum
{
  PTHREAD_PROCESS_PRIVATE,

  PTHREAD_PROCESS_SHARED

};
# 190 "/usr/include/pthread.h" 3 4
struct _pthread_cleanup_buffer
{
  void (*__routine) (void *);
  void *__arg;
  int __canceltype;
  struct _pthread_cleanup_buffer *__prev;
};


enum
{
  PTHREAD_CANCEL_ENABLE,

  PTHREAD_CANCEL_DISABLE

};
enum
{
  PTHREAD_CANCEL_DEFERRED,

  PTHREAD_CANCEL_ASYNCHRONOUS

};
# 228 "/usr/include/pthread.h" 3 4
extern "C" {




extern int pthread_create (pthread_t *__restrict __newthread,
      const pthread_attr_t *__restrict __attr,
      void *(*__start_routine) (void *),
      void *__restrict __arg) throw () __attribute__ ((__nonnull__ (1, 3)));





extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__));







extern int pthread_join (pthread_t __th, void **__thread_return);




extern int pthread_tryjoin_np (pthread_t __th, void **__thread_return) throw ();







extern int pthread_timedjoin_np (pthread_t __th, void **__thread_return,
     const struct timespec *__abstime);






extern int pthread_detach (pthread_t __th) throw ();



extern pthread_t pthread_self (void) throw () __attribute__ ((__const__));


extern int pthread_equal (pthread_t __thread1, pthread_t __thread2)
  throw () __attribute__ ((__const__));







extern int pthread_attr_init (pthread_attr_t *__attr) throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_attr_destroy (pthread_attr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_attr_getdetachstate (const pthread_attr_t *__attr,
     int *__detachstate)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_attr_setdetachstate (pthread_attr_t *__attr,
     int __detachstate)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_attr_getguardsize (const pthread_attr_t *__attr,
          size_t *__guardsize)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_attr_setguardsize (pthread_attr_t *__attr,
          size_t __guardsize)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_attr_getschedparam (const pthread_attr_t *__restrict __attr,
           struct sched_param *__restrict __param)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr,
           const struct sched_param *__restrict
           __param) throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_attr_getschedpolicy (const pthread_attr_t *__restrict
     __attr, int *__restrict __policy)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_attr_getinheritsched (const pthread_attr_t *__restrict
      __attr, int *__restrict __inherit)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_attr_setinheritsched (pthread_attr_t *__attr,
      int __inherit)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_attr_getscope (const pthread_attr_t *__restrict __attr,
      int *__restrict __scope)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_attr_getstackaddr (const pthread_attr_t *__restrict
          __attr, void **__restrict __stackaddr)
     throw () __attribute__ ((__nonnull__ (1, 2))) __attribute__ ((__deprecated__));





extern int pthread_attr_setstackaddr (pthread_attr_t *__attr,
          void *__stackaddr)
     throw () __attribute__ ((__nonnull__ (1))) __attribute__ ((__deprecated__));


extern int pthread_attr_getstacksize (const pthread_attr_t *__restrict
          __attr, size_t *__restrict __stacksize)
     throw () __attribute__ ((__nonnull__ (1, 2)));




extern int pthread_attr_setstacksize (pthread_attr_t *__attr,
          size_t __stacksize)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_attr_getstack (const pthread_attr_t *__restrict __attr,
      void **__restrict __stackaddr,
      size_t *__restrict __stacksize)
     throw () __attribute__ ((__nonnull__ (1, 2, 3)));




extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr,
      size_t __stacksize) throw () __attribute__ ((__nonnull__ (1)));





extern int pthread_attr_setaffinity_np (pthread_attr_t *__attr,
     size_t __cpusetsize,
     const cpu_set_t *__cpuset)
     throw () __attribute__ ((__nonnull__ (1, 3)));



extern int pthread_attr_getaffinity_np (const pthread_attr_t *__attr,
     size_t __cpusetsize,
     cpu_set_t *__cpuset)
     throw () __attribute__ ((__nonnull__ (1, 3)));


extern int pthread_getattr_default_np (pthread_attr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_setattr_default_np (const pthread_attr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));




extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)
     throw () __attribute__ ((__nonnull__ (2)));







extern int pthread_setschedparam (pthread_t __target_thread, int __policy,
      const struct sched_param *__param)
     throw () __attribute__ ((__nonnull__ (3)));


extern int pthread_getschedparam (pthread_t __target_thread,
      int *__restrict __policy,
      struct sched_param *__restrict __param)
     throw () __attribute__ ((__nonnull__ (2, 3)));


extern int pthread_setschedprio (pthread_t __target_thread, int __prio)
     throw ();




extern int pthread_getname_np (pthread_t __target_thread, char *__buf,
          size_t __buflen)
     throw () __attribute__ ((__nonnull__ (2)));


extern int pthread_setname_np (pthread_t __target_thread, const char *__name)
     throw () __attribute__ ((__nonnull__ (2)));





extern int pthread_getconcurrency (void) throw ();


extern int pthread_setconcurrency (int __level) throw ();







extern int pthread_yield (void) throw ();




extern int pthread_setaffinity_np (pthread_t __th, size_t __cpusetsize,
       const cpu_set_t *__cpuset)
     throw () __attribute__ ((__nonnull__ (3)));


extern int pthread_getaffinity_np (pthread_t __th, size_t __cpusetsize,
       cpu_set_t *__cpuset)
     throw () __attribute__ ((__nonnull__ (3)));
# 494 "/usr/include/pthread.h" 3 4
extern int pthread_once (pthread_once_t *__once_control,
    void (*__init_routine) (void)) __attribute__ ((__nonnull__ (1, 2)));
# 506 "/usr/include/pthread.h" 3 4
extern int pthread_setcancelstate (int __state, int *__oldstate);



extern int pthread_setcanceltype (int __type, int *__oldtype);


extern int pthread_cancel (pthread_t __th);




extern void pthread_testcancel (void);




typedef struct
{
  struct
  {
    __jmp_buf __cancel_jmp_buf;
    int __mask_was_saved;
  } __cancel_jmp_buf[1];
  void *__pad[4];
} __pthread_unwind_buf_t __attribute__ ((__aligned__));
# 540 "/usr/include/pthread.h" 3 4
struct __pthread_cleanup_frame
{
  void (*__cancel_routine) (void *);
  void *__cancel_arg;
  int __do_it;
  int __cancel_type;
};




class __pthread_cleanup_class
{
  void (*__cancel_routine) (void *);
  void *__cancel_arg;
  int __do_it;
  int __cancel_type;

 public:
  __pthread_cleanup_class (void (*__fct) (void *), void *__arg)
    : __cancel_routine (__fct), __cancel_arg (__arg), __do_it (1) { }
  ~__pthread_cleanup_class () { if (__do_it) __cancel_routine (__cancel_arg); }
  void __setdoit (int __newval) { __do_it = __newval; }
  void __defer () { pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED,
        &__cancel_type); }
  void __restore () const { pthread_setcanceltype (__cancel_type, 0); }
};
# 742 "/usr/include/pthread.h" 3 4
struct __jmp_buf_tag;
extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) throw ();





extern int pthread_mutex_init (pthread_mutex_t *__mutex,
          const pthread_mutexattr_t *__mutexattr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_mutex_destroy (pthread_mutex_t *__mutex)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_mutex_trylock (pthread_mutex_t *__mutex)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_mutex_lock (pthread_mutex_t *__mutex)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex,
        const struct timespec *__restrict
        __abstime) throw () __attribute__ ((__nonnull__ (1, 2)));



extern int pthread_mutex_unlock (pthread_mutex_t *__mutex)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_mutex_getprioceiling (const pthread_mutex_t *
      __restrict __mutex,
      int *__restrict __prioceiling)
     throw () __attribute__ ((__nonnull__ (1, 2)));



extern int pthread_mutex_setprioceiling (pthread_mutex_t *__restrict __mutex,
      int __prioceiling,
      int *__restrict __old_ceiling)
     throw () __attribute__ ((__nonnull__ (1, 3)));




extern int pthread_mutex_consistent (pthread_mutex_t *__mutex)
     throw () __attribute__ ((__nonnull__ (1)));

extern int pthread_mutex_consistent_np (pthread_mutex_t *__mutex)
     throw () __attribute__ ((__nonnull__ (1)));
# 806 "/usr/include/pthread.h" 3 4
extern int pthread_mutexattr_init (pthread_mutexattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_mutexattr_getpshared (const pthread_mutexattr_t *
      __restrict __attr,
      int *__restrict __pshared)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr,
      int __pshared)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_mutexattr_gettype (const pthread_mutexattr_t *__restrict
          __attr, int *__restrict __kind)
     throw () __attribute__ ((__nonnull__ (1, 2)));




extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *
       __restrict __attr,
       int *__restrict __protocol)
     throw () __attribute__ ((__nonnull__ (1, 2)));



extern int pthread_mutexattr_setprotocol (pthread_mutexattr_t *__attr,
       int __protocol)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *
          __restrict __attr,
          int *__restrict __prioceiling)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr,
          int __prioceiling)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_mutexattr_getrobust (const pthread_mutexattr_t *__attr,
     int *__robustness)
     throw () __attribute__ ((__nonnull__ (1, 2)));

extern int pthread_mutexattr_getrobust_np (const pthread_mutexattr_t *__attr,
        int *__robustness)
     throw () __attribute__ ((__nonnull__ (1, 2)));



extern int pthread_mutexattr_setrobust (pthread_mutexattr_t *__attr,
     int __robustness)
     throw () __attribute__ ((__nonnull__ (1)));

extern int pthread_mutexattr_setrobust_np (pthread_mutexattr_t *__attr,
        int __robustness)
     throw () __attribute__ ((__nonnull__ (1)));
# 888 "/usr/include/pthread.h" 3 4
extern int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock,
    const pthread_rwlockattr_t *__restrict
    __attr) throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock)
  throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_rwlock_timedrdlock (pthread_rwlock_t *__restrict __rwlock,
           const struct timespec *__restrict
           __abstime) throw () __attribute__ ((__nonnull__ (1, 2)));



extern int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_rwlock_timedwrlock (pthread_rwlock_t *__restrict __rwlock,
           const struct timespec *__restrict
           __abstime) throw () __attribute__ ((__nonnull__ (1, 2)));



extern int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock)
     throw () __attribute__ ((__nonnull__ (1)));





extern int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *
       __restrict __attr,
       int *__restrict __pshared)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr,
       int __pshared)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t *
       __restrict __attr,
       int *__restrict __pref)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
       int __pref) throw () __attribute__ ((__nonnull__ (1)));







extern int pthread_cond_init (pthread_cond_t *__restrict __cond,
         const pthread_condattr_t *__restrict __cond_attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_cond_destroy (pthread_cond_t *__cond)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_cond_signal (pthread_cond_t *__cond)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_cond_broadcast (pthread_cond_t *__cond)
     throw () __attribute__ ((__nonnull__ (1)));






extern int pthread_cond_wait (pthread_cond_t *__restrict __cond,
         pthread_mutex_t *__restrict __mutex)
     __attribute__ ((__nonnull__ (1, 2)));
# 1000 "/usr/include/pthread.h" 3 4
extern int pthread_cond_timedwait (pthread_cond_t *__restrict __cond,
       pthread_mutex_t *__restrict __mutex,
       const struct timespec *__restrict __abstime)
     __attribute__ ((__nonnull__ (1, 2, 3)));




extern int pthread_condattr_init (pthread_condattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_condattr_destroy (pthread_condattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_condattr_getpshared (const pthread_condattr_t *
     __restrict __attr,
     int *__restrict __pshared)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_condattr_setpshared (pthread_condattr_t *__attr,
     int __pshared) throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_condattr_getclock (const pthread_condattr_t *
          __restrict __attr,
          __clockid_t *__restrict __clock_id)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_condattr_setclock (pthread_condattr_t *__attr,
          __clockid_t __clock_id)
     throw () __attribute__ ((__nonnull__ (1)));
# 1044 "/usr/include/pthread.h" 3 4
extern int pthread_spin_init (pthread_spinlock_t *__lock, int __pshared)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_spin_destroy (pthread_spinlock_t *__lock)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_spin_lock (pthread_spinlock_t *__lock)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_spin_trylock (pthread_spinlock_t *__lock)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_spin_unlock (pthread_spinlock_t *__lock)
     throw () __attribute__ ((__nonnull__ (1)));






extern int pthread_barrier_init (pthread_barrier_t *__restrict __barrier,
     const pthread_barrierattr_t *__restrict
     __attr, unsigned int __count)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_barrier_destroy (pthread_barrier_t *__barrier)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_barrier_wait (pthread_barrier_t *__barrier)
     throw () __attribute__ ((__nonnull__ (1)));



extern int pthread_barrierattr_init (pthread_barrierattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr)
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_barrierattr_getpshared (const pthread_barrierattr_t *
        __restrict __attr,
        int *__restrict __pshared)
     throw () __attribute__ ((__nonnull__ (1, 2)));


extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr,
        int __pshared)
     throw () __attribute__ ((__nonnull__ (1)));
# 1111 "/usr/include/pthread.h" 3 4
extern int pthread_key_create (pthread_key_t *__key,
          void (*__destr_function) (void *))
     throw () __attribute__ ((__nonnull__ (1)));


extern int pthread_key_delete (pthread_key_t __key) throw ();


extern void *pthread_getspecific (pthread_key_t __key) throw ();


extern int pthread_setspecific (pthread_key_t __key,
    const void *__pointer) throw () ;




extern int pthread_getcpuclockid (pthread_t __thread_id,
      __clockid_t *__clock_id)
     throw () __attribute__ ((__nonnull__ (2)));
# 1145 "/usr/include/pthread.h" 3 4
extern int pthread_atfork (void (*__prepare) (void),
      void (*__parent) (void),
      void (*__child) (void)) throw ();
# 1159 "/usr/include/pthread.h" 3 4
}
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 2 3
# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
typedef pthread_t __gthread_t;
typedef pthread_key_t __gthread_key_t;
typedef pthread_once_t __gthread_once_t;
typedef pthread_mutex_t __gthread_mutex_t;
typedef pthread_mutex_t __gthread_recursive_mutex_t;
typedef pthread_cond_t __gthread_cond_t;
typedef struct timespec __gthread_time_t;
# 101 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
static __typeof(pthread_once) __gthrw_pthread_once __attribute__ ((__weakref__("pthread_once")));
static __typeof(pthread_getspecific) __gthrw_pthread_getspecific __attribute__ ((__weakref__("pthread_getspecific")));
static __typeof(pthread_setspecific) __gthrw_pthread_setspecific __attribute__ ((__weakref__("pthread_setspecific")));

static __typeof(pthread_create) __gthrw_pthread_create __attribute__ ((__weakref__("pthread_create")));
static __typeof(pthread_join) __gthrw_pthread_join __attribute__ ((__weakref__("pthread_join")));
static __typeof(pthread_equal) __gthrw_pthread_equal __attribute__ ((__weakref__("pthread_equal")));
static __typeof(pthread_self) __gthrw_pthread_self __attribute__ ((__weakref__("pthread_self")));
static __typeof(pthread_detach) __gthrw_pthread_detach __attribute__ ((__weakref__("pthread_detach")));

static __typeof(pthread_cancel) __gthrw_pthread_cancel __attribute__ ((__weakref__("pthread_cancel")));

static __typeof(sched_yield) __gthrw_sched_yield __attribute__ ((__weakref__("sched_yield")));

static __typeof(pthread_mutex_lock) __gthrw_pthread_mutex_lock __attribute__ ((__weakref__("pthread_mutex_lock")));
static __typeof(pthread_mutex_trylock) __gthrw_pthread_mutex_trylock __attribute__ ((__weakref__("pthread_mutex_trylock")));

static __typeof(pthread_mutex_timedlock) __gthrw_pthread_mutex_timedlock __attribute__ ((__weakref__("pthread_mutex_timedlock")));

static __typeof(pthread_mutex_unlock) __gthrw_pthread_mutex_unlock __attribute__ ((__weakref__("pthread_mutex_unlock")));
static __typeof(pthread_mutex_init) __gthrw_pthread_mutex_init __attribute__ ((__weakref__("pthread_mutex_init")));
static __typeof(pthread_mutex_destroy) __gthrw_pthread_mutex_destroy __attribute__ ((__weakref__("pthread_mutex_destroy")));

static __typeof(pthread_cond_init) __gthrw_pthread_cond_init __attribute__ ((__weakref__("pthread_cond_init")));
static __typeof(pthread_cond_broadcast) __gthrw_pthread_cond_broadcast __attribute__ ((__weakref__("pthread_cond_broadcast")));
static __typeof(pthread_cond_signal) __gthrw_pthread_cond_signal __attribute__ ((__weakref__("pthread_cond_signal")));
static __typeof(pthread_cond_wait) __gthrw_pthread_cond_wait __attribute__ ((__weakref__("pthread_cond_wait")));
static __typeof(pthread_cond_timedwait) __gthrw_pthread_cond_timedwait __attribute__ ((__weakref__("pthread_cond_timedwait")));
static __typeof(pthread_cond_destroy) __gthrw_pthread_cond_destroy __attribute__ ((__weakref__("pthread_cond_destroy")));

static __typeof(pthread_key_create) __gthrw_pthread_key_create __attribute__ ((__weakref__("pthread_key_create")));
static __typeof(pthread_key_delete) __gthrw_pthread_key_delete __attribute__ ((__weakref__("pthread_key_delete")));
static __typeof(pthread_mutexattr_init) __gthrw_pthread_mutexattr_init __attribute__ ((__weakref__("pthread_mutexattr_init")));
static __typeof(pthread_mutexattr_settype) __gthrw_pthread_mutexattr_settype __attribute__ ((__weakref__("pthread_mutexattr_settype")));
static __typeof(pthread_mutexattr_destroy) __gthrw_pthread_mutexattr_destroy __attribute__ ((__weakref__("pthread_mutexattr_destroy")));
# 236 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
static __typeof(pthread_key_create) __gthrw___pthread_key_create __attribute__ ((__weakref__("__pthread_key_create")));
# 246 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
static inline int
__gthread_active_p (void)
{
  static void *const __gthread_active_ptr
    = __extension__ (void *) &__gthrw___pthread_key_create;
  return __gthread_active_ptr != 0;
}
# 658 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
static inline int
__gthread_create (__gthread_t *__threadid, void *(*__func) (void*),
    void *__args)
{
  return __gthrw_pthread_create (__threadid, __null, __func, __args);
}

static inline int
__gthread_join (__gthread_t __threadid, void **__value_ptr)
{
  return __gthrw_pthread_join (__threadid, __value_ptr);
}

static inline int
__gthread_detach (__gthread_t __threadid)
{
  return __gthrw_pthread_detach (__threadid);
}

static inline int
__gthread_equal (__gthread_t __t1, __gthread_t __t2)
{
  return __gthrw_pthread_equal (__t1, __t2);
}

static inline __gthread_t
__gthread_self (void)
{
  return __gthrw_pthread_self ();
}

static inline int
__gthread_yield (void)
{
  return __gthrw_sched_yield ();
}

static inline int
__gthread_once (__gthread_once_t *__once, void (*__func) (void))
{
  if (__gthread_active_p ())
    return __gthrw_pthread_once (__once, __func);
  else
    return -1;
}

static inline int
__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
{
  return __gthrw_pthread_key_create (__key, __dtor);
}

static inline int
__gthread_key_delete (__gthread_key_t __key)
{
  return __gthrw_pthread_key_delete (__key);
}

static inline void *
__gthread_getspecific (__gthread_key_t __key)
{
  return __gthrw_pthread_getspecific (__key);
}

static inline int
__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
{
  return __gthrw_pthread_setspecific (__key, __ptr);
}

static inline void
__gthread_mutex_init_function (__gthread_mutex_t *__mutex)
{
  if (__gthread_active_p ())
    __gthrw_pthread_mutex_init (__mutex, __null);
}

static inline int
__gthread_mutex_destroy (__gthread_mutex_t *__mutex)
{
  if (__gthread_active_p ())
    return __gthrw_pthread_mutex_destroy (__mutex);
  else
    return 0;
}

static inline int
__gthread_mutex_lock (__gthread_mutex_t *__mutex)
{
  if (__gthread_active_p ())
    return __gthrw_pthread_mutex_lock (__mutex);
  else
    return 0;
}

static inline int
__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
{
  if (__gthread_active_p ())
    return __gthrw_pthread_mutex_trylock (__mutex);
  else
    return 0;
}


static inline int
__gthread_mutex_timedlock (__gthread_mutex_t *__mutex,
      const __gthread_time_t *__abs_timeout)
{
  if (__gthread_active_p ())
    return __gthrw_pthread_mutex_timedlock (__mutex, __abs_timeout);
  else
    return 0;
}


static inline int
__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
{
  if (__gthread_active_p ())
    return __gthrw_pthread_mutex_unlock (__mutex);
  else
    return 0;
}
# 807 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
static inline int
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
{
  return __gthread_mutex_lock (__mutex);
}

static inline int
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
{
  return __gthread_mutex_trylock (__mutex);
}


static inline int
__gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex,
         const __gthread_time_t *__abs_timeout)
{
  return __gthread_mutex_timedlock (__mutex, __abs_timeout);
}


static inline int
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
{
  return __gthread_mutex_unlock (__mutex);
}

static inline int
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex)
{
  return __gthread_mutex_destroy (__mutex);
}
# 849 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr-default.h" 3
static inline int
__gthread_cond_broadcast (__gthread_cond_t *__cond)
{
  return __gthrw_pthread_cond_broadcast (__cond);
}

static inline int
__gthread_cond_signal (__gthread_cond_t *__cond)
{
  return __gthrw_pthread_cond_signal (__cond);
}

static inline int
__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
{
  return __gthrw_pthread_cond_wait (__cond, __mutex);
}

static inline int
__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex,
     const __gthread_time_t *__abs_timeout)
{
  return __gthrw_pthread_cond_timedwait (__cond, __mutex, __abs_timeout);
}

static inline int
__gthread_cond_wait_recursive (__gthread_cond_t *__cond,
          __gthread_recursive_mutex_t *__mutex)
{
  return __gthread_cond_wait (__cond, __mutex);
}

static inline int
__gthread_cond_destroy (__gthread_cond_t* __cond)
{
  return __gthrw_pthread_cond_destroy (__cond);
}
# 149 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/gthr.h" 2 3


#pragma GCC visibility pop
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/atomic_word.h" 1 3
# 32 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/atomic_word.h" 3
typedef int _Atomic_word;
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 2 3

namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{







  static inline _Atomic_word
  __exchange_and_add(volatile _Atomic_word* __mem, int __val)
  { return __atomic_fetch_add(__mem, __val, 4); }

  static inline void
  __atomic_add(volatile _Atomic_word* __mem, int __val)
  { __atomic_fetch_add(__mem, __val, 4); }
# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/atomicity.h" 3
  static inline _Atomic_word
  __exchange_and_add_single(_Atomic_word* __mem, int __val)
  {
    _Atomic_word __result = *__mem;
    *__mem += __val;
    return __result;
  }

  static inline void
  __atomic_add_single(_Atomic_word* __mem, int __val)
  { *__mem += __val; }

  static inline _Atomic_word
  __attribute__ ((__unused__))
  __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
  {

    if (__gthread_active_p())
      return __exchange_and_add(__mem, __val);
    else
      return __exchange_and_add_single(__mem, __val);



  }

  static inline void
  __attribute__ ((__unused__))
  __atomic_add_dispatch(_Atomic_word* __mem, int __val)
  {

    if (__gthread_active_p())
      __atomic_add(__mem, __val);
    else
      __atomic_add_single(__mem, __val);



  }


}
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 3




# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 1 3
# 46 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 3
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{


  using std::size_t;
  using std::ptrdiff_t;
# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 3
  template<typename _Tp>
    class new_allocator
    {
    public:
      typedef size_t size_type;
      typedef ptrdiff_t difference_type;
      typedef _Tp* pointer;
      typedef const _Tp* const_pointer;
      typedef _Tp& reference;
      typedef const _Tp& const_reference;
      typedef _Tp value_type;

      template<typename _Tp1>
        struct rebind
        { typedef new_allocator<_Tp1> other; };




      typedef std::true_type propagate_on_container_move_assignment;


      new_allocator() noexcept { }

      new_allocator(const new_allocator&) noexcept { }

      template<typename _Tp1>
        new_allocator(const new_allocator<_Tp1>&) noexcept { }

      ~new_allocator() noexcept { }

      pointer
      address(reference __x) const noexcept
      { return std::__addressof(__x); }

      const_pointer
      address(const_reference __x) const noexcept
      { return std::__addressof(__x); }



      pointer
      allocate(size_type __n, const void* = 0)
      {
 if (__n > this->max_size())
   std::__throw_bad_alloc();

 return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
      }


      void
      deallocate(pointer __p, size_type)
      { ::operator delete(__p); }

      size_type
      max_size() const noexcept
      { return size_t(-1) / sizeof(_Tp); }


      template<typename _Up, typename... _Args>
        void
        construct(_Up* __p, _Args&&... __args)
 { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

      template<typename _Up>
        void
        destroy(_Up* __p) { __p->~_Up(); }
# 135 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/new_allocator.h" 3
    };

  template<typename _Tp>
    inline bool
    operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
    { return true; }

  template<typename _Tp>
    inline bool
    operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
    { return false; }


}
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 2 3


namespace std
{
# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/c++allocator.h" 3
  template<typename _Tp>
    using __allocator_base = __gnu_cxx::new_allocator<_Tp>;
}
# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 2 3
# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3
  template<>
    class allocator<void>
    {
    public:
      typedef size_t size_type;
      typedef ptrdiff_t difference_type;
      typedef void* pointer;
      typedef const void* const_pointer;
      typedef void value_type;

      template<typename _Tp1>
        struct rebind
        { typedef allocator<_Tp1> other; };




      typedef true_type propagate_on_container_move_assignment;

      typedef true_type is_always_equal;

      template<typename _Up, typename... _Args>
 void
 construct(_Up* __p, _Args&&... __args)
 { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

      template<typename _Up>
 void
 destroy(_Up* __p) { __p->~_Up(); }

    };
# 107 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/allocator.h" 3
  template<typename _Tp>
    class allocator: public __allocator_base<_Tp>
    {
   public:
      typedef size_t size_type;
      typedef ptrdiff_t difference_type;
      typedef _Tp* pointer;
      typedef const _Tp* const_pointer;
      typedef _Tp& reference;
      typedef const _Tp& const_reference;
      typedef _Tp value_type;

      template<typename _Tp1>
        struct rebind
        { typedef allocator<_Tp1> other; };




      typedef true_type propagate_on_container_move_assignment;

      typedef true_type is_always_equal;


      allocator() throw() { }

      allocator(const allocator& __a) throw()
      : __allocator_base<_Tp>(__a) { }

      template<typename _Tp1>
        allocator(const allocator<_Tp1>&) throw() { }

      ~allocator() throw() { }


    };

  template<typename _T1, typename _T2>
    inline bool
    operator==(const allocator<_T1>&, const allocator<_T2>&)
    noexcept
    { return true; }

  template<typename _Tp>
    inline bool
    operator==(const allocator<_Tp>&, const allocator<_Tp>&)
    noexcept
    { return true; }

  template<typename _T1, typename _T2>
    inline bool
    operator!=(const allocator<_T1>&, const allocator<_T2>&)
    noexcept
    { return false; }

  template<typename _Tp>
    inline bool
    operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
    noexcept
    { return false; }






  extern template class allocator<char>;
  extern template class allocator<wchar_t>;






  template<typename _Alloc, bool = __is_empty(_Alloc)>
    struct __alloc_swap
    { static void _S_do_it(_Alloc&, _Alloc&) noexcept { } };

  template<typename _Alloc>
    struct __alloc_swap<_Alloc, false>
    {
      static void
      _S_do_it(_Alloc& __one, _Alloc& __two) noexcept
      {

 if (__one != __two)
   swap(__one, __two);
      }
    };


  template<typename _Alloc, bool = __is_empty(_Alloc)>
    struct __alloc_neq
    {
      static bool
      _S_do_it(const _Alloc&, const _Alloc&)
      { return false; }
    };

  template<typename _Alloc>
    struct __alloc_neq<_Alloc, false>
    {
      static bool
      _S_do_it(const _Alloc& __one, const _Alloc& __two)
      { return __one != __two; }
    };


  template<typename _Tp, bool
    = __or_<is_copy_constructible<typename _Tp::value_type>,
            is_nothrow_move_constructible<typename _Tp::value_type>>::value>
    struct __shrink_to_fit_aux
    { static bool _S_do_it(_Tp&) noexcept { return false; } };

  template<typename _Tp>
    struct __shrink_to_fit_aux<_Tp, true>
    {
      static bool
      _S_do_it(_Tp& __c) noexcept
      {

 try
   {
     _Tp(__make_move_if_noexcept_iterator(__c.begin()),
  __make_move_if_noexcept_iterator(__c.end()),
  __c.get_allocator()).swap(__c);
     return true;
   }
 catch(...)
   { return false; }



      }
    };



}
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream_insert.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream_insert.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cxxabi_forced.h" 1 3
# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/cxxabi_forced.h" 3

#pragma GCC visibility push(default)


namespace __cxxabiv1
{







  class __forced_unwind
  {
    virtual ~__forced_unwind() throw();


    virtual void __pure_dummy() = 0;
  };
}


#pragma GCC visibility pop
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream_insert.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _CharT, typename _Traits>
    inline void
    __ostream_write(basic_ostream<_CharT, _Traits>& __out,
      const _CharT* __s, streamsize __n)
    {
      typedef basic_ostream<_CharT, _Traits> __ostream_type;
      typedef typename __ostream_type::ios_base __ios_base;

      const streamsize __put = __out.rdbuf()->sputn(__s, __n);
      if (__put != __n)
 __out.setstate(__ios_base::badbit);
    }

  template<typename _CharT, typename _Traits>
    inline void
    __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
    {
      typedef basic_ostream<_CharT, _Traits> __ostream_type;
      typedef typename __ostream_type::ios_base __ios_base;

      const _CharT __c = __out.fill();
      for (; __n > 0; --__n)
 {
   const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
   if (_Traits::eq_int_type(__put, _Traits::eof()))
     {
       __out.setstate(__ios_base::badbit);
       break;
     }
 }
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
       const _CharT* __s, streamsize __n)
    {
      typedef basic_ostream<_CharT, _Traits> __ostream_type;
      typedef typename __ostream_type::ios_base __ios_base;

      typename __ostream_type::sentry __cerb(__out);
      if (__cerb)
 {
   try
     {
       const streamsize __w = __out.width();
       if (__w > __n)
  {
    const bool __left = ((__out.flags()
     & __ios_base::adjustfield)
           == __ios_base::left);
    if (!__left)
      __ostream_fill(__out, __w - __n);
    if (__out.good())
      __ostream_write(__out, __s, __n);
    if (__left && __out.good())
      __ostream_fill(__out, __w - __n);
  }
       else
  __ostream_write(__out, __s, __n);
       __out.width(0);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       __out._M_setstate(__ios_base::badbit);
       throw;
     }
   catch(...)
     { __out._M_setstate(__ios_base::badbit); }
 }
      return __out;
    }




  extern template ostream& __ostream_insert(ostream&, const char*, streamsize);


  extern template wostream& __ostream_insert(wostream&, const wchar_t*,
          streamsize);




}
# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 1 3
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 104 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
  template<typename _Arg, typename _Result>
    struct unary_function
    {

      typedef _Arg argument_type;


      typedef _Result result_type;
    };




  template<typename _Arg1, typename _Arg2, typename _Result>
    struct binary_function
    {

      typedef _Arg1 first_argument_type;


      typedef _Arg2 second_argument_type;


      typedef _Result result_type;
    };
# 144 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
  struct __is_transparent;

  template<typename _Tp = void>
    struct plus;

  template<typename _Tp = void>
    struct minus;

  template<typename _Tp = void>
    struct multiplies;

  template<typename _Tp = void>
    struct divides;

  template<typename _Tp = void>
    struct modulus;

  template<typename _Tp = void>
    struct negate;



  template<typename _Tp>
    struct plus : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x + __y; }
    };


  template<typename _Tp>
    struct minus : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x - __y; }
    };


  template<typename _Tp>
    struct multiplies : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x * __y; }
    };


  template<typename _Tp>
    struct divides : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x / __y; }
    };


  template<typename _Tp>
    struct modulus : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x % __y; }
    };


  template<typename _Tp>
    struct negate : public unary_function<_Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x) const
      { return -__x; }
    };





  template<>
    struct plus<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct minus<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct multiplies<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct divides<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct modulus<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) % std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct negate<void>
    {
      template <typename _Tp>
 constexpr
 auto
 operator()(_Tp&& __t) const
 noexcept(noexcept(-std::forward<_Tp>(__t)))
 -> decltype(-std::forward<_Tp>(__t))
 { return -std::forward<_Tp>(__t); }

      typedef __is_transparent is_transparent;
    };
# 330 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
  template<typename _Tp = void>
    struct equal_to;

  template<typename _Tp = void>
    struct not_equal_to;

  template<typename _Tp = void>
    struct greater;

  template<typename _Tp = void>
    struct less;

  template<typename _Tp = void>
    struct greater_equal;

  template<typename _Tp = void>
    struct less_equal;



  template<typename _Tp>
    struct equal_to : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x == __y; }
    };


  template<typename _Tp>
    struct not_equal_to : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x != __y; }
    };


  template<typename _Tp>
    struct greater : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x > __y; }
    };


  template<typename _Tp>
    struct less : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x < __y; }
    };


  template<typename _Tp>
    struct greater_equal : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x >= __y; }
    };


  template<typename _Tp>
    struct less_equal : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x <= __y; }
    };



  template<>
    struct equal_to<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct not_equal_to<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct greater<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct less<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct greater_equal<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct less_equal<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };
# 512 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
  template<typename _Tp = void>
    struct logical_and;

  template<typename _Tp = void>
    struct logical_or;

  template<typename _Tp = void>
    struct logical_not;



  template<typename _Tp>
    struct logical_and : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x && __y; }
    };


  template<typename _Tp>
    struct logical_or : public binary_function<_Tp, _Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x || __y; }
    };


  template<typename _Tp>
    struct logical_not : public unary_function<_Tp, bool>
    {
      constexpr
      bool
      operator()(const _Tp& __x) const
      { return !__x; }
    };



  template<>
    struct logical_and<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct logical_or<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };


  template<>
    struct logical_not<void>
    {
      template <typename _Tp>
 constexpr
 auto
 operator()(_Tp&& __t) const
 noexcept(noexcept(!std::forward<_Tp>(__t)))
 -> decltype(!std::forward<_Tp>(__t))
 { return !std::forward<_Tp>(__t); }

      typedef __is_transparent is_transparent;
    };




  template<typename _Tp = void>
    struct bit_and;

  template<typename _Tp = void>
    struct bit_or;

  template<typename _Tp = void>
    struct bit_xor;

  template<typename _Tp = void>
    struct bit_not;




  template<typename _Tp>
    struct bit_and : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x & __y; }
    };

  template<typename _Tp>
    struct bit_or : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x | __y; }
    };

  template<typename _Tp>
    struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
    {
      constexpr
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x ^ __y; }
    };

  template<typename _Tp>
    struct bit_not : public unary_function<_Tp, _Tp>
    {
    constexpr
      _Tp
      operator()(const _Tp& __x) const
      { return ~__x; }
    };


  template <>
    struct bit_and<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };

  template <>
    struct bit_or<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };

  template <>
    struct bit_xor<void>
    {
      template <typename _Tp, typename _Up>
 constexpr
 auto
 operator()(_Tp&& __t, _Up&& __u) const
 noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)))
 -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))
 { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); }

      typedef __is_transparent is_transparent;
    };

  template <>
    struct bit_not<void>
    {
      template <typename _Tp>
 constexpr
 auto
 operator()(_Tp&& __t) const
 noexcept(noexcept(~std::forward<_Tp>(__t)))
 -> decltype(~std::forward<_Tp>(__t))
 { return ~std::forward<_Tp>(__t); }

      typedef __is_transparent is_transparent;
    };
# 740 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
  template<typename _Predicate>
    class unary_negate
    : public unary_function<typename _Predicate::argument_type, bool>
    {
    protected:
      _Predicate _M_pred;

    public:
      constexpr
      explicit
      unary_negate(const _Predicate& __x) : _M_pred(__x) { }

      constexpr
      bool
      operator()(const typename _Predicate::argument_type& __x) const
      { return !_M_pred(__x); }
    };


  template<typename _Predicate>
    constexpr
    inline unary_negate<_Predicate>
    not1(const _Predicate& __pred)
    { return unary_negate<_Predicate>(__pred); }


  template<typename _Predicate>
    class binary_negate
    : public binary_function<typename _Predicate::first_argument_type,
        typename _Predicate::second_argument_type, bool>
    {
    protected:
      _Predicate _M_pred;

    public:
      constexpr
      explicit
      binary_negate(const _Predicate& __x) : _M_pred(__x) { }

      constexpr
      bool
      operator()(const typename _Predicate::first_argument_type& __x,
   const typename _Predicate::second_argument_type& __y) const
      { return !_M_pred(__x, __y); }
    };


  template<typename _Predicate>
    constexpr
    inline binary_negate<_Predicate>
    not2(const _Predicate& __pred)
    { return binary_negate<_Predicate>(__pred); }
# 817 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
  template<typename _Arg, typename _Result>
    class pointer_to_unary_function : public unary_function<_Arg, _Result>
    {
    protected:
      _Result (*_M_ptr)(_Arg);

    public:
      pointer_to_unary_function() { }

      explicit
      pointer_to_unary_function(_Result (*__x)(_Arg))
      : _M_ptr(__x) { }

      _Result
      operator()(_Arg __x) const
      { return _M_ptr(__x); }
    };


  template<typename _Arg, typename _Result>
    inline pointer_to_unary_function<_Arg, _Result>
    ptr_fun(_Result (*__x)(_Arg))
    { return pointer_to_unary_function<_Arg, _Result>(__x); }


  template<typename _Arg1, typename _Arg2, typename _Result>
    class pointer_to_binary_function
    : public binary_function<_Arg1, _Arg2, _Result>
    {
    protected:
      _Result (*_M_ptr)(_Arg1, _Arg2);

    public:
      pointer_to_binary_function() { }

      explicit
      pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
      : _M_ptr(__x) { }

      _Result
      operator()(_Arg1 __x, _Arg2 __y) const
      { return _M_ptr(__x, __y); }
    };


  template<typename _Arg1, typename _Arg2, typename _Result>
    inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
    ptr_fun(_Result (*__x)(_Arg1, _Arg2))
    { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }


  template<typename _Tp>
    struct _Identity
    : public unary_function<_Tp,_Tp>
    {
      _Tp&
      operator()(_Tp& __x) const
      { return __x; }

      const _Tp&
      operator()(const _Tp& __x) const
      { return __x; }
    };

  template<typename _Pair>
    struct _Select1st
    : public unary_function<_Pair, typename _Pair::first_type>
    {
      typename _Pair::first_type&
      operator()(_Pair& __x) const
      { return __x.first; }

      const typename _Pair::first_type&
      operator()(const _Pair& __x) const
      { return __x.first; }


      template<typename _Pair2>
        typename _Pair2::first_type&
        operator()(_Pair2& __x) const
        { return __x.first; }

      template<typename _Pair2>
        const typename _Pair2::first_type&
        operator()(const _Pair2& __x) const
        { return __x.first; }

    };

  template<typename _Pair>
    struct _Select2nd
    : public unary_function<_Pair, typename _Pair::second_type>
    {
      typename _Pair::second_type&
      operator()(_Pair& __x) const
      { return __x.second; }

      const typename _Pair::second_type&
      operator()(const _Pair& __x) const
      { return __x.second; }
    };
# 937 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 3
  template<typename _Ret, typename _Tp>
    class mem_fun_t : public unary_function<_Tp*, _Ret>
    {
    public:
      explicit
      mem_fun_t(_Ret (_Tp::*__pf)())
      : _M_f(__pf) { }

      _Ret
      operator()(_Tp* __p) const
      { return (__p->*_M_f)(); }

    private:
      _Ret (_Tp::*_M_f)();
    };



  template<typename _Ret, typename _Tp>
    class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
    {
    public:
      explicit
      const_mem_fun_t(_Ret (_Tp::*__pf)() const)
      : _M_f(__pf) { }

      _Ret
      operator()(const _Tp* __p) const
      { return (__p->*_M_f)(); }

    private:
      _Ret (_Tp::*_M_f)() const;
    };



  template<typename _Ret, typename _Tp>
    class mem_fun_ref_t : public unary_function<_Tp, _Ret>
    {
    public:
      explicit
      mem_fun_ref_t(_Ret (_Tp::*__pf)())
      : _M_f(__pf) { }

      _Ret
      operator()(_Tp& __r) const
      { return (__r.*_M_f)(); }

    private:
      _Ret (_Tp::*_M_f)();
  };



  template<typename _Ret, typename _Tp>
    class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
    {
    public:
      explicit
      const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
      : _M_f(__pf) { }

      _Ret
      operator()(const _Tp& __r) const
      { return (__r.*_M_f)(); }

    private:
      _Ret (_Tp::*_M_f)() const;
    };



  template<typename _Ret, typename _Tp, typename _Arg>
    class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
    {
    public:
      explicit
      mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
      : _M_f(__pf) { }

      _Ret
      operator()(_Tp* __p, _Arg __x) const
      { return (__p->*_M_f)(__x); }

    private:
      _Ret (_Tp::*_M_f)(_Arg);
    };



  template<typename _Ret, typename _Tp, typename _Arg>
    class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
    {
    public:
      explicit
      const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
      : _M_f(__pf) { }

      _Ret
      operator()(const _Tp* __p, _Arg __x) const
      { return (__p->*_M_f)(__x); }

    private:
      _Ret (_Tp::*_M_f)(_Arg) const;
    };



  template<typename _Ret, typename _Tp, typename _Arg>
    class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
    {
    public:
      explicit
      mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
      : _M_f(__pf) { }

      _Ret
      operator()(_Tp& __r, _Arg __x) const
      { return (__r.*_M_f)(__x); }

    private:
      _Ret (_Tp::*_M_f)(_Arg);
    };



  template<typename _Ret, typename _Tp, typename _Arg>
    class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
    {
    public:
      explicit
      const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
      : _M_f(__pf) { }

      _Ret
      operator()(const _Tp& __r, _Arg __x) const
      { return (__r.*_M_f)(__x); }

    private:
      _Ret (_Tp::*_M_f)(_Arg) const;
    };



  template<typename _Ret, typename _Tp>
    inline mem_fun_t<_Ret, _Tp>
    mem_fun(_Ret (_Tp::*__f)())
    { return mem_fun_t<_Ret, _Tp>(__f); }

  template<typename _Ret, typename _Tp>
    inline const_mem_fun_t<_Ret, _Tp>
    mem_fun(_Ret (_Tp::*__f)() const)
    { return const_mem_fun_t<_Ret, _Tp>(__f); }

  template<typename _Ret, typename _Tp>
    inline mem_fun_ref_t<_Ret, _Tp>
    mem_fun_ref(_Ret (_Tp::*__f)())
    { return mem_fun_ref_t<_Ret, _Tp>(__f); }

  template<typename _Ret, typename _Tp>
    inline const_mem_fun_ref_t<_Ret, _Tp>
    mem_fun_ref(_Ret (_Tp::*__f)() const)
    { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }

  template<typename _Ret, typename _Tp, typename _Arg>
    inline mem_fun1_t<_Ret, _Tp, _Arg>
    mem_fun(_Ret (_Tp::*__f)(_Arg))
    { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }

  template<typename _Ret, typename _Tp, typename _Arg>
    inline const_mem_fun1_t<_Ret, _Tp, _Arg>
    mem_fun(_Ret (_Tp::*__f)(_Arg) const)
    { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }

  template<typename _Ret, typename _Tp, typename _Arg>
    inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
    mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
    { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }

  template<typename _Ret, typename _Tp, typename _Arg>
    inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
    mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
    { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }




}



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/backward/binders.h" 1 3
# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/backward/binders.h" 3
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

namespace std __attribute__ ((__visibility__ ("default")))
{
# 107 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/backward/binders.h" 3
  template<typename _Operation>
    class binder1st
    : public unary_function<typename _Operation::second_argument_type,
       typename _Operation::result_type>
    {
    protected:
      _Operation op;
      typename _Operation::first_argument_type value;

    public:
      binder1st(const _Operation& __x,
  const typename _Operation::first_argument_type& __y)
      : op(__x), value(__y) { }

      typename _Operation::result_type
      operator()(const typename _Operation::second_argument_type& __x) const
      { return op(value, __x); }



      typename _Operation::result_type
      operator()(typename _Operation::second_argument_type& __x) const
      { return op(value, __x); }
    } __attribute__ ((__deprecated__));


  template<typename _Operation, typename _Tp>
    inline binder1st<_Operation>
    bind1st(const _Operation& __fn, const _Tp& __x)
    {
      typedef typename _Operation::first_argument_type _Arg1_type;
      return binder1st<_Operation>(__fn, _Arg1_type(__x));
    }


  template<typename _Operation>
    class binder2nd
    : public unary_function<typename _Operation::first_argument_type,
       typename _Operation::result_type>
    {
    protected:
      _Operation op;
      typename _Operation::second_argument_type value;

    public:
      binder2nd(const _Operation& __x,
  const typename _Operation::second_argument_type& __y)
      : op(__x), value(__y) { }

      typename _Operation::result_type
      operator()(const typename _Operation::first_argument_type& __x) const
      { return op(__x, value); }



      typename _Operation::result_type
      operator()(typename _Operation::first_argument_type& __x) const
      { return op(__x, value); }
    } __attribute__ ((__deprecated__));


  template<typename _Operation, typename _Tp>
    inline binder2nd<_Operation>
    bind2nd(const _Operation& __fn, const _Tp& __x)
    {
      typedef typename _Operation::second_argument_type _Arg2_type;
      return binder2nd<_Operation>(__fn, _Arg2_type(__x));
    }



}

#pragma GCC diagnostic pop
# 1128 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h" 2 3
# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/initializer_list" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/initializer_list" 3





#pragma GCC visibility push(default)



namespace std
{

  template<class _E>
    class initializer_list
    {
    public:
      typedef _E value_type;
      typedef const _E& reference;
      typedef const _E& const_reference;
      typedef size_t size_type;
      typedef const _E* iterator;
      typedef const _E* const_iterator;

    private:
      iterator _M_array;
      size_type _M_len;


      constexpr initializer_list(const_iterator __a, size_type __l)
      : _M_array(__a), _M_len(__l) { }

    public:
      constexpr initializer_list() noexcept
      : _M_array(0), _M_len(0) { }


      constexpr size_type
      size() const noexcept { return _M_len; }


      constexpr const_iterator
      begin() const noexcept { return _M_array; }


      constexpr const_iterator
      end() const noexcept { return begin() + size(); }
    };






  template<class _Tp>
    constexpr const _Tp*
    begin(initializer_list<_Tp> __ils) noexcept
    { return __ils.begin(); }






  template<class _Tp>
    constexpr const _Tp*
    end(initializer_list<_Tp> __ils) noexcept
    { return __ils.end(); }
}

#pragma GCC visibility pop
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 2 3
namespace std __attribute__ ((__visibility__ ("default")))
{







  template<typename _Container>
    inline auto
    begin(_Container& __cont) -> decltype(__cont.begin())
    { return __cont.begin(); }






  template<typename _Container>
    inline auto
    begin(const _Container& __cont) -> decltype(__cont.begin())
    { return __cont.begin(); }






  template<typename _Container>
    inline auto
    end(_Container& __cont) -> decltype(__cont.end())
    { return __cont.end(); }






  template<typename _Container>
    inline auto
    end(const _Container& __cont) -> decltype(__cont.end())
    { return __cont.end(); }





  template<typename _Tp, size_t _Nm>
    inline constexpr _Tp*
    begin(_Tp (&__arr)[_Nm])
    { return __arr; }






  template<typename _Tp, size_t _Nm>
    inline constexpr _Tp*
    end(_Tp (&__arr)[_Nm])
    { return __arr + _Nm; }



  template<typename _Tp> class valarray;

  template<typename _Tp> _Tp* begin(valarray<_Tp>&);
  template<typename _Tp> const _Tp* begin(const valarray<_Tp>&);
  template<typename _Tp> _Tp* end(valarray<_Tp>&);
  template<typename _Tp> const _Tp* end(const valarray<_Tp>&);






  template<typename _Container>
    inline constexpr auto
    cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
      -> decltype(std::begin(__cont))
    { return std::begin(__cont); }






  template<typename _Container>
    inline constexpr auto
    cend(const _Container& __cont) noexcept(noexcept(std::end(__cont)))
      -> decltype(std::end(__cont))
    { return std::end(__cont); }






  template<typename _Container>
    inline auto
    rbegin(_Container& __cont) -> decltype(__cont.rbegin())
    { return __cont.rbegin(); }






  template<typename _Container>
    inline auto
    rbegin(const _Container& __cont) -> decltype(__cont.rbegin())
    { return __cont.rbegin(); }






  template<typename _Container>
    inline auto
    rend(_Container& __cont) -> decltype(__cont.rend())
    { return __cont.rend(); }






  template<typename _Container>
    inline auto
    rend(const _Container& __cont) -> decltype(__cont.rend())
    { return __cont.rend(); }






  template<typename _Tp, size_t _Nm>
    inline reverse_iterator<_Tp*>
    rbegin(_Tp (&__arr)[_Nm])
    { return reverse_iterator<_Tp*>(__arr + _Nm); }






  template<typename _Tp, size_t _Nm>
    inline reverse_iterator<_Tp*>
    rend(_Tp (&__arr)[_Nm])
    { return reverse_iterator<_Tp*>(__arr); }






  template<typename _Tp>
    inline reverse_iterator<const _Tp*>
    rbegin(initializer_list<_Tp> __il)
    { return reverse_iterator<const _Tp*>(__il.end()); }






  template<typename _Tp>
    inline reverse_iterator<const _Tp*>
    rend(initializer_list<_Tp> __il)
    { return reverse_iterator<const _Tp*>(__il.begin()); }






  template<typename _Container>
    inline auto
    crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont))
    { return std::rbegin(__cont); }






  template<typename _Container>
    inline auto
    crend(const _Container& __cont) -> decltype(std::rend(__cont))
    { return std::rend(__cont); }
# 320 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/range_access.h" 3
}
# 52 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 3



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 1 3
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  struct __allocator_traits_base
  {
    template<typename _Alloc, typename _Up>
      using __rebind = typename _Alloc::template rebind<_Up>::other;

  protected:
    template<typename _Tp>
      using __pointer = typename _Tp::pointer;
    template<typename _Tp>
      using __c_pointer = typename _Tp::const_pointer;
    template<typename _Tp>
      using __v_pointer = typename _Tp::void_pointer;
    template<typename _Tp>
      using __cv_pointer = typename _Tp::const_void_pointer;
    template<typename _Tp>
      using __diff_type = typename _Tp::difference_type;
    template<typename _Tp>
      using __size_type = typename _Tp::size_type;
    template<typename _Tp>
      using __pocca = typename _Tp::propagate_on_container_copy_assignment;
    template<typename _Tp>
      using __pocma = typename _Tp::propagate_on_container_move_assignment;
    template<typename _Tp>
      using __pocs = typename _Tp::propagate_on_container_swap;
    template<typename _Tp>
      using __equal = typename _Tp::is_always_equal;
  };

  template<typename _Alloc, typename _Up>
    using __alloc_rebind = __detected_or_t_<__replace_first_arg_t,
         __allocator_traits_base::__rebind,
         _Alloc, _Up>;





  template<typename _Alloc>
    struct allocator_traits : __allocator_traits_base
    {

      typedef _Alloc allocator_type;

      typedef typename _Alloc::value_type value_type;






      using pointer = __detected_or_t<value_type*, __pointer, _Alloc>;







      using const_pointer
 = __detected_or_t<__ptr_rebind<pointer, const value_type>,
     __c_pointer, _Alloc>;







      using void_pointer
 = __detected_or_t<__ptr_rebind<pointer, void>, __v_pointer, _Alloc>;







      using const_void_pointer
 = __detected_or_t<__ptr_rebind<pointer, const void>, __cv_pointer,
     _Alloc>;







      using difference_type
 = __detected_or_t<typename pointer_traits<pointer>::difference_type,
     __diff_type, _Alloc>;







      using size_type
 = __detected_or_t<typename make_unsigned<difference_type>::type,
     __size_type, _Alloc>;







      using propagate_on_container_copy_assignment
 = __detected_or_t<false_type, __pocca, _Alloc>;







      using propagate_on_container_move_assignment
 = __detected_or_t<false_type, __pocma, _Alloc>;







      using propagate_on_container_swap
 = __detected_or_t<false_type, __pocs, _Alloc>;







      using is_always_equal
 = __detected_or_t<typename is_empty<_Alloc>::type, __equal, _Alloc>;

      template<typename _Tp>
 using rebind_alloc = __alloc_rebind<_Alloc, _Tp>;
      template<typename _Tp>
 using rebind_traits = allocator_traits<rebind_alloc<_Tp>>;

      static_assert(!is_same<rebind_alloc<value_type>, __undefined>::value,
   "allocator defines rebind or is like Alloc<T, Args>");

    private:
      template<typename _Alloc2>
 static auto
 _S_allocate(_Alloc2& __a, size_type __n, const_void_pointer __hint, int)
 -> decltype(__a.allocate(__n, __hint))
 { return __a.allocate(__n, __hint); }

      template<typename _Alloc2>
 static pointer
 _S_allocate(_Alloc2& __a, size_type __n, const_void_pointer, ...)
 { return __a.allocate(__n); }

      template<typename _Tp, typename... _Args>
 struct __construct_helper
 {
   template<typename _Alloc2,
     typename = decltype(std::declval<_Alloc2*>()->construct(
    std::declval<_Tp*>(), std::declval<_Args>()...))>
     static true_type __test(int);

   template<typename>
     static false_type __test(...);

   using type = decltype(__test<_Alloc>(0));
 };

      template<typename _Tp, typename... _Args>
 using __has_construct
   = typename __construct_helper<_Tp, _Args...>::type;

      template<typename _Tp, typename... _Args>
 static _Require<__has_construct<_Tp, _Args...>>
 _S_construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
 { __a.construct(__p, std::forward<_Args>(__args)...); }

      template<typename _Tp, typename... _Args>
 static
 _Require<__and_<__not_<__has_construct<_Tp, _Args...>>,
          is_constructible<_Tp, _Args...>>>
 _S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
 { ::new((void*)__p) _Tp(std::forward<_Args>(__args)...); }

      template<typename _Alloc2, typename _Tp>
 static auto
 _S_destroy(_Alloc2& __a, _Tp* __p, int)
 -> decltype(__a.destroy(__p))
 { __a.destroy(__p); }

      template<typename _Alloc2, typename _Tp>
 static void
 _S_destroy(_Alloc2&, _Tp* __p, ...)
 { __p->~_Tp(); }

      template<typename _Alloc2>
 static auto
 _S_max_size(_Alloc2& __a, int)
 -> decltype(__a.max_size())
 { return __a.max_size(); }

      template<typename _Alloc2>
 static size_type
 _S_max_size(_Alloc2&, ...)
 {


   return __gnu_cxx::__numeric_traits<size_type>::__max
     / sizeof(value_type);
 }

      template<typename _Alloc2>
 static auto
 _S_select(_Alloc2& __a, int)
 -> decltype(__a.select_on_container_copy_construction())
 { return __a.select_on_container_copy_construction(); }

      template<typename _Alloc2>
 static _Alloc2
 _S_select(_Alloc2& __a, ...)
 { return __a; }

    public:
# 279 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static pointer
      allocate(_Alloc& __a, size_type __n)
      { return __a.allocate(__n); }
# 294 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static pointer
      allocate(_Alloc& __a, size_type __n, const_void_pointer __hint)
      { return _S_allocate(__a, __n, __hint, 0); }
# 306 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static void
      deallocate(_Alloc& __a, pointer __p, size_type __n)
      { __a.deallocate(__p, __n); }
# 321 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      template<typename _Tp, typename... _Args>
 static auto construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
 -> decltype(_S_construct(__a, __p, std::forward<_Args>(__args)...))
 { _S_construct(__a, __p, std::forward<_Args>(__args)...); }
# 334 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      template<typename _Tp>
 static void destroy(_Alloc& __a, _Tp* __p)
 { _S_destroy(__a, __p, 0); }
# 346 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static size_type max_size(const _Alloc& __a) noexcept
      { return _S_max_size(__a, 0); }
# 357 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static _Alloc
      select_on_container_copy_construction(const _Alloc& __rhs)
      { return _S_select(__rhs, 0); }
    };


  template<typename _Tp>
    struct allocator_traits<allocator<_Tp>>
    {

      using allocator_type = allocator<_Tp>;

      using value_type = _Tp;


      using pointer = _Tp*;


      using const_pointer = const _Tp*;


      using void_pointer = void*;


      using const_void_pointer = const void*;


      using difference_type = std::ptrdiff_t;


      using size_type = std::size_t;


      using propagate_on_container_copy_assignment = false_type;


      using propagate_on_container_move_assignment = true_type;


      using propagate_on_container_swap = false_type;


      using is_always_equal = true_type;

      template<typename _Up>
 using rebind_alloc = allocator<_Up>;

      template<typename _Up>
 using rebind_traits = allocator_traits<allocator<_Up>>;
# 414 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static pointer
      allocate(allocator_type& __a, size_type __n)
      { return __a.allocate(__n); }
# 428 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static pointer
      allocate(allocator_type& __a, size_type __n, const_void_pointer __hint)
      { return __a.allocate(__n, __hint); }
# 440 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      static void
      deallocate(allocator_type& __a, pointer __p, size_type __n)
      { __a.deallocate(__p, __n); }
# 452 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      template<typename _Up, typename... _Args>
 static void
 construct(allocator_type& __a, _Up* __p, _Args&&... __args)
 { __a.construct(__p, std::forward<_Args>(__args)...); }
# 464 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/alloc_traits.h" 3
      template<typename _Up>
 static void
 destroy(allocator_type& __a, _Up* __p)
 { __a.destroy(__p); }






      static size_type
      max_size(const allocator_type& __a) noexcept
      { return __a.max_size(); }






      static allocator_type
      select_on_container_copy_construction(const allocator_type& __rhs)
      { return __rhs; }
    };


  template<typename _Alloc>
    inline void
    __do_alloc_on_copy(_Alloc& __one, const _Alloc& __two, true_type)
    { __one = __two; }

  template<typename _Alloc>
    inline void
    __do_alloc_on_copy(_Alloc&, const _Alloc&, false_type)
    { }

  template<typename _Alloc>
    inline void __alloc_on_copy(_Alloc& __one, const _Alloc& __two)
    {
      typedef allocator_traits<_Alloc> __traits;
      typedef typename __traits::propagate_on_container_copy_assignment __pocca;
      __do_alloc_on_copy(__one, __two, __pocca());
    }

  template<typename _Alloc>
    inline _Alloc __alloc_on_copy(const _Alloc& __a)
    {
      typedef allocator_traits<_Alloc> __traits;
      return __traits::select_on_container_copy_construction(__a);
    }

  template<typename _Alloc>
    inline void __do_alloc_on_move(_Alloc& __one, _Alloc& __two, true_type)
    { __one = std::move(__two); }

  template<typename _Alloc>
    inline void __do_alloc_on_move(_Alloc&, _Alloc&, false_type)
    { }

  template<typename _Alloc>
    inline void __alloc_on_move(_Alloc& __one, _Alloc& __two)
    {
      typedef allocator_traits<_Alloc> __traits;
      typedef typename __traits::propagate_on_container_move_assignment __pocma;
      __do_alloc_on_move(__one, __two, __pocma());
    }

  template<typename _Alloc>
    inline void __do_alloc_on_swap(_Alloc& __one, _Alloc& __two, true_type)
    {
      using std::swap;
      swap(__one, __two);
    }

  template<typename _Alloc>
    inline void __do_alloc_on_swap(_Alloc&, _Alloc&, false_type)
    { }

  template<typename _Alloc>
    inline void __alloc_on_swap(_Alloc& __one, _Alloc& __two)
    {
      typedef allocator_traits<_Alloc> __traits;
      typedef typename __traits::propagate_on_container_swap __pocs;
      __do_alloc_on_swap(__one, __two, __pocs());
    }

  template<typename _Alloc>
    class __is_copy_insertable_impl
    {
      typedef allocator_traits<_Alloc> _Traits;

      template<typename _Up, typename
        = decltype(_Traits::construct(std::declval<_Alloc&>(),
          std::declval<_Up*>(),
          std::declval<const _Up&>()))>
 static true_type
 _M_select(int);

      template<typename _Up>
 static false_type
 _M_select(...);

    public:
      typedef decltype(_M_select<typename _Alloc::value_type>(0)) type;
    };


  template<typename _Alloc>
    struct __is_copy_insertable
    : __is_copy_insertable_impl<_Alloc>::type
    { };


  template<typename _Tp>
    struct __is_copy_insertable<allocator<_Tp>>
    : is_copy_constructible<_Tp>
    { };


}
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 2 3




namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{






template<typename _Alloc>
  struct __alloc_traits

  : std::allocator_traits<_Alloc>

  {
    typedef _Alloc allocator_type;

    typedef std::allocator_traits<_Alloc> _Base_type;
    typedef typename _Base_type::value_type value_type;
    typedef typename _Base_type::pointer pointer;
    typedef typename _Base_type::const_pointer const_pointer;
    typedef typename _Base_type::size_type size_type;
    typedef typename _Base_type::difference_type difference_type;

    typedef value_type& reference;
    typedef const value_type& const_reference;
    using _Base_type::allocate;
    using _Base_type::deallocate;
    using _Base_type::construct;
    using _Base_type::destroy;
    using _Base_type::max_size;

  private:
    template<typename _Ptr>
      using __is_custom_pointer
 = std::__and_<std::is_same<pointer, _Ptr>,
        std::__not_<std::is_pointer<_Ptr>>>;

  public:

    template<typename _Ptr, typename... _Args>
      static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
      construct(_Alloc& __a, _Ptr __p, _Args&&... __args)
      {
 _Base_type::construct(__a, std::addressof(*__p),
         std::forward<_Args>(__args)...);
      }


    template<typename _Ptr>
      static typename std::enable_if<__is_custom_pointer<_Ptr>::value>::type
      destroy(_Alloc& __a, _Ptr __p)
      { _Base_type::destroy(__a, std::addressof(*__p)); }

    static _Alloc _S_select_on_copy(const _Alloc& __a)
    { return _Base_type::select_on_container_copy_construction(__a); }

    static void _S_on_swap(_Alloc& __a, _Alloc& __b)
    { std::__alloc_on_swap(__a, __b); }

    static constexpr bool _S_propagate_on_copy_assign()
    { return _Base_type::propagate_on_container_copy_assignment::value; }

    static constexpr bool _S_propagate_on_move_assign()
    { return _Base_type::propagate_on_container_move_assignment::value; }

    static constexpr bool _S_propagate_on_swap()
    { return _Base_type::propagate_on_container_swap::value; }

    static constexpr bool _S_always_equal()
    { return _Base_type::is_always_equal::value; }

    static constexpr bool _S_nothrow_move()
    { return _S_propagate_on_move_assign() || _S_always_equal(); }

    template<typename _Tp>
      struct rebind
      { typedef typename _Base_type::template rebind_alloc<_Tp> other; };
# 158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/alloc_traits.h" 3
  };


}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 2 3






namespace std __attribute__ ((__visibility__ ("default")))
{



namespace __cxx11 {
# 71 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    class basic_string
    {
      typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
 rebind<_CharT>::other _Char_alloc_type;
      typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits;


    public:
      typedef _Traits traits_type;
      typedef typename _Traits::char_type value_type;
      typedef _Char_alloc_type allocator_type;
      typedef typename _Alloc_traits::size_type size_type;
      typedef typename _Alloc_traits::difference_type difference_type;
      typedef typename _Alloc_traits::reference reference;
      typedef typename _Alloc_traits::const_reference const_reference;
      typedef typename _Alloc_traits::pointer pointer;
      typedef typename _Alloc_traits::const_pointer const_pointer;
      typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
      typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
       const_iterator;
      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
      typedef std::reverse_iterator<iterator> reverse_iterator;


      static const size_type npos = static_cast<size_type>(-1);

    private:




      typedef const_iterator __const_iterator;



      struct _Alloc_hider : allocator_type
      {
 _Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
 : allocator_type(__a), _M_p(__dat) { }

 pointer _M_p;
      };

      _Alloc_hider _M_dataplus;
      size_type _M_string_length;

      enum { _S_local_capacity = 15 / sizeof(_CharT) };

      union
      {
 _CharT _M_local_buf[_S_local_capacity + 1];
 size_type _M_allocated_capacity;
      };

      void
      _M_data(pointer __p)
      { _M_dataplus._M_p = __p; }

      void
      _M_length(size_type __length)
      { _M_string_length = __length; }

      pointer
      _M_data() const
      { return _M_dataplus._M_p; }

      pointer
      _M_local_data()
      {

 return std::pointer_traits<pointer>::pointer_to(*_M_local_buf);



      }

      const_pointer
      _M_local_data() const
      {

 return std::pointer_traits<const_pointer>::pointer_to(*_M_local_buf);



      }

      void
      _M_capacity(size_type __capacity)
      { _M_allocated_capacity = __capacity; }

      void
      _M_set_length(size_type __n)
      {
 _M_length(__n);
 traits_type::assign(_M_data()[__n], _CharT());
      }

      bool
      _M_is_local() const
      { return _M_data() == _M_local_data(); }


      pointer
      _M_create(size_type&, size_type);

      void
      _M_dispose()
      {
 if (!_M_is_local())
   _M_destroy(_M_allocated_capacity);
      }

      void
      _M_destroy(size_type __size) throw()
      { _Alloc_traits::deallocate(_M_get_allocator(), _M_data(), __size + 1); }



      template<typename _InIterator>
        void
        _M_construct_aux(_InIterator __beg, _InIterator __end,
    std::__false_type)
 {
          typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
          _M_construct(__beg, __end, _Tag());
 }



      template<typename _Integer>
        void
        _M_construct_aux(_Integer __beg, _Integer __end, std::__true_type)
 { _M_construct_aux_2(static_cast<size_type>(__beg), __end); }

      void
      _M_construct_aux_2(size_type __req, _CharT __c)
      { _M_construct(__req, __c); }

      template<typename _InIterator>
        void
        _M_construct(_InIterator __beg, _InIterator __end)
 {
   typedef typename std::__is_integer<_InIterator>::__type _Integral;
   _M_construct_aux(__beg, __end, _Integral());
        }


      template<typename _InIterator>
        void
        _M_construct(_InIterator __beg, _InIterator __end,
       std::input_iterator_tag);



      template<typename _FwdIterator>
        void
        _M_construct(_FwdIterator __beg, _FwdIterator __end,
       std::forward_iterator_tag);

      void
      _M_construct(size_type __req, _CharT __c);

      allocator_type&
      _M_get_allocator()
      { return _M_dataplus; }

      const allocator_type&
      _M_get_allocator() const
      { return _M_dataplus; }

    private:
# 258 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      _M_check(size_type __pos, const char* __s) const
      {
 if (__pos > this->size())
   __throw_out_of_range_fmt(("%s: __pos (which is %zu) > " "this->size() (which is %zu)"),

       __s, __pos, this->size());
 return __pos;
      }

      void
      _M_check_length(size_type __n1, size_type __n2, const char* __s) const
      {
 if (this->max_size() - (this->size() - __n1) < __n2)
   __throw_length_error((__s));
      }



      size_type
      _M_limit(size_type __pos, size_type __off) const noexcept
      {
 const bool __testoff = __off < this->size() - __pos;
 return __testoff ? __off : this->size() - __pos;
      }


      bool
      _M_disjunct(const _CharT* __s) const noexcept
      {
 return (less<const _CharT*>()(__s, _M_data())
  || less<const _CharT*>()(_M_data() + this->size(), __s));
      }



      static void
      _S_copy(_CharT* __d, const _CharT* __s, size_type __n)
      {
 if (__n == 1)
   traits_type::assign(*__d, *__s);
 else
   traits_type::copy(__d, __s, __n);
      }

      static void
      _S_move(_CharT* __d, const _CharT* __s, size_type __n)
      {
 if (__n == 1)
   traits_type::assign(*__d, *__s);
 else
   traits_type::move(__d, __s, __n);
      }

      static void
      _S_assign(_CharT* __d, size_type __n, _CharT __c)
      {
 if (__n == 1)
   traits_type::assign(*__d, __c);
 else
   traits_type::assign(__d, __n, __c);
      }



      template<class _Iterator>
        static void
        _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
        {
   for (; __k1 != __k2; ++__k1, (void)++__p)
     traits_type::assign(*__p, *__k1);
 }

      static void
      _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) noexcept
      { _S_copy_chars(__p, __k1.base(), __k2.base()); }

      static void
      _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
      noexcept
      { _S_copy_chars(__p, __k1.base(), __k2.base()); }

      static void
      _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) noexcept
      { _S_copy(__p, __k1, __k2 - __k1); }

      static void
      _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
      noexcept
      { _S_copy(__p, __k1, __k2 - __k1); }

      static int
      _S_compare(size_type __n1, size_type __n2) noexcept
      {
 const difference_type __d = difference_type(__n1 - __n2);

 if (__d > __gnu_cxx::__numeric_traits<int>::__max)
   return __gnu_cxx::__numeric_traits<int>::__max;
 else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
   return __gnu_cxx::__numeric_traits<int>::__min;
 else
   return int(__d);
      }

      void
      _M_assign(const basic_string& __rcs);

      void
      _M_mutate(size_type __pos, size_type __len1, const _CharT* __s,
  size_type __len2);

      void
      _M_erase(size_type __pos, size_type __n);

    public:







      basic_string()
      noexcept(is_nothrow_default_constructible<_Alloc>::value)
      : _M_dataplus(_M_local_data())
      { _M_set_length(0); }




      explicit
      basic_string(const _Alloc& __a) noexcept
      : _M_dataplus(_M_local_data(), __a)
      { _M_set_length(0); }





      basic_string(const basic_string& __str)
      : _M_dataplus(_M_local_data(),
      _Alloc_traits::_S_select_on_copy(__str._M_get_allocator()))
      { _M_construct(__str._M_data(), __str._M_data() + __str.length()); }
# 410 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string(const basic_string& __str, size_type __pos,
     size_type __n = npos)
      : _M_dataplus(_M_local_data())
      {
 const _CharT* __start = __str._M_data()
   + __str._M_check(__pos, "basic_string::basic_string");
 _M_construct(__start, __start + __str._M_limit(__pos, __n));
      }
# 426 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string(const basic_string& __str, size_type __pos,
     size_type __n, const _Alloc& __a)
      : _M_dataplus(_M_local_data(), __a)
      {
 const _CharT* __start
   = __str._M_data() + __str._M_check(__pos, "string::string");
 _M_construct(__start, __start + __str._M_limit(__pos, __n));
      }
# 444 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string(const _CharT* __s, size_type __n,
     const _Alloc& __a = _Alloc())
      : _M_dataplus(_M_local_data(), __a)
      { _M_construct(__s, __s + __n); }






      basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
      : _M_dataplus(_M_local_data(), __a)
      { _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); }







      basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
      : _M_dataplus(_M_local_data(), __a)
      { _M_construct(__n, __c); }
# 476 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string(basic_string&& __str) noexcept
      : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator()))
      {
 if (__str._M_is_local())
   {
     traits_type::copy(_M_local_buf, __str._M_local_buf,
         _S_local_capacity + 1);
   }
 else
   {
     _M_data(__str._M_data());
     _M_capacity(__str._M_allocated_capacity);
   }




 _M_length(__str.length());
 __str._M_data(__str._M_local_data());
 __str._M_set_length(0);
      }






      basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc())
      : _M_dataplus(_M_local_data(), __a)
      { _M_construct(__l.begin(), __l.end()); }

      basic_string(const basic_string& __str, const _Alloc& __a)
      : _M_dataplus(_M_local_data(), __a)
      { _M_construct(__str.begin(), __str.end()); }

      basic_string(basic_string&& __str, const _Alloc& __a)
      noexcept(_Alloc_traits::_S_always_equal())
      : _M_dataplus(_M_local_data(), __a)
      {
 if (__str._M_is_local())
   {
     traits_type::copy(_M_local_buf, __str._M_local_buf,
         _S_local_capacity + 1);
     _M_length(__str.length());
     __str._M_set_length(0);
   }
 else if (_Alloc_traits::_S_always_equal()
     || __str.get_allocator() == __a)
   {
     _M_data(__str._M_data());
     _M_length(__str.length());
     _M_capacity(__str._M_allocated_capacity);
     __str._M_data(__str._M_local_buf);
     __str._M_set_length(0);
   }
 else
   _M_construct(__str.begin(), __str.end());
      }
# 544 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>



        basic_string(_InputIterator __beg, _InputIterator __end,
       const _Alloc& __a = _Alloc())
 : _M_dataplus(_M_local_data(), __a)
 { _M_construct(__beg, __end); }




      ~basic_string()
      { _M_dispose(); }





      basic_string&
      operator=(const basic_string& __str)
      {

 if (_Alloc_traits::_S_propagate_on_copy_assign())
   {
     if (!_Alloc_traits::_S_always_equal() && !_M_is_local()
  && _M_get_allocator() != __str._M_get_allocator())
       {

  _M_destroy(_M_allocated_capacity);
  _M_data(_M_local_data());
  _M_set_length(0);
       }
     std::__alloc_on_copy(_M_get_allocator(), __str._M_get_allocator());
   }

 return this->assign(__str);
      }





      basic_string&
      operator=(const _CharT* __s)
      { return this->assign(__s); }
# 599 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      operator=(_CharT __c)
      {
 this->assign(1, __c);
 return *this;
      }
# 617 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      operator=(basic_string&& __str)
      noexcept(_Alloc_traits::_S_nothrow_move())
      {
 if (!_M_is_local() && _Alloc_traits::_S_propagate_on_move_assign()
     && !_Alloc_traits::_S_always_equal()
     && _M_get_allocator() != __str._M_get_allocator())
   {

     _M_destroy(_M_allocated_capacity);
     _M_data(_M_local_data());
     _M_set_length(0);
   }

 std::__alloc_on_move(_M_get_allocator(), __str._M_get_allocator());

 if (!__str._M_is_local()
     && (_Alloc_traits::_S_propagate_on_move_assign()
       || _Alloc_traits::_S_always_equal()))
   {
     pointer __data = nullptr;
     size_type __capacity;
     if (!_M_is_local())
       {
  if (_Alloc_traits::_S_always_equal())
    {
      __data = _M_data();
      __capacity = _M_allocated_capacity;
    }
  else
    _M_destroy(_M_allocated_capacity);
       }

     _M_data(__str._M_data());
     _M_length(__str.length());
     _M_capacity(__str._M_allocated_capacity);
     if (__data)
       {
  __str._M_data(__data);
  __str._M_capacity(__capacity);
       }
     else
       __str._M_data(__str._M_local_buf);
   }
 else
     assign(__str);
 __str.clear();
 return *this;
      }





      basic_string&
      operator=(initializer_list<_CharT> __l)
      {
 this->assign(__l.begin(), __l.size());
 return *this;
      }







      iterator
      begin() noexcept
      { return iterator(_M_data()); }





      const_iterator
      begin() const noexcept
      { return const_iterator(_M_data()); }





      iterator
      end() noexcept
      { return iterator(_M_data() + this->size()); }





      const_iterator
      end() const noexcept
      { return const_iterator(_M_data() + this->size()); }






      reverse_iterator
      rbegin() noexcept
      { return reverse_iterator(this->end()); }






      const_reverse_iterator
      rbegin() const noexcept
      { return const_reverse_iterator(this->end()); }






      reverse_iterator
      rend() noexcept
      { return reverse_iterator(this->begin()); }






      const_reverse_iterator
      rend() const noexcept
      { return const_reverse_iterator(this->begin()); }






      const_iterator
      cbegin() const noexcept
      { return const_iterator(this->_M_data()); }





      const_iterator
      cend() const noexcept
      { return const_iterator(this->_M_data() + this->size()); }






      const_reverse_iterator
      crbegin() const noexcept
      { return const_reverse_iterator(this->end()); }






      const_reverse_iterator
      crend() const noexcept
      { return const_reverse_iterator(this->begin()); }


    public:



      size_type
      size() const noexcept
      { return _M_string_length; }



      size_type
      length() const noexcept
      { return _M_string_length; }


      size_type
      max_size() const noexcept
      { return (_Alloc_traits::max_size(_M_get_allocator()) - 1) / 2; }
# 813 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      void
      resize(size_type __n, _CharT __c);
# 826 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      void
      resize(size_type __n)
      { this->resize(__n, _CharT()); }



      void
      shrink_to_fit() noexcept
      {

 if (capacity() > size())
   {
     try
       { reserve(0); }
     catch(...)
       { }
   }

      }






      size_type
      capacity() const noexcept
      {
 return _M_is_local() ? size_type(_S_local_capacity)
                      : _M_allocated_capacity;
      }
# 875 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      void
      reserve(size_type __res_arg = 0);




      void
      clear() noexcept
      { _M_set_length(0); }





      bool
      empty() const noexcept
      { return this->size() == 0; }
# 904 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      const_reference
      operator[] (size_type __pos) const noexcept
      {
                                  ;
 return _M_data()[__pos];
      }
# 921 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      reference
      operator[](size_type __pos)
      {


                                  ;

                                                                   ;
 return _M_data()[__pos];
      }
# 942 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      const_reference
      at(size_type __n) const
      {
 if (__n >= this->size())
   __throw_out_of_range_fmt(("basic_string::at: __n " "(which is %zu) >= this->size() " "(which is %zu)"),


       __n, this->size());
 return _M_data()[__n];
      }
# 963 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      reference
      at(size_type __n)
      {
 if (__n >= size())
   __throw_out_of_range_fmt(("basic_string::at: __n " "(which is %zu) >= this->size() " "(which is %zu)"),


       __n, this->size());
 return _M_data()[__n];
      }






      reference
      front() noexcept
      {
                           ;
 return operator[](0);
      }





      const_reference
      front() const noexcept
      {
                           ;
 return operator[](0);
      }





      reference
      back() noexcept
      {
                           ;
 return operator[](this->size() - 1);
      }





      const_reference
      back() const noexcept
      {
                           ;
 return operator[](this->size() - 1);
      }
# 1026 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      operator+=(const basic_string& __str)
      { return this->append(__str); }






      basic_string&
      operator+=(const _CharT* __s)
      { return this->append(__s); }






      basic_string&
      operator+=(_CharT __c)
      {
 this->push_back(__c);
 return *this;
      }







      basic_string&
      operator+=(initializer_list<_CharT> __l)
      { return this->append(__l.begin(), __l.size()); }







      basic_string&
      append(const basic_string& __str)
      { return _M_append(__str._M_data(), __str.size()); }
# 1084 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      append(const basic_string& __str, size_type __pos, size_type __n)
      { return _M_append(__str._M_data()
    + __str._M_check(__pos, "basic_string::append"),
    __str._M_limit(__pos, __n)); }







      basic_string&
      append(const _CharT* __s, size_type __n)
      {
                                        ;
 _M_check_length(size_type(0), __n, "basic_string::append");
 return _M_append(__s, __n);
      }






      basic_string&
      append(const _CharT* __s)
      {
                               ;
 const size_type __n = traits_type::length(__s);
 _M_check_length(size_type(0), __n, "basic_string::append");
 return _M_append(__s, __n);
      }
# 1126 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      append(size_type __n, _CharT __c)
      { return _M_replace_aux(this->size(), size_type(0), __n, __c); }







      basic_string&
      append(initializer_list<_CharT> __l)
      { return this->append(__l.begin(), __l.size()); }
# 1150 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      template<class _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>



        basic_string&
        append(_InputIterator __first, _InputIterator __last)
        { return this->replace(end(), end(), __first, __last); }





      void
      push_back(_CharT __c)
      {
 const size_type __size = this->size();
 if (__size + 1 > this->capacity())
   this->_M_mutate(__size, size_type(0), 0, size_type(1));
 traits_type::assign(this->_M_data()[__size], __c);
 this->_M_set_length(__size + 1);
      }






      basic_string&
      assign(const basic_string& __str)
      {
 this->_M_assign(__str);
 return *this;
      }
# 1194 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      assign(basic_string&& __str)
      noexcept(_Alloc_traits::_S_nothrow_move())
      {


 return *this = std::move(__str);
      }
# 1217 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      assign(const basic_string& __str, size_type __pos, size_type __n)
      { return _M_replace(size_type(0), this->size(), __str._M_data()
     + __str._M_check(__pos, "basic_string::assign"),
     __str._M_limit(__pos, __n)); }
# 1233 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      assign(const _CharT* __s, size_type __n)
      {
                                        ;
 return _M_replace(size_type(0), this->size(), __s, __n);
      }
# 1249 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      assign(const _CharT* __s)
      {
                               ;
 return _M_replace(size_type(0), this->size(), __s,
     traits_type::length(__s));
      }
# 1266 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      assign(size_type __n, _CharT __c)
      { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
# 1279 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      template<class _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>



        basic_string&
        assign(_InputIterator __first, _InputIterator __last)
        { return this->replace(begin(), end(), __first, __last); }







      basic_string&
      assign(initializer_list<_CharT> __l)
      { return this->assign(__l.begin(), __l.size()); }
# 1315 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      iterator
      insert(const_iterator __p, size_type __n, _CharT __c)
      {
                                                         ;
 const size_type __pos = __p - begin();
 this->replace(__p, __p, __n, __c);
 return iterator(this->_M_data() + __pos);
      }
# 1357 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      template<class _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
 iterator
        insert(const_iterator __p, _InputIterator __beg, _InputIterator __end)
        {
                                                           ;
   const size_type __pos = __p - begin();
   this->replace(__p, __p, __beg, __end);
   return iterator(this->_M_data() + __pos);
 }
# 1393 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      void
      insert(iterator __p, initializer_list<_CharT> __l)
      {
                                                         ;
 this->insert(__p - begin(), __l.begin(), __l.size());
      }
# 1413 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      insert(size_type __pos1, const basic_string& __str)
      { return this->replace(__pos1, size_type(0),
        __str._M_data(), __str.size()); }
# 1436 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      insert(size_type __pos1, const basic_string& __str,
      size_type __pos2, size_type __n)
      { return this->replace(__pos1, size_type(0), __str._M_data()
        + __str._M_check(__pos2, "basic_string::insert"),
        __str._M_limit(__pos2, __n)); }
# 1459 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      insert(size_type __pos, const _CharT* __s, size_type __n)
      { return this->replace(__pos, size_type(0), __s, __n); }
# 1478 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      insert(size_type __pos, const _CharT* __s)
      {
                               ;
 return this->replace(__pos, size_type(0), __s,
        traits_type::length(__s));
      }
# 1502 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      insert(size_type __pos, size_type __n, _CharT __c)
      { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
         size_type(0), __n, __c); }
# 1520 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      iterator
      insert(__const_iterator __p, _CharT __c)
      {
                                                         ;
 const size_type __pos = __p - begin();
 _M_replace_aux(__pos, size_type(0), size_type(1), __c);
 return iterator(_M_data() + __pos);
      }
# 1544 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      erase(size_type __pos = 0, size_type __n = npos)
      {
 this->_M_erase(_M_check(__pos, "basic_string::erase"),
         _M_limit(__pos, __n));
 return *this;
      }
# 1560 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      iterator
      erase(__const_iterator __position)
      {

                           ;
 const size_type __pos = __position - begin();
 this->_M_erase(__pos, size_type(1));
 return iterator(_M_data() + __pos);
      }
# 1579 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      iterator
      erase(__const_iterator __first, __const_iterator __last)
      {

                        ;
        const size_type __pos = __first - begin();
 this->_M_erase(__pos, __last - __first);
 return iterator(this->_M_data() + __pos);
      }







      void
      pop_back() noexcept
      {
                           ;
 _M_erase(size() - 1, 1);
      }
# 1620 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(size_type __pos, size_type __n, const basic_string& __str)
      { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
# 1642 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(size_type __pos1, size_type __n1, const basic_string& __str,
       size_type __pos2, size_type __n2)
      { return this->replace(__pos1, __n1, __str._M_data()
        + __str._M_check(__pos2, "basic_string::replace"),
        __str._M_limit(__pos2, __n2)); }
# 1667 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(size_type __pos, size_type __n1, const _CharT* __s,
       size_type __n2)
      {
                                         ;
 return _M_replace(_M_check(__pos, "basic_string::replace"),
     _M_limit(__pos, __n1), __s, __n2);
      }
# 1692 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(size_type __pos, size_type __n1, const _CharT* __s)
      {
                               ;
 return this->replace(__pos, __n1, __s, traits_type::length(__s));
      }
# 1716 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
      { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
         _M_limit(__pos, __n1), __n2, __c); }
# 1734 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2,
       const basic_string& __str)
      { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
# 1754 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2,
       const _CharT* __s, size_type __n)
      {

                      ;
 return this->replace(__i1 - begin(), __i2 - __i1, __s, __n);
      }
# 1776 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2, const _CharT* __s)
      {
                               ;
 return this->replace(__i1, __i2, __s, traits_type::length(__s));
      }
# 1797 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2, size_type __n,
       _CharT __c)
      {

                      ;
 return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __c);
      }
# 1822 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      template<class _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
        basic_string&
        replace(const_iterator __i1, const_iterator __i2,
  _InputIterator __k1, _InputIterator __k2)
        {

                        ;
                                             ;
   return this->_M_replace_dispatch(__i1, __i2, __k1, __k2,
        std::__false_type());
 }
# 1854 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2,
       _CharT* __k1, _CharT* __k2)
      {

                      ;
                                           ;
 return this->replace(__i1 - begin(), __i2 - __i1,
        __k1, __k2 - __k1);
      }

      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2,
       const _CharT* __k1, const _CharT* __k2)
      {

                      ;
                                           ;
 return this->replace(__i1 - begin(), __i2 - __i1,
        __k1, __k2 - __k1);
      }

      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2,
       iterator __k1, iterator __k2)
      {

                      ;
                                           ;
 return this->replace(__i1 - begin(), __i2 - __i1,
        __k1.base(), __k2 - __k1);
      }

      basic_string&
      replace(__const_iterator __i1, __const_iterator __i2,
       const_iterator __k1, const_iterator __k2)
      {

                      ;
                                           ;
 return this->replace(__i1 - begin(), __i2 - __i1,
        __k1.base(), __k2 - __k1);
      }
# 1913 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string& replace(const_iterator __i1, const_iterator __i2,
       initializer_list<_CharT> __l)
      { return this->replace(__i1, __i2, __l.begin(), __l.end()); }


    private:
      template<class _Integer>
 basic_string&
 _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
       _Integer __n, _Integer __val, __true_type)
        { return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __val); }

      template<class _InputIterator>
 basic_string&
 _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
       _InputIterator __k1, _InputIterator __k2,
       __false_type);

      basic_string&
      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
       _CharT __c);

      basic_string&
      _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
   const size_type __len2);

      basic_string&
      _M_append(const _CharT* __s, size_type __n);

    public:
# 1956 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
# 1966 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      void
      swap(basic_string& __s) noexcept;
# 1976 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      const _CharT*
      c_str() const noexcept
      { return _M_data(); }







      const _CharT*
      data() const noexcept
      { return _M_data(); }




      allocator_type
      get_allocator() const noexcept
      { return _M_get_allocator(); }
# 2009 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find(const _CharT* __s, size_type __pos, size_type __n) const;
# 2022 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find(const basic_string& __str, size_type __pos = 0) const
 noexcept
      { return this->find(__str.data(), __pos, __str.size()); }
# 2037 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find(const _CharT* __s, size_type __pos = 0) const
      {
                               ;
 return this->find(__s, __pos, traits_type::length(__s));
      }
# 2054 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find(_CharT __c, size_type __pos = 0) const noexcept;
# 2067 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      rfind(const basic_string& __str, size_type __pos = npos) const
 noexcept
      { return this->rfind(__str.data(), __pos, __str.size()); }
# 2084 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      rfind(const _CharT* __s, size_type __pos, size_type __n) const;
# 2097 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      rfind(const _CharT* __s, size_type __pos = npos) const
      {
                               ;
 return this->rfind(__s, __pos, traits_type::length(__s));
      }
# 2114 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      rfind(_CharT __c, size_type __pos = npos) const noexcept;
# 2128 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_of(const basic_string& __str, size_type __pos = 0) const
 noexcept
      { return this->find_first_of(__str.data(), __pos, __str.size()); }
# 2145 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
# 2158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_of(const _CharT* __s, size_type __pos = 0) const
      {
                               ;
 return this->find_first_of(__s, __pos, traits_type::length(__s));
      }
# 2177 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_of(_CharT __c, size_type __pos = 0) const noexcept
      { return this->find(__c, __pos); }
# 2192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_of(const basic_string& __str, size_type __pos = npos) const
 noexcept
      { return this->find_last_of(__str.data(), __pos, __str.size()); }
# 2209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
# 2222 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_of(const _CharT* __s, size_type __pos = npos) const
      {
                               ;
 return this->find_last_of(__s, __pos, traits_type::length(__s));
      }
# 2241 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_of(_CharT __c, size_type __pos = npos) const noexcept
      { return this->rfind(__c, __pos); }
# 2255 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_not_of(const basic_string& __str, size_type __pos = 0) const
 noexcept
      { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
# 2272 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_not_of(const _CharT* __s, size_type __pos,
   size_type __n) const;
# 2286 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_not_of(const _CharT* __s, size_type __pos = 0) const
      {
                               ;
 return this->find_first_not_of(__s, __pos, traits_type::length(__s));
      }
# 2303 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_first_not_of(_CharT __c, size_type __pos = 0) const
 noexcept;
# 2318 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_not_of(const basic_string& __str, size_type __pos = npos) const
 noexcept
      { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
# 2335 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_not_of(const _CharT* __s, size_type __pos,
         size_type __n) const;
# 2349 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_not_of(const _CharT* __s, size_type __pos = npos) const
      {
                               ;
 return this->find_last_not_of(__s, __pos, traits_type::length(__s));
      }
# 2366 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      size_type
      find_last_not_of(_CharT __c, size_type __pos = npos) const
 noexcept;
# 2382 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      basic_string
      substr(size_type __pos = 0, size_type __n = npos) const
      { return basic_string(*this,
       _M_check(__pos, "basic_string::substr"), __n); }
# 2401 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      int
      compare(const basic_string& __str) const
      {
 const size_type __size = this->size();
 const size_type __osize = __str.size();
 const size_type __len = std::min(__size, __osize);

 int __r = traits_type::compare(_M_data(), __str.data(), __len);
 if (!__r)
   __r = _S_compare(__size, __osize);
 return __r;
      }
# 2433 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      int
      compare(size_type __pos, size_type __n, const basic_string& __str) const;
# 2459 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      int
      compare(size_type __pos1, size_type __n1, const basic_string& __str,
       size_type __pos2, size_type __n2) const;
# 2477 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      int
      compare(const _CharT* __s) const;
# 2501 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      int
      compare(size_type __pos, size_type __n1, const _CharT* __s) const;
# 2528 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
      int
      compare(size_type __pos, size_type __n1, const _CharT* __s,
       size_type __n2) const;
  };
}
# 4927 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>
    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    {
      basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
      __str.append(__rhs);
      return __str;
    }







  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT,_Traits,_Alloc>
    operator+(const _CharT* __lhs,
       const basic_string<_CharT,_Traits,_Alloc>& __rhs);







  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT,_Traits,_Alloc>
    operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
       const _CharT* __rhs)
    {
      basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
      __str.append(__rhs);
      return __str;
    }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
    {
      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef typename __string_type::size_type __size_type;
      __string_type __str(__lhs);
      __str.append(__size_type(1), __rhs);
      return __str;
    }


  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return std::move(__lhs.append(__rhs)); }

  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
       basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    { return std::move(__rhs.insert(0, __lhs)); }

  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
       basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    {
      const auto __size = __lhs.size() + __rhs.size();
      const bool __cond = (__size > __lhs.capacity()
      && __size <= __rhs.capacity());
      return __cond ? std::move(__rhs.insert(0, __lhs))
             : std::move(__lhs.append(__rhs));
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(const _CharT* __lhs,
       basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    { return std::move(__rhs.insert(0, __lhs)); }

  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(_CharT __lhs,
       basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    { return std::move(__rhs.insert(0, 1, __lhs)); }

  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
       const _CharT* __rhs)
    { return std::move(__lhs.append(__rhs)); }

  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_string<_CharT, _Traits, _Alloc>
    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
       _CharT __rhs)
    { return std::move(__lhs.append(1, __rhs)); }
# 5048 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    noexcept
    { return __lhs.compare(__rhs) == 0; }

  template<typename _CharT>
    inline
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
    operator==(const basic_string<_CharT>& __lhs,
        const basic_string<_CharT>& __rhs) noexcept
    { return (__lhs.size() == __rhs.size()
       && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
          __lhs.size())); }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator==(const _CharT* __lhs,
        const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return __rhs.compare(__lhs) == 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const _CharT* __rhs)
    { return __lhs.compare(__rhs) == 0; }
# 5095 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    noexcept
    { return !(__lhs == __rhs); }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator!=(const _CharT* __lhs,
        const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return !(__lhs == __rhs); }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const _CharT* __rhs)
    { return !(__lhs == __rhs); }
# 5133 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    noexcept
    { return __lhs.compare(__rhs) < 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
       const _CharT* __rhs)
    { return __lhs.compare(__rhs) < 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator<(const _CharT* __lhs,
       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return __rhs.compare(__lhs) > 0; }
# 5171 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    noexcept
    { return __lhs.compare(__rhs) > 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
       const _CharT* __rhs)
    { return __lhs.compare(__rhs) > 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator>(const _CharT* __lhs,
       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return __rhs.compare(__lhs) < 0; }
# 5209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    noexcept
    { return __lhs.compare(__rhs) <= 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const _CharT* __rhs)
    { return __lhs.compare(__rhs) <= 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator<=(const _CharT* __lhs,
        const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return __rhs.compare(__lhs) >= 0; }
# 5247 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    noexcept
    { return __lhs.compare(__rhs) >= 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
        const _CharT* __rhs)
    { return __lhs.compare(__rhs) >= 0; }







  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator>=(const _CharT* __lhs,
      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return __rhs.compare(__lhs) <= 0; }
# 5285 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline void
    swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
  basic_string<_CharT, _Traits, _Alloc>& __rhs)
    noexcept(noexcept(__lhs.swap(__rhs)))
    { __lhs.swap(__rhs); }
# 5305 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __is,
        basic_string<_CharT, _Traits, _Alloc>& __str);

  template<>
    basic_istream<char>&
    operator>>(basic_istream<char>& __is, basic_string<char>& __str);
# 5323 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __os,
        const basic_string<_CharT, _Traits, _Alloc>& __str)
    {


      return __ostream_insert(__os, __str.data(), __str.size());
    }
# 5346 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_istream<_CharT, _Traits>&
    getline(basic_istream<_CharT, _Traits>& __is,
     basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
# 5363 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_istream<_CharT, _Traits>&
    getline(basic_istream<_CharT, _Traits>& __is,
     basic_string<_CharT, _Traits, _Alloc>& __str)
    { return std::getline(__is, __str, __is.widen('\n')); }



  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_istream<_CharT, _Traits>&
    getline(basic_istream<_CharT, _Traits>&& __is,
     basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
    { return std::getline(__is, __str, __delim); }


  template<typename _CharT, typename _Traits, typename _Alloc>
    inline basic_istream<_CharT, _Traits>&
    getline(basic_istream<_CharT, _Traits>&& __is,
     basic_string<_CharT, _Traits, _Alloc>& __str)
    { return std::getline(__is, __str); }


  template<>
    basic_istream<char>&
    getline(basic_istream<char>& __in, basic_string<char>& __str,
     char __delim);


  template<>
    basic_istream<wchar_t>&
    getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
     wchar_t __delim);



}




# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 3








# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 3




# 1 "/usr/include/wchar.h" 1 3 4
# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwchar" 2 3
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3
# 96 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3
namespace std
{
  using ::FILE;
  using ::fpos_t;

  using ::clearerr;
  using ::fclose;
  using ::feof;
  using ::ferror;
  using ::fflush;
  using ::fgetc;
  using ::fgetpos;
  using ::fgets;
  using ::fopen;
  using ::fprintf;
  using ::fputc;
  using ::fputs;
  using ::fread;
  using ::freopen;
  using ::fscanf;
  using ::fseek;
  using ::fsetpos;
  using ::ftell;
  using ::fwrite;
  using ::getc;
  using ::getchar;




  using ::perror;
  using ::printf;
  using ::putc;
  using ::putchar;
  using ::puts;
  using ::remove;
  using ::rename;
  using ::rewind;
  using ::scanf;
  using ::setbuf;
  using ::setvbuf;
  using ::sprintf;
  using ::sscanf;
  using ::tmpfile;

  using ::tmpnam;

  using ::ungetc;
  using ::vfprintf;
  using ::vprintf;
  using ::vsprintf;
}
# 157 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3
namespace __gnu_cxx
{
# 175 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdio" 3
  using ::snprintf;
  using ::vfscanf;
  using ::vscanf;
  using ::vsnprintf;
  using ::vsscanf;

}

namespace std
{
  using ::__gnu_cxx::snprintf;
  using ::__gnu_cxx::vfscanf;
  using ::__gnu_cxx::vscanf;
  using ::__gnu_cxx::vsnprintf;
  using ::__gnu_cxx::vsscanf;
}
# 44 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 3


# 1 "/usr/include/errno.h" 1 3 4
# 31 "/usr/include/errno.h" 3 4
extern "C" {




# 1 "/usr/include/bits/errno.h" 1 3 4
# 24 "/usr/include/bits/errno.h" 3 4
# 1 "/usr/include/linux/errno.h" 1 3 4
# 1 "/usr/include/asm/errno.h" 1 3 4
# 1 "/usr/include/asm-generic/errno.h" 1 3 4



# 1 "/usr/include/asm-generic/errno-base.h" 1 3 4
# 5 "/usr/include/asm-generic/errno.h" 2 3 4
# 2 "/usr/include/asm/errno.h" 2 3 4
# 2 "/usr/include/linux/errno.h" 2 3 4
# 25 "/usr/include/bits/errno.h" 2 3 4
# 50 "/usr/include/bits/errno.h" 3 4
extern int *__errno_location (void) throw () __attribute__ ((__const__));
# 36 "/usr/include/errno.h" 2 3 4
# 54 "/usr/include/errno.h" 3 4
extern char *program_invocation_name, *program_invocation_short_name;



}
# 68 "/usr/include/errno.h" 3 4
typedef int error_t;
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 2 3
# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ext/string_conversions.h" 2 3

namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
{



  template<typename _TRet, typename _Ret = _TRet, typename _CharT,
    typename... _Base>
    _Ret
    __stoa(_TRet (*__convf) (const _CharT*, _CharT**, _Base...),
    const char* __name, const _CharT* __str, std::size_t* __idx,
    _Base... __base)
    {
      _Ret __ret;

      _CharT* __endptr;

      struct _Save_errno {
 _Save_errno() : _M_errno((*__errno_location ())) { (*__errno_location ()) = 0; }
 ~_Save_errno() { if ((*__errno_location ()) == 0) (*__errno_location ()) = _M_errno; }
 int _M_errno;
      } const __save_errno;

      const _TRet __tmp = __convf(__str, &__endptr, __base...);

      if (__endptr == __str)
 std::__throw_invalid_argument(__name);
      else if ((*__errno_location ()) == 34
        || (std::__are_same<_Ret, int>::__value
     && (__tmp < __numeric_traits<int>::__min
         || __tmp > __numeric_traits<int>::__max)))
 std::__throw_out_of_range(__name);
      else
 __ret = __tmp;

      if (__idx)
 *__idx = __endptr - __str;

      return __ret;
    }


  template<typename _String, typename _CharT = typename _String::value_type>
    _String
    __to_xstring(int (*__convf) (_CharT*, std::size_t, const _CharT*,
     __builtin_va_list), std::size_t __n,
   const _CharT* __fmt, ...)
    {


      _CharT* __s = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
         * __n));

      __builtin_va_list __args;
      __builtin_va_start(__args, __fmt);

      const int __len = __convf(__s, __n, __fmt, __args);

      __builtin_va_end(__args);

      return _String(__s, __s + __len);
    }


}
# 5403 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{

namespace __cxx11 {



  inline int
  stoi(const string& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
     __idx, __base); }

  inline long
  stol(const string& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
        __idx, __base); }

  inline unsigned long
  stoul(const string& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
        __idx, __base); }

  inline long long
  stoll(const string& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
        __idx, __base); }

  inline unsigned long long
  stoull(const string& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
        __idx, __base); }


  inline float
  stof(const string& __str, size_t* __idx = 0)
  { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }

  inline double
  stod(const string& __str, size_t* __idx = 0)
  { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }

  inline long double
  stold(const string& __str, size_t* __idx = 0)
  { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }






  inline string
  to_string(int __val)
  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
        "%d", __val); }

  inline string
  to_string(unsigned __val)
  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
        4 * sizeof(unsigned),
        "%u", __val); }

  inline string
  to_string(long __val)
  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long),
        "%ld", __val); }

  inline string
  to_string(unsigned long __val)
  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
        4 * sizeof(unsigned long),
        "%lu", __val); }

  inline string
  to_string(long long __val)
  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
        4 * sizeof(long long),
        "%lld", __val); }

  inline string
  to_string(unsigned long long __val)
  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
        4 * sizeof(unsigned long long),
        "%llu", __val); }

  inline string
  to_string(float __val)
  {
    const int __n =
      __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
        "%f", __val);
  }

  inline string
  to_string(double __val)
  {
    const int __n =
      __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
        "%f", __val);
  }

  inline string
  to_string(long double __val)
  {
    const int __n =
      __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
        "%Lf", __val);
  }



  inline int
  stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
     __idx, __base); }

  inline long
  stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
        __idx, __base); }

  inline unsigned long
  stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
        __idx, __base); }

  inline long long
  stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
        __idx, __base); }

  inline unsigned long long
  stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
        __idx, __base); }


  inline float
  stof(const wstring& __str, size_t* __idx = 0)
  { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }

  inline double
  stod(const wstring& __str, size_t* __idx = 0)
  { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }

  inline long double
  stold(const wstring& __str, size_t* __idx = 0)
  { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }



  inline wstring
  to_wstring(int __val)
  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(int),
         L"%d", __val); }

  inline wstring
  to_wstring(unsigned __val)
  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
         4 * sizeof(unsigned),
         L"%u", __val); }

  inline wstring
  to_wstring(long __val)
  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(long),
         L"%ld", __val); }

  inline wstring
  to_wstring(unsigned long __val)
  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
         4 * sizeof(unsigned long),
         L"%lu", __val); }

  inline wstring
  to_wstring(long long __val)
  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
         4 * sizeof(long long),
         L"%lld", __val); }

  inline wstring
  to_wstring(unsigned long long __val)
  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
         4 * sizeof(unsigned long long),
         L"%llu", __val); }

  inline wstring
  to_wstring(float __val)
  {
    const int __n =
      __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
         L"%f", __val);
  }

  inline wstring
  to_wstring(double __val)
  {
    const int __n =
      __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
         L"%f", __val);
  }

  inline wstring
  to_wstring(long double __val)
  {
    const int __n =
      __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
         L"%Lf", __val);
  }



}

}






# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/hash_bytes.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/hash_bytes.h" 3



namespace std
{







  size_t
  _Hash_bytes(const void* __ptr, size_t __len, size_t __seed);





  size_t
  _Fnv_hash_bytes(const void* __ptr, size_t __len, size_t __seed);


}
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3
  template<typename _Result, typename _Arg>
    struct __hash_base
    {
      typedef _Result result_type;
      typedef _Arg argument_type;
    };


  template<typename _Tp>
    struct hash;


  template<typename _Tp, bool = is_enum<_Tp>::value>
    struct __hash_enum
    {
    private:

      __hash_enum(__hash_enum&&);
      ~__hash_enum();
    };


  template<typename _Tp>
    struct __hash_enum<_Tp, true> : public __hash_base<size_t, _Tp>
    {
      size_t
      operator()(_Tp __val) const noexcept
      {
       using __type = typename underlying_type<_Tp>::type;
       return hash<__type>{}(static_cast<__type>(__val));
      }
    };



  template<typename _Tp>
    struct hash : __hash_enum<_Tp>
    { };


  template<typename _Tp>
    struct hash<_Tp*> : public __hash_base<size_t, _Tp*>
    {
      size_t
      operator()(_Tp* __p) const noexcept
      { return reinterpret_cast<size_t>(__p); }
    };
# 108 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3
  template<> struct hash<bool> : public __hash_base<size_t, bool> { size_t operator()(bool __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<char> : public __hash_base<size_t, char> { size_t operator()(char __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<signed char> : public __hash_base<size_t, signed char> { size_t operator()(signed char __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<unsigned char> : public __hash_base<size_t, unsigned char> { size_t operator()(unsigned char __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<wchar_t> : public __hash_base<size_t, wchar_t> { size_t operator()(wchar_t __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<char16_t> : public __hash_base<size_t, char16_t> { size_t operator()(char16_t __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<char32_t> : public __hash_base<size_t, char32_t> { size_t operator()(char32_t __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<short> : public __hash_base<size_t, short> { size_t operator()(short __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<int> : public __hash_base<size_t, int> { size_t operator()(int __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<long> : public __hash_base<size_t, long> { size_t operator()(long __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<long long> : public __hash_base<size_t, long long> { size_t operator()(long long __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<unsigned short> : public __hash_base<size_t, unsigned short> { size_t operator()(unsigned short __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<unsigned int> : public __hash_base<size_t, unsigned int> { size_t operator()(unsigned int __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<unsigned long> : public __hash_base<size_t, unsigned long> { size_t operator()(unsigned long __val) const noexcept { return static_cast<size_t>(__val); } };


  template<> struct hash<unsigned long long> : public __hash_base<size_t, unsigned long long> { size_t operator()(unsigned long long __val) const noexcept { return static_cast<size_t>(__val); } };
# 171 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/functional_hash.h" 3
  struct _Hash_impl
  {
    static size_t
    hash(const void* __ptr, size_t __clength,
  size_t __seed = static_cast<size_t>(0xc70f6907UL))
    { return _Hash_bytes(__ptr, __clength, __seed); }

    template<typename _Tp>
      static size_t
      hash(const _Tp& __val)
      { return hash(&__val, sizeof(__val)); }

    template<typename _Tp>
      static size_t
      __hash_combine(const _Tp& __val, size_t __hash)
      { return hash(&__val, sizeof(__val), __hash); }
  };

  struct _Fnv_hash_impl
  {
    static size_t
    hash(const void* __ptr, size_t __clength,
  size_t __seed = static_cast<size_t>(2166136261UL))
    { return _Fnv_hash_bytes(__ptr, __clength, __seed); }

    template<typename _Tp>
      static size_t
      hash(const _Tp& __val)
      { return hash(&__val, sizeof(__val)); }

    template<typename _Tp>
      static size_t
      __hash_combine(const _Tp& __val, size_t __hash)
      { return hash(&__val, sizeof(__val), __hash); }
  };


  template<>
    struct hash<float> : public __hash_base<size_t, float>
    {
      size_t
      operator()(float __val) const noexcept
      {

 return __val != 0.0f ? std::_Hash_impl::hash(__val) : 0;
      }
    };


  template<>
    struct hash<double> : public __hash_base<size_t, double>
    {
      size_t
      operator()(double __val) const noexcept
      {

 return __val != 0.0 ? std::_Hash_impl::hash(__val) : 0;
      }
    };


  template<>
    struct hash<long double>
    : public __hash_base<size_t, long double>
    {
      __attribute__ ((__pure__)) size_t
      operator()(long double __val) const noexcept;
    };







  template<typename _Hash>
    struct __is_fast_hash : public std::true_type
    { };

  template<>
    struct __is_fast_hash<hash<long double>> : public std::false_type
    { };


}
# 5629 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{






  template<>
    struct hash<string>
    : public __hash_base<size_t, string>
    {
      size_t
      operator()(const string& __s) const noexcept
      { return std::_Hash_impl::hash(__s.data(), __s.length()); }
    };

  template<>
    struct __is_fast_hash<hash<string>> : std::false_type
    { };



  template<>
    struct hash<wstring>
    : public __hash_base<size_t, wstring>
    {
      size_t
      operator()(const wstring& __s) const noexcept
      { return std::_Hash_impl::hash(__s.data(),
                                     __s.length() * sizeof(wchar_t)); }
    };

  template<>
    struct __is_fast_hash<hash<wstring>> : std::false_type
    { };





  template<>
    struct hash<u16string>
    : public __hash_base<size_t, u16string>
    {
      size_t
      operator()(const u16string& __s) const noexcept
      { return std::_Hash_impl::hash(__s.data(),
                                     __s.length() * sizeof(char16_t)); }
    };

  template<>
    struct __is_fast_hash<hash<u16string>> : std::false_type
    { };


  template<>
    struct hash<u32string>
    : public __hash_base<size_t, u32string>
    {
      size_t
      operator()(const u32string& __s) const noexcept
      { return std::_Hash_impl::hash(__s.data(),
                                     __s.length() * sizeof(char32_t)); }
    };

  template<>
    struct __is_fast_hash<hash<u32string>> : std::false_type
    { };
# 5707 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h" 3
  inline namespace literals
  {
  inline namespace string_literals
  {


    __attribute ((__abi_tag__ ("cxx11")))
    inline basic_string<char>
    operator""s(const char* __str, size_t __len)
    { return basic_string<char>{__str, __len}; }


    __attribute ((__abi_tag__ ("cxx11")))
    inline basic_string<wchar_t>
    operator""s(const wchar_t* __str, size_t __len)
    { return basic_string<wchar_t>{__str, __len}; }



    __attribute ((__abi_tag__ ("cxx11")))
    inline basic_string<char16_t>
    operator""s(const char16_t* __str, size_t __len)
    { return basic_string<char16_t>{__str, __len}; }

    __attribute ((__abi_tag__ ("cxx11")))
    inline basic_string<char32_t>
    operator""s(const char32_t* __str, size_t __len)
    { return basic_string<char32_t>{__str, __len}; }



  }
  }



}
# 53 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc" 1 3
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc" 3



namespace std __attribute__ ((__visibility__ ("default")))
{




  template<typename _CharT, typename _Traits, typename _Alloc>
    const typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::npos;

  template<typename _CharT, typename _Traits, typename _Alloc>
    void
    basic_string<_CharT, _Traits, _Alloc>::
    swap(basic_string& __s) noexcept
    {
      if (this == &__s)
 return;

      _Alloc_traits::_S_on_swap(_M_get_allocator(), __s._M_get_allocator());

      if (_M_is_local())
 if (__s._M_is_local())
   {
     if (length() && __s.length())
       {
  _CharT __tmp_data[_S_local_capacity + 1];
  traits_type::copy(__tmp_data, __s._M_local_buf,
      _S_local_capacity + 1);
  traits_type::copy(__s._M_local_buf, _M_local_buf,
      _S_local_capacity + 1);
  traits_type::copy(_M_local_buf, __tmp_data,
      _S_local_capacity + 1);
       }
     else if (__s.length())
       {
  traits_type::copy(_M_local_buf, __s._M_local_buf,
      _S_local_capacity + 1);
  _M_length(__s.length());
  __s._M_set_length(0);
  return;
       }
     else if (length())
       {
  traits_type::copy(__s._M_local_buf, _M_local_buf,
      _S_local_capacity + 1);
  __s._M_length(length());
  _M_set_length(0);
  return;
       }
   }
 else
   {
     const size_type __tmp_capacity = __s._M_allocated_capacity;
     traits_type::copy(__s._M_local_buf, _M_local_buf,
         _S_local_capacity + 1);
     _M_data(__s._M_data());
     __s._M_data(__s._M_local_buf);
     _M_capacity(__tmp_capacity);
   }
      else
 {
   const size_type __tmp_capacity = _M_allocated_capacity;
   if (__s._M_is_local())
     {
       traits_type::copy(_M_local_buf, __s._M_local_buf,
    _S_local_capacity + 1);
       __s._M_data(_M_data());
       _M_data(_M_local_buf);
     }
   else
     {
       pointer __tmp_ptr = _M_data();
       _M_data(__s._M_data());
       __s._M_data(__tmp_ptr);
       _M_capacity(__s._M_allocated_capacity);
     }
   __s._M_capacity(__tmp_capacity);
 }

      const size_type __tmp_length = length();
      _M_length(__s.length());
      __s._M_length(__tmp_length);
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::pointer
    basic_string<_CharT, _Traits, _Alloc>::
    _M_create(size_type& __capacity, size_type __old_capacity)
    {


      if (__capacity > max_size())
 std::__throw_length_error(("basic_string::_M_create"));




      if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
 {
   __capacity = 2 * __old_capacity;

   if (__capacity > max_size())
     __capacity = max_size();
 }



      return _Alloc_traits::allocate(_M_get_allocator(), __capacity + 1);
    }





  template<typename _CharT, typename _Traits, typename _Alloc>
    template<typename _InIterator>
      void
      basic_string<_CharT, _Traits, _Alloc>::
      _M_construct(_InIterator __beg, _InIterator __end,
     std::input_iterator_tag)
      {
 size_type __len = 0;
 size_type __capacity = size_type(_S_local_capacity);

 while (__beg != __end && __len < __capacity)
   {
     _M_data()[__len++] = *__beg;
     ++__beg;
   }

 try
   {
     while (__beg != __end)
       {
  if (__len == __capacity)
    {

      __capacity = __len + 1;
      pointer __another = _M_create(__capacity, __len);
      this->_S_copy(__another, _M_data(), __len);
      _M_dispose();
      _M_data(__another);
      _M_capacity(__capacity);
    }
  _M_data()[__len++] = *__beg;
  ++__beg;
       }
   }
 catch(...)
   {
     _M_dispose();
     throw;
   }

 _M_set_length(__len);
      }

  template<typename _CharT, typename _Traits, typename _Alloc>
    template<typename _InIterator>
      void
      basic_string<_CharT, _Traits, _Alloc>::
      _M_construct(_InIterator __beg, _InIterator __end,
     std::forward_iterator_tag)
      {

 if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end)
   std::__throw_logic_error(("basic_string::" "_M_construct null not valid"));


 size_type __dnew = static_cast<size_type>(std::distance(__beg, __end));

 if (__dnew > size_type(_S_local_capacity))
   {
     _M_data(_M_create(__dnew, size_type(0)));
     _M_capacity(__dnew);
   }


 try
   { this->_S_copy_chars(_M_data(), __beg, __end); }
 catch(...)
   {
     _M_dispose();
     throw;
   }

 _M_set_length(__dnew);
      }

  template<typename _CharT, typename _Traits, typename _Alloc>
    void
    basic_string<_CharT, _Traits, _Alloc>::
    _M_construct(size_type __n, _CharT __c)
    {
      if (__n > size_type(_S_local_capacity))
 {
   _M_data(_M_create(__n, size_type(0)));
   _M_capacity(__n);
 }

      if (__n)
 this->_S_assign(_M_data(), __n, __c);

      _M_set_length(__n);
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    void
    basic_string<_CharT, _Traits, _Alloc>::
    _M_assign(const basic_string& __str)
    {
      if (this != &__str)
 {
   const size_type __rsize = __str.length();
   const size_type __capacity = capacity();

   if (__rsize > __capacity)
     {
       size_type __new_capacity = __rsize;
       pointer __tmp = _M_create(__new_capacity, __capacity);
       _M_dispose();
       _M_data(__tmp);
       _M_capacity(__new_capacity);
     }

   if (__rsize)
     this->_S_copy(_M_data(), __str._M_data(), __rsize);

   _M_set_length(__rsize);
 }
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    void
    basic_string<_CharT, _Traits, _Alloc>::
    reserve(size_type __res)
    {

      if (__res < length())
 __res = length();

      const size_type __capacity = capacity();
      if (__res != __capacity)
 {
   if (__res > __capacity
       || __res > size_type(_S_local_capacity))
     {
       pointer __tmp = _M_create(__res, __capacity);
       this->_S_copy(__tmp, _M_data(), length() + 1);
       _M_dispose();
       _M_data(__tmp);
       _M_capacity(__res);
     }
   else if (!_M_is_local())
     {
       this->_S_copy(_M_local_data(), _M_data(), length() + 1);
       _M_destroy(__capacity);
       _M_data(_M_local_data());
     }
 }
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    void
    basic_string<_CharT, _Traits, _Alloc>::
    _M_mutate(size_type __pos, size_type __len1, const _CharT* __s,
       size_type __len2)
    {
      const size_type __how_much = length() - __pos - __len1;

      size_type __new_capacity = length() + __len2 - __len1;
      pointer __r = _M_create(__new_capacity, capacity());

      if (__pos)
 this->_S_copy(__r, _M_data(), __pos);
      if (__s && __len2)
 this->_S_copy(__r + __pos, __s, __len2);
      if (__how_much)
 this->_S_copy(__r + __pos + __len2,
        _M_data() + __pos + __len1, __how_much);

      _M_dispose();
      _M_data(__r);
      _M_capacity(__new_capacity);
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    void
    basic_string<_CharT, _Traits, _Alloc>::
    _M_erase(size_type __pos, size_type __n)
    {
      const size_type __how_much = length() - __pos - __n;

      if (__how_much && __n)
 this->_S_move(_M_data() + __pos, _M_data() + __pos + __n, __how_much);

      _M_set_length(length() - __n);
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    void
    basic_string<_CharT, _Traits, _Alloc>::
    resize(size_type __n, _CharT __c)
    {
      const size_type __size = this->size();
      if (__size < __n)
 this->append(__n - __size, __c);
      else if (__n < __size)
 this->_M_erase(__n, __size - __n);
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>&
    basic_string<_CharT, _Traits, _Alloc>::
    _M_append(const _CharT* __s, size_type __n)
    {
      const size_type __len = __n + this->size();

      if (__len <= this->capacity())
 {
   if (__n)
     this->_S_copy(this->_M_data() + this->size(), __s, __n);
 }
      else
 this->_M_mutate(this->size(), size_type(0), __s, __n);

      this->_M_set_length(__len);
      return *this;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    template<typename _InputIterator>
      basic_string<_CharT, _Traits, _Alloc>&
      basic_string<_CharT, _Traits, _Alloc>::
      _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
     _InputIterator __k1, _InputIterator __k2,
     std::__false_type)
      {
 const basic_string __s(__k1, __k2);
 const size_type __n1 = __i2 - __i1;
 return _M_replace(__i1 - begin(), __n1, __s._M_data(),
     __s.size());
      }

  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>&
    basic_string<_CharT, _Traits, _Alloc>::
    _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
     _CharT __c)
    {
      _M_check_length(__n1, __n2, "basic_string::_M_replace_aux");

      const size_type __old_size = this->size();
      const size_type __new_size = __old_size + __n2 - __n1;

      if (__new_size <= this->capacity())
 {
   pointer __p = this->_M_data() + __pos1;

   const size_type __how_much = __old_size - __pos1 - __n1;
   if (__how_much && __n1 != __n2)
     this->_S_move(__p + __n2, __p + __n1, __how_much);
 }
      else
 this->_M_mutate(__pos1, __n1, 0, __n2);

      if (__n2)
 this->_S_assign(this->_M_data() + __pos1, __n2, __c);

      this->_M_set_length(__new_size);
      return *this;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>&
    basic_string<_CharT, _Traits, _Alloc>::
    _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
        const size_type __len2)
    {
      _M_check_length(__len1, __len2, "basic_string::_M_replace");

      const size_type __old_size = this->size();
      const size_type __new_size = __old_size + __len2 - __len1;

      if (__new_size <= this->capacity())
 {
   pointer __p = this->_M_data() + __pos;

   const size_type __how_much = __old_size - __pos - __len1;
   if (_M_disjunct(__s))
     {
       if (__how_much && __len1 != __len2)
  this->_S_move(__p + __len2, __p + __len1, __how_much);
       if (__len2)
  this->_S_copy(__p, __s, __len2);
     }
   else
     {

       if (__len2 && __len2 <= __len1)
  this->_S_move(__p, __s, __len2);
       if (__how_much && __len1 != __len2)
  this->_S_move(__p + __len2, __p + __len1, __how_much);
       if (__len2 > __len1)
  {
    if (__s + __len2 <= __p + __len1)
      this->_S_move(__p, __s, __len2);
    else if (__s >= __p + __len1)
      this->_S_copy(__p, __s + __len2 - __len1, __len2);
    else
      {
        const size_type __nleft = (__p + __len1) - __s;
        this->_S_move(__p, __s, __nleft);
        this->_S_copy(__p + __nleft, __p + __len2,
        __len2 - __nleft);
      }
  }
     }
 }
      else
 this->_M_mutate(__pos, __len1, __s, __len2);

      this->_M_set_length(__new_size);
      return *this;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    copy(_CharT* __s, size_type __n, size_type __pos) const
    {
      _M_check(__pos, "basic_string::copy");
      __n = _M_limit(__pos, __n);
                                             ;
      if (__n)
 _S_copy(__s, _M_data() + __pos, __n);

      return __n;
    }
# 1145 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>
    operator+(const _CharT* __lhs,
       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    {
                                      ;
      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef typename __string_type::size_type __size_type;
      const __size_type __len = _Traits::length(__lhs);
      __string_type __str;
      __str.reserve(__len + __rhs.size());
      __str.append(__lhs, __len);
      __str.append(__rhs);
      return __str;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>
    operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    {
      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef typename __string_type::size_type __size_type;
      __string_type __str;
      const __size_type __len = __rhs.size();
      __str.reserve(__len + 1);
      __str.append(__size_type(1), __lhs);
      __str.append(__rhs);
      return __str;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find(const _CharT* __s, size_type __pos, size_type __n) const
    {
                                             ;
      const size_type __size = this->size();
      const _CharT* __data = _M_data();

      if (__n == 0)
 return __pos <= __size ? __pos : npos;

      if (__n <= __size)
 {
   for (; __pos <= __size - __n; ++__pos)
     if (traits_type::eq(__data[__pos], __s[0])
  && traits_type::compare(__data + __pos + 1,
     __s + 1, __n - 1) == 0)
       return __pos;
 }
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find(_CharT __c, size_type __pos) const noexcept
    {
      size_type __ret = npos;
      const size_type __size = this->size();
      if (__pos < __size)
 {
   const _CharT* __data = _M_data();
   const size_type __n = __size - __pos;
   const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
   if (__p)
     __ret = __p - __data;
 }
      return __ret;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    rfind(const _CharT* __s, size_type __pos, size_type __n) const
    {
                                             ;
      const size_type __size = this->size();
      if (__n <= __size)
 {
   __pos = std::min(size_type(__size - __n), __pos);
   const _CharT* __data = _M_data();
   do
     {
       if (traits_type::compare(__data + __pos, __s, __n) == 0)
  return __pos;
     }
   while (__pos-- > 0);
 }
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    rfind(_CharT __c, size_type __pos) const noexcept
    {
      size_type __size = this->size();
      if (__size)
 {
   if (--__size > __pos)
     __size = __pos;
   for (++__size; __size-- > 0; )
     if (traits_type::eq(_M_data()[__size], __c))
       return __size;
 }
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
    {
                                             ;
      for (; __n && __pos < this->size(); ++__pos)
 {
   const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]);
   if (__p)
     return __pos;
 }
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
    {
                                             ;
      size_type __size = this->size();
      if (__size && __n)
 {
   if (--__size > __pos)
     __size = __pos;
   do
     {
       if (traits_type::find(__s, __n, _M_data()[__size]))
  return __size;
     }
   while (__size-- != 0);
 }
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
    {
                                             ;
      for (; __pos < this->size(); ++__pos)
 if (!traits_type::find(__s, __n, _M_data()[__pos]))
   return __pos;
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find_first_not_of(_CharT __c, size_type __pos) const noexcept
    {
      for (; __pos < this->size(); ++__pos)
 if (!traits_type::eq(_M_data()[__pos], __c))
   return __pos;
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
    {
                                             ;
      size_type __size = this->size();
      if (__size)
 {
   if (--__size > __pos)
     __size = __pos;
   do
     {
       if (!traits_type::find(__s, __n, _M_data()[__size]))
  return __size;
     }
   while (__size--);
 }
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::
    find_last_not_of(_CharT __c, size_type __pos) const noexcept
    {
      size_type __size = this->size();
      if (__size)
 {
   if (--__size > __pos)
     __size = __pos;
   do
     {
       if (!traits_type::eq(_M_data()[__size], __c))
  return __size;
     }
   while (__size--);
 }
      return npos;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    int
    basic_string<_CharT, _Traits, _Alloc>::
    compare(size_type __pos, size_type __n, const basic_string& __str) const
    {
      _M_check(__pos, "basic_string::compare");
      __n = _M_limit(__pos, __n);
      const size_type __osize = __str.size();
      const size_type __len = std::min(__n, __osize);
      int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
      if (!__r)
 __r = _S_compare(__n, __osize);
      return __r;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    int
    basic_string<_CharT, _Traits, _Alloc>::
    compare(size_type __pos1, size_type __n1, const basic_string& __str,
     size_type __pos2, size_type __n2) const
    {
      _M_check(__pos1, "basic_string::compare");
      __str._M_check(__pos2, "basic_string::compare");
      __n1 = _M_limit(__pos1, __n1);
      __n2 = __str._M_limit(__pos2, __n2);
      const size_type __len = std::min(__n1, __n2);
      int __r = traits_type::compare(_M_data() + __pos1,
         __str.data() + __pos2, __len);
      if (!__r)
 __r = _S_compare(__n1, __n2);
      return __r;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    int
    basic_string<_CharT, _Traits, _Alloc>::
    compare(const _CharT* __s) const
    {
                                    ;
      const size_type __size = this->size();
      const size_type __osize = traits_type::length(__s);
      const size_type __len = std::min(__size, __osize);
      int __r = traits_type::compare(_M_data(), __s, __len);
      if (!__r)
 __r = _S_compare(__size, __osize);
      return __r;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    int
    basic_string <_CharT, _Traits, _Alloc>::
    compare(size_type __pos, size_type __n1, const _CharT* __s) const
    {
                                    ;
      _M_check(__pos, "basic_string::compare");
      __n1 = _M_limit(__pos, __n1);
      const size_type __osize = traits_type::length(__s);
      const size_type __len = std::min(__n1, __osize);
      int __r = traits_type::compare(_M_data() + __pos, __s, __len);
      if (!__r)
 __r = _S_compare(__n1, __osize);
      return __r;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    int
    basic_string <_CharT, _Traits, _Alloc>::
    compare(size_type __pos, size_type __n1, const _CharT* __s,
     size_type __n2) const
    {
                                              ;
      _M_check(__pos, "basic_string::compare");
      __n1 = _M_limit(__pos, __n1);
      const size_type __len = std::min(__n1, __n2);
      int __r = traits_type::compare(_M_data() + __pos, __s, __len);
      if (!__r)
 __r = _S_compare(__n1, __n2);
      return __r;
    }


  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __in,
        basic_string<_CharT, _Traits, _Alloc>& __str)
    {
      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef typename __istream_type::ios_base __ios_base;
      typedef typename __istream_type::int_type __int_type;
      typedef typename __string_type::size_type __size_type;
      typedef ctype<_CharT> __ctype_type;
      typedef typename __ctype_type::ctype_base __ctype_base;

      __size_type __extracted = 0;
      typename __ios_base::iostate __err = __ios_base::goodbit;
      typename __istream_type::sentry __cerb(__in, false);
      if (__cerb)
 {
   try
     {

       __str.erase();
       _CharT __buf[128];
       __size_type __len = 0;
       const streamsize __w = __in.width();
       const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
                                : __str.max_size();
       const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
       const __int_type __eof = _Traits::eof();
       __int_type __c = __in.rdbuf()->sgetc();

       while (__extracted < __n
       && !_Traits::eq_int_type(__c, __eof)
       && !__ct.is(__ctype_base::space,
     _Traits::to_char_type(__c)))
  {
    if (__len == sizeof(__buf) / sizeof(_CharT))
      {
        __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
        __len = 0;
      }
    __buf[__len++] = _Traits::to_char_type(__c);
    ++__extracted;
    __c = __in.rdbuf()->snextc();
  }
       __str.append(__buf, __len);

       if (_Traits::eq_int_type(__c, __eof))
  __err |= __ios_base::eofbit;
       __in.width(0);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       __in._M_setstate(__ios_base::badbit);
       throw;
     }
   catch(...)
     {



       __in._M_setstate(__ios_base::badbit);
     }
 }

      if (!__extracted)
 __err |= __ios_base::failbit;
      if (__err)
 __in.setstate(__err);
      return __in;
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_istream<_CharT, _Traits>&
    getline(basic_istream<_CharT, _Traits>& __in,
     basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
    {
      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef typename __istream_type::ios_base __ios_base;
      typedef typename __istream_type::int_type __int_type;
      typedef typename __string_type::size_type __size_type;

      __size_type __extracted = 0;
      const __size_type __n = __str.max_size();
      typename __ios_base::iostate __err = __ios_base::goodbit;
      typename __istream_type::sentry __cerb(__in, true);
      if (__cerb)
 {
   try
     {
       __str.erase();
       const __int_type __idelim = _Traits::to_int_type(__delim);
       const __int_type __eof = _Traits::eof();
       __int_type __c = __in.rdbuf()->sgetc();

       while (__extracted < __n
       && !_Traits::eq_int_type(__c, __eof)
       && !_Traits::eq_int_type(__c, __idelim))
  {
    __str += _Traits::to_char_type(__c);
    ++__extracted;
    __c = __in.rdbuf()->snextc();
  }

       if (_Traits::eq_int_type(__c, __eof))
  __err |= __ios_base::eofbit;
       else if (_Traits::eq_int_type(__c, __idelim))
  {
    ++__extracted;
    __in.rdbuf()->sbumpc();
  }
       else
  __err |= __ios_base::failbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       __in._M_setstate(__ios_base::badbit);
       throw;
     }
   catch(...)
     {



       __in._M_setstate(__ios_base::badbit);
     }
 }
      if (!__extracted)
 __err |= __ios_base::failbit;
      if (__err)
 __in.setstate(__err);
      return __in;
    }




  extern template class basic_string<char>;
  extern template
    basic_istream<char>&
    operator>>(basic_istream<char>&, string&);
  extern template
    basic_ostream<char>&
    operator<<(basic_ostream<char>&, const string&);
  extern template
    basic_istream<char>&
    getline(basic_istream<char>&, string&, char);
  extern template
    basic_istream<char>&
    getline(basic_istream<char>&, string&);


  extern template class basic_string<wchar_t>;
  extern template
    basic_istream<wchar_t>&
    operator>>(basic_istream<wchar_t>&, wstring&);
  extern template
    basic_ostream<wchar_t>&
    operator<<(basic_ostream<wchar_t>&, const wstring&);
  extern template
    basic_istream<wchar_t>&
    getline(basic_istream<wchar_t>&, wstring&, wchar_t);
  extern template
    basic_istream<wchar_t>&
    getline(basic_istream<wchar_t>&, wstring&);




}
# 54 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/string" 2 3
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 2 3


namespace std __attribute__ ((__visibility__ ("default")))
{
# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
  class locale
  {
  public:


    typedef int category;


    class facet;
    class id;
    class _Impl;

    friend class facet;
    friend class _Impl;

    template<typename _Facet>
      friend bool
      has_facet(const locale&) throw();

    template<typename _Facet>
      friend const _Facet&
      use_facet(const locale&);

    template<typename _Cache>
      friend struct __use_cache;
# 98 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    static const category none = 0;
    static const category ctype = 1L << 0;
    static const category numeric = 1L << 1;
    static const category collate = 1L << 2;
    static const category time = 1L << 3;
    static const category monetary = 1L << 4;
    static const category messages = 1L << 5;
    static const category all = (ctype | numeric | collate |
        time | monetary | messages);
# 117 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    locale() throw();
# 126 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    locale(const locale& __other) throw();
# 136 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    explicit
    locale(const char* __s);
# 151 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    locale(const locale& __base, const char* __s, category __cat);
# 162 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    explicit
    locale(const std::string& __s) : locale(__s.c_str()) { }
# 177 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    locale(const locale& __base, const std::string& __s, category __cat)
    : locale(__base, __s.c_str(), __cat) { }
# 192 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    locale(const locale& __base, const locale& __add, category __cat);
# 205 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    template<typename _Facet>
      locale(const locale& __other, _Facet* __f);


    ~locale() throw();
# 219 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    const locale&
    operator=(const locale& __other) throw();
# 234 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    template<typename _Facet>
      locale
      combine(const locale& __other) const;






    __attribute ((__abi_tag__ ("cxx11")))
    string
    name() const;
# 254 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    bool
    operator==(const locale& __other) const throw();







    bool
    operator!=(const locale& __other) const throw()
    { return !(this->operator==(__other)); }
# 282 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    template<typename _Char, typename _Traits, typename _Alloc>
      bool
      operator()(const basic_string<_Char, _Traits, _Alloc>& __s1,
   const basic_string<_Char, _Traits, _Alloc>& __s2) const;
# 298 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    static locale
    global(const locale& __loc);




    static const locale&
    classic();

  private:

    _Impl* _M_impl;


    static _Impl* _S_classic;


    static _Impl* _S_global;





    static const char* const* const _S_categories;
# 333 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    enum { _S_categories_size = 6 + 6 };


    static __gthread_once_t _S_once;


    explicit
    locale(_Impl*) throw();

    static void
    _S_initialize();

    static void
    _S_initialize_once() throw();

    static category
    _S_normalize_category(category);

    void
    _M_coalesce(const locale& __base, const locale& __add, category __cat);


    static const id* const _S_twinned_facets[];

  };
# 371 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
  class locale::facet
  {
  private:
    friend class locale;
    friend class locale::_Impl;

    mutable _Atomic_word _M_refcount;


    static __c_locale _S_c_locale;


    static const char _S_c_name[2];


    static __gthread_once_t _S_once;


    static void
    _S_initialize_once();

  protected:
# 402 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    explicit
    facet(size_t __refs = 0) throw() : _M_refcount(__refs ? 1 : 0)
    { }


    virtual
    ~facet();

    static void
    _S_create_c_locale(__c_locale& __cloc, const char* __s,
         __c_locale __old = 0);

    static __c_locale
    _S_clone_c_locale(__c_locale& __cloc) throw();

    static void
    _S_destroy_c_locale(__c_locale& __cloc);

    static __c_locale
    _S_lc_ctype_c_locale(__c_locale __cloc, const char* __s);



    static __c_locale
    _S_get_c_locale();

    __attribute__ ((__const__)) static const char*
    _S_get_c_name() throw();
# 438 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
    facet(const facet&) = delete;

    facet&
    operator=(const facet&) = delete;


  private:
    void
    _M_add_reference() const throw()
    { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }

    void
    _M_remove_reference() const throw()
    {

                                                           ;
      if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
 {
                                                              ;
   try
     { delete this; }
   catch(...)
     { }
 }
    }

    class __shim;

    const facet* _M_sso_shim(const id*) const;
    const facet* _M_cow_shim(const id*) const;
  };
# 482 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
  class locale::id
  {
  private:
    friend class locale;
    friend class locale::_Impl;

    template<typename _Facet>
      friend const _Facet&
      use_facet(const locale&);

    template<typename _Facet>
      friend bool
      has_facet(const locale&) throw();




    mutable size_t _M_index;


    static _Atomic_word _S_refcount;

    void
    operator=(const id&);

    id(const id&);

  public:



    id() { }

    size_t
    _M_id() const throw();
  };



  class locale::_Impl
  {
  public:

    friend class locale;
    friend class locale::facet;

    template<typename _Facet>
      friend bool
      has_facet(const locale&) throw();

    template<typename _Facet>
      friend const _Facet&
      use_facet(const locale&);

    template<typename _Cache>
      friend struct __use_cache;

  private:

    _Atomic_word _M_refcount;
    const facet** _M_facets;
    size_t _M_facets_size;
    const facet** _M_caches;
    char** _M_names;
    static const locale::id* const _S_id_ctype[];
    static const locale::id* const _S_id_numeric[];
    static const locale::id* const _S_id_collate[];
    static const locale::id* const _S_id_time[];
    static const locale::id* const _S_id_monetary[];
    static const locale::id* const _S_id_messages[];
    static const locale::id* const* const _S_facet_categories[];

    void
    _M_add_reference() throw()
    { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }

    void
    _M_remove_reference() throw()
    {

                                                           ;
      if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
 {
                                                              ;
   try
     { delete this; }
   catch(...)
     { }
 }
    }

    _Impl(const _Impl&, size_t);
    _Impl(const char*, size_t);
    _Impl(size_t) throw();

   ~_Impl() throw();

    _Impl(const _Impl&);

    void
    operator=(const _Impl&);

    bool
    _M_check_same_name()
    {
      bool __ret = true;
      if (_M_names[1])

 for (size_t __i = 0; __ret && __i < _S_categories_size - 1; ++__i)
   __ret = __builtin_strcmp(_M_names[__i], _M_names[__i + 1]) == 0;
      return __ret;
    }

    void
    _M_replace_categories(const _Impl*, category);

    void
    _M_replace_category(const _Impl*, const locale::id* const*);

    void
    _M_replace_facet(const _Impl*, const locale::id*);

    void
    _M_install_facet(const locale::id*, const facet*);

    template<typename _Facet>
      void
      _M_init_facet(_Facet* __facet)
      { _M_install_facet(&_Facet::id, __facet); }

    template<typename _Facet>
      void
      _M_init_facet_unchecked(_Facet* __facet)
      {
 __facet->_M_add_reference();
 _M_facets[_Facet::id._M_id()] = __facet;
      }

    void
    _M_install_cache(const facet*, size_t);

    void _M_init_extra(facet**);
    void _M_init_extra(void*, void*, const char*, const char*);
  };
# 640 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
  template<typename _CharT>
    class __cxx11:: collate : public locale::facet
    {
    public:



      typedef _CharT char_type;
      typedef basic_string<_CharT> string_type;


    protected:


      __c_locale _M_c_locale_collate;

    public:

      static locale::id id;
# 667 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      explicit
      collate(size_t __refs = 0)
      : facet(__refs), _M_c_locale_collate(_S_get_c_locale())
      { }
# 681 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      explicit
      collate(__c_locale __cloc, size_t __refs = 0)
      : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc))
      { }
# 698 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      int
      compare(const _CharT* __lo1, const _CharT* __hi1,
       const _CharT* __lo2, const _CharT* __hi2) const
      { return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
# 717 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      string_type
      transform(const _CharT* __lo, const _CharT* __hi) const
      { return this->do_transform(__lo, __hi); }
# 731 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      long
      hash(const _CharT* __lo, const _CharT* __hi) const
      { return this->do_hash(__lo, __hi); }


      int
      _M_compare(const _CharT*, const _CharT*) const throw();

      size_t
      _M_transform(_CharT*, const _CharT*, size_t) const throw();

  protected:

      virtual
      ~collate()
      { _S_destroy_c_locale(_M_c_locale_collate); }
# 760 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      virtual int
      do_compare(const _CharT* __lo1, const _CharT* __hi1,
   const _CharT* __lo2, const _CharT* __hi2) const;
# 774 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      virtual string_type
      do_transform(const _CharT* __lo, const _CharT* __hi) const;
# 787 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 3
      virtual long
      do_hash(const _CharT* __lo, const _CharT* __hi) const;
    };

  template<typename _CharT>
    locale::id collate<_CharT>::id;


  template<>
    int
    collate<char>::_M_compare(const char*, const char*) const throw();

  template<>
    size_t
    collate<char>::_M_transform(char*, const char*, size_t) const throw();


  template<>
    int
    collate<wchar_t>::_M_compare(const wchar_t*, const wchar_t*) const throw();

  template<>
    size_t
    collate<wchar_t>::_M_transform(wchar_t*, const wchar_t*, size_t) const throw();



  template<typename _CharT>
    class __cxx11:: collate_byname : public collate<_CharT>
    {
    public:


      typedef _CharT char_type;
      typedef basic_string<_CharT> string_type;


      explicit
      collate_byname(const char* __s, size_t __refs = 0)
      : collate<_CharT>(__refs)
      {
 if (__builtin_strcmp(__s, "C") != 0
     && __builtin_strcmp(__s, "POSIX") != 0)
   {
     this->_S_destroy_c_locale(this->_M_c_locale_collate);
     this->_S_create_c_locale(this->_M_c_locale_collate, __s);
   }
      }


      explicit
      collate_byname(const string& __s, size_t __refs = 0)
      : collate_byname(__s.c_str(), __refs) { }


    protected:
      virtual
      ~collate_byname() { }
    };


}


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _Facet>
    locale::
    locale(const locale& __other, _Facet* __f)
    {
      _M_impl = new _Impl(*__other._M_impl, 1);

      try
 { _M_impl->_M_install_facet(&_Facet::id, __f); }
      catch(...)
 {
   _M_impl->_M_remove_reference();
   throw;
 }
      delete [] _M_impl->_M_names[0];
      _M_impl->_M_names[0] = 0;
    }

  template<typename _Facet>
    locale
    locale::
    combine(const locale& __other) const
    {
      _Impl* __tmp = new _Impl(*_M_impl, 1);
      try
 {
   __tmp->_M_replace_facet(__other._M_impl, &_Facet::id);
 }
      catch(...)
 {
   __tmp->_M_remove_reference();
   throw;
 }
      return locale(__tmp);
    }

  template<typename _CharT, typename _Traits, typename _Alloc>
    bool
    locale::
    operator()(const basic_string<_CharT, _Traits, _Alloc>& __s1,
        const basic_string<_CharT, _Traits, _Alloc>& __s2) const
    {
      typedef std::collate<_CharT> __collate_type;
      const __collate_type& __collate = use_facet<__collate_type>(*this);
      return (__collate.compare(__s1.data(), __s1.data() + __s1.length(),
    __s2.data(), __s2.data() + __s2.length()) < 0);
    }
# 102 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 3
  template<typename _Facet>
    bool
    has_facet(const locale& __loc) throw()
    {
      const size_t __i = _Facet::id._M_id();
      const locale::facet** __facets = __loc._M_impl->_M_facets;
      return (__i < __loc._M_impl->_M_facets_size

       && dynamic_cast<const _Facet*>(__facets[__i]));



    }
# 130 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.tcc" 3
  template<typename _Facet>
    const _Facet&
    use_facet(const locale& __loc)
    {
      const size_t __i = _Facet::id._M_id();
      const locale::facet** __facets = __loc._M_impl->_M_facets;
      if (__i >= __loc._M_impl->_M_facets_size || !__facets[__i])
        __throw_bad_cast();

      return dynamic_cast<const _Facet&>(*__facets[__i]);



    }



  template<typename _CharT>
    int
    collate<_CharT>::_M_compare(const _CharT*, const _CharT*) const throw ()
    { return 0; }


  template<typename _CharT>
    size_t
    collate<_CharT>::_M_transform(_CharT*, const _CharT*, size_t) const throw ()
    { return 0; }

  template<typename _CharT>
    int
    collate<_CharT>::
    do_compare(const _CharT* __lo1, const _CharT* __hi1,
        const _CharT* __lo2, const _CharT* __hi2) const
    {


      const string_type __one(__lo1, __hi1);
      const string_type __two(__lo2, __hi2);

      const _CharT* __p = __one.c_str();
      const _CharT* __pend = __one.data() + __one.length();
      const _CharT* __q = __two.c_str();
      const _CharT* __qend = __two.data() + __two.length();




      for (;;)
 {
   const int __res = _M_compare(__p, __q);
   if (__res)
     return __res;

   __p += char_traits<_CharT>::length(__p);
   __q += char_traits<_CharT>::length(__q);
   if (__p == __pend && __q == __qend)
     return 0;
   else if (__p == __pend)
     return -1;
   else if (__q == __qend)
     return 1;

   __p++;
   __q++;
 }
    }

  template<typename _CharT>
    typename collate<_CharT>::string_type
    collate<_CharT>::
    do_transform(const _CharT* __lo, const _CharT* __hi) const
    {
      string_type __ret;


      const string_type __str(__lo, __hi);

      const _CharT* __p = __str.c_str();
      const _CharT* __pend = __str.data() + __str.length();

      size_t __len = (__hi - __lo) * 2;

      _CharT* __c = new _CharT[__len];

      try
 {



   for (;;)
     {

       size_t __res = _M_transform(__c, __p, __len);


       if (__res >= __len)
  {
    __len = __res + 1;
    delete [] __c, __c = 0;
    __c = new _CharT[__len];
    __res = _M_transform(__c, __p, __len);
  }

       __ret.append(__c, __res);
       __p += char_traits<_CharT>::length(__p);
       if (__p == __pend)
  break;

       __p++;
       __ret.push_back(_CharT());
     }
 }
      catch(...)
 {
   delete [] __c;
   throw;
 }

      delete [] __c;

      return __ret;
    }

  template<typename _CharT>
    long
    collate<_CharT>::
    do_hash(const _CharT* __lo, const _CharT* __hi) const
    {
      unsigned long __val = 0;
      for (; __lo < __hi; ++__lo)
 __val =
   *__lo + ((__val << 7)
     | (__val >> (__gnu_cxx::__numeric_traits<unsigned long>::
    __digits - 7)));
      return static_cast<long>(__val);
    }




  extern template class collate<char>;
  extern template class collate_byname<char>;

  extern template
    const collate<char>&
    use_facet<collate<char> >(const locale&);

  extern template
    bool
    has_facet<collate<char> >(const locale&);


  extern template class collate<wchar_t>;
  extern template class collate_byname<wchar_t>;

  extern template
    const collate<wchar_t>&
    use_facet<collate<wchar_t> >(const locale&);

  extern template
    bool
    has_facet<collate<wchar_t> >(const locale&);




}
# 851 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_classes.h" 2 3
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 2 3




# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 3






# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/error_constants.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/error_constants.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 3


# 1 "/usr/include/errno.h" 1 3 4
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cerrno" 2 3
# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/error_constants.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  enum class errc
    {
      address_family_not_supported = 97,
      address_in_use = 98,
      address_not_available = 99,
      already_connected = 106,
      argument_list_too_long = 7,
      argument_out_of_domain = 33,
      bad_address = 14,
      bad_file_descriptor = 9,


      bad_message = 74,


      broken_pipe = 32,
      connection_aborted = 103,
      connection_already_in_progress = 114,
      connection_refused = 111,
      connection_reset = 104,
      cross_device_link = 18,
      destination_address_required = 89,
      device_or_resource_busy = 16,
      directory_not_empty = 39,
      executable_format_error = 8,
      file_exists = 17,
      file_too_large = 27,
      filename_too_long = 36,
      function_not_supported = 38,
      host_unreachable = 113,


      identifier_removed = 43,


      illegal_byte_sequence = 84,
      inappropriate_io_control_operation = 25,
      interrupted = 4,
      invalid_argument = 22,
      invalid_seek = 29,
      io_error = 5,
      is_a_directory = 21,
      message_size = 90,
      network_down = 100,
      network_reset = 102,
      network_unreachable = 101,
      no_buffer_space = 105,
      no_child_process = 10,


      no_link = 67,


      no_lock_available = 37,


      no_message_available = 61,


      no_message = 42,
      no_protocol_option = 92,
      no_space_on_device = 28,


      no_stream_resources = 63,


      no_such_device_or_address = 6,
      no_such_device = 19,
      no_such_file_or_directory = 2,
      no_such_process = 3,
      not_a_directory = 20,
      not_a_socket = 88,


      not_a_stream = 60,


      not_connected = 107,
      not_enough_memory = 12,


      not_supported = 95,



      operation_canceled = 125,


      operation_in_progress = 115,
      operation_not_permitted = 1,
      operation_not_supported = 95,
      operation_would_block = 11,


      owner_dead = 130,


      permission_denied = 13,


      protocol_error = 71,


      protocol_not_supported = 93,
      read_only_file_system = 30,
      resource_deadlock_would_occur = 35,
      resource_unavailable_try_again = 11,
      result_out_of_range = 34,


      state_not_recoverable = 131,



      stream_timeout = 62,



      text_file_busy = 26,


      timed_out = 110,
      too_many_files_open_in_system = 23,
      too_many_files_open = 24,
      too_many_links = 31,
      too_many_symbolic_link_levels = 40,


      value_too_large = 75,


      wrong_protocol_type = 91
    };


}
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdexcept" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdexcept" 3




namespace std __attribute__ ((__visibility__ ("default")))
{





  struct __cow_string
  {
    union {
      const char* _M_p;
      char _M_bytes[sizeof(const char*)];
    };

    __cow_string();
    __cow_string(const std::string&);
    __cow_string(const char*, size_t);
    __cow_string(const __cow_string&) noexcept;
    __cow_string& operator=(const __cow_string&) noexcept;
    ~__cow_string();

    __cow_string(__cow_string&&) noexcept;
    __cow_string& operator=(__cow_string&&) noexcept;

  };

  typedef basic_string<char> __sso_string;
# 113 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdexcept" 3
  class logic_error : public exception
  {
    __cow_string _M_msg;

  public:

    explicit
    logic_error(const string& __arg) ;


    explicit
    logic_error(const char*) ;



    logic_error(const logic_error&) noexcept;
    logic_error& operator=(const logic_error&) noexcept;


    virtual ~logic_error() noexcept;



    virtual const char*
    what() const noexcept;





  };



  class domain_error : public logic_error
  {
  public:
    explicit domain_error(const string& __arg) ;

    explicit domain_error(const char*) ;

    virtual ~domain_error() noexcept;
  };


  class invalid_argument : public logic_error
  {
  public:
    explicit invalid_argument(const string& __arg) ;

    explicit invalid_argument(const char*) ;

    virtual ~invalid_argument() noexcept;
  };



  class length_error : public logic_error
  {
  public:
    explicit length_error(const string& __arg) ;

    explicit length_error(const char*) ;

    virtual ~length_error() noexcept;
  };



  class out_of_range : public logic_error
  {
  public:
    explicit out_of_range(const string& __arg) ;

    explicit out_of_range(const char*) ;

    virtual ~out_of_range() noexcept;
  };






  class runtime_error : public exception
  {
    __cow_string _M_msg;

  public:

    explicit
    runtime_error(const string& __arg) ;


    explicit
    runtime_error(const char*) ;



    runtime_error(const runtime_error&) noexcept;
    runtime_error& operator=(const runtime_error&) noexcept;


    virtual ~runtime_error() noexcept;



    virtual const char*
    what() const noexcept;





  };


  class range_error : public runtime_error
  {
  public:
    explicit range_error(const string& __arg) ;

    explicit range_error(const char*) ;

    virtual ~range_error() noexcept;
  };


  class overflow_error : public runtime_error
  {
  public:
    explicit overflow_error(const string& __arg) ;

    explicit overflow_error(const char*) ;

    virtual ~overflow_error() noexcept;
  };


  class underflow_error : public runtime_error
  {
  public:
    explicit underflow_error(const string& __arg) ;

    explicit underflow_error(const char*) ;

    virtual ~underflow_error() noexcept;
  };




}
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  class error_code;
  class error_condition;
  class system_error;


  template<typename _Tp>
    struct is_error_code_enum : public false_type { };


  template<typename _Tp>
    struct is_error_condition_enum : public false_type { };

  template<>
    struct is_error_condition_enum<errc>
    : public true_type { };

  inline namespace _V2 {


  class error_category
  {
  public:
    constexpr error_category() noexcept = default;

    virtual ~error_category();

    error_category(const error_category&) = delete;
    error_category& operator=(const error_category&) = delete;

    virtual const char*
    name() const noexcept = 0;






  private:
    __attribute ((__abi_tag__ ("cxx11")))
    virtual __cow_string
    _M_message(int) const;

  public:
    __attribute ((__abi_tag__ ("cxx11")))
    virtual string
    message(int) const = 0;
# 102 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/system_error" 3
  public:
    virtual error_condition
    default_error_condition(int __i) const noexcept;

    virtual bool
    equivalent(int __i, const error_condition& __cond) const noexcept;

    virtual bool
    equivalent(const error_code& __code, int __i) const noexcept;

    bool
    operator<(const error_category& __other) const noexcept
    { return less<const error_category*>()(this, &__other); }

    bool
    operator==(const error_category& __other) const noexcept
    { return this == &__other; }

    bool
    operator!=(const error_category& __other) const noexcept
    { return this != &__other; }
  };


  __attribute__ ((__const__)) const error_category& system_category() noexcept;
  __attribute__ ((__const__)) const error_category& generic_category() noexcept;

  }

  error_code make_error_code(errc) noexcept;

  template<typename _Tp>
    struct hash;



  struct error_code
  {
    error_code() noexcept
    : _M_value(0), _M_cat(&system_category()) { }

    error_code(int __v, const error_category& __cat) noexcept
    : _M_value(__v), _M_cat(&__cat) { }

    template<typename _ErrorCodeEnum, typename = typename
      enable_if<is_error_code_enum<_ErrorCodeEnum>::value>::type>
      error_code(_ErrorCodeEnum __e) noexcept
      { *this = make_error_code(__e); }

    void
    assign(int __v, const error_category& __cat) noexcept
    {
      _M_value = __v;
      _M_cat = &__cat;
    }

    void
    clear() noexcept
    { assign(0, system_category()); }


    template<typename _ErrorCodeEnum>
      typename enable_if<is_error_code_enum<_ErrorCodeEnum>::value,
    error_code&>::type
      operator=(_ErrorCodeEnum __e) noexcept
      { return *this = make_error_code(__e); }

    int
    value() const noexcept { return _M_value; }

    const error_category&
    category() const noexcept { return *_M_cat; }

    error_condition
    default_error_condition() const noexcept;

    __attribute ((__abi_tag__ ("cxx11")))
    string
    message() const
    { return category().message(value()); }

    explicit operator bool() const noexcept
    { return _M_value != 0; }


  private:
    friend class hash<error_code>;

    int _M_value;
    const error_category* _M_cat;
  };


  inline error_code
  make_error_code(errc __e) noexcept
  { return error_code(static_cast<int>(__e), generic_category()); }

  inline bool
  operator<(const error_code& __lhs, const error_code& __rhs) noexcept
  {
    return (__lhs.category() < __rhs.category()
     || (__lhs.category() == __rhs.category()
  && __lhs.value() < __rhs.value()));
  }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __e)
    { return (__os << __e.category().name() << ':' << __e.value()); }

  error_condition make_error_condition(errc) noexcept;



  struct error_condition
  {
    error_condition() noexcept
    : _M_value(0), _M_cat(&generic_category()) { }

    error_condition(int __v, const error_category& __cat) noexcept
    : _M_value(__v), _M_cat(&__cat) { }

    template<typename _ErrorConditionEnum, typename = typename
  enable_if<is_error_condition_enum<_ErrorConditionEnum>::value>::type>
      error_condition(_ErrorConditionEnum __e) noexcept
      { *this = make_error_condition(__e); }

    void
    assign(int __v, const error_category& __cat) noexcept
    {
      _M_value = __v;
      _M_cat = &__cat;
    }


    template<typename _ErrorConditionEnum>
      typename enable_if<is_error_condition_enum
    <_ErrorConditionEnum>::value, error_condition&>::type
      operator=(_ErrorConditionEnum __e) noexcept
      { return *this = make_error_condition(__e); }

    void
    clear() noexcept
    { assign(0, generic_category()); }


    int
    value() const noexcept { return _M_value; }

    const error_category&
    category() const noexcept { return *_M_cat; }

    __attribute ((__abi_tag__ ("cxx11")))
    string
    message() const
    { return category().message(value()); }

    explicit operator bool() const noexcept
    { return _M_value != 0; }


  private:
    int _M_value;
    const error_category* _M_cat;
  };


  inline error_condition
  make_error_condition(errc __e) noexcept
  { return error_condition(static_cast<int>(__e), generic_category()); }

  inline bool
  operator<(const error_condition& __lhs,
     const error_condition& __rhs) noexcept
  {
    return (__lhs.category() < __rhs.category()
     || (__lhs.category() == __rhs.category()
  && __lhs.value() < __rhs.value()));
  }


  inline bool
  operator==(const error_code& __lhs, const error_code& __rhs) noexcept
  { return (__lhs.category() == __rhs.category()
     && __lhs.value() == __rhs.value()); }

  inline bool
  operator==(const error_code& __lhs, const error_condition& __rhs) noexcept
  {
    return (__lhs.category().equivalent(__lhs.value(), __rhs)
     || __rhs.category().equivalent(__lhs, __rhs.value()));
  }

  inline bool
  operator==(const error_condition& __lhs, const error_code& __rhs) noexcept
  {
    return (__rhs.category().equivalent(__rhs.value(), __lhs)
     || __lhs.category().equivalent(__rhs, __lhs.value()));
  }

  inline bool
  operator==(const error_condition& __lhs,
      const error_condition& __rhs) noexcept
  {
    return (__lhs.category() == __rhs.category()
     && __lhs.value() == __rhs.value());
  }

  inline bool
  operator!=(const error_code& __lhs, const error_code& __rhs) noexcept
  { return !(__lhs == __rhs); }

  inline bool
  operator!=(const error_code& __lhs, const error_condition& __rhs) noexcept
  { return !(__lhs == __rhs); }

  inline bool
  operator!=(const error_condition& __lhs, const error_code& __rhs) noexcept
  { return !(__lhs == __rhs); }

  inline bool
  operator!=(const error_condition& __lhs,
      const error_condition& __rhs) noexcept
  { return !(__lhs == __rhs); }







  class system_error : public std::runtime_error
  {
  private:
    error_code _M_code;

  public:
    system_error(error_code __ec = error_code())
    : runtime_error(__ec.message()), _M_code(__ec) { }

    system_error(error_code __ec, const string& __what)
    : runtime_error(__what + ": " + __ec.message()), _M_code(__ec) { }

    system_error(error_code __ec, const char* __what)
    : runtime_error(__what + (": " + __ec.message())), _M_code(__ec) { }

    system_error(int __v, const error_category& __ecat, const char* __what)
    : system_error(error_code(__v, __ecat), __what) { }

    system_error(int __v, const error_category& __ecat)
    : runtime_error(error_code(__v, __ecat).message()),
      _M_code(__v, __ecat) { }

    system_error(int __v, const error_category& __ecat, const string& __what)
    : runtime_error(__what + ": " + error_code(__v, __ecat).message()),
      _M_code(__v, __ecat) { }

    virtual ~system_error() noexcept;

    const error_code&
    code() const noexcept { return _M_code; }
  };


}





namespace std __attribute__ ((__visibility__ ("default")))
{




  template<>
    struct hash<error_code>
    : public __hash_base<size_t, error_code>
    {
      size_t
      operator()(const error_code& __e) const noexcept
      {
 const size_t __tmp = std::_Hash_impl::hash(__e._M_value);
 return std::_Hash_impl::__hash_combine(__e._M_cat, __tmp);
      }
    };


}
# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 2 3


namespace std __attribute__ ((__visibility__ ("default")))
{






  enum _Ios_Fmtflags
    {
      _S_boolalpha = 1L << 0,
      _S_dec = 1L << 1,
      _S_fixed = 1L << 2,
      _S_hex = 1L << 3,
      _S_internal = 1L << 4,
      _S_left = 1L << 5,
      _S_oct = 1L << 6,
      _S_right = 1L << 7,
      _S_scientific = 1L << 8,
      _S_showbase = 1L << 9,
      _S_showpoint = 1L << 10,
      _S_showpos = 1L << 11,
      _S_skipws = 1L << 12,
      _S_unitbuf = 1L << 13,
      _S_uppercase = 1L << 14,
      _S_adjustfield = _S_left | _S_right | _S_internal,
      _S_basefield = _S_dec | _S_oct | _S_hex,
      _S_floatfield = _S_scientific | _S_fixed,
      _S_ios_fmtflags_end = 1L << 16,
      _S_ios_fmtflags_max = 2147483647,
      _S_ios_fmtflags_min = ~2147483647
    };

  inline constexpr _Ios_Fmtflags
  operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
  { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }

  inline constexpr _Ios_Fmtflags
  operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
  { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }

  inline constexpr _Ios_Fmtflags
  operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
  { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }

  inline constexpr _Ios_Fmtflags
  operator~(_Ios_Fmtflags __a)
  { return _Ios_Fmtflags(~static_cast<int>(__a)); }

  inline const _Ios_Fmtflags&
  operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
  { return __a = __a | __b; }

  inline const _Ios_Fmtflags&
  operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
  { return __a = __a & __b; }

  inline const _Ios_Fmtflags&
  operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
  { return __a = __a ^ __b; }


  enum _Ios_Openmode
    {
      _S_app = 1L << 0,
      _S_ate = 1L << 1,
      _S_bin = 1L << 2,
      _S_in = 1L << 3,
      _S_out = 1L << 4,
      _S_trunc = 1L << 5,
      _S_ios_openmode_end = 1L << 16,
      _S_ios_openmode_max = 2147483647,
      _S_ios_openmode_min = ~2147483647
    };

  inline constexpr _Ios_Openmode
  operator&(_Ios_Openmode __a, _Ios_Openmode __b)
  { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }

  inline constexpr _Ios_Openmode
  operator|(_Ios_Openmode __a, _Ios_Openmode __b)
  { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }

  inline constexpr _Ios_Openmode
  operator^(_Ios_Openmode __a, _Ios_Openmode __b)
  { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }

  inline constexpr _Ios_Openmode
  operator~(_Ios_Openmode __a)
  { return _Ios_Openmode(~static_cast<int>(__a)); }

  inline const _Ios_Openmode&
  operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
  { return __a = __a | __b; }

  inline const _Ios_Openmode&
  operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
  { return __a = __a & __b; }

  inline const _Ios_Openmode&
  operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
  { return __a = __a ^ __b; }


  enum _Ios_Iostate
    {
      _S_goodbit = 0,
      _S_badbit = 1L << 0,
      _S_eofbit = 1L << 1,
      _S_failbit = 1L << 2,
      _S_ios_iostate_end = 1L << 16,
      _S_ios_iostate_max = 2147483647,
      _S_ios_iostate_min = ~2147483647
    };

  inline constexpr _Ios_Iostate
  operator&(_Ios_Iostate __a, _Ios_Iostate __b)
  { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }

  inline constexpr _Ios_Iostate
  operator|(_Ios_Iostate __a, _Ios_Iostate __b)
  { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }

  inline constexpr _Ios_Iostate
  operator^(_Ios_Iostate __a, _Ios_Iostate __b)
  { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }

  inline constexpr _Ios_Iostate
  operator~(_Ios_Iostate __a)
  { return _Ios_Iostate(~static_cast<int>(__a)); }

  inline const _Ios_Iostate&
  operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
  { return __a = __a | __b; }

  inline const _Ios_Iostate&
  operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
  { return __a = __a & __b; }

  inline const _Ios_Iostate&
  operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
  { return __a = __a ^ __b; }


  enum _Ios_Seekdir
    {
      _S_beg = 0,
      _S_cur = 1,
      _S_end = 2,
      _S_ios_seekdir_end = 1L << 16
    };



  enum class io_errc { stream = 1 };

  template <> struct is_error_code_enum<io_errc> : public true_type { };

  const error_category& iostream_category() noexcept;

  inline error_code
  make_error_code(io_errc e) noexcept
  { return error_code(static_cast<int>(e), iostream_category()); }

  inline error_condition
  make_error_condition(io_errc e) noexcept
  { return error_condition(static_cast<int>(e), iostream_category()); }
# 228 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
  class ios_base
  {
# 246 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
  public:
# 255 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    class __attribute ((__abi_tag__ ("cxx11"))) failure : public system_error
    {
    public:
      explicit
      failure(const string& __str);


      explicit
      failure(const string&, const error_code&);

      explicit
      failure(const char*, const error_code& = io_errc::stream);


      virtual
      ~failure() throw();

      virtual const char*
      what() const throw();
    };
# 323 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    typedef _Ios_Fmtflags fmtflags;


    static const fmtflags boolalpha = _S_boolalpha;


    static const fmtflags dec = _S_dec;


    static const fmtflags fixed = _S_fixed;


    static const fmtflags hex = _S_hex;




    static const fmtflags internal = _S_internal;



    static const fmtflags left = _S_left;


    static const fmtflags oct = _S_oct;



    static const fmtflags right = _S_right;


    static const fmtflags scientific = _S_scientific;



    static const fmtflags showbase = _S_showbase;



    static const fmtflags showpoint = _S_showpoint;


    static const fmtflags showpos = _S_showpos;


    static const fmtflags skipws = _S_skipws;


    static const fmtflags unitbuf = _S_unitbuf;



    static const fmtflags uppercase = _S_uppercase;


    static const fmtflags adjustfield = _S_adjustfield;


    static const fmtflags basefield = _S_basefield;


    static const fmtflags floatfield = _S_floatfield;
# 398 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    typedef _Ios_Iostate iostate;



    static const iostate badbit = _S_badbit;


    static const iostate eofbit = _S_eofbit;




    static const iostate failbit = _S_failbit;


    static const iostate goodbit = _S_goodbit;
# 429 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    typedef _Ios_Openmode openmode;


    static const openmode app = _S_app;


    static const openmode ate = _S_ate;




    static const openmode binary = _S_bin;


    static const openmode in = _S_in;


    static const openmode out = _S_out;


    static const openmode trunc = _S_trunc;
# 461 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    typedef _Ios_Seekdir seekdir;


    static const seekdir beg = _S_beg;


    static const seekdir cur = _S_cur;


    static const seekdir end = _S_end;


    typedef int io_state;
    typedef int open_mode;
    typedef int seek_dir;

    typedef std::streampos streampos;
    typedef std::streamoff streamoff;
# 487 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    enum event
    {
      erase_event,
      imbue_event,
      copyfmt_event
    };
# 504 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    typedef void (*event_callback) (event __e, ios_base& __b, int __i);
# 516 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    void
    register_callback(event_callback __fn, int __index);

  protected:
    streamsize _M_precision;
    streamsize _M_width;
    fmtflags _M_flags;
    iostate _M_exception;
    iostate _M_streambuf_state;



    struct _Callback_list
    {

      _Callback_list* _M_next;
      ios_base::event_callback _M_fn;
      int _M_index;
      _Atomic_word _M_refcount;

      _Callback_list(ios_base::event_callback __fn, int __index,
       _Callback_list* __cb)
      : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }

      void
      _M_add_reference() { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }


      int
      _M_remove_reference()
      {

                                                             ;
        int __res = __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1);
        if (__res == 0)
          {
                                                                ;
          }
        return __res;
      }
    };

     _Callback_list* _M_callbacks;

    void
    _M_call_callbacks(event __ev) throw();

    void
    _M_dispose_callbacks(void) throw();


    struct _Words
    {
      void* _M_pword;
      long _M_iword;
      _Words() : _M_pword(0), _M_iword(0) { }
    };


    _Words _M_word_zero;



    enum { _S_local_word_size = 8 };
    _Words _M_local_word[_S_local_word_size];


    int _M_word_size;
    _Words* _M_word;

    _Words&
    _M_grow_words(int __index, bool __iword);


    locale _M_ios_locale;

    void
    _M_init() throw();

  public:





    class Init
    {
      friend class ios_base;
    public:
      Init();
      ~Init();

    private:
      static _Atomic_word _S_refcount;
      static bool _S_synced_with_stdio;
    };






    fmtflags
    flags() const
    { return _M_flags; }
# 629 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    fmtflags
    flags(fmtflags __fmtfl)
    {
      fmtflags __old = _M_flags;
      _M_flags = __fmtfl;
      return __old;
    }
# 645 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    fmtflags
    setf(fmtflags __fmtfl)
    {
      fmtflags __old = _M_flags;
      _M_flags |= __fmtfl;
      return __old;
    }
# 662 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    fmtflags
    setf(fmtflags __fmtfl, fmtflags __mask)
    {
      fmtflags __old = _M_flags;
      _M_flags &= ~__mask;
      _M_flags |= (__fmtfl & __mask);
      return __old;
    }







    void
    unsetf(fmtflags __mask)
    { _M_flags &= ~__mask; }
# 688 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    streamsize
    precision() const
    { return _M_precision; }






    streamsize
    precision(streamsize __prec)
    {
      streamsize __old = _M_precision;
      _M_precision = __prec;
      return __old;
    }







    streamsize
    width() const
    { return _M_width; }






    streamsize
    width(streamsize __wide)
    {
      streamsize __old = _M_width;
      _M_width = __wide;
      return __old;
    }
# 739 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    static bool
    sync_with_stdio(bool __sync = true);
# 751 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    locale
    imbue(const locale& __loc) throw();
# 762 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    locale
    getloc() const
    { return _M_ios_locale; }
# 773 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    const locale&
    _M_getloc() const
    { return _M_ios_locale; }
# 792 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    static int
    xalloc() throw();
# 808 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    long&
    iword(int __ix)
    {
      _Words& __word = (__ix < _M_word_size)
   ? _M_word[__ix] : _M_grow_words(__ix, true);
      return __word._M_iword;
    }
# 829 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    void*&
    pword(int __ix)
    {
      _Words& __word = (__ix < _M_word_size)
   ? _M_word[__ix] : _M_grow_words(__ix, false);
      return __word._M_pword;
    }
# 846 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
    virtual ~ios_base();

  protected:
    ios_base() throw ();
# 860 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ios_base.h" 3
  public:
    ios_base(const ios_base&) = delete;

    ios_base&
    operator=(const ios_base&) = delete;

  protected:
    void
    _M_move(ios_base&) noexcept;

    void
    _M_swap(ios_base& __rhs) noexcept;

  };



  inline ios_base&
  boolalpha(ios_base& __base)
  {
    __base.setf(ios_base::boolalpha);
    return __base;
  }


  inline ios_base&
  noboolalpha(ios_base& __base)
  {
    __base.unsetf(ios_base::boolalpha);
    return __base;
  }


  inline ios_base&
  showbase(ios_base& __base)
  {
    __base.setf(ios_base::showbase);
    return __base;
  }


  inline ios_base&
  noshowbase(ios_base& __base)
  {
    __base.unsetf(ios_base::showbase);
    return __base;
  }


  inline ios_base&
  showpoint(ios_base& __base)
  {
    __base.setf(ios_base::showpoint);
    return __base;
  }


  inline ios_base&
  noshowpoint(ios_base& __base)
  {
    __base.unsetf(ios_base::showpoint);
    return __base;
  }


  inline ios_base&
  showpos(ios_base& __base)
  {
    __base.setf(ios_base::showpos);
    return __base;
  }


  inline ios_base&
  noshowpos(ios_base& __base)
  {
    __base.unsetf(ios_base::showpos);
    return __base;
  }


  inline ios_base&
  skipws(ios_base& __base)
  {
    __base.setf(ios_base::skipws);
    return __base;
  }


  inline ios_base&
  noskipws(ios_base& __base)
  {
    __base.unsetf(ios_base::skipws);
    return __base;
  }


  inline ios_base&
  uppercase(ios_base& __base)
  {
    __base.setf(ios_base::uppercase);
    return __base;
  }


  inline ios_base&
  nouppercase(ios_base& __base)
  {
    __base.unsetf(ios_base::uppercase);
    return __base;
  }


  inline ios_base&
  unitbuf(ios_base& __base)
  {
     __base.setf(ios_base::unitbuf);
     return __base;
  }


  inline ios_base&
  nounitbuf(ios_base& __base)
  {
     __base.unsetf(ios_base::unitbuf);
     return __base;
  }



  inline ios_base&
  internal(ios_base& __base)
  {
     __base.setf(ios_base::internal, ios_base::adjustfield);
     return __base;
  }


  inline ios_base&
  left(ios_base& __base)
  {
    __base.setf(ios_base::left, ios_base::adjustfield);
    return __base;
  }


  inline ios_base&
  right(ios_base& __base)
  {
    __base.setf(ios_base::right, ios_base::adjustfield);
    return __base;
  }



  inline ios_base&
  dec(ios_base& __base)
  {
    __base.setf(ios_base::dec, ios_base::basefield);
    return __base;
  }


  inline ios_base&
  hex(ios_base& __base)
  {
    __base.setf(ios_base::hex, ios_base::basefield);
    return __base;
  }


  inline ios_base&
  oct(ios_base& __base)
  {
    __base.setf(ios_base::oct, ios_base::basefield);
    return __base;
  }



  inline ios_base&
  fixed(ios_base& __base)
  {
    __base.setf(ios_base::fixed, ios_base::floatfield);
    return __base;
  }


  inline ios_base&
  scientific(ios_base& __base)
  {
    __base.setf(ios_base::scientific, ios_base::floatfield);
    return __base;
  }






  inline ios_base&
  hexfloat(ios_base& __base)
  {
    __base.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield);
    return __base;
  }


  inline ios_base&
  defaultfloat(ios_base& __base)
  {
    __base.unsetf(ios_base::floatfield);
    return __base;
  }



}
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3








namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _CharT, typename _Traits>
    streamsize
    __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*,
     basic_streambuf<_CharT, _Traits>*, bool&);
# 119 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
  template<typename _CharT, typename _Traits>
    class basic_streambuf
    {
    public:






      typedef _CharT char_type;
      typedef _Traits traits_type;
      typedef typename traits_type::int_type int_type;
      typedef typename traits_type::pos_type pos_type;
      typedef typename traits_type::off_type off_type;




      typedef basic_streambuf<char_type, traits_type> __streambuf_type;


      friend class basic_ios<char_type, traits_type>;
      friend class basic_istream<char_type, traits_type>;
      friend class basic_ostream<char_type, traits_type>;
      friend class istreambuf_iterator<char_type, traits_type>;
      friend class ostreambuf_iterator<char_type, traits_type>;

      friend streamsize
      __copy_streambufs_eof<>(basic_streambuf*, basic_streambuf*, bool&);

      template<bool _IsMove, typename _CharT2>
        friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
            _CharT2*>::__type
        __copy_move_a2(istreambuf_iterator<_CharT2>,
         istreambuf_iterator<_CharT2>, _CharT2*);

      template<typename _CharT2>
        friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
      istreambuf_iterator<_CharT2> >::__type
        find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
      const _CharT2&);

      template<typename _CharT2, typename _Traits2>
        friend basic_istream<_CharT2, _Traits2>&
        operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*);

      template<typename _CharT2, typename _Traits2, typename _Alloc>
        friend basic_istream<_CharT2, _Traits2>&
        operator>>(basic_istream<_CharT2, _Traits2>&,
     basic_string<_CharT2, _Traits2, _Alloc>&);

      template<typename _CharT2, typename _Traits2, typename _Alloc>
        friend basic_istream<_CharT2, _Traits2>&
        getline(basic_istream<_CharT2, _Traits2>&,
  basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2);

    protected:







      char_type* _M_in_beg;
      char_type* _M_in_cur;
      char_type* _M_in_end;
      char_type* _M_out_beg;
      char_type* _M_out_cur;
      char_type* _M_out_end;


      locale _M_buf_locale;

  public:

      virtual
      ~basic_streambuf()
      { }
# 208 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      locale
      pubimbue(const locale& __loc)
      {
 locale __tmp(this->getloc());
 this->imbue(__loc);
 _M_buf_locale = __loc;
 return __tmp;
      }
# 225 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      locale
      getloc() const
      { return _M_buf_locale; }
# 238 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      basic_streambuf*
      pubsetbuf(char_type* __s, streamsize __n)
      { return this->setbuf(__s, __n); }
# 250 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      pos_type
      pubseekoff(off_type __off, ios_base::seekdir __way,
   ios_base::openmode __mode = ios_base::in | ios_base::out)
      { return this->seekoff(__off, __way, __mode); }
# 262 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      pos_type
      pubseekpos(pos_type __sp,
   ios_base::openmode __mode = ios_base::in | ios_base::out)
      { return this->seekpos(__sp, __mode); }




      int
      pubsync() { return this->sync(); }
# 283 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      streamsize
      in_avail()
      {
 const streamsize __ret = this->egptr() - this->gptr();
 return __ret ? __ret : this->showmanyc();
      }
# 297 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      int_type
      snextc()
      {
 int_type __ret = traits_type::eof();
 if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(),
             __ret), true))
   __ret = this->sgetc();
 return __ret;
      }
# 315 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      int_type
      sbumpc()
      {
 int_type __ret;
 if (__builtin_expect(this->gptr() < this->egptr(), true))
   {
     __ret = traits_type::to_int_type(*this->gptr());
     this->gbump(1);
   }
 else
   __ret = this->uflow();
 return __ret;
      }
# 337 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      int_type
      sgetc()
      {
 int_type __ret;
 if (__builtin_expect(this->gptr() < this->egptr(), true))
   __ret = traits_type::to_int_type(*this->gptr());
 else
   __ret = this->underflow();
 return __ret;
      }
# 356 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      streamsize
      sgetn(char_type* __s, streamsize __n)
      { return this->xsgetn(__s, __n); }
# 371 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      int_type
      sputbackc(char_type __c)
      {
 int_type __ret;
 const bool __testpos = this->eback() < this->gptr();
 if (__builtin_expect(!__testpos ||
        !traits_type::eq(__c, this->gptr()[-1]), false))
   __ret = this->pbackfail(traits_type::to_int_type(__c));
 else
   {
     this->gbump(-1);
     __ret = traits_type::to_int_type(*this->gptr());
   }
 return __ret;
      }
# 396 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      int_type
      sungetc()
      {
 int_type __ret;
 if (__builtin_expect(this->eback() < this->gptr(), true))
   {
     this->gbump(-1);
     __ret = traits_type::to_int_type(*this->gptr());
   }
 else
   __ret = this->pbackfail();
 return __ret;
      }
# 423 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      int_type
      sputc(char_type __c)
      {
 int_type __ret;
 if (__builtin_expect(this->pptr() < this->epptr(), true))
   {
     *this->pptr() = __c;
     this->pbump(1);
     __ret = traits_type::to_int_type(__c);
   }
 else
   __ret = this->overflow(traits_type::to_int_type(__c));
 return __ret;
      }
# 449 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      streamsize
      sputn(const char_type* __s, streamsize __n)
      { return this->xsputn(__s, __n); }

    protected:
# 463 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      basic_streambuf()
      : _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
      _M_out_beg(0), _M_out_cur(0), _M_out_end(0),
      _M_buf_locale(locale())
      { }
# 481 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      char_type*
      eback() const { return _M_in_beg; }

      char_type*
      gptr() const { return _M_in_cur; }

      char_type*
      egptr() const { return _M_in_end; }
# 497 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      void
      gbump(int __n) { _M_in_cur += __n; }
# 508 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      void
      setg(char_type* __gbeg, char_type* __gnext, char_type* __gend)
      {
 _M_in_beg = __gbeg;
 _M_in_cur = __gnext;
 _M_in_end = __gend;
      }
# 528 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      char_type*
      pbase() const { return _M_out_beg; }

      char_type*
      pptr() const { return _M_out_cur; }

      char_type*
      epptr() const { return _M_out_end; }
# 544 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      void
      pbump(int __n) { _M_out_cur += __n; }
# 554 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      void
      setp(char_type* __pbeg, char_type* __pend)
      {
 _M_out_beg = _M_out_cur = __pbeg;
 _M_out_end = __pend;
      }
# 575 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual void
      imbue(const locale& __loc)
      { }
# 590 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual basic_streambuf<char_type,_Traits>*
      setbuf(char_type*, streamsize)
      { return this; }
# 601 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual pos_type
      seekoff(off_type, ios_base::seekdir,
       ios_base::openmode = ios_base::in | ios_base::out)
      { return pos_type(off_type(-1)); }
# 613 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual pos_type
      seekpos(pos_type,
       ios_base::openmode = ios_base::in | ios_base::out)
      { return pos_type(off_type(-1)); }
# 626 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual int
      sync() { return 0; }
# 648 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual streamsize
      showmanyc() { return 0; }
# 664 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual streamsize
      xsgetn(char_type* __s, streamsize __n);
# 686 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual int_type
      underflow()
      { return traits_type::eof(); }
# 699 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual int_type
      uflow()
      {
 int_type __ret = traits_type::eof();
 const bool __testeof = traits_type::eq_int_type(this->underflow(),
       __ret);
 if (!__testeof)
   {
     __ret = traits_type::to_int_type(*this->gptr());
     this->gbump(1);
   }
 return __ret;
      }
# 723 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual int_type
      pbackfail(int_type __c = traits_type::eof())
      { return traits_type::eof(); }
# 741 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual streamsize
      xsputn(const char_type* __s, streamsize __n);
# 767 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      virtual int_type
      overflow(int_type __c = traits_type::eof())
      { return traits_type::eof(); }



    public:
# 782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 3
      void
      stossc()
      {
 if (this->gptr() < this->egptr())
   this->gbump(1);
 else
   this->uflow();
      }



      void
      __safe_gbump(streamsize __n) { _M_in_cur += __n; }

      void
      __safe_pbump(streamsize __n) { _M_out_cur += __n; }




    protected:

      basic_streambuf(const basic_streambuf&);

      basic_streambuf&
      operator=(const basic_streambuf&);


      void
      swap(basic_streambuf& __sb)
      {
 std::swap(_M_in_beg, __sb._M_in_beg);
 std::swap(_M_in_cur, __sb._M_in_cur);
 std::swap(_M_in_end, __sb._M_in_end);
 std::swap(_M_out_beg, __sb._M_out_beg);
 std::swap(_M_out_cur, __sb._M_out_cur);
 std::swap(_M_out_end, __sb._M_out_end);
 std::swap(_M_buf_locale, __sb._M_buf_locale);
      }

    };


  template<typename _CharT, typename _Traits>
    std::basic_streambuf<_CharT, _Traits>::
    basic_streambuf(const basic_streambuf&) = default;

  template<typename _CharT, typename _Traits>
    std::basic_streambuf<_CharT, _Traits>&
    std::basic_streambuf<_CharT, _Traits>::
    operator=(const basic_streambuf&) = default;



  template<>
    streamsize
    __copy_streambufs_eof(basic_streambuf<char>* __sbin,
     basic_streambuf<char>* __sbout, bool& __ineof);

  template<>
    streamsize
    __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin,
     basic_streambuf<wchar_t>* __sbout, bool& __ineof);



}


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf.tcc" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf.tcc" 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _CharT, typename _Traits>
    streamsize
    basic_streambuf<_CharT, _Traits>::
    xsgetn(char_type* __s, streamsize __n)
    {
      streamsize __ret = 0;
      while (__ret < __n)
 {
   const streamsize __buf_len = this->egptr() - this->gptr();
   if (__buf_len)
     {
       const streamsize __remaining = __n - __ret;
       const streamsize __len = std::min(__buf_len, __remaining);
       traits_type::copy(__s, this->gptr(), __len);
       __ret += __len;
       __s += __len;
       this->__safe_gbump(__len);
     }

   if (__ret < __n)
     {
       const int_type __c = this->uflow();
       if (!traits_type::eq_int_type(__c, traits_type::eof()))
  {
    traits_type::assign(*__s++, traits_type::to_char_type(__c));
    ++__ret;
  }
       else
  break;
     }
 }
      return __ret;
    }

  template<typename _CharT, typename _Traits>
    streamsize
    basic_streambuf<_CharT, _Traits>::
    xsputn(const char_type* __s, streamsize __n)
    {
      streamsize __ret = 0;
      while (__ret < __n)
 {
   const streamsize __buf_len = this->epptr() - this->pptr();
   if (__buf_len)
     {
       const streamsize __remaining = __n - __ret;
       const streamsize __len = std::min(__buf_len, __remaining);
       traits_type::copy(this->pptr(), __s, __len);
       __ret += __len;
       __s += __len;
       this->__safe_pbump(__len);
     }

   if (__ret < __n)
     {
       int_type __c = this->overflow(traits_type::to_int_type(*__s));
       if (!traits_type::eq_int_type(__c, traits_type::eof()))
  {
    ++__ret;
    ++__s;
  }
       else
  break;
     }
 }
      return __ret;
    }




  template<typename _CharT, typename _Traits>
    streamsize
    __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>* __sbin,
     basic_streambuf<_CharT, _Traits>* __sbout,
     bool& __ineof)
    {
      streamsize __ret = 0;
      __ineof = true;
      typename _Traits::int_type __c = __sbin->sgetc();
      while (!_Traits::eq_int_type(__c, _Traits::eof()))
 {
   __c = __sbout->sputc(_Traits::to_char_type(__c));
   if (_Traits::eq_int_type(__c, _Traits::eof()))
     {
       __ineof = false;
       break;
     }
   ++__ret;
   __c = __sbin->snextc();
 }
      return __ret;
    }

  template<typename _CharT, typename _Traits>
    inline streamsize
    __copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin,
        basic_streambuf<_CharT, _Traits>* __sbout)
    {
      bool __ineof;
      return __copy_streambufs_eof(__sbin, __sbout, __ineof);
    }




  extern template class basic_streambuf<char>;
  extern template
    streamsize
    __copy_streambufs(basic_streambuf<char>*,
        basic_streambuf<char>*);
  extern template
    streamsize
    __copy_streambufs_eof(basic_streambuf<char>*,
     basic_streambuf<char>*, bool&);


  extern template class basic_streambuf<wchar_t>;
  extern template
    streamsize
    __copy_streambufs(basic_streambuf<wchar_t>*,
        basic_streambuf<wchar_t>*);
  extern template
    streamsize
    __copy_streambufs_eof(basic_streambuf<wchar_t>*,
     basic_streambuf<wchar_t>*, bool&);




}
# 851 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/streambuf" 2 3
# 44 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 3
# 50 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 3
# 1 "/usr/include/wctype.h" 1 3 4
# 33 "/usr/include/wctype.h" 3 4
# 1 "/usr/include/wchar.h" 1 3 4
# 34 "/usr/include/wctype.h" 2 3 4
# 52 "/usr/include/wctype.h" 3 4
typedef unsigned long int wctype_t;
# 71 "/usr/include/wctype.h" 3 4
enum
{
  __ISwupper = 0,
  __ISwlower = 1,
  __ISwalpha = 2,
  __ISwdigit = 3,
  __ISwxdigit = 4,
  __ISwspace = 5,
  __ISwprint = 6,
  __ISwgraph = 7,
  __ISwblank = 8,
  __ISwcntrl = 9,
  __ISwpunct = 10,
  __ISwalnum = 11,

  _ISwupper = ((__ISwupper) < 8 ? (int) ((1UL << (__ISwupper)) << 24) : ((__ISwupper) < 16 ? (int) ((1UL << (__ISwupper)) << 8) : ((__ISwupper) < 24 ? (int) ((1UL << (__ISwupper)) >> 8) : (int) ((1UL << (__ISwupper)) >> 24)))),
  _ISwlower = ((__ISwlower) < 8 ? (int) ((1UL << (__ISwlower)) << 24) : ((__ISwlower) < 16 ? (int) ((1UL << (__ISwlower)) << 8) : ((__ISwlower) < 24 ? (int) ((1UL << (__ISwlower)) >> 8) : (int) ((1UL << (__ISwlower)) >> 24)))),
  _ISwalpha = ((__ISwalpha) < 8 ? (int) ((1UL << (__ISwalpha)) << 24) : ((__ISwalpha) < 16 ? (int) ((1UL << (__ISwalpha)) << 8) : ((__ISwalpha) < 24 ? (int) ((1UL << (__ISwalpha)) >> 8) : (int) ((1UL << (__ISwalpha)) >> 24)))),
  _ISwdigit = ((__ISwdigit) < 8 ? (int) ((1UL << (__ISwdigit)) << 24) : ((__ISwdigit) < 16 ? (int) ((1UL << (__ISwdigit)) << 8) : ((__ISwdigit) < 24 ? (int) ((1UL << (__ISwdigit)) >> 8) : (int) ((1UL << (__ISwdigit)) >> 24)))),
  _ISwxdigit = ((__ISwxdigit) < 8 ? (int) ((1UL << (__ISwxdigit)) << 24) : ((__ISwxdigit) < 16 ? (int) ((1UL << (__ISwxdigit)) << 8) : ((__ISwxdigit) < 24 ? (int) ((1UL << (__ISwxdigit)) >> 8) : (int) ((1UL << (__ISwxdigit)) >> 24)))),
  _ISwspace = ((__ISwspace) < 8 ? (int) ((1UL << (__ISwspace)) << 24) : ((__ISwspace) < 16 ? (int) ((1UL << (__ISwspace)) << 8) : ((__ISwspace) < 24 ? (int) ((1UL << (__ISwspace)) >> 8) : (int) ((1UL << (__ISwspace)) >> 24)))),
  _ISwprint = ((__ISwprint) < 8 ? (int) ((1UL << (__ISwprint)) << 24) : ((__ISwprint) < 16 ? (int) ((1UL << (__ISwprint)) << 8) : ((__ISwprint) < 24 ? (int) ((1UL << (__ISwprint)) >> 8) : (int) ((1UL << (__ISwprint)) >> 24)))),
  _ISwgraph = ((__ISwgraph) < 8 ? (int) ((1UL << (__ISwgraph)) << 24) : ((__ISwgraph) < 16 ? (int) ((1UL << (__ISwgraph)) << 8) : ((__ISwgraph) < 24 ? (int) ((1UL << (__ISwgraph)) >> 8) : (int) ((1UL << (__ISwgraph)) >> 24)))),
  _ISwblank = ((__ISwblank) < 8 ? (int) ((1UL << (__ISwblank)) << 24) : ((__ISwblank) < 16 ? (int) ((1UL << (__ISwblank)) << 8) : ((__ISwblank) < 24 ? (int) ((1UL << (__ISwblank)) >> 8) : (int) ((1UL << (__ISwblank)) >> 24)))),
  _ISwcntrl = ((__ISwcntrl) < 8 ? (int) ((1UL << (__ISwcntrl)) << 24) : ((__ISwcntrl) < 16 ? (int) ((1UL << (__ISwcntrl)) << 8) : ((__ISwcntrl) < 24 ? (int) ((1UL << (__ISwcntrl)) >> 8) : (int) ((1UL << (__ISwcntrl)) >> 24)))),
  _ISwpunct = ((__ISwpunct) < 8 ? (int) ((1UL << (__ISwpunct)) << 24) : ((__ISwpunct) < 16 ? (int) ((1UL << (__ISwpunct)) << 8) : ((__ISwpunct) < 24 ? (int) ((1UL << (__ISwpunct)) >> 8) : (int) ((1UL << (__ISwpunct)) >> 24)))),
  _ISwalnum = ((__ISwalnum) < 8 ? (int) ((1UL << (__ISwalnum)) << 24) : ((__ISwalnum) < 16 ? (int) ((1UL << (__ISwalnum)) << 8) : ((__ISwalnum) < 24 ? (int) ((1UL << (__ISwalnum)) >> 8) : (int) ((1UL << (__ISwalnum)) >> 24))))
};



extern "C" {
# 111 "/usr/include/wctype.h" 3 4
extern int iswalnum (wint_t __wc) throw ();





extern int iswalpha (wint_t __wc) throw ();


extern int iswcntrl (wint_t __wc) throw ();



extern int iswdigit (wint_t __wc) throw ();



extern int iswgraph (wint_t __wc) throw ();




extern int iswlower (wint_t __wc) throw ();


extern int iswprint (wint_t __wc) throw ();




extern int iswpunct (wint_t __wc) throw ();




extern int iswspace (wint_t __wc) throw ();




extern int iswupper (wint_t __wc) throw ();




extern int iswxdigit (wint_t __wc) throw ();





extern int iswblank (wint_t __wc) throw ();
# 171 "/usr/include/wctype.h" 3 4
extern wctype_t wctype (const char *__property) throw ();



extern int iswctype (wint_t __wc, wctype_t __desc) throw ();
# 186 "/usr/include/wctype.h" 3 4
typedef const __int32_t *wctrans_t;







extern wint_t towlower (wint_t __wc) throw ();


extern wint_t towupper (wint_t __wc) throw ();


}
# 213 "/usr/include/wctype.h" 3 4
extern "C" {




extern wctrans_t wctrans (const char *__property) throw ();


extern wint_t towctrans (wint_t __wc, wctrans_t __desc) throw ();
# 230 "/usr/include/wctype.h" 3 4
extern int iswalnum_l (wint_t __wc, __locale_t __locale) throw ();





extern int iswalpha_l (wint_t __wc, __locale_t __locale) throw ();


extern int iswcntrl_l (wint_t __wc, __locale_t __locale) throw ();



extern int iswdigit_l (wint_t __wc, __locale_t __locale) throw ();



extern int iswgraph_l (wint_t __wc, __locale_t __locale) throw ();




extern int iswlower_l (wint_t __wc, __locale_t __locale) throw ();


extern int iswprint_l (wint_t __wc, __locale_t __locale) throw ();




extern int iswpunct_l (wint_t __wc, __locale_t __locale) throw ();




extern int iswspace_l (wint_t __wc, __locale_t __locale) throw ();




extern int iswupper_l (wint_t __wc, __locale_t __locale) throw ();




extern int iswxdigit_l (wint_t __wc, __locale_t __locale) throw ();




extern int iswblank_l (wint_t __wc, __locale_t __locale) throw ();



extern wctype_t wctype_l (const char *__property, __locale_t __locale)
     throw ();



extern int iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale)
     throw ();







extern wint_t towlower_l (wint_t __wc, __locale_t __locale) throw ();


extern wint_t towupper_l (wint_t __wc, __locale_t __locale) throw ();



extern wctrans_t wctrans_l (const char *__property, __locale_t __locale)
     throw ();


extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc,
      __locale_t __locale) throw ();



}
# 51 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 2 3
# 80 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cwctype" 3
namespace std
{
  using ::wctrans_t;
  using ::wctype_t;
  using ::wint_t;

  using ::iswalnum;
  using ::iswalpha;

  using ::iswblank;

  using ::iswcntrl;
  using ::iswctype;
  using ::iswdigit;
  using ::iswgraph;
  using ::iswlower;
  using ::iswprint;
  using ::iswpunct;
  using ::iswspace;
  using ::iswupper;
  using ::iswxdigit;
  using ::towctrans;
  using ::towlower;
  using ::towupper;
  using ::wctrans;
  using ::wctype;
}
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cctype" 3
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_base.h" 1 3
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_base.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{



  struct ctype_base
  {

    typedef const int* __to_type;



    typedef unsigned short mask;
    static const mask upper = _ISupper;
    static const mask lower = _ISlower;
    static const mask alpha = _ISalpha;
    static const mask digit = _ISdigit;
    static const mask xdigit = _ISxdigit;
    static const mask space = _ISspace;
    static const mask print = _ISprint;
    static const mask graph = _ISalpha | _ISdigit | _ISpunct;
    static const mask cntrl = _IScntrl;
    static const mask punct = _ISpunct;
    static const mask alnum = _ISalpha | _ISdigit;

    static const mask blank = _ISblank;

  };


}
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3






# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf_iterator.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf_iterator.h" 3




namespace std __attribute__ ((__visibility__ ("default")))
{
# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/streambuf_iterator.h" 3
  template<typename _CharT, typename _Traits>
    class istreambuf_iterator
    : public iterator<input_iterator_tag, _CharT, typename _Traits::off_type,
                      _CharT*,


        _CharT>



    {
    public:



      typedef _CharT char_type;
      typedef _Traits traits_type;
      typedef typename _Traits::int_type int_type;
      typedef basic_streambuf<_CharT, _Traits> streambuf_type;
      typedef basic_istream<_CharT, _Traits> istream_type;


      template<typename _CharT2>
 friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
                      ostreambuf_iterator<_CharT2> >::__type
 copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
      ostreambuf_iterator<_CharT2>);

      template<bool _IsMove, typename _CharT2>
 friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
            _CharT2*>::__type
 __copy_move_a2(istreambuf_iterator<_CharT2>,
         istreambuf_iterator<_CharT2>, _CharT2*);

      template<typename _CharT2>
 friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
               istreambuf_iterator<_CharT2> >::__type
 find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
      const _CharT2&);

    private:







      mutable streambuf_type* _M_sbuf;
      mutable int_type _M_c;

    public:

      constexpr istreambuf_iterator() noexcept
      : _M_sbuf(0), _M_c(traits_type::eof()) { }


      istreambuf_iterator(const istreambuf_iterator&) noexcept = default;

      ~istreambuf_iterator() = default;



      istreambuf_iterator(istream_type& __s) noexcept
      : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }


      istreambuf_iterator(streambuf_type* __s) noexcept
      : _M_sbuf(__s), _M_c(traits_type::eof()) { }




      char_type
      operator*() const
      {







 return traits_type::to_char_type(_M_get());
      }


      istreambuf_iterator&
      operator++()
      {


                        ;
 if (_M_sbuf)
   {
     _M_sbuf->sbumpc();
     _M_c = traits_type::eof();
   }
 return *this;
      }


      istreambuf_iterator
      operator++(int)
      {


                        ;

 istreambuf_iterator __old = *this;
 if (_M_sbuf)
   {
     __old._M_c = _M_sbuf->sbumpc();
     _M_c = traits_type::eof();
   }
 return __old;
      }





      bool
      equal(const istreambuf_iterator& __b) const
      { return _M_at_eof() == __b._M_at_eof(); }

    private:
      int_type
      _M_get() const
      {
 const int_type __eof = traits_type::eof();
 int_type __ret = __eof;
 if (_M_sbuf)
   {
     if (!traits_type::eq_int_type(_M_c, __eof))
       __ret = _M_c;
     else if (!traits_type::eq_int_type((__ret = _M_sbuf->sgetc()),
            __eof))
       _M_c = __ret;
     else
       _M_sbuf = 0;
   }
 return __ret;
      }

      bool
      _M_at_eof() const
      {
 const int_type __eof = traits_type::eof();
 return traits_type::eq_int_type(_M_get(), __eof);
      }
    };

  template<typename _CharT, typename _Traits>
    inline bool
    operator==(const istreambuf_iterator<_CharT, _Traits>& __a,
        const istreambuf_iterator<_CharT, _Traits>& __b)
    { return __a.equal(__b); }

  template<typename _CharT, typename _Traits>
    inline bool
    operator!=(const istreambuf_iterator<_CharT, _Traits>& __a,
        const istreambuf_iterator<_CharT, _Traits>& __b)
    { return !__a.equal(__b); }


  template<typename _CharT, typename _Traits>
    class ostreambuf_iterator
    : public iterator<output_iterator_tag, void, void, void, void>
    {
    public:



      typedef _CharT char_type;
      typedef _Traits traits_type;
      typedef basic_streambuf<_CharT, _Traits> streambuf_type;
      typedef basic_ostream<_CharT, _Traits> ostream_type;


      template<typename _CharT2>
 friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
                      ostreambuf_iterator<_CharT2> >::__type
 copy(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>,
      ostreambuf_iterator<_CharT2>);

    private:
      streambuf_type* _M_sbuf;
      bool _M_failed;

    public:

      ostreambuf_iterator(ostream_type& __s) noexcept
      : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }


      ostreambuf_iterator(streambuf_type* __s) noexcept
      : _M_sbuf(__s), _M_failed(!_M_sbuf) { }


      ostreambuf_iterator&
      operator=(_CharT __c)
      {
 if (!_M_failed &&
     _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
   _M_failed = true;
 return *this;
      }


      ostreambuf_iterator&
      operator*()
      { return *this; }


      ostreambuf_iterator&
      operator++(int)
      { return *this; }


      ostreambuf_iterator&
      operator++()
      { return *this; }


      bool
      failed() const noexcept
      { return _M_failed; }

      ostreambuf_iterator&
      _M_put(const _CharT* __ws, streamsize __len)
      {
 if (__builtin_expect(!_M_failed, true)
     && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len,
    false))
   _M_failed = true;
 return *this;
      }
    };


  template<typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
                           ostreambuf_iterator<_CharT> >::__type
    copy(istreambuf_iterator<_CharT> __first,
  istreambuf_iterator<_CharT> __last,
  ostreambuf_iterator<_CharT> __result)
    {
      if (__first._M_sbuf && !__last._M_sbuf && !__result._M_failed)
 {
   bool __ineof;
   __copy_streambufs_eof(__first._M_sbuf, __result._M_sbuf, __ineof);
   if (!__ineof)
     __result._M_failed = true;
 }
      return __result;
    }

  template<bool _IsMove, typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
            ostreambuf_iterator<_CharT> >::__type
    __copy_move_a2(_CharT* __first, _CharT* __last,
     ostreambuf_iterator<_CharT> __result)
    {
      const streamsize __num = __last - __first;
      if (__num > 0)
 __result._M_put(__first, __num);
      return __result;
    }

  template<bool _IsMove, typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
        ostreambuf_iterator<_CharT> >::__type
    __copy_move_a2(const _CharT* __first, const _CharT* __last,
     ostreambuf_iterator<_CharT> __result)
    {
      const streamsize __num = __last - __first;
      if (__num > 0)
 __result._M_put(__first, __num);
      return __result;
    }

  template<bool _IsMove, typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
            _CharT*>::__type
    __copy_move_a2(istreambuf_iterator<_CharT> __first,
     istreambuf_iterator<_CharT> __last, _CharT* __result)
    {
      typedef istreambuf_iterator<_CharT> __is_iterator_type;
      typedef typename __is_iterator_type::traits_type traits_type;
      typedef typename __is_iterator_type::streambuf_type streambuf_type;
      typedef typename traits_type::int_type int_type;

      if (__first._M_sbuf && !__last._M_sbuf)
 {
   streambuf_type* __sb = __first._M_sbuf;
   int_type __c = __sb->sgetc();
   while (!traits_type::eq_int_type(__c, traits_type::eof()))
     {
       const streamsize __n = __sb->egptr() - __sb->gptr();
       if (__n > 1)
  {
    traits_type::copy(__result, __sb->gptr(), __n);
    __sb->__safe_gbump(__n);
    __result += __n;
    __c = __sb->underflow();
  }
       else
  {
    *__result++ = traits_type::to_char_type(__c);
    __c = __sb->snextc();
  }
     }
 }
      return __result;
    }

  template<typename _CharT>
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
          istreambuf_iterator<_CharT> >::__type
    find(istreambuf_iterator<_CharT> __first,
  istreambuf_iterator<_CharT> __last, const _CharT& __val)
    {
      typedef istreambuf_iterator<_CharT> __is_iterator_type;
      typedef typename __is_iterator_type::traits_type traits_type;
      typedef typename __is_iterator_type::streambuf_type streambuf_type;
      typedef typename traits_type::int_type int_type;

      if (__first._M_sbuf && !__last._M_sbuf)
 {
   const int_type __ival = traits_type::to_int_type(__val);
   streambuf_type* __sb = __first._M_sbuf;
   int_type __c = __sb->sgetc();
   while (!traits_type::eq_int_type(__c, traits_type::eof())
   && !traits_type::eq_int_type(__c, __ival))
     {
       streamsize __n = __sb->egptr() - __sb->gptr();
       if (__n > 1)
  {
    const _CharT* __p = traits_type::find(__sb->gptr(),
       __n, __val);
    if (__p)
      __n = __p - __sb->gptr();
    __sb->__safe_gbump(__n);
    __c = __sb->sgetc();
  }
       else
  __c = __sb->snextc();
     }

   if (!traits_type::eq_int_type(__c, traits_type::eof()))
     __first._M_c = __c;
   else
     __first._M_sbuf = 0;
 }
      return __first;
    }




}
# 49 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 71 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<typename _Tp>
    void
    __convert_to_v(const char*, _Tp&, ios_base::iostate&,
     const __c_locale&) throw();


  template<>
    void
    __convert_to_v(const char*, float&, ios_base::iostate&,
     const __c_locale&) throw();

  template<>
    void
    __convert_to_v(const char*, double&, ios_base::iostate&,
     const __c_locale&) throw();

  template<>
    void
    __convert_to_v(const char*, long double&, ios_base::iostate&,
     const __c_locale&) throw();



  template<typename _CharT, typename _Traits>
    struct __pad
    {
      static void
      _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
      const _CharT* __olds, streamsize __newlen, streamsize __oldlen);
    };






  template<typename _CharT>
    _CharT*
    __add_grouping(_CharT* __s, _CharT __sep,
     const char* __gbeg, size_t __gsize,
     const _CharT* __first, const _CharT* __last);




  template<typename _CharT>
    inline
    ostreambuf_iterator<_CharT>
    __write(ostreambuf_iterator<_CharT> __s, const _CharT* __ws, int __len)
    {
      __s._M_put(__ws, __len);
      return __s;
    }


  template<typename _CharT, typename _OutIter>
    inline
    _OutIter
    __write(_OutIter __s, const _CharT* __ws, int __len)
    {
      for (int __j = 0; __j < __len; __j++, ++__s)
 *__s = __ws[__j];
      return __s;
    }
# 149 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<typename _CharT>
    class __ctype_abstract_base : public locale::facet, public ctype_base
    {
    public:


      typedef _CharT char_type;
# 168 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      bool
      is(mask __m, char_type __c) const
      { return this->do_is(__m, __c); }
# 185 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      is(const char_type *__lo, const char_type *__hi, mask *__vec) const
      { return this->do_is(__lo, __hi, __vec); }
# 201 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      scan_is(mask __m, const char_type* __lo, const char_type* __hi) const
      { return this->do_scan_is(__m, __lo, __hi); }
# 217 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
      { return this->do_scan_not(__m, __lo, __hi); }
# 231 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      toupper(char_type __c) const
      { return this->do_toupper(__c); }
# 246 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      toupper(char_type *__lo, const char_type* __hi) const
      { return this->do_toupper(__lo, __hi); }
# 260 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      tolower(char_type __c) const
      { return this->do_tolower(__c); }
# 275 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      tolower(char_type* __lo, const char_type* __hi) const
      { return this->do_tolower(__lo, __hi); }
# 292 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      widen(char __c) const
      { return this->do_widen(__c); }
# 311 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char*
      widen(const char* __lo, const char* __hi, char_type* __to) const
      { return this->do_widen(__lo, __hi, __to); }
# 330 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char
      narrow(char_type __c, char __dfault) const
      { return this->do_narrow(__c, __dfault); }
# 352 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      narrow(const char_type* __lo, const char_type* __hi,
       char __dfault, char* __to) const
      { return this->do_narrow(__lo, __hi, __dfault, __to); }

    protected:
      explicit
      __ctype_abstract_base(size_t __refs = 0): facet(__refs) { }

      virtual
      ~__ctype_abstract_base() { }
# 377 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual bool
      do_is(mask __m, char_type __c) const = 0;
# 396 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_is(const char_type* __lo, const char_type* __hi,
     mask* __vec) const = 0;
# 415 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_scan_is(mask __m, const char_type* __lo,
   const char_type* __hi) const = 0;
# 434 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_scan_not(mask __m, const char_type* __lo,
    const char_type* __hi) const = 0;
# 452 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_toupper(char_type __c) const = 0;
# 469 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_toupper(char_type* __lo, const char_type* __hi) const = 0;
# 485 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_tolower(char_type __c) const = 0;
# 502 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_tolower(char_type* __lo, const char_type* __hi) const = 0;
# 521 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_widen(char __c) const = 0;
# 542 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char*
      do_widen(const char* __lo, const char* __hi, char_type* __to) const = 0;
# 563 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char
      do_narrow(char_type __c, char __dfault) const = 0;
# 588 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_narrow(const char_type* __lo, const char_type* __hi,
  char __dfault, char* __to) const = 0;
    };
# 611 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<typename _CharT>
    class ctype : public __ctype_abstract_base<_CharT>
    {
    public:

      typedef _CharT char_type;
      typedef typename __ctype_abstract_base<_CharT>::mask mask;


      static locale::id id;

      explicit
      ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { }

   protected:
      virtual
      ~ctype();

      virtual bool
      do_is(mask __m, char_type __c) const;

      virtual const char_type*
      do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;

      virtual const char_type*
      do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;

      virtual const char_type*
      do_scan_not(mask __m, const char_type* __lo,
    const char_type* __hi) const;

      virtual char_type
      do_toupper(char_type __c) const;

      virtual const char_type*
      do_toupper(char_type* __lo, const char_type* __hi) const;

      virtual char_type
      do_tolower(char_type __c) const;

      virtual const char_type*
      do_tolower(char_type* __lo, const char_type* __hi) const;

      virtual char_type
      do_widen(char __c) const;

      virtual const char*
      do_widen(const char* __lo, const char* __hi, char_type* __dest) const;

      virtual char
      do_narrow(char_type, char __dfault) const;

      virtual const char_type*
      do_narrow(const char_type* __lo, const char_type* __hi,
  char __dfault, char* __to) const;
    };

  template<typename _CharT>
    locale::id ctype<_CharT>::id;
# 680 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<>
    class ctype<char> : public locale::facet, public ctype_base
    {
    public:


      typedef char char_type;

    protected:

      __c_locale _M_c_locale_ctype;
      bool _M_del;
      __to_type _M_toupper;
      __to_type _M_tolower;
      const mask* _M_table;
      mutable char _M_widen_ok;
      mutable char _M_widen[1 + static_cast<unsigned char>(-1)];
      mutable char _M_narrow[1 + static_cast<unsigned char>(-1)];
      mutable char _M_narrow_ok;


    public:

      static locale::id id;

      static const size_t table_size = 1 + static_cast<unsigned char>(-1);
# 717 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      ctype(const mask* __table = 0, bool __del = false, size_t __refs = 0);
# 730 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      ctype(__c_locale __cloc, const mask* __table = 0, bool __del = false,
     size_t __refs = 0);
# 743 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      inline bool
      is(mask __m, char __c) const;
# 758 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      inline const char*
      is(const char* __lo, const char* __hi, mask* __vec) const;
# 772 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      inline const char*
      scan_is(mask __m, const char* __lo, const char* __hi) const;
# 786 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      inline const char*
      scan_not(mask __m, const char* __lo, const char* __hi) const;
# 801 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      toupper(char_type __c) const
      { return this->do_toupper(__c); }
# 818 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      toupper(char_type *__lo, const char_type* __hi) const
      { return this->do_toupper(__lo, __hi); }
# 834 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      tolower(char_type __c) const
      { return this->do_tolower(__c); }
# 851 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      tolower(char_type* __lo, const char_type* __hi) const
      { return this->do_tolower(__lo, __hi); }
# 871 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      widen(char __c) const
      {
 if (_M_widen_ok)
   return _M_widen[static_cast<unsigned char>(__c)];
 this->_M_widen_init();
 return this->do_widen(__c);
      }
# 898 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char*
      widen(const char* __lo, const char* __hi, char_type* __to) const
      {
 if (_M_widen_ok == 1)
   {
     __builtin_memcpy(__to, __lo, __hi - __lo);
     return __hi;
   }
 if (!_M_widen_ok)
   _M_widen_init();
 return this->do_widen(__lo, __hi, __to);
      }
# 929 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char
      narrow(char_type __c, char __dfault) const
      {
 if (_M_narrow[static_cast<unsigned char>(__c)])
   return _M_narrow[static_cast<unsigned char>(__c)];
 const char __t = do_narrow(__c, __dfault);
 if (__t != __dfault)
   _M_narrow[static_cast<unsigned char>(__c)] = __t;
 return __t;
      }
# 962 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      const char_type*
      narrow(const char_type* __lo, const char_type* __hi,
      char __dfault, char* __to) const
      {
 if (__builtin_expect(_M_narrow_ok == 1, true))
   {
     __builtin_memcpy(__to, __lo, __hi - __lo);
     return __hi;
   }
 if (!_M_narrow_ok)
   _M_narrow_init();
 return this->do_narrow(__lo, __hi, __dfault, __to);
      }





      const mask*
      table() const throw()
      { return _M_table; }


      static const mask*
      classic_table() throw();
    protected:







      virtual
      ~ctype();
# 1011 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_toupper(char_type __c) const;
# 1028 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_toupper(char_type* __lo, const char_type* __hi) const;
# 1044 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_tolower(char_type __c) const;
# 1061 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_tolower(char_type* __lo, const char_type* __hi) const;
# 1081 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_widen(char __c) const
      { return __c; }
# 1104 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char*
      do_widen(const char* __lo, const char* __hi, char_type* __to) const
      {
 __builtin_memcpy(__to, __lo, __hi - __lo);
 return __hi;
      }
# 1130 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char
      do_narrow(char_type __c, char __dfault) const
      { return __c; }
# 1156 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_narrow(const char_type* __lo, const char_type* __hi,
  char __dfault, char* __to) const
      {
 __builtin_memcpy(__to, __lo, __hi - __lo);
 return __hi;
      }

    private:
      void _M_narrow_init() const;
      void _M_widen_init() const;
    };
# 1181 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<>
    class ctype<wchar_t> : public __ctype_abstract_base<wchar_t>
    {
    public:


      typedef wchar_t char_type;
      typedef wctype_t __wmask_type;

    protected:
      __c_locale _M_c_locale_ctype;


      bool _M_narrow_ok;
      char _M_narrow[128];
      wint_t _M_widen[1 + static_cast<unsigned char>(-1)];


      mask _M_bit[16];
      __wmask_type _M_wmask[16];

    public:


      static locale::id id;
# 1214 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      ctype(size_t __refs = 0);
# 1225 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      ctype(__c_locale __cloc, size_t __refs = 0);

    protected:
      __wmask_type
      _M_convert_to_wmask(const mask __m) const throw();


      virtual
      ~ctype();
# 1249 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual bool
      do_is(mask __m, char_type __c) const;
# 1268 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_is(const char_type* __lo, const char_type* __hi, mask* __vec) const;
# 1286 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_scan_is(mask __m, const char_type* __lo, const char_type* __hi) const;
# 1304 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_scan_not(mask __m, const char_type* __lo,
    const char_type* __hi) const;
# 1321 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_toupper(char_type __c) const;
# 1338 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_toupper(char_type* __lo, const char_type* __hi) const;
# 1354 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_tolower(char_type __c) const;
# 1371 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_tolower(char_type* __lo, const char_type* __hi) const;
# 1391 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_widen(char __c) const;
# 1413 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char*
      do_widen(const char* __lo, const char* __hi, char_type* __to) const;
# 1436 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char
      do_narrow(char_type __c, char __dfault) const;
# 1462 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual const char_type*
      do_narrow(const char_type* __lo, const char_type* __hi,
  char __dfault, char* __to) const;


      void
      _M_initialize_ctype() throw();
    };



  template<typename _CharT>
    class ctype_byname : public ctype<_CharT>
    {
    public:
      typedef typename ctype<_CharT>::mask mask;

      explicit
      ctype_byname(const char* __s, size_t __refs = 0);


      explicit
      ctype_byname(const string& __s, size_t __refs = 0)
      : ctype_byname(__s.c_str(), __refs) { }


    protected:
      virtual
      ~ctype_byname() { };
    };


  template<>
    class ctype_byname<char> : public ctype<char>
    {
    public:
      explicit
      ctype_byname(const char* __s, size_t __refs = 0);


      explicit
      ctype_byname(const string& __s, size_t __refs = 0);


    protected:
      virtual
      ~ctype_byname();
    };


  template<>
    class ctype_byname<wchar_t> : public ctype<wchar_t>
    {
    public:
      explicit
      ctype_byname(const char* __s, size_t __refs = 0);


      explicit
      ctype_byname(const string& __s, size_t __refs = 0);


    protected:
      virtual
      ~ctype_byname();
    };



}



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_inline.h" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/x86_64-redhat-linux/bits/ctype_inline.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  bool
  ctype<char>::
  is(mask __m, char __c) const
  { return _M_table[static_cast<unsigned char>(__c)] & __m; }

  const char*
  ctype<char>::
  is(const char* __low, const char* __high, mask* __vec) const
  {
    while (__low < __high)
      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
    return __high;
  }

  const char*
  ctype<char>::
  scan_is(mask __m, const char* __low, const char* __high) const
  {
    while (__low < __high
    && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
      ++__low;
    return __low;
  }

  const char*
  ctype<char>::
  scan_not(mask __m, const char* __low, const char* __high) const
  {
    while (__low < __high
    && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
      ++__low;
    return __low;
  }


}
# 1535 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{



  class __num_base
  {
  public:


    enum
      {
 _S_ominus,
 _S_oplus,
 _S_ox,
 _S_oX,
 _S_odigits,
 _S_odigits_end = _S_odigits + 16,
 _S_oudigits = _S_odigits_end,
 _S_oudigits_end = _S_oudigits + 16,
 _S_oe = _S_odigits + 14,
 _S_oE = _S_oudigits + 14,
 _S_oend = _S_oudigits_end
      };






    static const char* _S_atoms_out;



    static const char* _S_atoms_in;

    enum
    {
      _S_iminus,
      _S_iplus,
      _S_ix,
      _S_iX,
      _S_izero,
      _S_ie = _S_izero + 14,
      _S_iE = _S_izero + 20,
      _S_iend = 26
    };



    static void
    _S_format_float(const ios_base& __io, char* __fptr, char __mod) throw();
  };

  template<typename _CharT>
    struct __numpunct_cache : public locale::facet
    {
      const char* _M_grouping;
      size_t _M_grouping_size;
      bool _M_use_grouping;
      const _CharT* _M_truename;
      size_t _M_truename_size;
      const _CharT* _M_falsename;
      size_t _M_falsename_size;
      _CharT _M_decimal_point;
      _CharT _M_thousands_sep;





      _CharT _M_atoms_out[__num_base::_S_oend];





      _CharT _M_atoms_in[__num_base::_S_iend];

      bool _M_allocated;

      __numpunct_cache(size_t __refs = 0)
      : facet(__refs), _M_grouping(0), _M_grouping_size(0),
 _M_use_grouping(false),
 _M_truename(0), _M_truename_size(0), _M_falsename(0),
 _M_falsename_size(0), _M_decimal_point(_CharT()),
 _M_thousands_sep(_CharT()), _M_allocated(false)
 { }

      ~__numpunct_cache();

      void
      _M_cache(const locale& __loc);

    private:
      __numpunct_cache&
      operator=(const __numpunct_cache&);

      explicit
      __numpunct_cache(const __numpunct_cache&);
    };

  template<typename _CharT>
    __numpunct_cache<_CharT>::~__numpunct_cache()
    {
      if (_M_allocated)
 {
   delete [] _M_grouping;
   delete [] _M_truename;
   delete [] _M_falsename;
 }
    }

namespace __cxx11 {
# 1665 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<typename _CharT>
    class numpunct : public locale::facet
    {
    public:



      typedef _CharT char_type;
      typedef basic_string<_CharT> string_type;

      typedef __numpunct_cache<_CharT> __cache_type;

    protected:
      __cache_type* _M_data;

    public:

      static locale::id id;






      explicit
      numpunct(size_t __refs = 0)
      : facet(__refs), _M_data(0)
      { _M_initialize_numpunct(); }
# 1703 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      numpunct(__cache_type* __cache, size_t __refs = 0)
      : facet(__refs), _M_data(__cache)
      { _M_initialize_numpunct(); }
# 1717 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      numpunct(__c_locale __cloc, size_t __refs = 0)
      : facet(__refs), _M_data(0)
      { _M_initialize_numpunct(__cloc); }
# 1731 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      decimal_point() const
      { return this->do_decimal_point(); }
# 1744 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      char_type
      thousands_sep() const
      { return this->do_thousands_sep(); }
# 1775 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      string
      grouping() const
      { return this->do_grouping(); }
# 1788 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      string_type
      truename() const
      { return this->do_truename(); }
# 1801 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      string_type
      falsename() const
      { return this->do_falsename(); }

    protected:

      virtual
      ~numpunct();
# 1818 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_decimal_point() const
      { return _M_data->_M_decimal_point; }
# 1830 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual char_type
      do_thousands_sep() const
      { return _M_data->_M_thousands_sep; }
# 1843 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual string
      do_grouping() const
      { return _M_data->_M_grouping; }
# 1856 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual string_type
      do_truename() const
      { return _M_data->_M_truename; }
# 1869 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual string_type
      do_falsename() const
      { return _M_data->_M_falsename; }


      void
      _M_initialize_numpunct(__c_locale __cloc = 0);
    };

  template<typename _CharT>
    locale::id numpunct<_CharT>::id;

  template<>
    numpunct<char>::~numpunct();

  template<>
    void
    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc);


  template<>
    numpunct<wchar_t>::~numpunct();

  template<>
    void
    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc);



  template<typename _CharT>
    class numpunct_byname : public numpunct<_CharT>
    {
    public:
      typedef _CharT char_type;
      typedef basic_string<_CharT> string_type;

      explicit
      numpunct_byname(const char* __s, size_t __refs = 0)
      : numpunct<_CharT>(__refs)
      {
 if (__builtin_strcmp(__s, "C") != 0
     && __builtin_strcmp(__s, "POSIX") != 0)
   {
     __c_locale __tmp;
     this->_S_create_c_locale(__tmp, __s);
     this->_M_initialize_numpunct(__tmp);
     this->_S_destroy_c_locale(__tmp);
   }
      }


      explicit
      numpunct_byname(const string& __s, size_t __refs = 0)
      : numpunct_byname(__s.c_str(), __refs) { }


    protected:
      virtual
      ~numpunct_byname() { }
    };

}
# 1947 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<typename _CharT, typename _InIter>
    class num_get : public locale::facet
    {
    public:



      typedef _CharT char_type;
      typedef _InIter iter_type;



      static locale::id id;
# 1968 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      num_get(size_t __refs = 0) : facet(__refs) { }
# 1994 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, bool& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }
# 2031 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, long& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }

      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, unsigned short& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }

      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, unsigned int& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }

      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, unsigned long& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }


      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, long long& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }

      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, unsigned long long& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }
# 2091 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, float& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }

      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, double& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }

      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, long double& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }
# 2134 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      get(iter_type __in, iter_type __end, ios_base& __io,
   ios_base::iostate& __err, void*& __v) const
      { return this->do_get(__in, __end, __io, __err, __v); }

    protected:

      virtual ~num_get() { }

      __attribute ((__abi_tag__ ("cxx11")))
      iter_type
      _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
         string&) const;

      template<typename _ValueT>
 __attribute ((__abi_tag__ ("cxx11")))
 iter_type
 _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
         _ValueT&) const;

      template<typename _CharT2>
      typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, int>::__type
 _M_find(const _CharT2*, size_t __len, _CharT2 __c) const
 {
   int __ret = -1;
   if (__len <= 10)
     {
       if (__c >= _CharT2('0') && __c < _CharT2(_CharT2('0') + __len))
  __ret = __c - _CharT2('0');
     }
   else
     {
       if (__c >= _CharT2('0') && __c <= _CharT2('9'))
  __ret = __c - _CharT2('0');
       else if (__c >= _CharT2('a') && __c <= _CharT2('f'))
  __ret = 10 + (__c - _CharT2('a'));
       else if (__c >= _CharT2('A') && __c <= _CharT2('F'))
  __ret = 10 + (__c - _CharT2('A'));
     }
   return __ret;
 }

      template<typename _CharT2>
      typename __gnu_cxx::__enable_if<!__is_char<_CharT2>::__value,
          int>::__type
 _M_find(const _CharT2* __zero, size_t __len, _CharT2 __c) const
 {
   int __ret = -1;
   const char_type* __q = char_traits<_CharT2>::find(__zero, __len, __c);
   if (__q)
     {
       __ret = __q - __zero;
       if (__ret > 15)
  __ret -= 6;
     }
   return __ret;
 }
# 2207 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual iter_type
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;

      virtual iter_type
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
      ios_base::iostate& __err, long& __v) const
      { return _M_extract_int(__beg, __end, __io, __err, __v); }

      virtual iter_type
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
      ios_base::iostate& __err, unsigned short& __v) const
      { return _M_extract_int(__beg, __end, __io, __err, __v); }

      virtual iter_type
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
      ios_base::iostate& __err, unsigned int& __v) const
      { return _M_extract_int(__beg, __end, __io, __err, __v); }

      virtual iter_type
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
      ios_base::iostate& __err, unsigned long& __v) const
      { return _M_extract_int(__beg, __end, __io, __err, __v); }


      virtual iter_type
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
      ios_base::iostate& __err, long long& __v) const
      { return _M_extract_int(__beg, __end, __io, __err, __v); }

      virtual iter_type
      do_get(iter_type __beg, iter_type __end, ios_base& __io,
      ios_base::iostate& __err, unsigned long long& __v) const
      { return _M_extract_int(__beg, __end, __io, __err, __v); }


      virtual iter_type
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, float&) const;

      virtual iter_type
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
      double&) const;







      virtual iter_type
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
      long double&) const;


      virtual iter_type
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, void*&) const;
# 2270 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
    };

  template<typename _CharT, typename _InIter>
    locale::id num_get<_CharT, _InIter>::id;
# 2288 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<typename _CharT, typename _OutIter>
    class num_put : public locale::facet
    {
    public:



      typedef _CharT char_type;
      typedef _OutIter iter_type;



      static locale::id id;
# 2309 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      explicit
      num_put(size_t __refs = 0) : facet(__refs) { }
# 2327 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const
      { return this->do_put(__s, __io, __fill, __v); }
# 2369 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
      { return this->do_put(__s, __io, __fill, __v); }

      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill,
   unsigned long __v) const
      { return this->do_put(__s, __io, __fill, __v); }


      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill, long long __v) const
      { return this->do_put(__s, __io, __fill, __v); }

      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill,
   unsigned long long __v) const
      { return this->do_put(__s, __io, __fill, __v); }
# 2432 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
      { return this->do_put(__s, __io, __fill, __v); }

      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill,
   long double __v) const
      { return this->do_put(__s, __io, __fill, __v); }
# 2457 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      iter_type
      put(iter_type __s, ios_base& __io, char_type __fill,
   const void* __v) const
      { return this->do_put(__s, __io, __fill, __v); }

    protected:
      template<typename _ValueT>
 iter_type
 _M_insert_float(iter_type, ios_base& __io, char_type __fill,
   char __mod, _ValueT __v) const;

      void
      _M_group_float(const char* __grouping, size_t __grouping_size,
       char_type __sep, const char_type* __p, char_type* __new,
       char_type* __cs, int& __len) const;

      template<typename _ValueT>
 iter_type
 _M_insert_int(iter_type, ios_base& __io, char_type __fill,
        _ValueT __v) const;

      void
      _M_group_int(const char* __grouping, size_t __grouping_size,
     char_type __sep, ios_base& __io, char_type* __new,
     char_type* __cs, int& __len) const;

      void
      _M_pad(char_type __fill, streamsize __w, ios_base& __io,
      char_type* __new, const char_type* __cs, int& __len) const;


      virtual
      ~num_put() { };
# 2505 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
      virtual iter_type
      do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const;

      virtual iter_type
      do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
      { return _M_insert_int(__s, __io, __fill, __v); }

      virtual iter_type
      do_put(iter_type __s, ios_base& __io, char_type __fill,
      unsigned long __v) const
      { return _M_insert_int(__s, __io, __fill, __v); }


      virtual iter_type
      do_put(iter_type __s, ios_base& __io, char_type __fill,
      long long __v) const
      { return _M_insert_int(__s, __io, __fill, __v); }

      virtual iter_type
      do_put(iter_type __s, ios_base& __io, char_type __fill,
      unsigned long long __v) const
      { return _M_insert_int(__s, __io, __fill, __v); }


      virtual iter_type
      do_put(iter_type, ios_base&, char_type, double) const;






      virtual iter_type
      do_put(iter_type, ios_base&, char_type, long double) const;


      virtual iter_type
      do_put(iter_type, ios_base&, char_type, const void*) const;







    };

  template <typename _CharT, typename _OutIter>
    locale::id num_put<_CharT, _OutIter>::id;
# 2563 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 3
  template<typename _CharT>
    inline bool
    isspace(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); }


  template<typename _CharT>
    inline bool
    isprint(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); }


  template<typename _CharT>
    inline bool
    iscntrl(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); }


  template<typename _CharT>
    inline bool
    isupper(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); }


  template<typename _CharT>
    inline bool
    islower(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); }


  template<typename _CharT>
    inline bool
    isalpha(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); }


  template<typename _CharT>
    inline bool
    isdigit(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); }


  template<typename _CharT>
    inline bool
    ispunct(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); }


  template<typename _CharT>
    inline bool
    isxdigit(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); }


  template<typename _CharT>
    inline bool
    isalnum(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); }


  template<typename _CharT>
    inline bool
    isgraph(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); }



  template<typename _CharT>
    inline bool
    isblank(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).is(ctype_base::blank, __c); }



  template<typename _CharT>
    inline _CharT
    toupper(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).toupper(__c); }


  template<typename _CharT>
    inline _CharT
    tolower(_CharT __c, const locale& __loc)
    { return use_facet<ctype<_CharT> >(__loc).tolower(__c); }


}


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3

namespace std __attribute__ ((__visibility__ ("default")))
{




  template<typename _Facet>
    struct __use_cache
    {
      const _Facet*
      operator() (const locale& __loc) const;
    };


  template<typename _CharT>
    struct __use_cache<__numpunct_cache<_CharT> >
    {
      const __numpunct_cache<_CharT>*
      operator() (const locale& __loc) const
      {
 const size_t __i = numpunct<_CharT>::id._M_id();
 const locale::facet** __caches = __loc._M_impl->_M_caches;
 if (!__caches[__i])
   {
     __numpunct_cache<_CharT>* __tmp = 0;
     try
       {
  __tmp = new __numpunct_cache<_CharT>;
  __tmp->_M_cache(__loc);
       }
     catch(...)
       {
  delete __tmp;
  throw;
       }
     __loc._M_impl->_M_install_cache(__tmp, __i);
   }
 return static_cast<const __numpunct_cache<_CharT>*>(__caches[__i]);
      }
    };

  template<typename _CharT>
    void
    __numpunct_cache<_CharT>::_M_cache(const locale& __loc)
    {
      const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);

      char* __grouping = 0;
      _CharT* __truename = 0;
      _CharT* __falsename = 0;
      try
 {
   const string& __g = __np.grouping();
   _M_grouping_size = __g.size();
   __grouping = new char[_M_grouping_size];
   __g.copy(__grouping, _M_grouping_size);
   _M_use_grouping = (_M_grouping_size
        && static_cast<signed char>(__grouping[0]) > 0
        && (__grouping[0]
     != __gnu_cxx::__numeric_traits<char>::__max));

   const basic_string<_CharT>& __tn = __np.truename();
   _M_truename_size = __tn.size();
   __truename = new _CharT[_M_truename_size];
   __tn.copy(__truename, _M_truename_size);

   const basic_string<_CharT>& __fn = __np.falsename();
   _M_falsename_size = __fn.size();
   __falsename = new _CharT[_M_falsename_size];
   __fn.copy(__falsename, _M_falsename_size);

   _M_decimal_point = __np.decimal_point();
   _M_thousands_sep = __np.thousands_sep();

   const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc);
   __ct.widen(__num_base::_S_atoms_out,
       __num_base::_S_atoms_out
       + __num_base::_S_oend, _M_atoms_out);
   __ct.widen(__num_base::_S_atoms_in,
       __num_base::_S_atoms_in
       + __num_base::_S_iend, _M_atoms_in);

   _M_grouping = __grouping;
   _M_truename = __truename;
   _M_falsename = __falsename;
   _M_allocated = true;
 }
      catch(...)
 {
   delete [] __grouping;
   delete [] __truename;
   delete [] __falsename;
   throw;
 }
    }
# 139 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3
  __attribute__ ((__pure__)) bool
  __verify_grouping(const char* __grouping, size_t __grouping_size,
      const string& __grouping_tmp) throw ();



  template<typename _CharT, typename _InIter>
    __attribute ((__abi_tag__ ("cxx11")))
    _InIter
    num_get<_CharT, _InIter>::
    _M_extract_float(_InIter __beg, _InIter __end, ios_base& __io,
       ios_base::iostate& __err, string& __xtrc) const
    {
      typedef char_traits<_CharT> __traits_type;
      typedef __numpunct_cache<_CharT> __cache_type;
      __use_cache<__cache_type> __uc;
      const locale& __loc = __io._M_getloc();
      const __cache_type* __lc = __uc(__loc);
      const _CharT* __lit = __lc->_M_atoms_in;
      char_type __c = char_type();


      bool __testeof = __beg == __end;


      if (!__testeof)
 {
   __c = *__beg;
   const bool __plus = __c == __lit[__num_base::_S_iplus];
   if ((__plus || __c == __lit[__num_base::_S_iminus])
       && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
       && !(__c == __lc->_M_decimal_point))
     {
       __xtrc += __plus ? '+' : '-';
       if (++__beg != __end)
  __c = *__beg;
       else
  __testeof = true;
     }
 }


      bool __found_mantissa = false;
      int __sep_pos = 0;
      while (!__testeof)
 {
   if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
       || __c == __lc->_M_decimal_point)
     break;
   else if (__c == __lit[__num_base::_S_izero])
     {
       if (!__found_mantissa)
  {
    __xtrc += '0';
    __found_mantissa = true;
  }
       ++__sep_pos;

       if (++__beg != __end)
  __c = *__beg;
       else
  __testeof = true;
     }
   else
     break;
 }


      bool __found_dec = false;
      bool __found_sci = false;
      string __found_grouping;
      if (__lc->_M_use_grouping)
 __found_grouping.reserve(32);
      const char_type* __lit_zero = __lit + __num_base::_S_izero;

      if (!__lc->_M_allocated)

 while (!__testeof)
   {
     const int __digit = _M_find(__lit_zero, 10, __c);
     if (__digit != -1)
       {
  __xtrc += '0' + __digit;
  __found_mantissa = true;
       }
     else if (__c == __lc->_M_decimal_point
       && !__found_dec && !__found_sci)
       {
  __xtrc += '.';
  __found_dec = true;
       }
     else if ((__c == __lit[__num_base::_S_ie]
        || __c == __lit[__num_base::_S_iE])
       && !__found_sci && __found_mantissa)
       {

  __xtrc += 'e';
  __found_sci = true;


  if (++__beg != __end)
    {
      __c = *__beg;
      const bool __plus = __c == __lit[__num_base::_S_iplus];
      if (__plus || __c == __lit[__num_base::_S_iminus])
        __xtrc += __plus ? '+' : '-';
      else
        continue;
    }
  else
    {
      __testeof = true;
      break;
    }
       }
     else
       break;

     if (++__beg != __end)
       __c = *__beg;
     else
       __testeof = true;
   }
      else
 while (!__testeof)
   {


     if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
       {
  if (!__found_dec && !__found_sci)
    {


      if (__sep_pos)
        {
   __found_grouping += static_cast<char>(__sep_pos);
   __sep_pos = 0;
        }
      else
        {


   __xtrc.clear();
   break;
        }
    }
  else
    break;
       }
     else if (__c == __lc->_M_decimal_point)
       {
  if (!__found_dec && !__found_sci)
    {



      if (__found_grouping.size())
        __found_grouping += static_cast<char>(__sep_pos);
      __xtrc += '.';
      __found_dec = true;
    }
  else
    break;
       }
     else
       {
  const char_type* __q =
    __traits_type::find(__lit_zero, 10, __c);
  if (__q)
    {
      __xtrc += '0' + (__q - __lit_zero);
      __found_mantissa = true;
      ++__sep_pos;
    }
  else if ((__c == __lit[__num_base::_S_ie]
     || __c == __lit[__num_base::_S_iE])
    && !__found_sci && __found_mantissa)
    {

      if (__found_grouping.size() && !__found_dec)
        __found_grouping += static_cast<char>(__sep_pos);
      __xtrc += 'e';
      __found_sci = true;


      if (++__beg != __end)
        {
   __c = *__beg;
   const bool __plus = __c == __lit[__num_base::_S_iplus];
   if ((__plus || __c == __lit[__num_base::_S_iminus])
       && !(__lc->_M_use_grouping
     && __c == __lc->_M_thousands_sep)
       && !(__c == __lc->_M_decimal_point))
        __xtrc += __plus ? '+' : '-';
   else
     continue;
        }
      else
        {
   __testeof = true;
   break;
        }
    }
  else
    break;
       }

     if (++__beg != __end)
       __c = *__beg;
     else
       __testeof = true;
   }



      if (__found_grouping.size())
        {

   if (!__found_dec && !__found_sci)
     __found_grouping += static_cast<char>(__sep_pos);

          if (!std::__verify_grouping(__lc->_M_grouping,
          __lc->_M_grouping_size,
          __found_grouping))
     __err = ios_base::failbit;
        }

      return __beg;
    }

  template<typename _CharT, typename _InIter>
    template<typename _ValueT>
      __attribute ((__abi_tag__ ("cxx11")))
      _InIter
      num_get<_CharT, _InIter>::
      _M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
       ios_base::iostate& __err, _ValueT& __v) const
      {
        typedef char_traits<_CharT> __traits_type;
 using __gnu_cxx::__add_unsigned;
 typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
 typedef __numpunct_cache<_CharT> __cache_type;
 __use_cache<__cache_type> __uc;
 const locale& __loc = __io._M_getloc();
 const __cache_type* __lc = __uc(__loc);
 const _CharT* __lit = __lc->_M_atoms_in;
 char_type __c = char_type();


 const ios_base::fmtflags __basefield = __io.flags()
                                        & ios_base::basefield;
 const bool __oct = __basefield == ios_base::oct;
 int __base = __oct ? 8 : (__basefield == ios_base::hex ? 16 : 10);


 bool __testeof = __beg == __end;


 bool __negative = false;
 if (!__testeof)
   {
     __c = *__beg;
     __negative = __c == __lit[__num_base::_S_iminus];
     if ((__negative || __c == __lit[__num_base::_S_iplus])
  && !(__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
  && !(__c == __lc->_M_decimal_point))
       {
  if (++__beg != __end)
    __c = *__beg;
  else
    __testeof = true;
       }
   }



 bool __found_zero = false;
 int __sep_pos = 0;
 while (!__testeof)
   {
     if ((__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
  || __c == __lc->_M_decimal_point)
       break;
     else if (__c == __lit[__num_base::_S_izero]
       && (!__found_zero || __base == 10))
       {
  __found_zero = true;
  ++__sep_pos;
  if (__basefield == 0)
    __base = 8;
  if (__base == 8)
    __sep_pos = 0;
       }
     else if (__found_zero
       && (__c == __lit[__num_base::_S_ix]
    || __c == __lit[__num_base::_S_iX]))
       {
  if (__basefield == 0)
    __base = 16;
  if (__base == 16)
    {
      __found_zero = false;
      __sep_pos = 0;
    }
  else
    break;
       }
     else
       break;

     if (++__beg != __end)
       {
  __c = *__beg;
  if (!__found_zero)
    break;
       }
     else
       __testeof = true;
   }



 const size_t __len = (__base == 16 ? __num_base::_S_iend
         - __num_base::_S_izero : __base);


 string __found_grouping;
 if (__lc->_M_use_grouping)
   __found_grouping.reserve(32);
 bool __testfail = false;
 bool __testoverflow = false;
 const __unsigned_type __max =
   (__negative && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
   ? -__gnu_cxx::__numeric_traits<_ValueT>::__min
   : __gnu_cxx::__numeric_traits<_ValueT>::__max;
 const __unsigned_type __smax = __max / __base;
 __unsigned_type __result = 0;
 int __digit = 0;
 const char_type* __lit_zero = __lit + __num_base::_S_izero;

 if (!__lc->_M_allocated)

   while (!__testeof)
     {
       __digit = _M_find(__lit_zero, __len, __c);
       if (__digit == -1)
  break;

       if (__result > __smax)
  __testoverflow = true;
       else
  {
    __result *= __base;
    __testoverflow |= __result > __max - __digit;
    __result += __digit;
    ++__sep_pos;
  }

       if (++__beg != __end)
  __c = *__beg;
       else
  __testeof = true;
     }
 else
   while (!__testeof)
     {


       if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
  {


    if (__sep_pos)
      {
        __found_grouping += static_cast<char>(__sep_pos);
        __sep_pos = 0;
      }
    else
      {
        __testfail = true;
        break;
      }
  }
       else if (__c == __lc->_M_decimal_point)
  break;
       else
  {
    const char_type* __q =
      __traits_type::find(__lit_zero, __len, __c);
    if (!__q)
      break;

    __digit = __q - __lit_zero;
    if (__digit > 15)
      __digit -= 6;
    if (__result > __smax)
      __testoverflow = true;
    else
      {
        __result *= __base;
        __testoverflow |= __result > __max - __digit;
        __result += __digit;
        ++__sep_pos;
      }
  }

       if (++__beg != __end)
  __c = *__beg;
       else
  __testeof = true;
     }



 if (__found_grouping.size())
   {

     __found_grouping += static_cast<char>(__sep_pos);

     if (!std::__verify_grouping(__lc->_M_grouping,
     __lc->_M_grouping_size,
     __found_grouping))
       __err = ios_base::failbit;
   }



 if ((!__sep_pos && !__found_zero && !__found_grouping.size())
     || __testfail)
   {
     __v = 0;
     __err = ios_base::failbit;
   }
 else if (__testoverflow)
   {
     if (__negative
  && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
       __v = __gnu_cxx::__numeric_traits<_ValueT>::__min;
     else
       __v = __gnu_cxx::__numeric_traits<_ValueT>::__max;
     __err = ios_base::failbit;
   }
 else
   __v = __negative ? -__result : __result;

 if (__testeof)
   __err |= ios_base::eofbit;
 return __beg;
      }



  template<typename _CharT, typename _InIter>
    _InIter
    num_get<_CharT, _InIter>::
    do_get(iter_type __beg, iter_type __end, ios_base& __io,
           ios_base::iostate& __err, bool& __v) const
    {
      if (!(__io.flags() & ios_base::boolalpha))
        {



   long __l = -1;
          __beg = _M_extract_int(__beg, __end, __io, __err, __l);
   if (__l == 0 || __l == 1)
     __v = bool(__l);
   else
     {


       __v = true;
       __err = ios_base::failbit;
       if (__beg == __end)
  __err |= ios_base::eofbit;
     }
        }
      else
        {

   typedef __numpunct_cache<_CharT> __cache_type;
   __use_cache<__cache_type> __uc;
   const locale& __loc = __io._M_getloc();
   const __cache_type* __lc = __uc(__loc);

   bool __testf = true;
   bool __testt = true;
   bool __donef = __lc->_M_falsename_size == 0;
   bool __donet = __lc->_M_truename_size == 0;
   bool __testeof = false;
   size_t __n = 0;
   while (!__donef || !__donet)
     {
       if (__beg == __end)
  {
    __testeof = true;
    break;
  }

       const char_type __c = *__beg;

       if (!__donef)
  __testf = __c == __lc->_M_falsename[__n];

       if (!__testf && __donet)
  break;

       if (!__donet)
  __testt = __c == __lc->_M_truename[__n];

       if (!__testt && __donef)
  break;

       if (!__testt && !__testf)
  break;

       ++__n;
       ++__beg;

       __donef = !__testf || __n >= __lc->_M_falsename_size;
       __donet = !__testt || __n >= __lc->_M_truename_size;
     }
   if (__testf && __n == __lc->_M_falsename_size && __n)
     {
       __v = false;
       if (__testt && __n == __lc->_M_truename_size)
  __err = ios_base::failbit;
       else
  __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
     }
   else if (__testt && __n == __lc->_M_truename_size && __n)
     {
       __v = true;
       __err = __testeof ? ios_base::eofbit : ios_base::goodbit;
     }
   else
     {


       __v = false;
       __err = ios_base::failbit;
       if (__testeof)
  __err |= ios_base::eofbit;
     }
 }
      return __beg;
    }

  template<typename _CharT, typename _InIter>
    _InIter
    num_get<_CharT, _InIter>::
    do_get(iter_type __beg, iter_type __end, ios_base& __io,
    ios_base::iostate& __err, float& __v) const
    {
      string __xtrc;
      __xtrc.reserve(32);
      __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
      std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
      if (__beg == __end)
 __err |= ios_base::eofbit;
      return __beg;
    }

  template<typename _CharT, typename _InIter>
    _InIter
    num_get<_CharT, _InIter>::
    do_get(iter_type __beg, iter_type __end, ios_base& __io,
           ios_base::iostate& __err, double& __v) const
    {
      string __xtrc;
      __xtrc.reserve(32);
      __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
      std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
      if (__beg == __end)
 __err |= ios_base::eofbit;
      return __beg;
    }
# 735 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3
  template<typename _CharT, typename _InIter>
    _InIter
    num_get<_CharT, _InIter>::
    do_get(iter_type __beg, iter_type __end, ios_base& __io,
           ios_base::iostate& __err, long double& __v) const
    {
      string __xtrc;
      __xtrc.reserve(32);
      __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
      std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
      if (__beg == __end)
 __err |= ios_base::eofbit;
      return __beg;
    }

  template<typename _CharT, typename _InIter>
    _InIter
    num_get<_CharT, _InIter>::
    do_get(iter_type __beg, iter_type __end, ios_base& __io,
           ios_base::iostate& __err, void*& __v) const
    {

      typedef ios_base::fmtflags fmtflags;
      const fmtflags __fmt = __io.flags();
      __io.flags((__fmt & ~ios_base::basefield) | ios_base::hex);

      typedef __gnu_cxx::__conditional_type<(sizeof(void*)
          <= sizeof(unsigned long)),
 unsigned long, unsigned long long>::__type _UIntPtrType;

      _UIntPtrType __ul;
      __beg = _M_extract_int(__beg, __end, __io, __err, __ul);


      __io.flags(__fmt);

      __v = reinterpret_cast<void*>(__ul);
      return __beg;
    }



  template<typename _CharT, typename _OutIter>
    void
    num_put<_CharT, _OutIter>::
    _M_pad(_CharT __fill, streamsize __w, ios_base& __io,
    _CharT* __new, const _CharT* __cs, int& __len) const
    {


      __pad<_CharT, char_traits<_CharT> >::_S_pad(__io, __fill, __new,
        __cs, __w, __len);
      __len = static_cast<int>(__w);
    }



  template<typename _CharT, typename _ValueT>
    int
    __int_to_char(_CharT* __bufend, _ValueT __v, const _CharT* __lit,
    ios_base::fmtflags __flags, bool __dec)
    {
      _CharT* __buf = __bufend;
      if (__builtin_expect(__dec, true))
 {

   do
     {
       *--__buf = __lit[(__v % 10) + __num_base::_S_odigits];
       __v /= 10;
     }
   while (__v != 0);
 }
      else if ((__flags & ios_base::basefield) == ios_base::oct)
 {

   do
     {
       *--__buf = __lit[(__v & 0x7) + __num_base::_S_odigits];
       __v >>= 3;
     }
   while (__v != 0);
 }
      else
 {

   const bool __uppercase = __flags & ios_base::uppercase;
   const int __case_offset = __uppercase ? __num_base::_S_oudigits
                                         : __num_base::_S_odigits;
   do
     {
       *--__buf = __lit[(__v & 0xf) + __case_offset];
       __v >>= 4;
     }
   while (__v != 0);
 }
      return __bufend - __buf;
    }



  template<typename _CharT, typename _OutIter>
    void
    num_put<_CharT, _OutIter>::
    _M_group_int(const char* __grouping, size_t __grouping_size, _CharT __sep,
   ios_base&, _CharT* __new, _CharT* __cs, int& __len) const
    {
      _CharT* __p = std::__add_grouping(__new, __sep, __grouping,
     __grouping_size, __cs, __cs + __len);
      __len = __p - __new;
    }

  template<typename _CharT, typename _OutIter>
    template<typename _ValueT>
      _OutIter
      num_put<_CharT, _OutIter>::
      _M_insert_int(_OutIter __s, ios_base& __io, _CharT __fill,
      _ValueT __v) const
      {
 using __gnu_cxx::__add_unsigned;
 typedef typename __add_unsigned<_ValueT>::__type __unsigned_type;
 typedef __numpunct_cache<_CharT> __cache_type;
 __use_cache<__cache_type> __uc;
 const locale& __loc = __io._M_getloc();
 const __cache_type* __lc = __uc(__loc);
 const _CharT* __lit = __lc->_M_atoms_out;
 const ios_base::fmtflags __flags = __io.flags();


 const int __ilen = 5 * sizeof(_ValueT);
 _CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
            * __ilen));



 const ios_base::fmtflags __basefield = __flags & ios_base::basefield;
 const bool __dec = (__basefield != ios_base::oct
       && __basefield != ios_base::hex);
 const __unsigned_type __u = ((__v > 0 || !__dec)
         ? __unsigned_type(__v)
         : -__unsigned_type(__v));
  int __len = __int_to_char(__cs + __ilen, __u, __lit, __flags, __dec);
 __cs += __ilen - __len;


 if (__lc->_M_use_grouping)
   {


     _CharT* __cs2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
          * (__len + 1)
          * 2));
     _M_group_int(__lc->_M_grouping, __lc->_M_grouping_size,
    __lc->_M_thousands_sep, __io, __cs2 + 2, __cs, __len);
     __cs = __cs2 + 2;
   }


 if (__builtin_expect(__dec, true))
   {

     if (__v >= 0)
       {
  if (bool(__flags & ios_base::showpos)
      && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
    *--__cs = __lit[__num_base::_S_oplus], ++__len;
       }
     else
       *--__cs = __lit[__num_base::_S_ominus], ++__len;
   }
 else if (bool(__flags & ios_base::showbase) && __v)
   {
     if (__basefield == ios_base::oct)
       *--__cs = __lit[__num_base::_S_odigits], ++__len;
     else
       {

  const bool __uppercase = __flags & ios_base::uppercase;
  *--__cs = __lit[__num_base::_S_ox + __uppercase];

  *--__cs = __lit[__num_base::_S_odigits];
  __len += 2;
       }
   }


 const streamsize __w = __io.width();
 if (__w > static_cast<streamsize>(__len))
   {
     _CharT* __cs3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
          * __w));
     _M_pad(__fill, __w, __io, __cs3, __cs, __len);
     __cs = __cs3;
   }
 __io.width(0);



 return std::__write(__s, __cs, __len);
      }

  template<typename _CharT, typename _OutIter>
    void
    num_put<_CharT, _OutIter>::
    _M_group_float(const char* __grouping, size_t __grouping_size,
     _CharT __sep, const _CharT* __p, _CharT* __new,
     _CharT* __cs, int& __len) const
    {



      const int __declen = __p ? __p - __cs : __len;
      _CharT* __p2 = std::__add_grouping(__new, __sep, __grouping,
      __grouping_size,
      __cs, __cs + __declen);


      int __newlen = __p2 - __new;
      if (__p)
 {
   char_traits<_CharT>::copy(__p2, __p, __len - __declen);
   __newlen += __len - __declen;
 }
      __len = __newlen;
    }
# 971 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3
  template<typename _CharT, typename _OutIter>
    template<typename _ValueT>
      _OutIter
      num_put<_CharT, _OutIter>::
      _M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod,
         _ValueT __v) const
      {
 typedef __numpunct_cache<_CharT> __cache_type;
 __use_cache<__cache_type> __uc;
 const locale& __loc = __io._M_getloc();
 const __cache_type* __lc = __uc(__loc);


 const streamsize __prec = __io.precision() < 0 ? 6 : __io.precision();

 const int __max_digits =
   __gnu_cxx::__numeric_traits<_ValueT>::__digits10;


 int __len;

 char __fbuf[16];
 __num_base::_S_format_float(__io, __fbuf, __mod);



 const bool __use_prec =
   (__io.flags() & ios_base::floatfield) != ios_base::floatfield;



 int __cs_size = __max_digits * 3;
 char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
 if (__use_prec)
   __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size,
     __fbuf, __prec, __v);
 else
   __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size,
     __fbuf, __v);


 if (__len >= __cs_size)
   {
     __cs_size = __len + 1;
     __cs = static_cast<char*>(__builtin_alloca(__cs_size));
     if (__use_prec)
       __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size,
         __fbuf, __prec, __v);
     else
       __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size,
         __fbuf, __v);
   }
# 1044 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3
 const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);

 _CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
            * __len));
 __ctype.widen(__cs, __cs + __len, __ws);


 _CharT* __wp = 0;
 const char* __p = char_traits<char>::find(__cs, __len, '.');
 if (__p)
   {
     __wp = __ws + (__p - __cs);
     *__wp = __lc->_M_decimal_point;
   }




 if (__lc->_M_use_grouping
     && (__wp || __len < 3 || (__cs[1] <= '9' && __cs[2] <= '9'
          && __cs[1] >= '0' && __cs[2] >= '0')))
   {


     _CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
          * __len * 2));

     streamsize __off = 0;
     if (__cs[0] == '-' || __cs[0] == '+')
       {
  __off = 1;
  __ws2[0] = __ws[0];
  __len -= 1;
       }

     _M_group_float(__lc->_M_grouping, __lc->_M_grouping_size,
      __lc->_M_thousands_sep, __wp, __ws2 + __off,
      __ws + __off, __len);
     __len += __off;

     __ws = __ws2;
   }


 const streamsize __w = __io.width();
 if (__w > static_cast<streamsize>(__len))
   {
     _CharT* __ws3 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
          * __w));
     _M_pad(__fill, __w, __io, __ws3, __ws, __len);
     __ws = __ws3;
   }
 __io.width(0);



 return std::__write(__s, __ws, __len);
      }

  template<typename _CharT, typename _OutIter>
    _OutIter
    num_put<_CharT, _OutIter>::
    do_put(iter_type __s, ios_base& __io, char_type __fill, bool __v) const
    {
      const ios_base::fmtflags __flags = __io.flags();
      if ((__flags & ios_base::boolalpha) == 0)
        {
          const long __l = __v;
          __s = _M_insert_int(__s, __io, __fill, __l);
        }
      else
        {
   typedef __numpunct_cache<_CharT> __cache_type;
   __use_cache<__cache_type> __uc;
   const locale& __loc = __io._M_getloc();
   const __cache_type* __lc = __uc(__loc);

   const _CharT* __name = __v ? __lc->_M_truename
                              : __lc->_M_falsename;
   int __len = __v ? __lc->_M_truename_size
                   : __lc->_M_falsename_size;

   const streamsize __w = __io.width();
   if (__w > static_cast<streamsize>(__len))
     {
       const streamsize __plen = __w - __len;
       _CharT* __ps
  = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
       * __plen));

       char_traits<_CharT>::assign(__ps, __plen, __fill);
       __io.width(0);

       if ((__flags & ios_base::adjustfield) == ios_base::left)
  {
    __s = std::__write(__s, __name, __len);
    __s = std::__write(__s, __ps, __plen);
  }
       else
  {
    __s = std::__write(__s, __ps, __plen);
    __s = std::__write(__s, __name, __len);
  }
       return __s;
     }
   __io.width(0);
   __s = std::__write(__s, __name, __len);
 }
      return __s;
    }

  template<typename _CharT, typename _OutIter>
    _OutIter
    num_put<_CharT, _OutIter>::
    do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
    { return _M_insert_float(__s, __io, __fill, char(), __v); }
# 1169 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3
  template<typename _CharT, typename _OutIter>
    _OutIter
    num_put<_CharT, _OutIter>::
    do_put(iter_type __s, ios_base& __io, char_type __fill,
    long double __v) const
    { return _M_insert_float(__s, __io, __fill, 'L', __v); }

  template<typename _CharT, typename _OutIter>
    _OutIter
    num_put<_CharT, _OutIter>::
    do_put(iter_type __s, ios_base& __io, char_type __fill,
           const void* __v) const
    {
      const ios_base::fmtflags __flags = __io.flags();
      const ios_base::fmtflags __fmt = ~(ios_base::basefield
      | ios_base::uppercase);
      __io.flags((__flags & __fmt) | (ios_base::hex | ios_base::showbase));

      typedef __gnu_cxx::__conditional_type<(sizeof(const void*)
          <= sizeof(unsigned long)),
 unsigned long, unsigned long long>::__type _UIntPtrType;

      __s = _M_insert_int(__s, __io, __fill,
     reinterpret_cast<_UIntPtrType>(__v));
      __io.flags(__flags);
      return __s;
    }
# 1206 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.tcc" 3
  template<typename _CharT, typename _Traits>
    void
    __pad<_CharT, _Traits>::_S_pad(ios_base& __io, _CharT __fill,
       _CharT* __news, const _CharT* __olds,
       streamsize __newlen, streamsize __oldlen)
    {
      const size_t __plen = static_cast<size_t>(__newlen - __oldlen);
      const ios_base::fmtflags __adjust = __io.flags() & ios_base::adjustfield;


      if (__adjust == ios_base::left)
 {
   _Traits::copy(__news, __olds, __oldlen);
   _Traits::assign(__news + __oldlen, __plen, __fill);
   return;
 }

      size_t __mod = 0;
      if (__adjust == ios_base::internal)
 {



          const locale& __loc = __io._M_getloc();
   const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);

   if (__ctype.widen('-') == __olds[0]
       || __ctype.widen('+') == __olds[0])
     {
       __news[0] = __olds[0];
       __mod = 1;
       ++__news;
     }
   else if (__ctype.widen('0') == __olds[0]
     && __oldlen > 1
     && (__ctype.widen('x') == __olds[1]
         || __ctype.widen('X') == __olds[1]))
     {
       __news[0] = __olds[0];
       __news[1] = __olds[1];
       __mod = 2;
       __news += 2;
     }

 }
      _Traits::assign(__news, __plen, __fill);
      _Traits::copy(__news + __plen, __olds + __mod, __oldlen - __mod);
    }

  template<typename _CharT>
    _CharT*
    __add_grouping(_CharT* __s, _CharT __sep,
     const char* __gbeg, size_t __gsize,
     const _CharT* __first, const _CharT* __last)
    {
      size_t __idx = 0;
      size_t __ctr = 0;

      while (__last - __first > __gbeg[__idx]
      && static_cast<signed char>(__gbeg[__idx]) > 0
      && __gbeg[__idx] != __gnu_cxx::__numeric_traits<char>::__max)
 {
   __last -= __gbeg[__idx];
   __idx < __gsize - 1 ? ++__idx : ++__ctr;
 }

      while (__first != __last)
 *__s++ = *__first++;

      while (__ctr--)
 {
   *__s++ = __sep;
   for (char __i = __gbeg[__idx]; __i > 0; --__i)
     *__s++ = *__first++;
 }

      while (__idx--)
 {
   *__s++ = __sep;
   for (char __i = __gbeg[__idx]; __i > 0; --__i)
     *__s++ = *__first++;
 }

      return __s;
    }




  extern template class __cxx11:: numpunct<char>;
  extern template class __cxx11:: numpunct_byname<char>;
  extern template class num_get<char>;
  extern template class num_put<char>;
  extern template class ctype_byname<char>;

  extern template
    const ctype<char>&
    use_facet<ctype<char> >(const locale&);

  extern template
    const numpunct<char>&
    use_facet<numpunct<char> >(const locale&);

  extern template
    const num_put<char>&
    use_facet<num_put<char> >(const locale&);

  extern template
    const num_get<char>&
    use_facet<num_get<char> >(const locale&);

  extern template
    bool
    has_facet<ctype<char> >(const locale&);

  extern template
    bool
    has_facet<numpunct<char> >(const locale&);

  extern template
    bool
    has_facet<num_put<char> >(const locale&);

  extern template
    bool
    has_facet<num_get<char> >(const locale&);


  extern template class __cxx11:: numpunct<wchar_t>;
  extern template class __cxx11:: numpunct_byname<wchar_t>;
  extern template class num_get<wchar_t>;
  extern template class num_put<wchar_t>;
  extern template class ctype_byname<wchar_t>;

  extern template
    const ctype<wchar_t>&
    use_facet<ctype<wchar_t> >(const locale&);

  extern template
    const numpunct<wchar_t>&
    use_facet<numpunct<wchar_t> >(const locale&);

  extern template
    const num_put<wchar_t>&
    use_facet<num_put<wchar_t> >(const locale&);

  extern template
    const num_get<wchar_t>&
    use_facet<num_get<wchar_t> >(const locale&);

 extern template
    bool
    has_facet<ctype<wchar_t> >(const locale&);

  extern template
    bool
    has_facet<numpunct<wchar_t> >(const locale&);

  extern template
    bool
    has_facet<num_put<wchar_t> >(const locale&);

  extern template
    bool
    has_facet<num_get<wchar_t> >(const locale&);




}
# 2652 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/locale_facets.h" 2 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 2 3



namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _Facet>
    inline const _Facet&
    __check_facet(const _Facet* __f)
    {
      if (!__f)
 __throw_bad_cast();
      return *__f;
    }
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
  template<typename _CharT, typename _Traits>
    class basic_ios : public ios_base
    {
    public:






      typedef _CharT char_type;
      typedef typename _Traits::int_type int_type;
      typedef typename _Traits::pos_type pos_type;
      typedef typename _Traits::off_type off_type;
      typedef _Traits traits_type;






      typedef ctype<_CharT> __ctype_type;
      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
           __num_put_type;
      typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
           __num_get_type;



    protected:
      basic_ostream<_CharT, _Traits>* _M_tie;
      mutable char_type _M_fill;
      mutable bool _M_fill_init;
      basic_streambuf<_CharT, _Traits>* _M_streambuf;


      const __ctype_type* _M_ctype;

      const __num_put_type* _M_num_put;

      const __num_get_type* _M_num_get;

    public:
# 117 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      explicit operator bool() const
      { return !this->fail(); }





      bool
      operator!() const
      { return this->fail(); }
# 136 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      iostate
      rdstate() const
      { return _M_streambuf_state; }
# 147 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      void
      clear(iostate __state = goodbit);







      void
      setstate(iostate __state)
      { this->clear(this->rdstate() | __state); }




      void
      _M_setstate(iostate __state)
      {


 _M_streambuf_state |= __state;
 if (this->exceptions() & __state)
   throw;
      }







      bool
      good() const
      { return this->rdstate() == 0; }







      bool
      eof() const
      { return (this->rdstate() & eofbit) != 0; }
# 200 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      bool
      fail() const
      { return (this->rdstate() & (badbit | failbit)) != 0; }







      bool
      bad() const
      { return (this->rdstate() & badbit) != 0; }
# 221 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      iostate
      exceptions() const
      { return _M_exception; }
# 256 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      void
      exceptions(iostate __except)
      {
        _M_exception = __except;
        this->clear(_M_streambuf_state);
      }







      explicit
      basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
      : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
 _M_ctype(0), _M_num_put(0), _M_num_get(0)
      { this->init(__sb); }







      virtual
      ~basic_ios() { }
# 294 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      basic_ostream<_CharT, _Traits>*
      tie() const
      { return _M_tie; }
# 306 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      basic_ostream<_CharT, _Traits>*
      tie(basic_ostream<_CharT, _Traits>* __tiestr)
      {
        basic_ostream<_CharT, _Traits>* __old = _M_tie;
        _M_tie = __tiestr;
        return __old;
      }







      basic_streambuf<_CharT, _Traits>*
      rdbuf() const
      { return _M_streambuf; }
# 346 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      basic_streambuf<_CharT, _Traits>*
      rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
# 360 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      basic_ios&
      copyfmt(const basic_ios& __rhs);







      char_type
      fill() const
      {
 if (!_M_fill_init)
   {
     _M_fill = this->widen(' ');
     _M_fill_init = true;
   }
 return _M_fill;
      }
# 389 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      char_type
      fill(char_type __ch)
      {
 char_type __old = this->fill();
 _M_fill = __ch;
 return __old;
      }
# 409 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      locale
      imbue(const locale& __loc);
# 429 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      char
      narrow(char_type __c, char __dfault) const
      { return __check_facet(_M_ctype).narrow(__c, __dfault); }
# 448 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 3
      char_type
      widen(char __c) const
      { return __check_facet(_M_ctype).widen(__c); }

    protected:







      basic_ios()
      : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
 _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
      { }







      void
      init(basic_streambuf<_CharT, _Traits>* __sb);


      basic_ios(const basic_ios&) = delete;
      basic_ios& operator=(const basic_ios&) = delete;

      void
      move(basic_ios& __rhs)
      {
 ios_base::_M_move(__rhs);
 _M_cache_locale(_M_ios_locale);
 this->tie(__rhs.tie(nullptr));
 _M_fill = __rhs._M_fill;
 _M_fill_init = __rhs._M_fill_init;
 _M_streambuf = nullptr;
      }

      void
      move(basic_ios&& __rhs)
      { this->move(__rhs); }

      void
      swap(basic_ios& __rhs) noexcept
      {
 ios_base::_M_swap(__rhs);
 _M_cache_locale(_M_ios_locale);
 __rhs._M_cache_locale(__rhs._M_ios_locale);
 std::swap(_M_tie, __rhs._M_tie);
 std::swap(_M_fill, __rhs._M_fill);
 std::swap(_M_fill_init, __rhs._M_fill_init);
      }

      void
      set_rdbuf(basic_streambuf<_CharT, _Traits>* __sb)
      { _M_streambuf = __sb; }


      void
      _M_cache_locale(const locale& __loc);
    };


}


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.tcc" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.tcc" 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _CharT, typename _Traits>
    void
    basic_ios<_CharT, _Traits>::clear(iostate __state)
    {
      if (this->rdbuf())
 _M_streambuf_state = __state;
      else
   _M_streambuf_state = __state | badbit;
      if (this->exceptions() & this->rdstate())
 __throw_ios_failure(("basic_ios::clear"));
    }

  template<typename _CharT, typename _Traits>
    basic_streambuf<_CharT, _Traits>*
    basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __sb)
    {
      basic_streambuf<_CharT, _Traits>* __old = _M_streambuf;
      _M_streambuf = __sb;
      this->clear();
      return __old;
    }

  template<typename _CharT, typename _Traits>
    basic_ios<_CharT, _Traits>&
    basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
    {


      if (this != &__rhs)
 {




   _Words* __words = (__rhs._M_word_size <= _S_local_word_size) ?
                      _M_local_word : new _Words[__rhs._M_word_size];


   _Callback_list* __cb = __rhs._M_callbacks;
   if (__cb)
     __cb->_M_add_reference();
   _M_call_callbacks(erase_event);
   if (_M_word != _M_local_word)
     {
       delete [] _M_word;
       _M_word = 0;
     }
   _M_dispose_callbacks();


   _M_callbacks = __cb;
   for (int __i = 0; __i < __rhs._M_word_size; ++__i)
     __words[__i] = __rhs._M_word[__i];
   _M_word = __words;
   _M_word_size = __rhs._M_word_size;

   this->flags(__rhs.flags());
   this->width(__rhs.width());
   this->precision(__rhs.precision());
   this->tie(__rhs.tie());
   this->fill(__rhs.fill());
   _M_ios_locale = __rhs.getloc();
   _M_cache_locale(_M_ios_locale);

   _M_call_callbacks(copyfmt_event);


   this->exceptions(__rhs.exceptions());
 }
      return *this;
    }


  template<typename _CharT, typename _Traits>
    locale
    basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
    {
      locale __old(this->getloc());
      ios_base::imbue(__loc);
      _M_cache_locale(__loc);
      if (this->rdbuf() != 0)
 this->rdbuf()->pubimbue(__loc);
      return __old;
    }

  template<typename _CharT, typename _Traits>
    void
    basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
    {

      ios_base::_M_init();


      _M_cache_locale(_M_ios_locale);
# 146 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.tcc" 3
      _M_fill = _CharT();
      _M_fill_init = false;

      _M_tie = 0;
      _M_exception = goodbit;
      _M_streambuf = __sb;
      _M_streambuf_state = __sb ? goodbit : badbit;
    }

  template<typename _CharT, typename _Traits>
    void
    basic_ios<_CharT, _Traits>::_M_cache_locale(const locale& __loc)
    {
      if (__builtin_expect(has_facet<__ctype_type>(__loc), true))
 _M_ctype = &use_facet<__ctype_type>(__loc);
      else
 _M_ctype = 0;

      if (__builtin_expect(has_facet<__num_put_type>(__loc), true))
 _M_num_put = &use_facet<__num_put_type>(__loc);
      else
 _M_num_put = 0;

      if (__builtin_expect(has_facet<__num_get_type>(__loc), true))
 _M_num_get = &use_facet<__num_get_type>(__loc);
      else
 _M_num_get = 0;
    }




  extern template class basic_ios<char>;


  extern template class basic_ios<wchar_t>;




}
# 517 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/basic_ios.h" 2 3
# 45 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ios" 2 3
# 39 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 2 3


namespace std __attribute__ ((__visibility__ ("default")))
{
# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
  template<typename _CharT, typename _Traits>
    class basic_ostream : virtual public basic_ios<_CharT, _Traits>
    {
    public:

      typedef _CharT char_type;
      typedef typename _Traits::int_type int_type;
      typedef typename _Traits::pos_type pos_type;
      typedef typename _Traits::off_type off_type;
      typedef _Traits traits_type;


      typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
      typedef basic_ios<_CharT, _Traits> __ios_type;
      typedef basic_ostream<_CharT, _Traits> __ostream_type;
      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
             __num_put_type;
      typedef ctype<_CharT> __ctype_type;
# 83 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      explicit
      basic_ostream(__streambuf_type* __sb)
      { this->init(__sb); }






      virtual
      ~basic_ostream() { }


      class sentry;
      friend class sentry;
# 107 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      operator<<(__ostream_type& (*__pf)(__ostream_type&))
      {



 return __pf(*this);
      }

      __ostream_type&
      operator<<(__ios_type& (*__pf)(__ios_type&))
      {



 __pf(*this);
 return *this;
      }

      __ostream_type&
      operator<<(ios_base& (*__pf) (ios_base&))
      {



 __pf(*this);
 return *this;
      }
# 165 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      operator<<(long __n)
      { return _M_insert(__n); }

      __ostream_type&
      operator<<(unsigned long __n)
      { return _M_insert(__n); }

      __ostream_type&
      operator<<(bool __n)
      { return _M_insert(__n); }

      __ostream_type&
      operator<<(short __n);

      __ostream_type&
      operator<<(unsigned short __n)
      {


 return _M_insert(static_cast<unsigned long>(__n));
      }

      __ostream_type&
      operator<<(int __n);

      __ostream_type&
      operator<<(unsigned int __n)
      {


 return _M_insert(static_cast<unsigned long>(__n));
      }


      __ostream_type&
      operator<<(long long __n)
      { return _M_insert(__n); }

      __ostream_type&
      operator<<(unsigned long long __n)
      { return _M_insert(__n); }
# 219 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      operator<<(double __f)
      { return _M_insert(__f); }

      __ostream_type&
      operator<<(float __f)
      {


 return _M_insert(static_cast<double>(__f));
      }

      __ostream_type&
      operator<<(long double __f)
      { return _M_insert(__f); }
# 244 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      operator<<(const void* __p)
      { return _M_insert(__p); }
# 269 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      operator<<(__streambuf_type* __sb);
# 302 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      put(char_type __c);






      void
      _M_write(const char_type* __s, streamsize __n)
      {
 const streamsize __put = this->rdbuf()->sputn(__s, __n);
 if (__put != __n)
   this->setstate(ios_base::badbit);
      }
# 334 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      write(const char_type* __s, streamsize __n);
# 347 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      flush();
# 357 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      pos_type
      tellp();
# 368 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      __ostream_type&
      seekp(pos_type);
# 380 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
       __ostream_type&
      seekp(off_type, ios_base::seekdir);

    protected:
      basic_ostream()
      { this->init(0); }



      basic_ostream(basic_iostream<_CharT, _Traits>&) { }

      basic_ostream(const basic_ostream&) = delete;

      basic_ostream(basic_ostream&& __rhs)
      : __ios_type()
      { __ios_type::move(__rhs); }



      basic_ostream& operator=(const basic_ostream&) = delete;

      basic_ostream&
      operator=(basic_ostream&& __rhs)
      {
 swap(__rhs);
 return *this;
      }

      void
      swap(basic_ostream& __rhs)
      { __ios_type::swap(__rhs); }


      template<typename _ValueT>
 __ostream_type&
 _M_insert(_ValueT __v);
    };
# 425 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
  template <typename _CharT, typename _Traits>
    class basic_ostream<_CharT, _Traits>::sentry
    {

      bool _M_ok;
      basic_ostream<_CharT, _Traits>& _M_os;

    public:
# 444 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      explicit
      sentry(basic_ostream<_CharT, _Traits>& __os);
# 454 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      ~sentry()
      {

 if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception())
   {

     if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)
       _M_os.setstate(ios_base::badbit);
   }
      }
# 473 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
      explicit

      operator bool() const
      { return _M_ok; }
    };
# 495 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
    { return __ostream_insert(__out, &__c, 1); }

  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
    { return (__out << __out.widen(__c)); }


  template <class _Traits>
    inline basic_ostream<char, _Traits>&
    operator<<(basic_ostream<char, _Traits>& __out, char __c)
    { return __ostream_insert(__out, &__c, 1); }


  template<class _Traits>
    inline basic_ostream<char, _Traits>&
    operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
    { return (__out << static_cast<char>(__c)); }

  template<class _Traits>
    inline basic_ostream<char, _Traits>&
    operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
    { return (__out << static_cast<char>(__c)); }
# 537 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
    {
      if (!__s)
 __out.setstate(ios_base::badbit);
      else
 __ostream_insert(__out, __s,
    static_cast<streamsize>(_Traits::length(__s)));
      return __out;
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits> &
    operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);


  template<class _Traits>
    inline basic_ostream<char, _Traits>&
    operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
    {
      if (!__s)
 __out.setstate(ios_base::badbit);
      else
 __ostream_insert(__out, __s,
    static_cast<streamsize>(_Traits::length(__s)));
      return __out;
    }


  template<class _Traits>
    inline basic_ostream<char, _Traits>&
    operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
    { return (__out << reinterpret_cast<const char*>(__s)); }

  template<class _Traits>
    inline basic_ostream<char, _Traits> &
    operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
    { return (__out << reinterpret_cast<const char*>(__s)); }
# 588 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    endl(basic_ostream<_CharT, _Traits>& __os)
    { return flush(__os.put(__os.widen('\n'))); }
# 600 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    ends(basic_ostream<_CharT, _Traits>& __os)
    { return __os.put(_CharT()); }






  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    flush(basic_ostream<_CharT, _Traits>& __os)
    { return __os.flush(); }
# 626 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 3
  template<typename _CharT, typename _Traits, typename _Tp>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
    {
      __os << __x;
      return __os;
    }



}


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream.tcc" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/ostream.tcc" 3



namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>::sentry::
    sentry(basic_ostream<_CharT, _Traits>& __os)
    : _M_ok(false), _M_os(__os)
    {

      if (__os.tie() && __os.good())
 __os.tie()->flush();

      if (__os.good())
 _M_ok = true;
      else
 __os.setstate(ios_base::failbit);
    }

  template<typename _CharT, typename _Traits>
    template<typename _ValueT>
      basic_ostream<_CharT, _Traits>&
      basic_ostream<_CharT, _Traits>::
      _M_insert(_ValueT __v)
      {
 sentry __cerb(*this);
 if (__cerb)
   {
     ios_base::iostate __err = ios_base::goodbit;
     try
       {
  const __num_put_type& __np = __check_facet(this->_M_num_put);
  if (__np.put(*this, *this, this->fill(), __v).failed())
    __err |= ios_base::badbit;
       }
     catch(__cxxabiv1::__forced_unwind&)
       {
  this->_M_setstate(ios_base::badbit);
  throw;
       }
     catch(...)
       { this->_M_setstate(ios_base::badbit); }
     if (__err)
       this->setstate(__err);
   }
 return *this;
      }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    operator<<(short __n)
    {


      const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
      if (__fmt == ios_base::oct || __fmt == ios_base::hex)
 return _M_insert(static_cast<long>(static_cast<unsigned short>(__n)));
      else
 return _M_insert(static_cast<long>(__n));
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    operator<<(int __n)
    {


      const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
      if (__fmt == ios_base::oct || __fmt == ios_base::hex)
 return _M_insert(static_cast<long>(static_cast<unsigned int>(__n)));
      else
 return _M_insert(static_cast<long>(__n));
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    operator<<(__streambuf_type* __sbin)
    {
      ios_base::iostate __err = ios_base::goodbit;
      sentry __cerb(*this);
      if (__cerb && __sbin)
 {
   try
     {
       if (!__copy_streambufs(__sbin, this->rdbuf()))
  __err |= ios_base::failbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::failbit); }
 }
      else if (!__sbin)
 __err |= ios_base::badbit;
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    put(char_type __c)
    {






      sentry __cerb(*this);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       const int_type __put = this->rdbuf()->sputc(__c);
       if (traits_type::eq_int_type(__put, traits_type::eof()))
  __err |= ios_base::badbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    write(const _CharT* __s, streamsize __n)
    {







      sentry __cerb(*this);
      if (__cerb)
 {
   try
     { _M_write(__s, __n); }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    flush()
    {



      ios_base::iostate __err = ios_base::goodbit;
      try
 {
   if (this->rdbuf() && this->rdbuf()->pubsync() == -1)
     __err |= ios_base::badbit;
 }
      catch(__cxxabiv1::__forced_unwind&)
 {
   this->_M_setstate(ios_base::badbit);
   throw;
 }
      catch(...)
 { this->_M_setstate(ios_base::badbit); }
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    typename basic_ostream<_CharT, _Traits>::pos_type
    basic_ostream<_CharT, _Traits>::
    tellp()
    {
      pos_type __ret = pos_type(-1);
      try
 {
   if (!this->fail())
     __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
 }
      catch(__cxxabiv1::__forced_unwind&)
 {
   this->_M_setstate(ios_base::badbit);
   throw;
 }
      catch(...)
 { this->_M_setstate(ios_base::badbit); }
      return __ret;
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    seekp(pos_type __pos)
    {
      ios_base::iostate __err = ios_base::goodbit;
      try
 {
   if (!this->fail())
     {


       const pos_type __p = this->rdbuf()->pubseekpos(__pos,
            ios_base::out);


       if (__p == pos_type(off_type(-1)))
  __err |= ios_base::failbit;
     }
 }
      catch(__cxxabiv1::__forced_unwind&)
 {
   this->_M_setstate(ios_base::badbit);
   throw;
 }
      catch(...)
 { this->_M_setstate(ios_base::badbit); }
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::
    seekp(off_type __off, ios_base::seekdir __dir)
    {
      ios_base::iostate __err = ios_base::goodbit;
      try
 {
   if (!this->fail())
     {


       const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
            ios_base::out);


       if (__p == pos_type(off_type(-1)))
  __err |= ios_base::failbit;
     }
 }
      catch(__cxxabiv1::__forced_unwind&)
 {
   this->_M_setstate(ios_base::badbit);
   throw;
 }
      catch(...)
 { this->_M_setstate(ios_base::badbit); }
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
    {
      if (!__s)
 __out.setstate(ios_base::badbit);
      else
 {


   const size_t __clen = char_traits<char>::length(__s);
   try
     {
       struct __ptr_guard
       {
  _CharT *__p;
  __ptr_guard (_CharT *__ip): __p(__ip) { }
  ~__ptr_guard() { delete[] __p; }
  _CharT* __get() { return __p; }
       } __pg (new _CharT[__clen]);

       _CharT *__ws = __pg.__get();
       for (size_t __i = 0; __i < __clen; ++__i)
  __ws[__i] = __out.widen(__s[__i]);
       __ostream_insert(__out, __ws, __clen);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       __out._M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { __out._M_setstate(ios_base::badbit); }
 }
      return __out;
    }




  extern template class basic_ostream<char>;
  extern template ostream& endl(ostream&);
  extern template ostream& ends(ostream&);
  extern template ostream& flush(ostream&);
  extern template ostream& operator<<(ostream&, char);
  extern template ostream& operator<<(ostream&, unsigned char);
  extern template ostream& operator<<(ostream&, signed char);
  extern template ostream& operator<<(ostream&, const char*);
  extern template ostream& operator<<(ostream&, const unsigned char*);
  extern template ostream& operator<<(ostream&, const signed char*);

  extern template ostream& ostream::_M_insert(long);
  extern template ostream& ostream::_M_insert(unsigned long);
  extern template ostream& ostream::_M_insert(bool);

  extern template ostream& ostream::_M_insert(long long);
  extern template ostream& ostream::_M_insert(unsigned long long);

  extern template ostream& ostream::_M_insert(double);
  extern template ostream& ostream::_M_insert(long double);
  extern template ostream& ostream::_M_insert(const void*);


  extern template class basic_ostream<wchar_t>;
  extern template wostream& endl(wostream&);
  extern template wostream& ends(wostream&);
  extern template wostream& flush(wostream&);
  extern template wostream& operator<<(wostream&, wchar_t);
  extern template wostream& operator<<(wostream&, char);
  extern template wostream& operator<<(wostream&, const wchar_t*);
  extern template wostream& operator<<(wostream&, const char*);

  extern template wostream& wostream::_M_insert(long);
  extern template wostream& wostream::_M_insert(unsigned long);
  extern template wostream& wostream::_M_insert(bool);

  extern template wostream& wostream::_M_insert(long long);
  extern template wostream& wostream::_M_insert(unsigned long long);

  extern template wostream& wostream::_M_insert(double);
  extern template wostream& wostream::_M_insert(long double);
  extern template wostream& wostream::_M_insert(const void*);




}
# 639 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/ostream" 2 3
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h" 2


namespace mozilla {

struct Nothing { };
# 85 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h"
template<class T>
class Maybe
{
  alignas(T) unsigned char mStorage[sizeof(T)];
  char mIsSome;



  void* data() { return mStorage; }
  const void* data() const { return mStorage; }

public:
  using ValueType = T;

  Maybe() : mIsSome(false) { }
  ~Maybe() { reset(); }

               Maybe(Nothing) : mIsSome(false) { }

  Maybe(const Maybe& aOther)
    : mIsSome(false)
  {
    if (aOther.mIsSome) {
      emplace(*aOther);
    }
  }




  template<typename U,
           typename =
             typename std::enable_if<std::is_convertible<U, T>::value>::type>

  Maybe(const Maybe<U>& aOther)
    : mIsSome(false)
  {
    if (aOther.isSome()) {
      emplace(*aOther);
    }
  }

  Maybe(Maybe&& aOther)
    : mIsSome(false)
  {
    if (aOther.mIsSome) {
      emplace(Move(*aOther));
      aOther.reset();
    }
  }




  template<typename U,
           typename =
             typename std::enable_if<std::is_convertible<U, T>::value>::type>

  Maybe(Maybe<U>&& aOther)
    : mIsSome(false)
  {
    if (aOther.isSome()) {
      emplace(Move(*aOther));
      aOther.reset();
    }
  }

  Maybe& operator=(const Maybe& aOther)
  {
    if (&aOther != this) {
      if (aOther.mIsSome) {
        if (mIsSome) {
          ref() = aOther.ref();
        } else {
          emplace(*aOther);
        }
      } else {
        reset();
      }
    }
    return *this;
  }

  template<typename U,
           typename =
             typename std::enable_if<std::is_convertible<U, T>::value>::type>
  Maybe& operator=(const Maybe<U>& aOther)
  {
    if (aOther.isSome()) {
      if (mIsSome) {
        ref() = aOther.ref();
      } else {
        emplace(*aOther);
      }
    } else {
      reset();
    }
    return *this;
  }

  Maybe& operator=(Maybe&& aOther)
  {
    do { } while (0);

    if (aOther.mIsSome) {
      if (mIsSome) {
        ref() = Move(aOther.ref());
      } else {
        emplace(Move(*aOther));
      }
      aOther.reset();
    } else {
      reset();
    }

    return *this;
  }

  template<typename U,
           typename =
             typename std::enable_if<std::is_convertible<U, T>::value>::type>
  Maybe& operator=(Maybe<U>&& aOther)
  {
    if (aOther.isSome()) {
      if (mIsSome) {
        ref() = Move(aOther.ref());
      } else {
        emplace(Move(*aOther));
      }
      aOther.reset();
    } else {
      reset();
    }

    return *this;
  }


  explicit operator bool() const { return isSome(); }
  bool isSome() const { return mIsSome; }
  bool isNothing() const { return !mIsSome; }


  T value() const
  {
    do { } while (0);
    return ref();
  }





  template<typename V>
  T valueOr(V&& aDefault) const
  {
    if (isSome()) {
      return ref();
    }
    return Forward<V>(aDefault);
  }





  template<typename F>
  T valueOrFrom(F&& aFunc) const
  {
    if (isSome()) {
      return ref();
    }
    return aFunc();
  }


  T* ptr()
  {
    do { } while (0);
    return &ref();
  }

  const T* ptr() const
  {
    do { } while (0);
    return &ref();
  }





  T* ptrOr(T* aDefault)
  {
    if (isSome()) {
      return ptr();
    }
    return aDefault;
  }

  const T* ptrOr(const T* aDefault) const
  {
    if (isSome()) {
      return ptr();
    }
    return aDefault;
  }





  template<typename F>
  T* ptrOrFrom(F&& aFunc)
  {
    if (isSome()) {
      return ptr();
    }
    return aFunc();
  }

  template<typename F>
  const T* ptrOrFrom(F&& aFunc) const
  {
    if (isSome()) {
      return ptr();
    }
    return aFunc();
  }

  T* operator->()
  {
    do { } while (0);
    return ptr();
  }

  const T* operator->() const
  {
    do { } while (0);
    return ptr();
  }


  T& ref()
  {
    do { } while (0);
    return *static_cast<T*>(data());
  }

  const T& ref() const
  {
    do { } while (0);
    return *static_cast<const T*>(data());
  }





  T& refOr(T& aDefault)
  {
    if (isSome()) {
      return ref();
    }
    return aDefault;
  }

  const T& refOr(const T& aDefault) const
  {
    if (isSome()) {
      return ref();
    }
    return aDefault;
  }





  template<typename F>
  T& refOrFrom(F&& aFunc)
  {
    if (isSome()) {
      return ref();
    }
    return aFunc();
  }

  template<typename F>
  const T& refOrFrom(F&& aFunc) const
  {
    if (isSome()) {
      return ref();
    }
    return aFunc();
  }

  T& operator*()
  {
    do { } while (0);
    return ref();
  }

  const T& operator*() const
  {
    do { } while (0);
    return ref();
  }



  template<typename Func>
  Maybe& apply(Func aFunc)
  {
    if (isSome()) {
      aFunc(ref());
    }
    return *this;
  }

  template<typename Func>
  const Maybe& apply(Func aFunc) const
  {
    if (isSome()) {
      aFunc(ref());
    }
    return *this;
  }





  template<typename Func>
  auto map(Func aFunc) -> Maybe<decltype(aFunc(DeclVal<Maybe<T>>().ref()))>
  {
    using ReturnType = decltype(aFunc(ref()));
    if (isSome()) {
      Maybe<ReturnType> val;
      val.emplace(aFunc(ref()));
      return val;
    }
    return Maybe<ReturnType>();
  }

  template<typename Func>
  auto map(Func aFunc) const -> Maybe<decltype(aFunc(DeclVal<Maybe<T>>().ref()))>
  {
    using ReturnType = decltype(aFunc(ref()));
    if (isSome()) {
      Maybe<ReturnType> val;
      val.emplace(aFunc(ref()));
      return val;
    }
    return Maybe<ReturnType>();
  }


  void reset()
  {
    if (isSome()) {
      ref().T::~T();
      mIsSome = false;
    }
  }





  template<typename... Args>
  void emplace(Args&&... aArgs)
  {
    do { } while (0);
    ::new (KnownNotNull, data()) T(Forward<Args>(aArgs)...);
    mIsSome = true;
  }

  friend std::ostream&
  operator<<(std::ostream& aStream, const Maybe<T>& aMaybe)
  {
    if (aMaybe) {
      aStream << aMaybe.ref();
    } else {
      aStream << "<Nothing>";
    }
    return aStream;
  }
};
# 485 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Maybe.h"
template<typename T,
         typename U = typename std::remove_cv<
           typename std::remove_reference<T>::type>::type>
Maybe<U>
Some(T&& aValue)
{
  Maybe<U> value;
  value.emplace(Forward<T>(aValue));
  return value;
}

template<typename T>
Maybe<typename RemoveCV<typename RemoveReference<T>::Type>::Type>
ToMaybe(T* aPtr)
{
  if (aPtr) {
    return Some(*aPtr);
  }
  return Nothing();
}






template<typename T> bool
operator==(const Maybe<T>& aLHS, const Maybe<T>& aRHS)
{
  if (aLHS.isNothing() != aRHS.isNothing()) {
    return false;
  }
  return aLHS.isNothing() || *aLHS == *aRHS;
}

template<typename T> bool
operator!=(const Maybe<T>& aLHS, const Maybe<T>& aRHS)
{
  return !(aLHS == aRHS);
}





template<typename T> bool
operator==(const Maybe<T>& aLHS, const Nothing& aRHS)
{
  return aLHS.isNothing();
}

template<typename T> bool
operator!=(const Maybe<T>& aLHS, const Nothing& aRHS)
{
  return !(aLHS == aRHS);
}

template<typename T> bool
operator==(const Nothing& aLHS, const Maybe<T>& aRHS)
{
  return aRHS.isNothing();
}

template<typename T> bool
operator!=(const Nothing& aLHS, const Maybe<T>& aRHS)
{
  return !(aLHS == aRHS);
}





template<typename T> bool
operator<(const Maybe<T>& aLHS, const Maybe<T>& aRHS)
{
  if (aLHS.isNothing()) {
    return aRHS.isSome();
  }
  if (aRHS.isNothing()) {
    return false;
  }
  return *aLHS < *aRHS;
}

template<typename T> bool
operator>(const Maybe<T>& aLHS, const Maybe<T>& aRHS)
{
  return !(aLHS < aRHS || aLHS == aRHS);
}

template<typename T> bool
operator<=(const Maybe<T>& aLHS, const Maybe<T>& aRHS)
{
  return aLHS < aRHS || aLHS == aRHS;
}

template<typename T> bool
operator>=(const Maybe<T>& aLHS, const Maybe<T>& aRHS)
{
  return !(aLHS < aRHS);
}

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClasses.h" 2
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClasses.h"
class nsIAtom;

namespace mozilla {
namespace dom {
class Element;
}



typedef uint8_t CSSPseudoClassTypeBase;
enum class CSSPseudoClassType : CSSPseudoClassTypeBase
{



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClassList.h" 1
# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClassList.h"
empty,
mozOnlyWhitespace,
mozEmptyExceptChildrenWithLocalname,
lang,
root,
any,

firstChild,
firstNode,
lastChild,
lastNode,
onlyChild,
firstOfType,
lastOfType,
onlyOfType,
nthChild,
nthLastChild,
nthOfType,
nthLastOfType,


mozIsHTML,


 unresolved,




mozNativeAnonymous,



mozSystemMetric,



mozLocaleDir,


mozLWTheme,


mozLWThemeBrightText,


mozLWThemeDarkText,


mozWindowInactive,



mozTableBorderNonzero,



mozBrowserFrame,




scope,



negation,



dir,


link,

mozAnyLink,

anyLink,

visited,

active,
checked,
disabled,
enabled,
focus,
focusWithin,
hover,
mozDragOver,
target,
indeterminate,


mozDevtoolsHighlighted,

mozStyleeditorTransitioning,




fullscreen,



mozFullScreen,


mozFocusRing,


mozBroken,
mozLoading,

mozUserDisabled,


mozSuppressed,


mozHandlerClickToPlay,


mozHandlerVulnerableUpdatable,


mozHandlerVulnerableNoUpdate,


mozHandlerDisabled,


mozHandlerBlocked,


mozHandlerCrashed,



mozMathIncrementScriptLevel,





required,
optional,
valid,
invalid,
inRange,
outOfRange,
defaultPseudo,
placeholderShown,

mozReadOnly,

mozReadWrite,

mozSubmitInvalid,

mozUIInvalid,

mozUIValid,

mozMeterOptimum,

mozMeterSubOptimum,

mozMeterSubSubOptimum,



mozPlaceholder,
# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoClasses.h" 2

  Count,
  NotPseudo,
  MAX
};

}

class nsCSSPseudoClasses
{
  typedef mozilla::CSSPseudoClassType Type;
  typedef mozilla::CSSEnabledState EnabledState;

public:
  static void AddRefAtoms();

  static Type GetPseudoType(nsIAtom* aAtom, EnabledState aEnabledState);
  static bool HasStringArg(Type aType);
  static bool HasNthPairArg(Type aType);
  static bool HasSelectorListArg(Type aType) {
    return aType == Type::any;
  }
  static bool IsUserActionPseudoClass(Type aType);


  static void PseudoTypeToString(Type aType, nsAString& aString);

  static bool IsEnabled(Type aType, EnabledState aEnabledState)
  {
    auto index = static_cast<size_t>(aType);
    do { } while (0);
    if (sPseudoClassEnabled[index] ||
        aEnabledState == EnabledState::eIgnoreEnabledState) {
      return true;
    }
    auto flags = kPseudoClassFlags[index];
    if (((aEnabledState & EnabledState::eInChrome) &&
         (flags & (1<<1))) ||
        ((aEnabledState & EnabledState::eInUASheets) &&
         (flags & (1<<0)))) {
      return true;
    }
    return false;
  }




  static mozilla::Maybe<bool>
    MatchesElement(Type aType, const mozilla::dom::Element* aElement);

private:
  static const uint32_t kPseudoClassFlags[size_t(Type::Count)];
  static bool sPseudoClassEnabled[size_t(Type::Count)];
};
# 3 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoPropPrefList.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoPropPrefList.h"
namespace mozilla {








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h" 1
# 328 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_align_content = !(sizeof("") == 1);
# 338 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_align_items = !(sizeof("") == 1);
# 348 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_align_self = !(sizeof("") == 1);
# 358 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_all = !(sizeof("layout.css.all-shorthand.enabled") == 1);





const bool SERVO_PREF_ENABLED_animation = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_animation_delay = !(sizeof("") == 1);
# 381 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_animation_direction = !(sizeof("") == 1);
# 392 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_animation_duration = !(sizeof("") == 1);
# 403 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_animation_fill_mode = !(sizeof("") == 1);
# 414 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_animation_iteration_count = !(sizeof("") == 1);
# 428 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_animation_name = !(sizeof("") == 1);
# 441 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_animation_play_state = !(sizeof("") == 1);
# 452 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_animation_timing_function = !(sizeof("") == 1);
# 463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_appearance = !(sizeof("layout.css.moz-appearance.enabled") == 1);
# 474 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_appearance = !(sizeof("layout.css.appearance.enabled") == 1);
# 485 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_backface_visibility = !(sizeof("") == 1);
# 495 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_background_attachment = !(sizeof("") == 1);
# 514 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_blend_mode = !(sizeof("layout.css.background-blend-mode.enabled") == 1);
# 527 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_clip = !(sizeof("") == 1);
# 540 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_color = !(sizeof("") == 1);
# 554 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_image = !(sizeof("") == 1);
# 569 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_origin = !(sizeof("") == 1);
# 582 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_position = !(sizeof("") == 1);






const bool SERVO_PREF_ENABLED_background_position_x = !(sizeof("") == 1);
# 603 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_position_y = !(sizeof("") == 1);
# 617 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_repeat = !(sizeof("") == 1);
# 630 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_background_size = !(sizeof("") == 1);
# 645 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_binding = !(sizeof("") == 1);
# 655 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_block_size = !(sizeof("") == 1);
# 673 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_block_end = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_block_end_color = !(sizeof("") == 1);
# 701 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_block_end_style = !(sizeof("") == 1);
# 717 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_block_end_width = !(sizeof("") == 1);
# 735 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_block_start = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_block_start_color = !(sizeof("") == 1);
# 756 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_block_start_style = !(sizeof("") == 1);
# 771 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_block_start_width = !(sizeof("") == 1);
# 788 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_bottom = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_bottom_color = !(sizeof("") == 1);
# 807 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_border_bottom_colors = !(sizeof("") == 1);
# 819 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_bottom_left_radius = !(sizeof("") == 1);
# 832 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_bottom_right_radius = !(sizeof("") == 1);
# 845 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_bottom_style = !(sizeof("") == 1);
# 856 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_bottom_width = !(sizeof("") == 1);
# 870 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_collapse = !(sizeof("") == 1);
# 880 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_color = !(sizeof("") == 1);






const bool SERVO_PREF_ENABLED_border_image = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_image_outset = !(sizeof("") == 1);
# 904 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_image_repeat = !(sizeof("") == 1);
# 915 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_image_slice = !(sizeof("") == 1);
# 926 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_image_source = !(sizeof("") == 1);
# 938 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_image_width = !(sizeof("") == 1);
# 949 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_inline_end = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_inline_end_color = !(sizeof("") == 1);
# 970 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_inline_end_style = !(sizeof("") == 1);
# 985 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_inline_end_width = !(sizeof("") == 1);
# 1002 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_inline_start = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_inline_start_color = !(sizeof("") == 1);
# 1022 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_inline_start_style = !(sizeof("") == 1);
# 1036 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_inline_start_width = !(sizeof("") == 1);
# 1052 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_left = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_left_color = !(sizeof("") == 1);
# 1071 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_border_left_colors = !(sizeof("") == 1);
# 1083 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_left_style = !(sizeof("") == 1);
# 1094 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_left_width = !(sizeof("") == 1);
# 1108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_radius = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_right = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_right_color = !(sizeof("") == 1);
# 1133 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_border_right_colors = !(sizeof("") == 1);
# 1145 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_right_style = !(sizeof("") == 1);
# 1156 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_right_width = !(sizeof("") == 1);
# 1170 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_spacing = !(sizeof("") == 1);
# 1182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_style = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_top = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_border_top_color = !(sizeof("") == 1);
# 1207 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_border_top_colors = !(sizeof("") == 1);
# 1219 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_top_left_radius = !(sizeof("") == 1);
# 1232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_top_right_radius = !(sizeof("") == 1);
# 1245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_top_style = !(sizeof("") == 1);
# 1256 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_top_width = !(sizeof("") == 1);
# 1270 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_border_width = !(sizeof("") == 1);






const bool SERVO_PREF_ENABLED_bottom = !(sizeof("") == 1);
# 1290 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_box_align = !(sizeof("") == 1);
# 1300 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_box_decoration_break = !(sizeof("layout.css.box-decoration-break.enabled") == 1);
# 1310 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_box_direction = !(sizeof("") == 1);
# 1320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_box_flex = !(sizeof("") == 1);
# 1331 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_box_ordinal_group = !(sizeof("") == 1);
# 1342 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_box_orient = !(sizeof("") == 1);
# 1352 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_box_pack = !(sizeof("") == 1);
# 1362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_box_shadow = !(sizeof("") == 1);
# 1376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_box_sizing = !(sizeof("") == 1);
# 1386 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_caption_side = !(sizeof("") == 1);
# 1396 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_caret_color = !(sizeof("") == 1);
# 1407 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_clear = !(sizeof("") == 1);
# 1417 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_clip = !(sizeof("") == 1);
# 1428 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_clip_path = !(sizeof("") == 1);
# 1441 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_clip_rule = !(sizeof("") == 1);
# 1451 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_color = !(sizeof("") == 1);
# 1465 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_color_adjust = !(sizeof("layout.css.color-adjust.enabled") == 1);
# 1475 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_color_interpolation = !(sizeof("") == 1);
# 1485 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_color_interpolation_filters = !(sizeof("") == 1);
# 1495 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_count = !(sizeof("") == 1);
# 1508 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_fill = !(sizeof("") == 1);
# 1518 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_gap = !(sizeof("") == 1);
# 1529 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_rule = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_column_rule_color = !(sizeof("") == 1);
# 1546 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_rule_style = !(sizeof("") == 1);
# 1556 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_rule_width = !(sizeof("") == 1);
# 1567 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_span = !(sizeof("layout.css.column-span.enabled") == 1);
# 1577 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_column_width = !(sizeof("") == 1);
# 1588 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_columns = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_contain = !(sizeof("layout.css.contain.enabled") == 1);
# 1607 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_content = !(sizeof("") == 1);
# 1619 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_control_character_visibility = !(sizeof("") == 1);
# 1631 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_counter_increment = !(sizeof("") == 1);
# 1641 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_counter_reset = !(sizeof("") == 1);
# 1651 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_cursor = !(sizeof("") == 1);
# 1665 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_direction = !(sizeof("") == 1);
# 1676 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_display = !(sizeof("") == 1);
# 1690 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_dominant_baseline = !(sizeof("") == 1);
# 1700 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_empty_cells = !(sizeof("") == 1);
# 1710 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_fill = !(sizeof("") == 1);
# 1720 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_fill_opacity = !(sizeof("") == 1);
# 1730 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_fill_rule = !(sizeof("") == 1);
# 1740 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_filter = !(sizeof("") == 1);
# 1752 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_flex = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_flex_basis = !(sizeof("") == 1);
# 1773 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_flex_direction = !(sizeof("") == 1);
# 1783 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_flex_flow = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_flex_grow = !(sizeof("") == 1);
# 1803 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_flex_shrink = !(sizeof("") == 1);
# 1817 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_flex_wrap = !(sizeof("") == 1);
# 1827 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_float_ = !(sizeof("") == 1);
# 1838 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_float_edge = !(sizeof("") == 1);
# 1848 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_flood_color = !(sizeof("") == 1);
# 1858 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_flood_opacity = !(sizeof("") == 1);
# 1868 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_font_family = !(sizeof("") == 1);
# 1887 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_feature_settings = !(sizeof("") == 1);
# 1900 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_kerning = !(sizeof("") == 1);
# 1912 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_language_override = !(sizeof("") == 1);
# 1924 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_size = !(sizeof("") == 1);
# 1940 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_size_adjust = !(sizeof("") == 1);
# 1953 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_stretch = !(sizeof("") == 1);
# 1965 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_style = !(sizeof("") == 1);
# 1977 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_synthesis = !(sizeof("") == 1);
# 1990 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_variant = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_font_variant_alternates = !(sizeof("") == 1);
# 2009 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_variant_caps = !(sizeof("") == 1);
# 2021 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_variant_east_asian = !(sizeof("") == 1);
# 2034 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_variant_ligatures = !(sizeof("") == 1);
# 2047 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_variant_numeric = !(sizeof("") == 1);
# 2060 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_variant_position = !(sizeof("") == 1);
# 2072 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_variation_settings = !(sizeof("layout.css.font-variations.enabled") == 1);
# 2086 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_font_weight = !(sizeof("") == 1);
# 2100 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_force_broken_image_icon = !(sizeof("") == 1);
# 2111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid = !(sizeof("layout.css.grid.enabled") == 1);





const bool SERVO_PREF_ENABLED_grid_area = !(sizeof("layout.css.grid.enabled") == 1);





const bool SERVO_PREF_ENABLED_grid_auto_columns = !(sizeof("layout.css.grid.enabled") == 1);
# 2135 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_auto_flow = !(sizeof("layout.css.grid.enabled") == 1);
# 2146 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_auto_rows = !(sizeof("layout.css.grid.enabled") == 1);
# 2158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_column = !(sizeof("layout.css.grid.enabled") == 1);





const bool SERVO_PREF_ENABLED_grid_column_end = !(sizeof("layout.css.grid.enabled") == 1);
# 2174 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_column_gap = !(sizeof("layout.css.grid.enabled") == 1);
# 2186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_column_start = !(sizeof("layout.css.grid.enabled") == 1);
# 2196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_gap = !(sizeof("layout.css.grid.enabled") == 1);





const bool SERVO_PREF_ENABLED_grid_row = !(sizeof("layout.css.grid.enabled") == 1);





const bool SERVO_PREF_ENABLED_grid_row_end = !(sizeof("layout.css.grid.enabled") == 1);
# 2218 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_row_gap = !(sizeof("layout.css.grid.enabled") == 1);
# 2230 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_row_start = !(sizeof("layout.css.grid.enabled") == 1);
# 2240 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_template = !(sizeof("layout.css.grid.enabled") == 1);





const bool SERVO_PREF_ENABLED_grid_template_areas = !(sizeof("layout.css.grid.enabled") == 1);
# 2257 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_template_columns = !(sizeof("layout.css.grid.enabled") == 1);
# 2270 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_grid_template_rows = !(sizeof("layout.css.grid.enabled") == 1);
# 2283 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_height = !(sizeof("") == 1);
# 2297 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_hyphens = !(sizeof("") == 1);
# 2307 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_initial_letter = !(sizeof("layout.css.initial-letter.enabled") == 1);
# 2318 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_image_orientation = !(sizeof("layout.css.image-orientation.enabled") == 1);
# 2329 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_image_region = !(sizeof("") == 1);
# 2339 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_image_rendering = !(sizeof("") == 1);
# 2349 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_ime_mode = !(sizeof("") == 1);
# 2359 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_inline_size = !(sizeof("") == 1);
# 2376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_isolation = !(sizeof("layout.css.isolation.enabled") == 1);
# 2387 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_justify_content = !(sizeof("") == 1);
# 2397 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_justify_items = !(sizeof("") == 1);
# 2408 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_justify_self = !(sizeof("") == 1);
# 2420 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__x_lang = !(sizeof("") == 1);
# 2433 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_left = !(sizeof("") == 1);
# 2446 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_letter_spacing = !(sizeof("") == 1);
# 2459 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_lighting_color = !(sizeof("") == 1);
# 2469 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_line_height = !(sizeof("") == 1);
# 2483 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_list_style = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_list_style_image = !(sizeof("") == 1);
# 2500 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_list_style_position = !(sizeof("") == 1);
# 2510 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_list_style_type = !(sizeof("") == 1);
# 2521 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin = !(sizeof("") == 1);







const bool SERVO_PREF_ENABLED_margin_block_end = !(sizeof("") == 1);
# 2548 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin_block_start = !(sizeof("") == 1);
# 2566 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin_bottom = !(sizeof("") == 1);
# 2581 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin_inline_end = !(sizeof("") == 1);
# 2598 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin_inline_start = !(sizeof("") == 1);
# 2614 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin_left = !(sizeof("") == 1);
# 2629 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin_right = !(sizeof("") == 1);
# 2644 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_margin_top = !(sizeof("") == 1);
# 2659 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_marker = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_marker_end = !(sizeof("") == 1);
# 2675 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_marker_mid = !(sizeof("") == 1);
# 2685 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_marker_start = !(sizeof("") == 1);
# 2708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_mask_clip = !(sizeof("") == 1);
# 2725 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_composite = !(sizeof("") == 1);
# 2736 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_image = !(sizeof("") == 1);
# 2749 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_mode = !(sizeof("") == 1);
# 2760 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_origin = !(sizeof("") == 1);
# 2771 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_position = !(sizeof("") == 1);






const bool SERVO_PREF_ENABLED_mask_position_x = !(sizeof("") == 1);
# 2790 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_position_y = !(sizeof("") == 1);
# 2802 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_repeat = !(sizeof("") == 1);
# 2813 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_size = !(sizeof("") == 1);
# 2827 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mask_type = !(sizeof("") == 1);
# 2839 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_math_display = !(sizeof("") == 1);
# 2851 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_math_variant = !(sizeof("") == 1);
# 2864 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_max_block_size = !(sizeof("") == 1);
# 2882 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_max_height = !(sizeof("") == 1);
# 2895 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_max_inline_size = !(sizeof("") == 1);
# 2912 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_max_width = !(sizeof("") == 1);
# 2925 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_min_block_size = !(sizeof("") == 1);
# 2944 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_min_font_size_ratio = !(sizeof("") == 1);
# 2957 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_min_height = !(sizeof("") == 1);
# 2970 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_min_inline_size = !(sizeof("") == 1);
# 2987 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_min_width = !(sizeof("") == 1);
# 3000 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_mix_blend_mode = !(sizeof("layout.css.mix-blend-mode.enabled") == 1);
# 3011 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_object_fit = !(sizeof("") == 1);
# 3021 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_object_position = !(sizeof("") == 1);
# 3032 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_offset_block_end = !(sizeof("") == 1);
# 3049 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_offset_block_start = !(sizeof("") == 1);
# 3065 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_offset_inline_end = !(sizeof("") == 1);
# 3081 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_offset_inline_start = !(sizeof("") == 1);
# 3096 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_opacity = !(sizeof("") == 1);
# 3109 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_order = !(sizeof("") == 1);
# 3119 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_orient = !(sizeof("") == 1);
# 3129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_osx_font_smoothing = !(sizeof("layout.css.osx-font-smoothing.enabled") == 1);
# 3141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_outline = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_outline_color = !(sizeof("") == 1);
# 3158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_outline_offset = !(sizeof("") == 1);
# 3168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_outline_radius = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED__moz_outline_radius_bottomleft = !(sizeof("") == 1);
# 3186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_outline_radius_bottomright = !(sizeof("") == 1);
# 3198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_outline_radius_topleft = !(sizeof("") == 1);
# 3210 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_outline_radius_topright = !(sizeof("") == 1);
# 3222 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_outline_style = !(sizeof("") == 1);
# 3232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_outline_width = !(sizeof("") == 1);
# 3243 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_overflow = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_overflow_clip_box = !(sizeof("layout.css.overflow-clip-box.enabled") == 1);
# 3261 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_overflow_x = !(sizeof("") == 1);
# 3273 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_overflow_y = !(sizeof("") == 1);
# 3285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding = !(sizeof("") == 1);






const bool SERVO_PREF_ENABLED_padding_block_end = !(sizeof("") == 1);
# 3313 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding_block_start = !(sizeof("") == 1);
# 3333 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding_bottom = !(sizeof("") == 1);
# 3350 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding_inline_end = !(sizeof("") == 1);
# 3370 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding_inline_start = !(sizeof("") == 1);
# 3389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding_left = !(sizeof("") == 1);
# 3406 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding_right = !(sizeof("") == 1);
# 3423 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_padding_top = !(sizeof("") == 1);
# 3440 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_page_break_after = !(sizeof("") == 1);
# 3450 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_page_break_before = !(sizeof("") == 1);
# 3460 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_page_break_inside = !(sizeof("") == 1);
# 3470 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_paint_order = !(sizeof("svg.paint-order.enabled") == 1);
# 3480 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_perspective = !(sizeof("") == 1);
# 3493 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_perspective_origin = !(sizeof("") == 1);
# 3505 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_place_content = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_place_items = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_place_self = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_pointer_events = !(sizeof("") == 1);
# 3534 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_position = !(sizeof("") == 1);
# 3547 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_quotes = !(sizeof("") == 1);
# 3557 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_resize = !(sizeof("") == 1);
# 3571 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_right = !(sizeof("") == 1);
# 3584 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_ruby_align = !(sizeof("") == 1);
# 3594 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_ruby_position = !(sizeof("") == 1);
# 3606 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_script_level = !(sizeof("") == 1);
# 3624 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_script_min_size = !(sizeof("") == 1);
# 3635 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_script_size_multiplier = !(sizeof("") == 1);
# 3648 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_scroll_behavior = !(sizeof("layout.css.scroll-behavior.property-enabled") == 1);
# 3658 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_scroll_snap_coordinate = !(sizeof("layout.css.scroll-snap.enabled") == 1);
# 3671 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_scroll_snap_destination = !(sizeof("layout.css.scroll-snap.enabled") == 1);
# 3683 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_scroll_snap_points_x = !(sizeof("layout.css.scroll-snap.enabled") == 1);
# 3695 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_scroll_snap_points_y = !(sizeof("layout.css.scroll-snap.enabled") == 1);
# 3707 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_scroll_snap_type = !(sizeof("layout.css.scroll-snap.enabled") == 1);





const bool SERVO_PREF_ENABLED_scroll_snap_type_x = !(sizeof("layout.css.scroll-snap.enabled") == 1);
# 3723 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_scroll_snap_type_y = !(sizeof("layout.css.scroll-snap.enabled") == 1);
# 3733 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_shape_outside = !(sizeof("layout.css.shape-outside.enabled") == 1);
# 3745 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_shape_rendering = !(sizeof("") == 1);
# 3757 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__x_span = !(sizeof("") == 1);
# 3770 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_stack_sizing = !(sizeof("") == 1);
# 3780 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stop_color = !(sizeof("") == 1);
# 3790 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stop_opacity = !(sizeof("") == 1);
# 3800 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke = !(sizeof("") == 1);
# 3810 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke_dasharray = !(sizeof("") == 1);
# 3823 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke_dashoffset = !(sizeof("") == 1);
# 3834 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke_linecap = !(sizeof("") == 1);
# 3844 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke_linejoin = !(sizeof("") == 1);
# 3854 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke_miterlimit = !(sizeof("") == 1);
# 3865 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke_opacity = !(sizeof("") == 1);
# 3875 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_stroke_width = !(sizeof("") == 1);
# 3888 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__x_system_font = !(sizeof("") == 1);
# 3902 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_tab_size = !(sizeof("") == 1);
# 3913 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_table_layout = !(sizeof("") == 1);
# 3923 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_align = !(sizeof("") == 1);
# 3936 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_align_last = !(sizeof("") == 1);
# 3946 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_anchor = !(sizeof("") == 1);
# 3956 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_combine_upright = !(sizeof("layout.css.text-combine-upright.enabled") == 1);
# 3967 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_decoration = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_text_decoration_color = !(sizeof("") == 1);
# 3986 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_decoration_line = !(sizeof("") == 1);
# 3999 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_decoration_style = !(sizeof("") == 1);
# 4011 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_emphasis = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_text_emphasis_color = !(sizeof("") == 1);
# 4028 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_emphasis_position = !(sizeof("") == 1);
# 4039 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_emphasis_style = !(sizeof("") == 1);
# 4050 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__webkit_text_fill_color = !(sizeof("layout.css.prefixes.webkit") == 1);
# 4063 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_indent = !(sizeof("") == 1);
# 4075 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_justify = !(sizeof("layout.css.text-justify.enabled") == 1);
# 4086 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_orientation = !(sizeof("") == 1);
# 4096 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_overflow = !(sizeof("") == 1);
# 4108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_rendering = !(sizeof("") == 1);
# 4118 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_shadow = !(sizeof("") == 1);
# 4133 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_text_size_adjust = !(sizeof("") == 1);
# 4143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__webkit_text_stroke = !(sizeof("layout.css.prefixes.webkit") == 1);





const bool SERVO_PREF_ENABLED__webkit_text_stroke_color = !(sizeof("layout.css.prefixes.webkit") == 1);
# 4162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__webkit_text_stroke_width = !(sizeof("layout.css.prefixes.webkit") == 1);
# 4175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_text_transform = !(sizeof("") == 1);
# 4189 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__x_text_zoom = !(sizeof("") == 1);
# 4202 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_top = !(sizeof("") == 1);
# 4216 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_top_layer = !(sizeof("") == 1);
# 4229 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_touch_action = !(sizeof("layout.css.touch_action.enabled") == 1);
# 4240 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_transform = !(sizeof("") == 1);
# 4256 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_transform = !(sizeof("layout.css.prefixes.transforms") == 1);






const bool SERVO_PREF_ENABLED_transform_box = !(sizeof("svg.transform-box.enabled") == 1);
# 4273 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_transform_origin = !(sizeof("") == 1);
# 4285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_transform_style = !(sizeof("") == 1);
# 4297 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_transition = !(sizeof("") == 1);





const bool SERVO_PREF_ENABLED_transition_delay = !(sizeof("") == 1);
# 4314 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_transition_duration = !(sizeof("") == 1);
# 4325 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_transition_property = !(sizeof("") == 1);
# 4336 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_transition_timing_function = !(sizeof("") == 1);
# 4348 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_unicode_bidi = !(sizeof("") == 1);
# 4359 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_user_focus = !(sizeof("") == 1);
# 4369 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_user_input = !(sizeof("") == 1);
# 4379 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_user_modify = !(sizeof("") == 1);
# 4389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_user_select = !(sizeof("") == 1);
# 4399 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_vector_effect = !(sizeof("") == 1);
# 4412 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_vertical_align = !(sizeof("") == 1);
# 4426 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_visibility = !(sizeof("") == 1);
# 4436 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_white_space = !(sizeof("") == 1);
# 4448 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_width = !(sizeof("") == 1);
# 4462 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_will_change = !(sizeof("") == 1);
# 4473 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_window_dragging = !(sizeof("") == 1);
# 4484 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED__moz_window_shadow = !(sizeof("") == 1);
# 4497 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_word_break = !(sizeof("") == 1);
# 4507 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_word_spacing = !(sizeof("") == 1);
# 4521 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_overflow_wrap = !(sizeof("") == 1);
# 4531 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_writing_mode = !(sizeof("") == 1);
# 4541 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
const bool SERVO_PREF_ENABLED_z_index = !(sizeof("") == 1);
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoPropPrefList.h" 2




}
# 4 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontConstants.h" 1
# 50 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontConstants.h"
enum {
    eFeatureAlternates_historical,
    eFeatureAlternates_stylistic,
    eFeatureAlternates_styleset,
    eFeatureAlternates_character_variant,
    eFeatureAlternates_swash,
    eFeatureAlternates_ornaments,
    eFeatureAlternates_annotation,

    eFeatureAlternates_numFeatures
};
# 92 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontConstants.h"
enum {
    eFeatureEastAsian_jis78,
    eFeatureEastAsian_jis83,
    eFeatureEastAsian_jis90,
    eFeatureEastAsian_jis04,
    eFeatureEastAsian_simplified,
    eFeatureEastAsian_traditional,
    eFeatureEastAsian_full_width,
    eFeatureEastAsian_prop_width,
    eFeatureEastAsian_ruby,

    eFeatureEastAsian_numFeatures
};
# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontConstants.h"
enum {
    eFeatureLigatures_none,
    eFeatureLigatures_common,
    eFeatureLigatures_no_common,
    eFeatureLigatures_discretionary,
    eFeatureLigatures_no_discretionary,
    eFeatureLigatures_historical,
    eFeatureLigatures_no_historical,
    eFeatureLigatures_contextual,
    eFeatureLigatures_no_contextual,

    eFeatureLigatures_numFeatures
};
# 168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontConstants.h"
enum {
    eFeatureNumeric_lining,
    eFeatureNumeric_oldstyle,
    eFeatureNumeric_proportional,
    eFeatureNumeric_tabular,
    eFeatureNumeric_diagonal_fractions,
    eFeatureNumeric_stacked_fractions,
    eFeatureNumeric_slashedzero,
    eFeatureNumeric_ordinal,

    eFeatureNumeric_numFeatures
};
# 226 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontConstants.h"
enum eFontPrefLang {


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontPrefLangList.h" 1







eFontPrefLang_Western,
eFontPrefLang_Japanese,
eFontPrefLang_ChineseTW,
eFontPrefLang_ChineseCN,
eFontPrefLang_ChineseHK,
eFontPrefLang_Korean,
eFontPrefLang_Cyrillic,
eFontPrefLang_Greek,
eFontPrefLang_Thai,
eFontPrefLang_Hebrew,
eFontPrefLang_Arabic,
eFontPrefLang_Devanagari,
eFontPrefLang_Tamil,
eFontPrefLang_Armenian,
eFontPrefLang_Bengali,
eFontPrefLang_Canadian,
eFontPrefLang_Ethiopic,
eFontPrefLang_Georgian,
eFontPrefLang_Gujarati,
eFontPrefLang_Gurmukhi,
eFontPrefLang_Khmer,
eFontPrefLang_Malayalam,
eFontPrefLang_Mathematics,
eFontPrefLang_Oriya,
eFontPrefLang_Telugu,
eFontPrefLang_Kannada,
eFontPrefLang_Sinhala,
eFontPrefLang_Tibetan,
eFontPrefLang_Others
# 229 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontConstants.h" 2


    , eFontPrefLang_CJKSet
    , eFontPrefLang_First = eFontPrefLang_Western
    , eFontPrefLang_Last = eFontPrefLang_Others
    , eFontPrefLang_Count = (eFontPrefLang_Last - eFontPrefLang_First + 1)
};
# 5 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThemeConstants.h" 1
# 6 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 1





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 1
# 7 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h"
namespace mozilla {
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h"
template<typename T>
class DebugOnly
{
public:
# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DebugOnly.h"
  DebugOnly() { }
               DebugOnly(const T&) { }
  DebugOnly(const DebugOnly&) { }
  DebugOnly& operator=(const T&) { return *this; }
  void operator++(int) { }
  void operator--(int) { }
  DebugOnly& operator+=(const T&) { return *this; }
  DebugOnly& operator-=(const T&) { return *this; }
  DebugOnly& operator&=(const T&) { return *this; }
  DebugOnly& operator|=(const T&) { return *this; }
  DebugOnly& operator^=(const T&) { return *this; }







  ~DebugOnly() {}
};

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/GuardObjects.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" 1
# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MemoryReporting.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MemoryReporting.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MemoryReporting.h" 2



namespace mozilla {





typedef size_t (*MallocSizeOf)(const void* p);

}



typedef size_t (*MozMallocSizeOf)(const void* p);
# 70 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h"
namespace mozilla {

struct unused_t;

}
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h"
template<class T>
struct already_AddRefed
{
# 68 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h"
  already_AddRefed() : mRawPtr(nullptr) {}



  typedef void (already_AddRefed::* MatchNullptr)(double, float);
               already_AddRefed(MatchNullptr aRawPtr) : mRawPtr(nullptr) {}

  explicit already_AddRefed(T* aRawPtr) : mRawPtr(aRawPtr) {}


  already_AddRefed(const already_AddRefed<T>& aOther) = delete;
  already_AddRefed<T>& operator=(const already_AddRefed<T>& aOther) = delete;

  already_AddRefed(already_AddRefed<T>&& aOther) : mRawPtr(aOther.take()) {}

  already_AddRefed<T>& operator=(already_AddRefed<T>&& aOther)
  {
    mRawPtr = aOther.take();
    return *this;
  }
# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h"
  template <typename U>
               already_AddRefed(already_AddRefed<U>&& aOther) : mRawPtr(aOther.take()) {}

  ~already_AddRefed() { do { } while (0); }





  friend void operator<<(const mozilla::unused_t& aUnused,
                         const already_AddRefed<T>& aRhs)
  {
    auto mutableAlreadyAddRefed = const_cast<already_AddRefed<T>*>(&aRhs);
    aUnused << mutableAlreadyAddRefed->take();
  }

  __attribute__ ((warn_unused_result)) T* take()
  {
    T* rawPtr = mRawPtr;
    mRawPtr = nullptr;
    return rawPtr;
  }
# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AlreadyAddRefed.h"
  template<class U>
  already_AddRefed<U> downcast()
  {
    U* tmp = static_cast<U*>(mRawPtr);
    mRawPtr = nullptr;
    return already_AddRefed<U>(tmp);
  }

private:
  T* mRawPtr;
};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h" 2







class nsCOMPtr_helper;

namespace mozilla {
template<class T> class OwningNonNull;
template<class T> class StaticRefPtr;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h"
template<class U>
struct RefPtrTraits
{
  static void AddRef(U* aPtr) {
    aPtr->AddRef();
  }
  static void Release(U* aPtr) {
    aPtr->Release();
  }
};

}

template <class T>
class RefPtr
{
private:
  void
  assign_with_AddRef(T* aRawPtr)
  {
    if (aRawPtr) {
      ConstRemovingRefPtrTraits<T>::AddRef(aRawPtr);
    }
    assign_assuming_AddRef(aRawPtr);
  }

  void
  assign_assuming_AddRef(T* aNewPtr)
  {
    T* oldPtr = mRawPtr;
    mRawPtr = aNewPtr;
    if (oldPtr) {
      ConstRemovingRefPtrTraits<T>::Release(oldPtr);
    }
  }

private:
  T* mRawPtr;

public:
  typedef T element_type;

  ~RefPtr()
  {
    if (mRawPtr) {
      ConstRemovingRefPtrTraits<T>::Release(mRawPtr);
    }
  }



  RefPtr()
    : mRawPtr(nullptr)

  {
  }

  RefPtr(const RefPtr<T>& aSmartPtr)
    : mRawPtr(aSmartPtr.mRawPtr)

  {
    if (mRawPtr) {
      ConstRemovingRefPtrTraits<T>::AddRef(mRawPtr);
    }
  }

  RefPtr(RefPtr<T>&& aRefPtr)
    : mRawPtr(aRefPtr.mRawPtr)
  {
    aRefPtr.mRawPtr = nullptr;
  }



               RefPtr(T* aRawPtr)
    : mRawPtr(aRawPtr)
  {
    if (mRawPtr) {
      ConstRemovingRefPtrTraits<T>::AddRef(mRawPtr);
    }
  }

               RefPtr(decltype(nullptr))
    : mRawPtr(nullptr)
  {
  }

  template <typename I>
               RefPtr(already_AddRefed<I>& aSmartPtr)
    : mRawPtr(aSmartPtr.take())

  {
  }

  template <typename I>
               RefPtr(already_AddRefed<I>&& aSmartPtr)
    : mRawPtr(aSmartPtr.take())

  {
  }

  template <typename I>
               RefPtr(const RefPtr<I>& aSmartPtr)
    : mRawPtr(aSmartPtr.get())

  {
    if (mRawPtr) {
      ConstRemovingRefPtrTraits<T>::AddRef(mRawPtr);
    }
  }

  template <typename I>
               RefPtr(RefPtr<I>&& aSmartPtr)
    : mRawPtr(aSmartPtr.forget().take())

  {
  }

               RefPtr(const nsCOMPtr_helper& aHelper);


  template<class U>
               RefPtr(const mozilla::OwningNonNull<U>& aOther);


  template<class U>
               RefPtr(const mozilla::StaticRefPtr<U>& aOther);



  RefPtr<T>&
  operator=(decltype(nullptr))
  {
    assign_assuming_AddRef(nullptr);
    return *this;
  }

  RefPtr<T>&
  operator=(const RefPtr<T>& aRhs)

  {
    assign_with_AddRef(aRhs.mRawPtr);
    return *this;
  }

  template <typename I>
  RefPtr<T>&
  operator=(const RefPtr<I>& aRhs)

  {
    assign_with_AddRef(aRhs.get());
    return *this;
  }

  RefPtr<T>&
  operator=(T* aRhs)

  {
    assign_with_AddRef(aRhs);
    return *this;
  }

  template <typename I>
  RefPtr<T>&
  operator=(already_AddRefed<I>& aRhs)

  {
    assign_assuming_AddRef(aRhs.take());
    return *this;
  }

  template <typename I>
  RefPtr<T>&
  operator=(already_AddRefed<I> && aRhs)

  {
    assign_assuming_AddRef(aRhs.take());
    return *this;
  }

  RefPtr<T>& operator=(const nsCOMPtr_helper& aHelper);

  RefPtr<T>&
  operator=(RefPtr<T> && aRefPtr)
  {
    assign_assuming_AddRef(aRefPtr.mRawPtr);
    aRefPtr.mRawPtr = nullptr;
    return *this;
  }


  template<class U>
  RefPtr<T>&
  operator=(const mozilla::OwningNonNull<U>& aOther);


  template<class U>
  RefPtr<T>&
  operator=(const mozilla::StaticRefPtr<U>& aOther);



  void
  swap(RefPtr<T>& aRhs)

  {
    T* temp = aRhs.mRawPtr;
    aRhs.mRawPtr = mRawPtr;
    mRawPtr = temp;
  }

  void
  swap(T*& aRhs)

  {
    T* temp = aRhs;
    aRhs = mRawPtr;
    mRawPtr = temp;
  }

  already_AddRefed<T>

  forget()


  {
    T* temp = nullptr;
    swap(temp);
    return already_AddRefed<T>(temp);
  }

  template <typename I>
  void
  forget(I** aRhs)




  {
    do { } while (0);
    *aRhs = mRawPtr;
    mRawPtr = nullptr;
  }

  T*
  get() const




  {
    return const_cast<T*>(mRawPtr);
  }

  operator T*() const &
# 296 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h"
  {
    return get();
  }




  operator T*() const && = delete;




  explicit operator bool() const { return !!mRawPtr; }
  bool operator!() const { return !mRawPtr; }

  T*
  operator->() const
  {
    do { } while (0);

    return get();
  }

  template <typename R, typename... Args>
  class Proxy
  {
    typedef R (T::*member_function)(Args...);
    T* mRawPtr;
    member_function mFunction;
  public:
    Proxy(T* aRawPtr, member_function aFunction)
      : mRawPtr(aRawPtr),
        mFunction(aFunction)
    {
    }
    template<typename... ActualArgs>
    R operator()(ActualArgs&&... aArgs)
    {
      return ((*mRawPtr).*mFunction)(mozilla::Forward<ActualArgs>(aArgs)...);
    }
  };

  template <typename R, typename... Args>
  Proxy<R, Args...> operator->*(R (T::*aFptr)(Args...)) const
  {
    do { } while (0);

    return Proxy<R, Args...>(get(), aFptr);
  }

  RefPtr<T>*
  get_address()


  {
    return this;
  }

  const RefPtr<T>*
  get_address() const


  {
    return this;
  }

public:
  T&
  operator*() const
  {
    do { } while (0);

    return *get();
  }

  T**
  StartAssignment()
  {
    assign_assuming_AddRef(nullptr);
    return reinterpret_cast<T**>(&mRawPtr);
  }
private:
# 388 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h"
  template<class U>
  struct ConstRemovingRefPtrTraits
  {
    static void AddRef(U* aPtr) {
      mozilla::RefPtrTraits<U>::AddRef(aPtr);
    }
    static void Release(U* aPtr) {
      mozilla::RefPtrTraits<U>::Release(aPtr);
    }
  };
  template<class U>
  struct ConstRemovingRefPtrTraits<const U>
  {
    static void AddRef(const U* aPtr) {
      mozilla::RefPtrTraits<U>::AddRef(const_cast<U*>(aPtr));
    }
    static void Release(const U* aPtr) {
      mozilla::RefPtrTraits<U>::Release(const_cast<U*>(aPtr));
    }
  };
};

class nsCycleCollectionTraversalCallback;
template <typename T>
void
CycleCollectionNoteChild(nsCycleCollectionTraversalCallback& aCallback,
                         T* aChild, const char* aName, uint32_t aFlags);

template <typename T>
inline void
ImplCycleCollectionUnlink(RefPtr<T>& aField)
{
  aField = nullptr;
}

template <typename T>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            RefPtr<T>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  CycleCollectionNoteChild(aCallback, aField.get(), aName, aFlags);
}

template <class T>
inline RefPtr<T>*
address_of(RefPtr<T>& aPtr)
{
  return aPtr.get_address();
}

template <class T>
inline const RefPtr<T>*
address_of(const RefPtr<T>& aPtr)
{
  return aPtr.get_address();
}

template <class T>
class RefPtrGetterAddRefs
# 466 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h"
{
public:
  explicit
  RefPtrGetterAddRefs(RefPtr<T>& aSmartPtr)
    : mTargetSmartPtr(aSmartPtr)
  {

  }

  operator void**()
  {
    return reinterpret_cast<void**>(mTargetSmartPtr.StartAssignment());
  }

  operator T**()
  {
    return mTargetSmartPtr.StartAssignment();
  }

  T*&
  operator*()
  {
    return *(mTargetSmartPtr.StartAssignment());
  }

private:
  RefPtr<T>& mTargetSmartPtr;
};

template <class T>
inline RefPtrGetterAddRefs<T>
getter_AddRefs(RefPtr<T>& aSmartPtr)




{
  return RefPtrGetterAddRefs<T>(aSmartPtr);
}




template <class T, class U>
inline bool
operator==(const RefPtr<T>& aLhs, const RefPtr<U>& aRhs)
{
  return static_cast<const T*>(aLhs.get()) == static_cast<const U*>(aRhs.get());
}


template <class T, class U>
inline bool
operator!=(const RefPtr<T>& aLhs, const RefPtr<U>& aRhs)
{
  return static_cast<const T*>(aLhs.get()) != static_cast<const U*>(aRhs.get());
}




template <class T, class U>
inline bool
operator==(const RefPtr<T>& aLhs, const U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) == static_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator==(const U* aLhs, const RefPtr<T>& aRhs)
{
  return static_cast<const U*>(aLhs) == static_cast<const T*>(aRhs.get());
}

template <class T, class U>
inline bool
operator!=(const RefPtr<T>& aLhs, const U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) != static_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator!=(const U* aLhs, const RefPtr<T>& aRhs)
{
  return static_cast<const U*>(aLhs) != static_cast<const T*>(aRhs.get());
}

template <class T, class U>
inline bool
operator==(const RefPtr<T>& aLhs, U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) == const_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator==(U* aLhs, const RefPtr<T>& aRhs)
{
  return const_cast<const U*>(aLhs) == static_cast<const T*>(aRhs.get());
}

template <class T, class U>
inline bool
operator!=(const RefPtr<T>& aLhs, U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) != const_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator!=(U* aLhs, const RefPtr<T>& aRhs)
{
  return const_cast<const U*>(aLhs) != static_cast<const T*>(aRhs.get());
}



template <class T>
inline bool
operator==(const RefPtr<T>& aLhs, decltype(nullptr))
{
  return aLhs.get() == nullptr;
}

template <class T>
inline bool
operator==(decltype(nullptr), const RefPtr<T>& aRhs)
{
  return nullptr == aRhs.get();
}

template <class T>
inline bool
operator!=(const RefPtr<T>& aLhs, decltype(nullptr))
{
  return aLhs.get() != nullptr;
}

template <class T>
inline bool
operator!=(decltype(nullptr), const RefPtr<T>& aRhs)
{
  return nullptr != aRhs.get();
}



template <class T>
inline already_AddRefed<T>
do_AddRef(T* aObj)
{
  RefPtr<T> ref(aObj);
  return ref.forget();
}

template <class T>
inline already_AddRefed<T>
do_AddRef(const RefPtr<T>& aObj)
{
  RefPtr<T> ref(aObj);
  return ref.forget();
}

namespace mozilla {
# 642 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefPtr.h"
template<typename T, typename... Args>
already_AddRefed<T>
MakeAndAddRef(Args&&... aArgs)
{
  RefPtr<T> p(new T(Forward<Args>(aArgs)...));
  return p.forget();
}

}
# 72 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h" 2



namespace mozilla {

template<typename T>
class LinkedListElement;

namespace detail {






template<typename T>
struct LinkedListElementTraits
{
  typedef T* RawType;
  typedef const T* ConstRawType;
  typedef T* ClientType;
  typedef const T* ConstClientType;






  static void enterList(LinkedListElement<T>* elt) {}
  static void exitList(LinkedListElement<T>* elt) {}
};

template<typename T>
struct LinkedListElementTraits<RefPtr<T>>
{
  typedef T* RawType;
  typedef const T* ConstRawType;
  typedef RefPtr<T> ClientType;
  typedef RefPtr<const T> ConstClientType;

  static void enterList(LinkedListElement<RefPtr<T>>* elt) { elt->asT()->AddRef(); }
  static void exitList(LinkedListElement<RefPtr<T>>* elt) { elt->asT()->Release(); }
};

}

template<typename T>
class LinkedList;

template<typename T>
class LinkedListElement
{
  typedef typename detail::LinkedListElementTraits<T> Traits;
  typedef typename Traits::RawType RawType;
  typedef typename Traits::ConstRawType ConstRawType;
  typedef typename Traits::ClientType ClientType;
  typedef typename Traits::ConstClientType ConstClientType;
# 164 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h"
private:
  LinkedListElement* mNext;
  LinkedListElement* mPrev;
  const bool mIsSentinel;

public:
  LinkedListElement()
    : mNext(this),
      mPrev(this),
      mIsSentinel(false)
  { }





  LinkedListElement(LinkedListElement<T>&& aOther)
    : mIsSentinel(aOther.mIsSentinel)
  {
    adjustLinkForMove(Move(aOther));
  }

  LinkedListElement& operator=(LinkedListElement<T>&& aOther)
  {
    do { } while (0);
    do { } while (0);

    adjustLinkForMove(Move(aOther));
    return *this;
  }

  ~LinkedListElement()
  {
    if (!mIsSentinel && isInList()) {
      remove();
    }
  }





  RawType getNext() { return mNext->asT(); }
  ConstRawType getNext() const { return mNext->asT(); }





  RawType getPrevious() { return mPrev->asT(); }
  ConstRawType getPrevious() const { return mPrev->asT(); }





  void setNext(RawType aElem)
  {
    do { } while (0);
    setNextUnsafe(aElem);
  }






  void setPrevious(RawType aElem)
  {
    do { } while (0);
    setPreviousUnsafe(aElem);
  }





  void remove()
  {
    do { } while (0);

    mPrev->mNext = mNext;
    mNext->mPrev = mPrev;
    mNext = this;
    mPrev = this;

    Traits::exitList(this);
  }






  ClientType removeAndGetNext()
  {
    ClientType r = getNext();
    remove();
    return r;
  }






  ClientType removeAndGetPrevious()
  {
    ClientType r = getPrevious();
    remove();
    return r;
  }





  void removeFrom(const LinkedList<T>& aList)
  {
    aList.assertContains(asT());
    remove();
  }




  bool isInList() const
  {
    do { } while (0);
    return mNext != this;
  }

private:
  friend class LinkedList<T>;
  friend struct detail::LinkedListElementTraits<T>;

  enum class NodeKind {
    Normal,
    Sentinel
  };

  explicit LinkedListElement(NodeKind nodeKind)
    : mNext(this),
      mPrev(this),
      mIsSentinel(nodeKind == NodeKind::Sentinel)
  { }





  RawType asT()
  {
    return mIsSentinel ? nullptr : static_cast<RawType>(this);
  }
  ConstRawType asT() const
  {
    return mIsSentinel ? nullptr : static_cast<ConstRawType>(this);
  }





  void setNextUnsafe(RawType aElem)
  {
    LinkedListElement *listElem = static_cast<LinkedListElement*>(aElem);
    do { } while (0);

    listElem->mNext = this->mNext;
    listElem->mPrev = this;
    this->mNext->mPrev = listElem;
    this->mNext = listElem;

    Traits::enterList(aElem);
  }





  void setPreviousUnsafe(RawType aElem)
  {
    LinkedListElement<T>* listElem = static_cast<LinkedListElement<T>*>(aElem);
    do { } while (0);

    listElem->mNext = this;
    listElem->mPrev = this->mPrev;
    this->mPrev->mNext = listElem;
    this->mPrev = listElem;

    Traits::enterList(aElem);
  }





  void adjustLinkForMove(LinkedListElement<T>&& aOther)
  {
    if (!aOther.isInList()) {
      mNext = this;
      mPrev = this;
      return;
    }

    if (!mIsSentinel) {
      Traits::enterList(this);
    }

    do { } while (0);
    do { } while (0);





    mNext = aOther.mNext;
    mPrev = aOther.mPrev;

    mNext->mPrev = this;
    mPrev->mNext = this;





    aOther.mNext = &aOther;
    aOther.mPrev = &aOther;

    if (!mIsSentinel) {
      Traits::exitList(&aOther);
    }
  }

  LinkedListElement& operator=(const LinkedListElement<T>& aOther) = delete;
  LinkedListElement(const LinkedListElement<T>& aOther) = delete;
};

template<typename T>
class LinkedList
{
private:
  typedef typename detail::LinkedListElementTraits<T> Traits;
  typedef typename Traits::RawType RawType;
  typedef typename Traits::ConstRawType ConstRawType;
  typedef typename Traits::ClientType ClientType;
  typedef typename Traits::ConstClientType ConstClientType;

  LinkedListElement<T> sentinel;

public:
  class Iterator {
    RawType mCurrent;

  public:
    explicit Iterator(RawType aCurrent) : mCurrent(aCurrent) {}

    RawType operator *() const {
      return mCurrent;
    }

    const Iterator& operator++() {
      mCurrent = mCurrent->getNext();
      return *this;
    }

    bool operator!=(Iterator& aOther) const {
      return mCurrent != aOther.mCurrent;
    }
  };

  LinkedList() : sentinel(LinkedListElement<T>::NodeKind::Sentinel) { }

  LinkedList(LinkedList<T>&& aOther)
    : sentinel(mozilla::Move(aOther.sentinel))
  { }

  LinkedList& operator=(LinkedList<T>&& aOther)
  {
    do { } while (0);
    sentinel = mozilla::Move(aOther.sentinel);
    return *this;
  }

  ~LinkedList() {
    do { } while (0);



  }




  void insertFront(RawType aElem)
  {

    sentinel.setNextUnsafe(aElem);
  }




  void insertBack(RawType aElem)
  {
    sentinel.setPreviousUnsafe(aElem);
  }




  RawType getFirst() { return sentinel.getNext(); }
  ConstRawType getFirst() const { return sentinel.getNext(); }




  RawType getLast() { return sentinel.getPrevious(); }
  ConstRawType getLast() const { return sentinel.getPrevious(); }





  ClientType popFirst()
  {
    ClientType ret = sentinel.getNext();
    if (ret) {
      static_cast<LinkedListElement<T>*>(RawType(ret))->remove();
    }
    return ret;
  }





  ClientType popLast()
  {
    ClientType ret = sentinel.getPrevious();
    if (ret) {
      static_cast<LinkedListElement<T>*>(RawType(ret))->remove();
    }
    return ret;
  }




  bool isEmpty() const
  {
    return !sentinel.isInList();
  }







  void clear()
  {
    while (popFirst()) {
      continue;
    }
  }






  Iterator begin() {
    return Iterator(getFirst());
  }
  Iterator end() {
    return Iterator(nullptr);
  }







  size_t sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
  {
    size_t n = 0;
    for (const T* t = getFirst(); t; t = t->getNext()) {
      n += aMallocSizeOf(t);
    }
    return n;
  }




  size_t sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf);
  }





  void debugAssertIsSane() const
  {
# 622 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h"
  }

private:
  friend class LinkedListElement<T>;

  void assertContains(const RawType aValue) const
  {
# 637 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LinkedList.h"
  }

  LinkedList& operator=(const LinkedList<T>& aOther) = delete;
  LinkedList(const LinkedList<T>& aOther) = delete;
};

template <typename T>
class AutoCleanLinkedList : public LinkedList<T>
{
public:
  ~AutoCleanLinkedList()
  {
    while (T* element = this->popFirst()) {
      delete element;
    }
  }
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumeratedArray.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumeratedArray.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Array.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Array.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReverseIterator.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReverseIterator.h"
namespace mozilla {

template<typename IteratorT>
class ReverseIterator
{
public:
  template<typename Iterator>
  explicit ReverseIterator(Iterator aIter)
    : mCurrent(aIter) { }

  template<typename Iterator>
               ReverseIterator(const ReverseIterator<Iterator>& aOther)
    : mCurrent(aOther.mCurrent) { }

  decltype(*DeclVal<IteratorT>()) operator*() const
  {
    IteratorT tmp = mCurrent;
    return *--tmp;
  }



  ReverseIterator& operator++() { --mCurrent; return *this; }
  ReverseIterator& operator--() { ++mCurrent; return *this; }
  ReverseIterator operator++(int) { auto ret = *this; mCurrent--; return ret; }
  ReverseIterator operator--(int) { auto ret = *this; mCurrent++; return ret; }



  template<typename Iterator1, typename Iterator2>
  friend bool operator==(const ReverseIterator<Iterator1>& aIter1,
                         const ReverseIterator<Iterator2>& aIter2);
  template<typename Iterator1, typename Iterator2>
  friend bool operator!=(const ReverseIterator<Iterator1>& aIter1,
                         const ReverseIterator<Iterator2>& aIter2);
  template<typename Iterator1, typename Iterator2>
  friend bool operator<(const ReverseIterator<Iterator1>& aIter1,
                        const ReverseIterator<Iterator2>& aIter2);
  template<typename Iterator1, typename Iterator2>
  friend bool operator<=(const ReverseIterator<Iterator1>& aIter1,
                         const ReverseIterator<Iterator2>& aIter2);
  template<typename Iterator1, typename Iterator2>
  friend bool operator>(const ReverseIterator<Iterator1>& aIter1,
                        const ReverseIterator<Iterator2>& aIter2);
  template<typename Iterator1, typename Iterator2>
  friend bool operator>=(const ReverseIterator<Iterator1>& aIter1,
                         const ReverseIterator<Iterator2>& aIter2);

private:
  IteratorT mCurrent;
};

template<typename Iterator1, typename Iterator2>
bool
operator==(const ReverseIterator<Iterator1>& aIter1,
           const ReverseIterator<Iterator2>& aIter2)
{
  return aIter1.mCurrent == aIter2.mCurrent;
}

template<typename Iterator1, typename Iterator2>
bool
operator!=(const ReverseIterator<Iterator1>& aIter1,
           const ReverseIterator<Iterator2>& aIter2)
{
  return aIter1.mCurrent != aIter2.mCurrent;
}

template<typename Iterator1, typename Iterator2>
bool
operator<(const ReverseIterator<Iterator1>& aIter1,
          const ReverseIterator<Iterator2>& aIter2)
{
  return aIter1.mCurrent > aIter2.mCurrent;
}

template<typename Iterator1, typename Iterator2>
bool
operator<=(const ReverseIterator<Iterator1>& aIter1,
           const ReverseIterator<Iterator2>& aIter2)
{
  return aIter1.mCurrent >= aIter2.mCurrent;
}

template<typename Iterator1, typename Iterator2>
bool
operator>(const ReverseIterator<Iterator1>& aIter1,
          const ReverseIterator<Iterator2>& aIter2)
{
  return aIter1.mCurrent < aIter2.mCurrent;
}

template<typename Iterator1, typename Iterator2>
bool
operator>=(const ReverseIterator<Iterator1>& aIter1,
           const ReverseIterator<Iterator2>& aIter2)
{
  return aIter1.mCurrent <= aIter2.mCurrent;
}

namespace detail {

template<typename IteratorT>
class IteratorRange
{
public:
  typedef IteratorT iterator;
  typedef IteratorT const_iterator;
  typedef ReverseIterator<IteratorT> reverse_iterator;
  typedef ReverseIterator<IteratorT> const_reverse_iterator;

  template<typename Iterator1, typename Iterator2>
               IteratorRange(Iterator1 aIterBegin, Iterator2 aIterEnd)
    : mIterBegin(aIterBegin), mIterEnd(aIterEnd) { }

  template<typename Iterator>
               IteratorRange(const IteratorRange<Iterator>& aOther)
    : mIterBegin(aOther.mIterBegin), mIterEnd(aOther.mIterEnd) { }

  iterator begin() const { return mIterBegin; }
  const_iterator cbegin() const { return begin(); }
  iterator end() const { return mIterEnd; }
  const_iterator cend() const { return end(); }
  reverse_iterator rbegin() const { return reverse_iterator(mIterEnd); }
  const_reverse_iterator crbegin() const { return rbegin(); }
  reverse_iterator rend() const { return reverse_iterator(mIterBegin); }
  const_reverse_iterator crend() const { return rend(); }

private:
  IteratorT mIterBegin;
  IteratorT mIterEnd;
};

}

template<typename Range>
detail::IteratorRange<typename Range::reverse_iterator>
Reversed(Range& aRange)
{
  return {aRange.rbegin(), aRange.rend()};
}

template<typename Range>
detail::IteratorRange<typename Range::const_reverse_iterator>
Reversed(const Range& aRange)
{
  return {aRange.rbegin(), aRange.rend()};
}

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Array.h" 2

# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Array.h" 2

namespace mozilla {

template<typename T, size_t Length>
class Array
{
  T mArr[Length];

public:
  Array() {}

  template <typename... Args>
               Array(Args&&... aArgs)
    : mArr{mozilla::Forward<Args>(aArgs)...}
  {
    static_assert(sizeof...(aArgs) == Length,
                  "The number of arguments should be equal to the template parameter Length");
  }

  T& operator[](size_t aIndex)
  {
    do { } while (0);
    return mArr[aIndex];
  }

  const T& operator[](size_t aIndex) const
  {
    do { } while (0);
    return mArr[aIndex];
  }

  bool operator==(const Array<T, Length>& aOther) const
  {
    for (size_t i = 0; i < Length; i++) {
      if (mArr[i] != aOther[i]) {
        return false;
      }
    }
    return true;
  }

  typedef T* iterator;
  typedef const T* const_iterator;
  typedef ReverseIterator<T*> reverse_iterator;
  typedef ReverseIterator<const T*> const_reverse_iterator;


  iterator begin() { return mArr; }
  const_iterator begin() const { return mArr; }
  const_iterator cbegin() const { return begin(); }
  iterator end() { return mArr + Length; }
  const_iterator end() const { return mArr + Length; }
  const_iterator cend() const { return end(); }


  reverse_iterator rbegin() { return reverse_iterator(end()); }
  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
  const_reverse_iterator crbegin() const { return rbegin(); }
  reverse_iterator rend() { return reverse_iterator(begin()); }
  const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
  const_reverse_iterator crend() const { return rend(); }
};

template<typename T>
class Array<T, 0>
{
public:
  T& operator[](size_t aIndex)
  {
    do { AnnotateMozCrashReason("MOZ_CRASH(" "indexing into zero-length array" ")"); do { *((volatile int*) __null) = 87; ::abort(); } while (0); } while (0);
  }

  const T& operator[](size_t aIndex) const
  {
    do { AnnotateMozCrashReason("MOZ_CRASH(" "indexing into zero-length array" ")"); do { *((volatile int*) __null) = 92; ::abort(); } while (0); } while (0);
  }
};

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumeratedArray.h" 2


namespace mozilla {
# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumeratedArray.h"
template<typename IndexType,
         IndexType SizeAsEnumValue,
         typename ValueType>
class EnumeratedArray
{
public:
  static const size_t kSize = size_t(SizeAsEnumValue);

private:
  typedef Array<ValueType, kSize> ArrayType;

  ArrayType mArray;

public:
  EnumeratedArray() {}

  template <typename... Args>
               EnumeratedArray(Args&&... aArgs)
    : mArray{mozilla::Forward<Args>(aArgs)...}
  {}

  explicit EnumeratedArray(const EnumeratedArray& aOther)
  {
    for (size_t i = 0; i < kSize; i++) {
      mArray[i] = aOther.mArray[i];
    }
  }

  EnumeratedArray(EnumeratedArray&& aOther)
  {
    for (size_t i = 0; i < kSize; i++) {
      mArray[i] = Move(aOther.mArray[i]);
    }
  }

  ValueType& operator[](IndexType aIndex)
  {
    return mArray[size_t(aIndex)];
  }

  const ValueType& operator[](IndexType aIndex) const
  {
    return mArray[size_t(aIndex)];
  }

  typedef typename ArrayType::iterator iterator;
  typedef typename ArrayType::const_iterator const_iterator;
  typedef typename ArrayType::reverse_iterator reverse_iterator;
  typedef typename ArrayType::const_reverse_iterator const_reverse_iterator;


  iterator begin() { return mArray.begin(); }
  const_iterator begin() const { return mArray.begin(); }
  const_iterator cbegin() const { return mArray.cbegin(); }
  iterator end() { return mArray.end(); }
  const_iterator end() const { return mArray.end(); }
  const_iterator cend() const { return mArray.cend(); }


  reverse_iterator rbegin() { return mArray.rbegin(); }
  const_reverse_iterator rbegin() const { return mArray.rbegin(); }
  const_reverse_iterator crbegin() const { return mArray.crbegin(); }
  reverse_iterator rend() { return mArray.rend(); }
  const_reverse_iterator rend() const { return mArray.rend(); }
  const_reverse_iterator crend() const { return mArray.crend(); }
};

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h" 2








namespace mozilla {
# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h"
template<class T>
__attribute__((always_inline)) inline size_t
PointerRangeSize(T* aBegin, T* aEnd)
{
  do { } while (0);
  return (size_t(aEnd) - size_t(aBegin)) / sizeof(T);
}







template<typename T, size_t N>
constexpr size_t
ArrayLength(T (&aArr)[N])
{
  return N;
}

template<typename T, size_t N>
constexpr size_t
ArrayLength(const Array<T, N>& aArr)
{
  return N;
}

template<typename E, E N, typename T>
constexpr size_t
ArrayLength(const EnumeratedArray<E, N, T>& aArr)
{
  return size_t(N);
}






template<typename T, size_t N>
constexpr T*
ArrayEnd(T (&aArr)[N])
{
  return aArr + ArrayLength(aArr);
}

template<typename T, size_t N>
constexpr T*
ArrayEnd(Array<T, N>& aArr)
{
  return &aArr[0] + ArrayLength(aArr);
}

template<typename T, size_t N>
constexpr const T*
ArrayEnd(const Array<T, N>& aArr)
{
  return &aArr[0] + ArrayLength(aArr);
}

namespace detail {

template<typename AlignType, typename Pointee,
         typename = EnableIf<!IsVoid<AlignType>::value>>
struct AlignedChecker
{
  static void
  test(const Pointee* aPtr)
  {
    do { } while (0);

  }
};

template<typename AlignType, typename Pointee>
struct AlignedChecker<AlignType, Pointee>
{
  static void
  test(const Pointee* aPtr)
  {
  }
};

}
# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayUtils.h"
template<typename T, typename U>
inline typename EnableIf<IsSame<T, U>::value ||
                         IsBaseOf<T, U>::value ||
                         IsVoid<T>::value,
                         bool>::Type
IsInRange(const T* aPtr, const U* aBegin, const U* aEnd)
{
  do { } while (0);
  detail::AlignedChecker<U, T>::test(aPtr);
  detail::AlignedChecker<U, U>::test(aBegin);
  detail::AlignedChecker<U, U>::test(aEnd);
  return aBegin <= reinterpret_cast<const U*>(aPtr) &&
         reinterpret_cast<const U*>(aPtr) < aEnd;
}






template<typename T>
inline bool
IsInRange(const T* aPtr, uintptr_t aBegin, uintptr_t aEnd)
{
  return IsInRange(aPtr,
                   reinterpret_cast<const T*>(aBegin),
                   reinterpret_cast<const T*>(aEnd));
}

namespace detail {





template <typename T, size_t N>
char (&ArrayLengthHelper(T (&array)[N]))[N];

}

}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h" 2





namespace mozilla {


template<typename T>
static __attribute__((always_inline)) inline void
PodZero(T* aT)
{
  memset(aT, 0, sizeof(T));
}


template<typename T>
static __attribute__((always_inline)) inline void
PodZero(T* aT, size_t aNElem)
{





  for (T* end = aT + aNElem; aT < end; aT++) {
    memset(aT, 0, sizeof(T));
  }
}
# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h"
template<typename T, size_t N>
static void PodZero(T (&aT)[N]) = delete;
template<typename T, size_t N>
static void PodZero(T (&aT)[N], size_t aNElem) = delete;


template <class T, size_t N>
static __attribute__((always_inline)) inline void
PodArrayZero(T (&aT)[N])
{
  memset(aT, 0, N * sizeof(T));
}

template <typename T, size_t N>
static __attribute__((always_inline)) inline void
PodArrayZero(Array<T, N>& aArr)
{
  memset(&aArr[0], 0, N * sizeof(T));
}





template<typename T>
static __attribute__((always_inline)) inline void
PodAssign(T* aDst, const T* aSrc)
{
  do { } while (0);

  memcpy(reinterpret_cast<char*>(aDst), reinterpret_cast<const char*>(aSrc),
         sizeof(T));
}





template<typename T>
static __attribute__((always_inline)) inline void
PodCopy(T* aDst, const T* aSrc, size_t aNElem)
{
  do { } while (0);

  if (aNElem < 128) {




    for (const T* srcend = aSrc + aNElem; aSrc < srcend; aSrc++, aDst++) {
      PodAssign(aDst, aSrc);
    }
  } else {
    memcpy(aDst, aSrc, aNElem * sizeof(T));
  }
}

template<typename T>
static __attribute__((always_inline)) inline void
PodCopy(volatile T* aDst, const volatile T* aSrc, size_t aNElem)
{
  do { } while (0);
# 127 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PodOperations.h"
  for (const volatile T* srcend = aSrc + aNElem;
       aSrc < srcend;
       aSrc++, aDst++) {
    *aDst = *aSrc;
  }
}





template <class T, size_t N>
static __attribute__((always_inline)) inline void
PodArrayCopy(T (&aDst)[N], const T (&aSrc)[N])
{
  PodCopy(aDst, aSrc, N);
}







template<typename T>
static __attribute__((always_inline)) inline void
PodMove(T* aDst, const T* aSrc, size_t aNElem)
{
  do { } while (0);

  memmove(aDst, aSrc, aNElem * sizeof(T));
}





template<typename T>
static __attribute__((always_inline)) inline bool
PodEqual(const T* one, const T* two, size_t len)
{
  if (len < 128) {
    const T* p1end = one + len;
    const T* p1 = one;
    const T* p2 = two;
    for (; p1 < p1end; p1++, p2++) {
      if (*p1 != *p2) {
        return false;
      }
    }
    return true;
  }

  return !memcmp(one, two, len * sizeof(T));
}





template <class T, size_t N>
static __attribute__((always_inline)) inline bool
PodEqual(const T (&one)[N], const T (&two)[N])
{
  return PodEqual(one, two, N);
}

}
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsprototypes.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Casting.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Casting.h"
namespace mozilla {
# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Casting.h"
template<typename To, typename From>
inline void
BitwiseCast(const From aFrom, To* aResult)
{
  static_assert(sizeof(From) == sizeof(To),
                "To and From must have the same size");
  union
  {
    From mFrom;
    To mTo;
  } u;
  u.mFrom = aFrom;
  *aResult = u.mTo;
}

template<typename To, typename From>
inline To
BitwiseCast(const From aFrom)
{
  To temp;
  BitwiseCast<To, From>(aFrom, &temp);
  return temp;
}

namespace detail {

enum ToSignedness { ToIsSigned, ToIsUnsigned };
enum FromSignedness { FromIsSigned, FromIsUnsigned };

template<typename From,
         typename To,
         FromSignedness = IsSigned<From>::value ? FromIsSigned : FromIsUnsigned,
         ToSignedness = IsSigned<To>::value ? ToIsSigned : ToIsUnsigned>
struct BoundsCheckImpl;






enum UUComparison { FromIsBigger, FromIsNotBigger };



template<typename From, typename To,
         UUComparison = (sizeof(From) > sizeof(To))
                        ? FromIsBigger
                        : FromIsNotBigger>
struct UnsignedUnsignedCheck;

template<typename From, typename To>
struct UnsignedUnsignedCheck<From, To, FromIsBigger>
{
public:
  static bool checkBounds(const From aFrom)
  {
    return aFrom <= From(To(-1));
  }
};

template<typename From, typename To>
struct UnsignedUnsignedCheck<From, To, FromIsNotBigger>
{
public:
  static bool checkBounds(const From aFrom)
  {
    return true;
  }
};

template<typename From, typename To>
struct BoundsCheckImpl<From, To, FromIsUnsigned, ToIsUnsigned>
{
public:
  static bool checkBounds(const From aFrom)
  {
    return UnsignedUnsignedCheck<From, To>::checkBounds(aFrom);
  }
};



template<typename From, typename To>
struct BoundsCheckImpl<From, To, FromIsSigned, ToIsUnsigned>
{
public:
  static bool checkBounds(const From aFrom)
  {
    if (aFrom < 0) {
      return false;
    }
    if (sizeof(To) >= sizeof(From)) {
      return true;
    }
    return aFrom <= From(To(-1));
  }
};



enum USComparison { FromIsSmaller, FromIsNotSmaller };

template<typename From, typename To,
         USComparison = (sizeof(From) < sizeof(To))
                        ? FromIsSmaller
                        : FromIsNotSmaller>
struct UnsignedSignedCheck;

template<typename From, typename To>
struct UnsignedSignedCheck<From, To, FromIsSmaller>
{
public:
  static bool checkBounds(const From aFrom)
  {
    return true;
  }
};

template<typename From, typename To>
struct UnsignedSignedCheck<From, To, FromIsNotSmaller>
{
public:
  static bool checkBounds(const From aFrom)
  {
    const To MaxValue = To((1ULL << (8 * sizeof(To) - 1)) - 1);
    return aFrom <= From(MaxValue);
  }
};

template<typename From, typename To>
struct BoundsCheckImpl<From, To, FromIsUnsigned, ToIsSigned>
{
public:
  static bool checkBounds(const From aFrom)
  {
    return UnsignedSignedCheck<From, To>::checkBounds(aFrom);
  }
};



template<typename From, typename To>
struct BoundsCheckImpl<From, To, FromIsSigned, ToIsSigned>
{
public:
  static bool checkBounds(const From aFrom)
  {
    if (sizeof(From) <= sizeof(To)) {
      return true;
    }
    const To MaxValue = To((1ULL << (8 * sizeof(To) - 1)) - 1);
    const To MinValue = -MaxValue - To(1);
    return From(MinValue) <= aFrom &&
           From(aFrom) <= From(MaxValue);
  }
};

template<typename From, typename To,
         bool TypesAreIntegral = IsIntegral<From>::value &&
                                 IsIntegral<To>::value>
class BoundsChecker;

template<typename From>
class BoundsChecker<From, From, true>
{
public:
  static bool checkBounds(const From aFrom) { return true; }
};

template<typename From, typename To>
class BoundsChecker<From, To, true>
{
public:
  static bool checkBounds(const From aFrom)
  {
    return BoundsCheckImpl<From, To>::checkBounds(aFrom);
  }
};

template<typename From, typename To>
inline bool
IsInBounds(const From aFrom)
{
  return BoundsChecker<From, To>::checkBounds(aFrom);
}

}






template<typename To, typename From>
inline To
AssertedCast(const From aFrom)
{
  do { } while (0);
  return static_cast<To>(aFrom);
}






template<typename To, typename From>
inline To
ReleaseAssertedCast(const From aFrom)
{
  do { static_assert(mozilla::detail::AssertionConditionType<decltype((detail::IsInBounds<From, To>(aFrom)))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!((detail::IsInBounds<From, To>(aFrom))))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "(detail::IsInBounds<From, To>(aFrom))" ")"); do { *((volatile int*) __null) = 250; ::abort(); } while (0); } } while (0);
  return static_cast<To>(aFrom);
}

}
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 2








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js-config.h" 1
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsversion.h" 1
# 36 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 2
# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jscpucfg.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jscpucfg.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h" 1
# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h"
namespace mozilla {

namespace detail {






template<typename T, size_t Size = sizeof(T)>
struct Swapper;

template<typename T>
struct Swapper<T, 2>
{
  static T swap(T aValue)
  {

    return __builtin_bswap16(aValue);



  }
};

template<typename T>
struct Swapper<T, 4>
{
  static T swap(T aValue)
  {

    return T(__builtin_bswap32(aValue));
# 198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h"
  }
};

template<typename T>
struct Swapper<T, 8>
{
  static inline T swap(T aValue)
  {

    return T(__builtin_bswap64(aValue));
# 220 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h"
  }
};

enum Endianness { Little, Big };







class EndianUtils
{




  static void assertNoOverlap(const void* aDest, const void* aSrc,
                              size_t aCount)
  {
    DebugOnly<const uint8_t*> byteDestPtr = static_cast<const uint8_t*>(aDest);
    DebugOnly<const uint8_t*> byteSrcPtr = static_cast<const uint8_t*>(aSrc);
    do { } while (0);



  }

  template<typename T>
  static void assertAligned(T* aPtr)
  {
    do { } while (0);
  }

protected:




  template<Endianness SourceEndian, Endianness DestEndian, typename T>
  static inline T maybeSwap(T aValue)
  {
    if (SourceEndian == DestEndian) {
      return aValue;
    }
    return Swapper<T>::swap(aValue);
  }





  template<Endianness SourceEndian, Endianness DestEndian, typename T>
  static inline void maybeSwapInPlace(T* aPtr, size_t aCount)
  {
    assertAligned(aPtr);

    if (SourceEndian == DestEndian) {
      return;
    }
    for (size_t i = 0; i < aCount; i++) {
      aPtr[i] = Swapper<T>::swap(aPtr[i]);
    }
  }





  template<Endianness SourceEndian, Endianness DestEndian, typename T>
  static void copyAndSwapTo(void* aDest, const T* aSrc, size_t aCount)
  {
    assertNoOverlap(aDest, aSrc, aCount * sizeof(T));
    assertAligned(aSrc);

    if (SourceEndian == DestEndian) {
      memcpy(aDest, aSrc, aCount * sizeof(T));
      return;
    }

    uint8_t* byteDestPtr = static_cast<uint8_t*>(aDest);
    for (size_t i = 0; i < aCount; ++i) {
      union
      {
        T mVal;
        uint8_t mBuffer[sizeof(T)];
      } u;
      u.mVal = maybeSwap<SourceEndian, DestEndian>(aSrc[i]);
      memcpy(byteDestPtr, u.mBuffer, sizeof(T));
      byteDestPtr += sizeof(T);
    }
  }





  template<Endianness SourceEndian, Endianness DestEndian, typename T>
  static void copyAndSwapFrom(T* aDest, const void* aSrc, size_t aCount)
  {
    assertNoOverlap(aDest, aSrc, aCount * sizeof(T));
    assertAligned(aDest);

    if (SourceEndian == DestEndian) {
      memcpy(aDest, aSrc, aCount * sizeof(T));
      return;
    }

    const uint8_t* byteSrcPtr = static_cast<const uint8_t*>(aSrc);
    for (size_t i = 0; i < aCount; ++i) {
      union
      {
        T mVal;
        uint8_t mBuffer[sizeof(T)];
      } u;
      memcpy(u.mBuffer, byteSrcPtr, sizeof(T));
      aDest[i] = maybeSwap<SourceEndian, DestEndian>(u.mVal);
      byteSrcPtr += sizeof(T);
    }
  }
};

template<Endianness ThisEndian>
class Endian : private EndianUtils
{
protected:

  static __attribute__ ((warn_unused_result)) uint16_t readUint16(const void* aPtr)
  {
    return read<uint16_t>(aPtr);
  }


  static __attribute__ ((warn_unused_result)) uint32_t readUint32(const void* aPtr)
  {
    return read<uint32_t>(aPtr);
  }


  static __attribute__ ((warn_unused_result)) uint64_t readUint64(const void* aPtr)
  {
    return read<uint64_t>(aPtr);
  }


  static __attribute__ ((warn_unused_result)) int16_t readInt16(const void* aPtr)
  {
    return read<int16_t>(aPtr);
  }


  static __attribute__ ((warn_unused_result)) int32_t readInt32(const void* aPtr)
  {
    return read<uint32_t>(aPtr);
  }


  static __attribute__ ((warn_unused_result)) int64_t readInt64(const void* aPtr)
  {
    return read<int64_t>(aPtr);
  }


  static void writeUint16(void* aPtr, uint16_t aValue)
  {
    write(aPtr, aValue);
  }


  static void writeUint32(void* aPtr, uint32_t aValue)
  {
    write(aPtr, aValue);
  }


  static void writeUint64(void* aPtr, uint64_t aValue)
  {
    write(aPtr, aValue);
  }


  static void writeInt16(void* aPtr, int16_t aValue)
  {
    write(aPtr, aValue);
  }


  static void writeInt32(void* aPtr, int32_t aValue)
  {
    write(aPtr, aValue);
  }


  static void writeInt64(void* aPtr, int64_t aValue)
  {
    write(aPtr, aValue);
  }
# 425 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EndianUtils.h"
  template<typename T>
  __attribute__ ((warn_unused_result)) static T swapToLittleEndian(T aValue)
  {
    return maybeSwap<ThisEndian, Little>(aValue);
  }






  template<typename T>
  static void copyAndSwapToLittleEndian(void* aDest, const T* aSrc,
                                        size_t aCount)
  {
    copyAndSwapTo<ThisEndian, Little>(aDest, aSrc, aCount);
  }




  template<typename T>
  static void swapToLittleEndianInPlace(T* aPtr, size_t aCount)
  {
    maybeSwapInPlace<ThisEndian, Little>(aPtr, aCount);
  }




  template<typename T>
  __attribute__ ((warn_unused_result)) static T swapToBigEndian(T aValue)
  {
    return maybeSwap<ThisEndian, Big>(aValue);
  }






  template<typename T>
  static void copyAndSwapToBigEndian(void* aDest, const T* aSrc,
                                     size_t aCount)
  {
    copyAndSwapTo<ThisEndian, Big>(aDest, aSrc, aCount);
  }




  template<typename T>
  static void swapToBigEndianInPlace(T* aPtr, size_t aCount)
  {
    maybeSwapInPlace<ThisEndian, Big>(aPtr, aCount);
  }






  template<typename T>
  __attribute__ ((warn_unused_result)) static T swapToNetworkOrder(T aValue)
  {
    return swapToBigEndian(aValue);
  }

  template<typename T>
  static void
  copyAndSwapToNetworkOrder(void* aDest, const T* aSrc, size_t aCount)
  {
    copyAndSwapToBigEndian(aDest, aSrc, aCount);
  }

  template<typename T>
  static void
  swapToNetworkOrderInPlace(T* aPtr, size_t aCount)
  {
    swapToBigEndianInPlace(aPtr, aCount);
  }




  template<typename T>
  __attribute__ ((warn_unused_result)) static T swapFromLittleEndian(T aValue)
  {
    return maybeSwap<Little, ThisEndian>(aValue);
  }






  template<typename T>
  static void copyAndSwapFromLittleEndian(T* aDest, const void* aSrc,
                                          size_t aCount)
  {
    copyAndSwapFrom<Little, ThisEndian>(aDest, aSrc, aCount);
  }




  template<typename T>
  static void swapFromLittleEndianInPlace(T* aPtr, size_t aCount)
  {
    maybeSwapInPlace<Little, ThisEndian>(aPtr, aCount);
  }




  template<typename T>
  __attribute__ ((warn_unused_result)) static T swapFromBigEndian(T aValue)
  {
    return maybeSwap<Big, ThisEndian>(aValue);
  }






  template<typename T>
  static void copyAndSwapFromBigEndian(T* aDest, const void* aSrc,
                                       size_t aCount)
  {
    copyAndSwapFrom<Big, ThisEndian>(aDest, aSrc, aCount);
  }




  template<typename T>
  static void swapFromBigEndianInPlace(T* aPtr, size_t aCount)
  {
    maybeSwapInPlace<Big, ThisEndian>(aPtr, aCount);
  }





  template<typename T>
  __attribute__ ((warn_unused_result)) static T swapFromNetworkOrder(T aValue)
  {
    return swapFromBigEndian(aValue);
  }

  template<typename T>
  static void copyAndSwapFromNetworkOrder(T* aDest, const void* aSrc,
                                          size_t aCount)
  {
    copyAndSwapFromBigEndian(aDest, aSrc, aCount);
  }

  template<typename T>
  static void swapFromNetworkOrderInPlace(T* aPtr, size_t aCount)
  {
    swapFromBigEndianInPlace(aPtr, aCount);
  }

private:




  template<typename T>
  static T read(const void* aPtr)
  {
    union
    {
      T mVal;
      uint8_t mBuffer[sizeof(T)];
    } u;
    memcpy(u.mBuffer, aPtr, sizeof(T));
    return maybeSwap<ThisEndian, detail::Little>(u.mVal);
  }





  template<typename T>
  static void write(void* aPtr, T aValue)
  {
    T tmp = maybeSwap<detail::Little, ThisEndian>(aValue);
    memcpy(aPtr, &tmp, sizeof(T));
  }

  Endian() = delete;
  Endian(const Endian& aTther) = delete;
  void operator=(const Endian& aOther) = delete;
};

template<Endianness ThisEndian>
class EndianReadWrite : public Endian<ThisEndian>
{
private:
  typedef Endian<ThisEndian> super;

public:
  using super::readUint16;
  using super::readUint32;
  using super::readUint64;
  using super::readInt16;
  using super::readInt32;
  using super::readInt64;
  using super::writeUint16;
  using super::writeUint32;
  using super::writeUint64;
  using super::writeInt16;
  using super::writeInt32;
  using super::writeInt64;
};

}

class LittleEndian final : public detail::EndianReadWrite<detail::Little>
{};

class BigEndian final : public detail::EndianReadWrite<detail::Big>
{};

typedef BigEndian NetworkEndian;

class NativeEndian final : public detail::Endian<detail::Little>
{
private:
  typedef detail::Endian<detail::Little> super;

public:





  using super::swapToLittleEndian;
  using super::copyAndSwapToLittleEndian;
  using super::swapToLittleEndianInPlace;
  using super::swapToBigEndian;
  using super::copyAndSwapToBigEndian;
  using super::swapToBigEndianInPlace;
  using super::swapToNetworkOrder;
  using super::copyAndSwapToNetworkOrder;
  using super::swapToNetworkOrderInPlace;






  using super::swapFromLittleEndian;
  using super::copyAndSwapFromLittleEndian;
  using super::swapFromLittleEndianInPlace;
  using super::swapFromBigEndian;
  using super::copyAndSwapFromBigEndian;
  using super::swapFromBigEndianInPlace;
  using super::swapFromNetworkOrder;
  using super::copyAndSwapFromNetworkOrder;
  using super::swapFromNetworkOrderInPlace;
};



}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jscpucfg.h" 2
# 140 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jstypes.h" 2
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h" 1
# 119 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h"
namespace mozilla {

template<typename... Ts>
class Variant;

namespace detail {

template <typename...>
struct FirstTypeIsInRest;

template <typename First>
struct FirstTypeIsInRest<First> : FalseType {};

template <typename First, typename Second, typename... Rest>
struct FirstTypeIsInRest<First, Second, Rest...>
{
  static constexpr bool value =
    IsSame<First, Second>::value ||
    FirstTypeIsInRest<First, Rest...>::value;
};

template <typename...>
struct TypesAreDistinct;

template <>
struct TypesAreDistinct<> : TrueType { };

template<typename First, typename... Rest>
struct TypesAreDistinct<First, Rest...>
{
  static constexpr bool value =
    !FirstTypeIsInRest<First, Rest...>::value &&
    TypesAreDistinct<Rest...>::value;
};






template<typename Needle, typename... Haystack>
struct IsVariant;

template<typename Needle>
struct IsVariant<Needle> : FalseType {};

template<typename Needle, typename... Haystack>
struct IsVariant<Needle, Needle, Haystack...> : TrueType {};

template<typename Needle, typename T, typename... Haystack>
struct IsVariant<Needle, T, Haystack...> : public IsVariant<Needle, Haystack...> { };


template<typename T, typename... Variants>
struct SelectVariantTypeHelper;

template<typename T>
struct SelectVariantTypeHelper<T>
{ };

template<typename T, typename... Variants>
struct SelectVariantTypeHelper<T, T, Variants...>
{
  typedef T Type;
};

template<typename T, typename... Variants>
struct SelectVariantTypeHelper<T, const T, Variants...>
{
  typedef const T Type;
};

template<typename T, typename... Variants>
struct SelectVariantTypeHelper<T, const T&, Variants...>
{
  typedef const T& Type;
};

template<typename T, typename... Variants>
struct SelectVariantTypeHelper<T, T&&, Variants...>
{
  typedef T&& Type;
};

template<typename T, typename Head, typename... Variants>
struct SelectVariantTypeHelper<T, Head, Variants...>
  : public SelectVariantTypeHelper<T, Variants...>
{ };






template <typename T, typename... Variants>
struct SelectVariantType
  : public SelectVariantTypeHelper<typename RemoveConst<typename RemoveReference<T>::Type>::Type,
                                   Variants...>
{ };



template<typename... Ts>
struct VariantTag
{
private:
  static const size_t TypeCount = sizeof...(Ts);

public:
  using Type =
    typename Conditional<TypeCount < 3,
                         bool,
                         typename Conditional<TypeCount < (1 << 8),
                                              uint_fast8_t,
                                              size_t
                                              >::Type
                         >::Type;
};





template<typename Tag, size_t N, typename T, typename U, typename Next, bool isMatch>
struct TagHelper;


template<typename Tag, size_t N, typename T, typename U, typename Next>
struct TagHelper<Tag, N, T, U, Next, false>
{
  static Tag tag() { return Next::template tag<U>(); }
};


template<typename Tag, size_t N, typename T, typename U, typename Next>
struct TagHelper<Tag, N, T, U, Next, true>
{
  static Tag tag() { return Tag(N); }
};







template<typename Tag, size_t N, typename... Ts>
struct VariantImplementation;


template<typename Tag, size_t N, typename T>
struct VariantImplementation<Tag, N, T>
{
  template<typename U>
  static Tag tag() {
    static_assert(mozilla::IsSame<T, U>::value,
                  "mozilla::Variant: tag: bad type!");
    return Tag(N);
  }

  template<typename Variant>
  static void copyConstruct(void* aLhs, const Variant& aRhs) {
    ::new (KnownNotNull, aLhs) T(aRhs.template as<T>());
  }

  template<typename Variant>
  static void moveConstruct(void* aLhs, Variant&& aRhs) {
    ::new (KnownNotNull, aLhs) T(aRhs.template extract<T>());
  }

  template<typename Variant>
  static void destroy(Variant& aV) {
    aV.template as<T>().~T();
  }

  template<typename Variant>
  static bool
  equal(const Variant& aLhs, const Variant& aRhs) {
      return aLhs.template as<T>() == aRhs.template as<T>();
  }

  template<typename Matcher, typename ConcreteVariant>
  static auto
  match(Matcher&& aMatcher, ConcreteVariant& aV)
    -> decltype(aMatcher.match(aV.template as<T>()))
  {
    return aMatcher.match(aV.template as<T>());
  }
};


template<typename Tag, size_t N, typename T, typename... Ts>
struct VariantImplementation<Tag, N, T, Ts...>
{

  using Next = VariantImplementation<Tag, N + 1, Ts...>;

  template<typename U>
  static Tag tag() {
    return TagHelper<Tag, N, T, U, Next, IsSame<T, U>::value>::tag();
  }

  template<typename Variant>
  static void copyConstruct(void* aLhs, const Variant& aRhs) {
    if (aRhs.template is<T>()) {
      ::new (KnownNotNull, aLhs) T(aRhs.template as<T>());
    } else {
      Next::copyConstruct(aLhs, aRhs);
    }
  }

  template<typename Variant>
  static void moveConstruct(void* aLhs, Variant&& aRhs) {
    if (aRhs.template is<T>()) {
      ::new (KnownNotNull, aLhs) T(aRhs.template extract<T>());
    } else {
      Next::moveConstruct(aLhs, aRhs);
    }
  }

  template<typename Variant>
  static void destroy(Variant& aV) {
    if (aV.template is<T>()) {
      aV.template as<T>().~T();
    } else {
      Next::destroy(aV);
    }
  }

  template<typename Variant>
  static bool equal(const Variant& aLhs, const Variant& aRhs) {
    if (aLhs.template is<T>()) {
      do { } while (0);
      return aLhs.template as<T>() == aRhs.template as<T>();
    } else {
      return Next::equal(aLhs, aRhs);
    }
  }

  template<typename Matcher, typename ConcreteVariant>
  static auto
  match(Matcher&& aMatcher, ConcreteVariant& aV)
    -> decltype(aMatcher.match(aV.template as<T>()))
  {
    if (aV.template is<T>()) {
      return aMatcher.match(aV.template as<T>());
    } else {
# 278 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h"
      return Next::match(aMatcher, aV);
    }
  }
};







template <typename T>
struct AsVariantTemporary
{
  explicit AsVariantTemporary(const T& aValue)
    : mValue(aValue)
  {}

  template<typename U>
  explicit AsVariantTemporary(U&& aValue)
    : mValue(Forward<U>(aValue))
  {}

  AsVariantTemporary(const AsVariantTemporary& aOther)
    : mValue(aOther.mValue)
  {}

  AsVariantTemporary(AsVariantTemporary&& aOther)
    : mValue(Move(aOther.mValue))
  {}

  AsVariantTemporary() = delete;
  void operator=(const AsVariantTemporary&) = delete;
  void operator=(AsVariantTemporary&&) = delete;

  typename RemoveConst<typename RemoveReference<T>::Type>::Type mValue;
};

}
# 447 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h"
template<typename... Ts>
class Variant
{
  static_assert(detail::TypesAreDistinct<Ts...>::value,
                "Variant with duplicate types is not supported");

  using Tag = typename detail::VariantTag<Ts...>::Type;
  using Impl = detail::VariantImplementation<Tag, 0, Ts...>;

  static constexpr size_t RawDataAlignment = tl::Max<alignof(Ts)...>::value;
  static constexpr size_t RawDataSize = tl::Max<sizeof(Ts)...>::value;


  alignas(RawDataAlignment) unsigned char rawData[RawDataSize];



  Tag tag;





  void* ptr() {
    return rawData;
  }

  const void* ptr() const {
    return rawData;
  }

public:

  template<typename RefT,




           typename T = typename detail::SelectVariantType<RefT, Ts...>::Type>
  explicit Variant(RefT&& aT)
    : tag(Impl::template tag<T>())
  {
    ::new (KnownNotNull, ptr()) T(Forward<RefT>(aT));
  }






  template<typename RefT,
           typename T = typename detail::SelectVariantType<RefT, Ts...>::Type>
               Variant(detail::AsVariantTemporary<RefT>&& aValue)
    : tag(Impl::template tag<T>())
  {
    ::new (KnownNotNull, ptr()) T(Move(aValue.mValue));
  }


  Variant(const Variant& aRhs)
    : tag(aRhs.tag)
  {
    Impl::copyConstruct(ptr(), aRhs);
  }


  Variant(Variant&& aRhs)
    : tag(aRhs.tag)
  {
    Impl::moveConstruct(ptr(), Move(aRhs));
  }


  Variant& operator=(const Variant& aRhs) {
    do { } while (0);
    this->~Variant();
    ::new (KnownNotNull, this) Variant(aRhs);
    return *this;
  }


  Variant& operator=(Variant&& aRhs) {
    do { } while (0);
    this->~Variant();
    ::new (KnownNotNull, this) Variant(Move(aRhs));
    return *this;
  }


  template <typename T>
  Variant& operator=(detail::AsVariantTemporary<T>&& aValue)
  {
    this->~Variant();
    ::new (KnownNotNull, this) Variant(Move(aValue));
    return *this;
  }

  ~Variant()
  {
    Impl::destroy(*this);
  }


  template<typename T>
  bool is() const {
    static_assert(detail::IsVariant<T, Ts...>::value,
                  "provided a type not found in this Variant's type list");
    return Impl::template tag<T>() == tag;
  }





  bool operator==(const Variant& aRhs) const {
    return tag == aRhs.tag && Impl::equal(*this, aRhs);
  }






  bool operator!=(const Variant& aRhs) const {
    return !(*this == aRhs);
  }




  template<typename T>
  T& as() {
    static_assert(detail::IsVariant<T, Ts...>::value,
                  "provided a type not found in this Variant's type list");
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(is<T>())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(is<T>()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "is<T>()" ")"); do { *((volatile int*) __null) = 581; ::abort(); } while (0); } } while (0);
    return *static_cast<T*>(ptr());
  }


  template<typename T>
  const T& as() const {
    static_assert(detail::IsVariant<T, Ts...>::value,
                  "provided a type not found in this Variant's type list");
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(is<T>())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(is<T>()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "is<T>()" ")"); do { *((volatile int*) __null) = 590; ::abort(); } while (0); } } while (0);
    return *static_cast<const T*>(ptr());
  }







  template<typename T>
  T extract() {
    static_assert(detail::IsVariant<T, Ts...>::value,
                  "provided a type not found in this Variant's type list");
    do { } while (0);
    return T(Move(as<T>()));
  }




  template<typename Matcher>
  auto
  match(Matcher&& aMatcher) const
    -> decltype(Impl::match(aMatcher, *this))
  {
    return Impl::match(aMatcher, *this);
  }


  template<typename Matcher>
  auto
  match(Matcher&& aMatcher)
    -> decltype(Impl::match(aMatcher, *this))
  {
    return Impl::match(aMatcher, *this);
  }
};
# 642 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h"
template<typename T>
detail::AsVariantTemporary<T>
AsVariant(T&& aValue)
{
  return detail::AsVariantTemporary<T>(Forward<T>(aValue));
}

}
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h" 2

namespace mozilla {






struct Ok {};

template <typename E> class GenericErrorResult;
template <typename V, typename E> class Result;

namespace detail {

enum class PackingStrategy {
  Variant,
  NullIsOk,
  LowBitTagIsError,
  PackedVariant,
};

template <typename V, typename E, PackingStrategy Strategy>
class ResultImplementation;

template <typename V, typename E>
class ResultImplementation<V, E, PackingStrategy::Variant>
{
  mozilla::Variant<V, E> mStorage;

public:
  explicit ResultImplementation(V aValue) : mStorage(aValue) {}
  explicit ResultImplementation(E aErrorValue) : mStorage(aErrorValue) {}

  bool isOk() const { return mStorage.template is<V>(); }




  V unwrap() const { return mStorage.template as<V>(); }
  E unwrapErr() const { return mStorage.template as<E>(); }
};





template <typename V, typename E>
class ResultImplementation<V, E&, PackingStrategy::Variant>
{
  mozilla::Variant<V, E*> mStorage;

public:
  explicit ResultImplementation(V aValue) : mStorage(aValue) {}
  explicit ResultImplementation(E& aErrorValue) : mStorage(&aErrorValue) {}

  bool isOk() const { return mStorage.template is<V>(); }
  V unwrap() const { return mStorage.template as<V>(); }
  E& unwrapErr() const { return *mStorage.template as<E*>(); }
};





template <typename V, typename E>
class ResultImplementation<V, E&, PackingStrategy::NullIsOk>
{
  E* mErrorValue;

public:
  explicit ResultImplementation(V) : mErrorValue(nullptr) {}
  explicit ResultImplementation(E& aErrorValue) : mErrorValue(&aErrorValue) {}

  bool isOk() const { return mErrorValue == nullptr; }

  V unwrap() const { return V(); }
  E& unwrapErr() const { return *mErrorValue; }
};





template <typename V, typename E>
class ResultImplementation<V*, E&, PackingStrategy::LowBitTagIsError>
{
  uintptr_t mBits;

public:
  explicit ResultImplementation(V* aValue)
    : mBits(reinterpret_cast<uintptr_t>(aValue))
  {
    do { } while (0);

  }
  explicit ResultImplementation(E& aErrorValue)
    : mBits(reinterpret_cast<uintptr_t>(&aErrorValue) | 1)
  {
    do { } while (0);

  }

  bool isOk() const { return (mBits & 1) == 0; }

  V* unwrap() const { return reinterpret_cast<V*>(mBits); }
  E& unwrapErr() const { return *reinterpret_cast<E*>(mBits ^ 1); }
};


template<typename V, typename E>
struct IsPackableVariant
{
  struct VEbool {
      V v;
      E e;
      bool ok;
  };
  struct EVbool {
      E e;
      V v;
      bool ok;
  };

  using Impl = typename Conditional<sizeof(VEbool) <= sizeof(EVbool),
                                    VEbool, EVbool>::Type;

  static const bool value = sizeof(Impl) <= sizeof(uintptr_t);
};





template <typename V, typename E>
class ResultImplementation<V, E, PackingStrategy::PackedVariant>
{
  using Impl = typename IsPackableVariant<V, E>::Impl;
  Impl data;

public:
  explicit ResultImplementation(V aValue)
  {
    data.v = aValue;
    data.ok = true;
  }
  explicit ResultImplementation(E aErrorValue)
  {
    data.e = aErrorValue;
    data.ok = false;
  }

  bool isOk() const { return data.ok; }

  V unwrap() const { return data.v; }
  E unwrapErr() const { return data.e; }
};





template<typename T>
struct UnusedZero
{
  static const bool value = false;
};


template<typename T>
struct UnusedZero<T&>
{
  static const bool value = true;
};




template <typename T> struct HasFreeLSB { static const bool value = false; };




template <typename T> struct HasFreeLSB<T*> {
  static const bool value = (mozilla::AlignmentFinder<T>::alignment & 1) == 0;
};



template <typename T> struct HasFreeLSB<T&> {
  static const bool value = HasFreeLSB<T*>::value;
};



template <typename V, typename E>
struct SelectResultImpl
{
  static const PackingStrategy value =
      (IsEmpty<V>::value && UnusedZero<E>::value)
    ? PackingStrategy::NullIsOk
    : (detail::HasFreeLSB<V>::value && detail::HasFreeLSB<E>::value)
    ? PackingStrategy::LowBitTagIsError
    : (IsDefaultConstructible<V>::value && IsDefaultConstructible<E>::value &&
       IsPackableVariant<V, E>::value)
    ? PackingStrategy::PackedVariant
    : PackingStrategy::Variant;

  using Type = detail::ResultImplementation<V, E, value>;
};

template <typename T>
struct IsResult : FalseType { };

template <typename V, typename E>
struct IsResult<Result<V, E>> : TrueType { };

}
# 263 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h"
template <typename V, typename E>
class Result final
{
  using Impl = typename detail::SelectResultImpl<V, E>::Type;

  Impl mImpl;

public:



               Result(V aValue) : mImpl(aValue) { do { } while (0); }




  explicit Result(E aErrorValue) : mImpl(aErrorValue) { do { } while (0); }





  template <typename E2>
               Result(const GenericErrorResult<E2>& aErrorResult)
    : mImpl(aErrorResult.mErrorValue)
  {
    static_assert(mozilla::IsConvertible<E2, E>::value,
                  "E2 must be convertible to E");
    do { } while (0);
  }

  Result(const Result&) = default;
  Result& operator=(const Result&) = default;


  bool isOk() const { return mImpl.isOk(); }


  bool isErr() const { return !mImpl.isOk(); }


  V unwrap() const {
    do { } while (0);
    return mImpl.unwrap();
  }


  E unwrapErr() const {
    do { } while (0);
    return mImpl.unwrapErr();
  }
# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h"
  template<typename F>
  auto map(F f) const -> Result<decltype(f(*((V*) nullptr))), E> {
      using RetResult = Result<decltype(f(*((V*) nullptr))), E>;
      return isOk() ? RetResult(f(unwrap())) : RetResult(unwrapErr());
  }
# 374 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Result.h"
  template<
      typename F,
      typename = typename EnableIf<
          detail::IsResult<decltype((*((F*) nullptr))(*((V*) nullptr)))>::value
      >::Type
  >
  auto andThen(F f) const -> decltype(f(*((V*) nullptr))) {
      return isOk() ? f(unwrap()) : GenericErrorResult<E>(unwrapErr());
  }
};







template <typename E>
class GenericErrorResult
{
  E mErrorValue;

  template<typename V, typename E2> friend class Result;

public:
  explicit GenericErrorResult(E aErrorValue) : mErrorValue(aErrorValue) {}
};

template <typename E>
inline GenericErrorResult<E>
Err(E&& aErrorValue)
{
  return GenericErrorResult<E>(aErrorValue);
}

}
# 120 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h" 2

struct JSContext;
# 179 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h"
namespace JS {

using mozilla::Ok;





struct Error
{


    int dummy;
};

struct OOM : public Error
{
};
# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Result.h"
template <typename V = Ok, typename E = Error&>
using Result = mozilla::Result<V, E>;

static_assert(sizeof(Result<>) == sizeof(uintptr_t),
              "Result<> should be pointer-sized");

static_assert(sizeof(Result<int*, Error&>) == sizeof(uintptr_t),
              "Result<V*, Error&> should be pointer-sized");

}
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h"
namespace mozilla {

namespace detail {

enum StorageType { AsBase, AsMember };
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h"
template<typename A, typename B,
         detail::StorageType =
           IsEmpty<A>::value ? detail::AsBase : detail::AsMember,
         detail::StorageType =
           IsEmpty<B>::value && !IsBaseOf<A, B>::value && !IsBaseOf<B, A>::value
           ? detail::AsBase
           : detail::AsMember>
struct PairHelper;

template<typename A, typename B>
struct PairHelper<A, B, AsMember, AsMember>
{
protected:
  template<typename AArg, typename BArg>
  PairHelper(AArg&& aA, BArg&& aB)
    : mFirstA(Forward<AArg>(aA)),
      mSecondB(Forward<BArg>(aB))
  {}

  A& first() { return mFirstA; }
  const A& first() const { return mFirstA; }
  B& second() { return mSecondB; }
  const B& second() const { return mSecondB; }

  void swap(PairHelper& aOther)
  {
    Swap(mFirstA, aOther.mFirstA);
    Swap(mSecondB, aOther.mSecondB);
  }

private:
  A mFirstA;
  B mSecondB;
};

template<typename A, typename B>
struct PairHelper<A, B, AsMember, AsBase> : private B
{
protected:
  template<typename AArg, typename BArg>
  PairHelper(AArg&& aA, BArg&& aB)
    : B(Forward<BArg>(aB)),
      mFirstA(Forward<AArg>(aA))
  {}

  A& first() { return mFirstA; }
  const A& first() const { return mFirstA; }
  B& second() { return *this; }
  const B& second() const { return *this; }

  void swap(PairHelper& aOther)
  {
    Swap(mFirstA, aOther.mFirstA);
    Swap(static_cast<B&>(*this), static_cast<B&>(aOther));
  }

private:
  A mFirstA;
};

template<typename A, typename B>
struct PairHelper<A, B, AsBase, AsMember> : private A
{
protected:
  template<typename AArg, typename BArg>
  PairHelper(AArg&& aA, BArg&& aB)
    : A(Forward<AArg>(aA)),
      mSecondB(Forward<BArg>(aB))
  {}

  A& first() { return *this; }
  const A& first() const { return *this; }
  B& second() { return mSecondB; }
  const B& second() const { return mSecondB; }

  void swap(PairHelper& aOther)
  {
    Swap(static_cast<A&>(*this), static_cast<A&>(aOther));
    Swap(mSecondB, aOther.mSecondB);
  }

private:
  B mSecondB;
};

template<typename A, typename B>
struct PairHelper<A, B, AsBase, AsBase> : private A, private B
{
protected:
  template<typename AArg, typename BArg>
  PairHelper(AArg&& aA, BArg&& aB)
    : A(Forward<AArg>(aA)),
      B(Forward<BArg>(aB))
  {}

  A& first() { return static_cast<A&>(*this); }
  const A& first() const { return static_cast<A&>(*this); }
  B& second() { return static_cast<B&>(*this); }
  const B& second() const { return static_cast<B&>(*this); }

  void swap(PairHelper& aOther)
  {
    Swap(static_cast<A&>(*this), static_cast<A&>(aOther));
    Swap(static_cast<B&>(*this), static_cast<B&>(aOther));
  }
};

}
# 151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h"
template<typename A, typename B>
struct Pair
  : private detail::PairHelper<A, B>
{
  typedef typename detail::PairHelper<A, B> Base;

public:
  template<typename AArg, typename BArg>
  Pair(AArg&& aA, BArg&& aB)
    : Base(Forward<AArg>(aA), Forward<BArg>(aB))
  {}

  Pair(Pair&& aOther)
    : Base(Move(aOther.first()), Move(aOther.second()))
  { }

  Pair(const Pair& aOther) = default;

  Pair& operator=(Pair&& aOther)
  {
    do { } while (0);

    first() = Move(aOther.first());
    second() = Move(aOther.second());

    return *this;
  }

  Pair& operator=(const Pair& aOther) = default;


  using Base::first;

  using Base::second;


  void swap(Pair& aOther) { Base::swap(aOther); }
};

template<typename A, class B>
void
Swap(Pair<A, B>& aX, Pair<A, B>& aY)
{
  aX.swap(aY);
}
# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Pair.h"
template<typename A, typename B>
Pair<typename RemoveCV<typename RemoveReference<A>::Type>::Type,
     typename RemoveCV<typename RemoveReference<B>::Type>::Type>
MakePair(A&& aA, B&& aB)
{
  return
    Pair<typename RemoveCV<typename RemoveReference<A>::Type>::Type,
         typename RemoveCV<typename RemoveReference<B>::Type>::Type>(
             Forward<A>(aA),
             Forward<B>(aB));
}

}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h" 2


namespace mozilla {

template<typename T> class DefaultDelete;
template<typename T, class D = DefaultDelete<T>> class UniquePtr;

}

namespace mozilla {

namespace detail {

struct HasPointerTypeHelper
{
  template <class U> static double Test(...);
  template <class U> static char Test(typename U::pointer* = 0);
};

template <class T>
class HasPointerType : public IntegralConstant<bool, sizeof(HasPointerTypeHelper::Test<T>(0)) == 1>
{
};

template <class T, class D, bool = HasPointerType<D>::value>
struct PointerTypeImpl
{
  typedef typename D::pointer Type;
};

template <class T, class D>
struct PointerTypeImpl<T, D, false>
{
  typedef T* Type;
};

template <class T, class D>
struct PointerType
{
  typedef typename PointerTypeImpl<T, typename RemoveReference<D>::Type>::Type Type;
};

}
# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h"
template<typename T, class D>
class UniquePtr
{
public:
  typedef T ElementType;
  typedef D DeleterType;
  typedef typename detail::PointerType<T, DeleterType>::Type Pointer;

private:
  Pair<Pointer, DeleterType> mTuple;

  Pointer& ptr() { return mTuple.first(); }
  const Pointer& ptr() const { return mTuple.first(); }

  DeleterType& del() { return mTuple.second(); }
  const DeleterType& del() const { return mTuple.second(); }

public:



  constexpr UniquePtr()
    : mTuple(static_cast<Pointer>(nullptr), DeleterType())
  {
    static_assert(!IsPointer<D>::value, "must provide a deleter instance");
    static_assert(!IsReference<D>::value, "must provide a deleter instance");
  }




  explicit UniquePtr(Pointer aPtr)
    : mTuple(aPtr, DeleterType())
  {
    static_assert(!IsPointer<D>::value, "must provide a deleter instance");
    static_assert(!IsReference<D>::value, "must provide a deleter instance");
  }

  UniquePtr(Pointer aPtr,
            typename Conditional<IsReference<D>::value,
                                 D,
                                 const D&>::Type aD1)
    : mTuple(aPtr, aD1)
  {}
# 254 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h"
  UniquePtr(Pointer aPtr,
            typename RemoveReference<D>::Type&& aD2)
    : mTuple(aPtr, Move(aD2))
  {
    static_assert(!IsReference<D>::value,
                  "rvalue deleter can't be stored by reference");
  }

  UniquePtr(UniquePtr&& aOther)
    : mTuple(aOther.release(), Forward<DeleterType>(aOther.get_deleter()))
  {}


  UniquePtr(decltype(nullptr))
    : mTuple(nullptr, DeleterType())
  {
    static_assert(!IsPointer<D>::value, "must provide a deleter instance");
    static_assert(!IsReference<D>::value, "must provide a deleter instance");
  }

  template<typename U, class E>

  UniquePtr(UniquePtr<U, E>&& aOther,
            typename EnableIf<IsConvertible<typename UniquePtr<U, E>::Pointer,
                                            Pointer>::value &&
                              !IsArray<U>::value &&
                              (IsReference<D>::value
                               ? IsSame<D, E>::value
                               : IsConvertible<E, D>::value),
                              int>::Type aDummy = 0)
    : mTuple(aOther.release(), Forward<E>(aOther.get_deleter()))
  {
  }

  ~UniquePtr() { reset(nullptr); }

  UniquePtr& operator=(UniquePtr&& aOther)
  {
    reset(aOther.release());
    get_deleter() = Forward<DeleterType>(aOther.get_deleter());
    return *this;
  }

  template<typename U, typename E>
  UniquePtr& operator=(UniquePtr<U, E>&& aOther)
  {
    static_assert(IsConvertible<typename UniquePtr<U, E>::Pointer,
                                Pointer>::value,
                  "incompatible UniquePtr pointees");
    static_assert(!IsArray<U>::value,
                  "can't assign from UniquePtr holding an array");

    reset(aOther.release());
    get_deleter() = Forward<E>(aOther.get_deleter());
    return *this;
  }

  UniquePtr& operator=(decltype(nullptr))
  {
    reset(nullptr);
    return *this;
  }

  T& operator*() const { return *get(); }
  Pointer operator->() const
  {
    do { } while (0);
    return get();
  }

  explicit operator bool() const { return get() != nullptr; }

  Pointer get() const { return ptr(); }

  DeleterType& get_deleter() { return del(); }
  const DeleterType& get_deleter() const { return del(); }

  __attribute__ ((warn_unused_result)) Pointer release()
  {
    Pointer p = ptr();
    ptr() = nullptr;
    return p;
  }

  void reset(Pointer aPtr = Pointer())
  {
    Pointer old = ptr();
    ptr() = aPtr;
    if (old != nullptr) {
      get_deleter()(old);
    }
  }

  void swap(UniquePtr& aOther)
  {
    mTuple.swap(aOther.mTuple);
  }

  UniquePtr(const UniquePtr& aOther) = delete;
  void operator=(const UniquePtr& aOther) = delete;
};





template<typename T, class D>
class UniquePtr<T[], D>
{
public:
  typedef T* Pointer;
  typedef T ElementType;
  typedef D DeleterType;

private:
  Pair<Pointer, DeleterType> mTuple;

public:



  constexpr UniquePtr()
    : mTuple(static_cast<Pointer>(nullptr), DeleterType())
  {
    static_assert(!IsPointer<D>::value, "must provide a deleter instance");
    static_assert(!IsReference<D>::value, "must provide a deleter instance");
  }




  explicit UniquePtr(Pointer aPtr)
    : mTuple(aPtr, DeleterType())
  {
    static_assert(!IsPointer<D>::value, "must provide a deleter instance");
    static_assert(!IsReference<D>::value, "must provide a deleter instance");
  }






  template<typename U>
  UniquePtr(U&& aU,
            typename EnableIf<IsPointer<U>::value &&
                              IsConvertible<U, Pointer>::value,
                              int>::Type aDummy = 0)
  = delete;

  UniquePtr(Pointer aPtr,
            typename Conditional<IsReference<D>::value,
                                 D,
                                 const D&>::Type aD1)
    : mTuple(aPtr, aD1)
  {}





  UniquePtr(Pointer aPtr,
            typename RemoveReference<D>::Type&& aD2)
    : mTuple(aPtr, Move(aD2))
  {
    static_assert(!IsReference<D>::value,
                  "rvalue deleter can't be stored by reference");
  }


  template<typename U, typename V>
  UniquePtr(U&& aU, V&& aV,
            typename EnableIf<IsPointer<U>::value &&
                              IsConvertible<U, Pointer>::value,
                              int>::Type aDummy = 0)
  = delete;

  UniquePtr(UniquePtr&& aOther)
    : mTuple(aOther.release(), Forward<DeleterType>(aOther.get_deleter()))
  {}


  UniquePtr(decltype(nullptr))
    : mTuple(nullptr, DeleterType())
  {
    static_assert(!IsPointer<D>::value, "must provide a deleter instance");
    static_assert(!IsReference<D>::value, "must provide a deleter instance");
  }

  ~UniquePtr() { reset(nullptr); }

  UniquePtr& operator=(UniquePtr&& aOther)
  {
    reset(aOther.release());
    get_deleter() = Forward<DeleterType>(aOther.get_deleter());
    return *this;
  }

  UniquePtr& operator=(decltype(nullptr))
  {
    reset();
    return *this;
  }

  explicit operator bool() const { return get() != nullptr; }

  T& operator[](decltype(sizeof(int)) aIndex) const { return get()[aIndex]; }
  Pointer get() const { return mTuple.first(); }

  DeleterType& get_deleter() { return mTuple.second(); }
  const DeleterType& get_deleter() const { return mTuple.second(); }

  __attribute__ ((warn_unused_result)) Pointer release()
  {
    Pointer p = mTuple.first();
    mTuple.first() = nullptr;
    return p;
  }

  void reset(Pointer aPtr = Pointer())
  {
    Pointer old = mTuple.first();
    mTuple.first() = aPtr;
    if (old != nullptr) {
      mTuple.second()(old);
    }
  }

  void reset(decltype(nullptr))
  {
    Pointer old = mTuple.first();
    mTuple.first() = nullptr;
    if (old != nullptr) {
      mTuple.second()(old);
    }
  }

  template<typename U>
  void reset(U) = delete;

  void swap(UniquePtr& aOther) { mTuple.swap(aOther.mTuple); }

  UniquePtr(const UniquePtr& aOther) = delete;
  void operator=(const UniquePtr& aOther) = delete;
};
# 513 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h"
template<typename T>
class DefaultDelete
{
public:
  constexpr DefaultDelete() {}

  template<typename U>
               DefaultDelete(const DefaultDelete<U>& aOther,
                             typename EnableIf<mozilla::IsConvertible<U*, T*>::value,
                                               int>::Type aDummy = 0)
  {}

  void operator()(T* aPtr) const
  {
    static_assert(sizeof(T) > 0, "T must be complete");
    delete aPtr;
  }
};


template<typename T>
class DefaultDelete<T[]>
{
public:
  constexpr DefaultDelete() {}

  void operator()(T* aPtr) const
  {
    static_assert(sizeof(T) > 0, "T must be complete");
    delete[] aPtr;
  }

  template<typename U>
  void operator()(U* aPtr) const = delete;
};

template<typename T, class D>
void
Swap(UniquePtr<T, D>& aX, UniquePtr<T, D>& aY)
{
  aX.swap(aY);
}

template<typename T, class D, typename U, class E>
bool
operator==(const UniquePtr<T, D>& aX, const UniquePtr<U, E>& aY)
{
  return aX.get() == aY.get();
}

template<typename T, class D, typename U, class E>
bool
operator!=(const UniquePtr<T, D>& aX, const UniquePtr<U, E>& aY)
{
  return aX.get() != aY.get();
}

template<typename T, class D>
bool
operator==(const UniquePtr<T, D>& aX, decltype(nullptr))
{
  return !aX;
}

template<typename T, class D>
bool
operator==(decltype(nullptr), const UniquePtr<T, D>& aX)
{
  return !aX;
}

template<typename T, class D>
bool
operator!=(const UniquePtr<T, D>& aX, decltype(nullptr))
{
  return bool(aX);
}

template<typename T, class D>
bool
operator!=(decltype(nullptr), const UniquePtr<T, D>& aX)
{
  return bool(aX);
}



namespace detail {

template<typename T>
struct UniqueSelector
{
  typedef UniquePtr<T> SingleObject;
};

template<typename T>
struct UniqueSelector<T[]>
{
  typedef UniquePtr<T[]> UnknownBound;
};

template<typename T, decltype(sizeof(int)) N>
struct UniqueSelector<T[N]>
{
  typedef UniquePtr<T[N]> KnownBound;
};

}
# 676 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UniquePtr.h"
template<typename T, typename... Args>
typename detail::UniqueSelector<T>::SingleObject
MakeUnique(Args&&... aArgs)
{
  return UniquePtr<T>(new T(Forward<Args>(aArgs)...));
}

template<typename T>
typename detail::UniqueSelector<T>::UnknownBound
MakeUnique(decltype(sizeof(int)) aN)
{
  typedef typename RemoveExtent<T>::Type ArrayType;
  return UniquePtr<T>(new ArrayType[aN]());
}

template<typename T, typename... Args>
typename detail::UniqueSelector<T>::KnownBound
MakeUnique(Args&&... aArgs) = delete;

}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TypeDecls.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TypeDecls.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TypeDecls.h" 2




struct JSContext;
class JSFunction;
class JSObject;
class JSScript;
class JSString;
class JSAddonId;

struct jsid;

namespace JS {

typedef unsigned char Latin1Char;

class Symbol;
class Value;
template <typename T> class Handle;
template <typename T> class MutableHandle;
template <typename T> class Rooted;
template <typename T> class PersistentRooted;

typedef Handle<JSFunction*> HandleFunction;
typedef Handle<jsid> HandleId;
typedef Handle<JSObject*> HandleObject;
typedef Handle<JSScript*> HandleScript;
typedef Handle<JSString*> HandleString;
typedef Handle<JS::Symbol*> HandleSymbol;
typedef Handle<Value> HandleValue;

typedef MutableHandle<JSFunction*> MutableHandleFunction;
typedef MutableHandle<jsid> MutableHandleId;
typedef MutableHandle<JSObject*> MutableHandleObject;
typedef MutableHandle<JSScript*> MutableHandleScript;
typedef MutableHandle<JSString*> MutableHandleString;
typedef MutableHandle<JS::Symbol*> MutableHandleSymbol;
typedef MutableHandle<Value> MutableHandleValue;

typedef Rooted<JSObject*> RootedObject;
typedef Rooted<JSFunction*> RootedFunction;
typedef Rooted<JSScript*> RootedScript;
typedef Rooted<JSString*> RootedString;
typedef Rooted<JS::Symbol*> RootedSymbol;
typedef Rooted<jsid> RootedId;
typedef Rooted<JS::Value> RootedValue;

typedef PersistentRooted<JSFunction*> PersistentRootedFunction;
typedef PersistentRooted<jsid> PersistentRootedId;
typedef PersistentRooted<JSObject*> PersistentRootedObject;
typedef PersistentRooted<JSScript*> PersistentRootedScript;
typedef PersistentRooted<JSString*> PersistentRootedString;
typedef PersistentRooted<JS::Symbol*> PersistentRootedSymbol;
typedef PersistentRooted<Value> PersistentRootedValue;

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h" 2


namespace js {
class BaseShape;
class LazyScript;
class ObjectGroup;
class RegExpShared;
class Shape;
class Scope;
namespace jit {
class JitCode;
}
}

namespace JS {
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h"
enum class TraceKind
{



    Object = 0x00,
    String = 0x02,
    Symbol = 0x03,


    Script = 0x01,


    Shape = 0x04,


    ObjectGroup = 0x05,


    Null = 0x06,


    BaseShape = 0x0F,
    JitCode = 0x1F,
    LazyScript = 0x2F,
    Scope = 0x3F,
    RegExpShared = 0x4F
};
const static uintptr_t OutOfLineTraceKindMask = 0x07;
static_assert(uintptr_t(JS::TraceKind::BaseShape) & OutOfLineTraceKindMask, "mask bits are set");
static_assert(uintptr_t(JS::TraceKind::JitCode) & OutOfLineTraceKindMask, "mask bits are set");
static_assert(uintptr_t(JS::TraceKind::LazyScript) & OutOfLineTraceKindMask, "mask bits are set");
static_assert(uintptr_t(JS::TraceKind::Scope) & OutOfLineTraceKindMask, "mask bits are set");
static_assert(uintptr_t(JS::TraceKind::RegExpShared) & OutOfLineTraceKindMask, "mask bits are set");




template <typename T>
struct MapTypeToTraceKind {
    static const JS::TraceKind kind = T::TraceKind;
};
# 102 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h"
template <> struct MapTypeToTraceKind<js::BaseShape> { static const JS::TraceKind kind = JS::TraceKind::BaseShape; }; template <> struct MapTypeToTraceKind<js::jit::JitCode> { static const JS::TraceKind kind = JS::TraceKind::JitCode; }; template <> struct MapTypeToTraceKind<js::LazyScript> { static const JS::TraceKind kind = JS::TraceKind::LazyScript; }; template <> struct MapTypeToTraceKind<js::Scope> { static const JS::TraceKind kind = JS::TraceKind::Scope; }; template <> struct MapTypeToTraceKind<JSObject> { static const JS::TraceKind kind = JS::TraceKind::Object; }; template <> struct MapTypeToTraceKind<js::ObjectGroup> { static const JS::TraceKind kind = JS::TraceKind::ObjectGroup; }; template <> struct MapTypeToTraceKind<JSScript> { static const JS::TraceKind kind = JS::TraceKind::Script; }; template <> struct MapTypeToTraceKind<js::Shape> { static const JS::TraceKind kind = JS::TraceKind::Shape; }; template <> struct MapTypeToTraceKind<JSString> { static const JS::TraceKind kind = JS::TraceKind::String; }; template <> struct MapTypeToTraceKind<JS::Symbol> { static const JS::TraceKind kind = JS::TraceKind::Symbol; }; template <> struct MapTypeToTraceKind<js::RegExpShared> { static const JS::TraceKind kind = JS::TraceKind::RegExpShared; };;





enum class RootKind : int8_t
{



BaseShape, JitCode, LazyScript, Scope, Object, ObjectGroup, Script, Shape, String, Symbol, RegExpShared,



    Id,
    Value,


    Traceable,

    Limit
};


template <TraceKind traceKind> struct MapTraceKindToRootKind {};




template <> struct MapTraceKindToRootKind<JS::TraceKind::BaseShape> { static const JS::RootKind kind = JS::RootKind::BaseShape; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::JitCode> { static const JS::RootKind kind = JS::RootKind::JitCode; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::LazyScript> { static const JS::RootKind kind = JS::RootKind::LazyScript; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::Scope> { static const JS::RootKind kind = JS::RootKind::Scope; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::Object> { static const JS::RootKind kind = JS::RootKind::Object; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::ObjectGroup> { static const JS::RootKind kind = JS::RootKind::ObjectGroup; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::Script> { static const JS::RootKind kind = JS::RootKind::Script; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::Shape> { static const JS::RootKind kind = JS::RootKind::Shape; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::String> { static const JS::RootKind kind = JS::RootKind::String; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::Symbol> { static const JS::RootKind kind = JS::RootKind::Symbol; }; template <> struct MapTraceKindToRootKind<JS::TraceKind::RegExpShared> { static const JS::RootKind kind = JS::RootKind::RegExpShared; };





template <typename T>
struct MapTypeToRootKind {
    static const JS::RootKind kind = JS::RootKind::Traceable;
};
template <typename T>
struct MapTypeToRootKind<T*> {
    static const JS::RootKind kind =
        JS::MapTraceKindToRootKind<JS::MapTypeToTraceKind<T>::kind>::kind;
};
template <typename T>
struct MapTypeToRootKind<mozilla::UniquePtr<T>> {
    static const JS::RootKind kind = JS::MapTypeToRootKind<T>::kind;
};
template <> struct MapTypeToRootKind<JS::Value> {
    static const JS::RootKind kind = JS::RootKind::Value;
};
template <> struct MapTypeToRootKind<jsid> {
    static const JS::RootKind kind = JS::RootKind::Id;
};
template <> struct MapTypeToRootKind<JSFunction*> : public MapTypeToRootKind<JSObject*> {};
# 183 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TraceKind.h"
template <typename F, typename... Args>
auto
DispatchTraceKindTyped(F f, JS::TraceKind traceKind, Args&&... args)
  -> decltype(f. template operator()<JSObject>(mozilla::Forward<Args>(args)...))
{
    switch (traceKind) {



      case JS::TraceKind::BaseShape: return f. template operator()<js::BaseShape>(mozilla::Forward<Args>(args)...); case JS::TraceKind::JitCode: return f. template operator()<js::jit::JitCode>(mozilla::Forward<Args>(args)...); case JS::TraceKind::LazyScript: return f. template operator()<js::LazyScript>(mozilla::Forward<Args>(args)...); case JS::TraceKind::Scope: return f. template operator()<js::Scope>(mozilla::Forward<Args>(args)...); case JS::TraceKind::Object: return f. template operator()<JSObject>(mozilla::Forward<Args>(args)...); case JS::TraceKind::ObjectGroup: return f. template operator()<js::ObjectGroup>(mozilla::Forward<Args>(args)...); case JS::TraceKind::Script: return f. template operator()<JSScript>(mozilla::Forward<Args>(args)...); case JS::TraceKind::Shape: return f. template operator()<js::Shape>(mozilla::Forward<Args>(args)...); case JS::TraceKind::String: return f. template operator()<JSString>(mozilla::Forward<Args>(args)...); case JS::TraceKind::Symbol: return f. template operator()<JS::Symbol>(mozilla::Forward<Args>(args)...); case JS::TraceKind::RegExpShared: return f. template operator()<js::RegExpShared>(mozilla::Forward<Args>(args)...);;

      default:
          do { AnnotateMozCrashReason("MOZ_CRASH(" "Invalid trace kind in DispatchTraceKindTyped." ")"); do { *((volatile int*) __null) = 195; ::abort(); } while (0); } while (0);
    }
}


template <typename F, typename... Args>
auto
DispatchTraceKindTyped(F f, void* thing, JS::TraceKind traceKind, Args&&... args)
  -> decltype(f(static_cast<JSObject*>(nullptr), mozilla::Forward<Args>(args)...))
{
    switch (traceKind) {



      case JS::TraceKind::BaseShape: return f(static_cast<js::BaseShape*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::JitCode: return f(static_cast<js::jit::JitCode*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::LazyScript: return f(static_cast<js::LazyScript*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::Scope: return f(static_cast<js::Scope*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::Object: return f(static_cast<JSObject*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::ObjectGroup: return f(static_cast<js::ObjectGroup*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::Script: return f(static_cast<JSScript*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::Shape: return f(static_cast<js::Shape*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::String: return f(static_cast<JSString*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::Symbol: return f(static_cast<JS::Symbol*>(thing), mozilla::Forward<Args>(args)...); case JS::TraceKind::RegExpShared: return f(static_cast<js::RegExpShared*>(thing), mozilla::Forward<Args>(args)...);;

      default:
          do { AnnotateMozCrashReason("MOZ_CRASH(" "Invalid trace kind in DispatchTraceKindTyped." ")"); do { *((volatile int*) __null) = 212; ::abort(); } while (0); } while (0);
    }
}

}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h" 2






namespace JS {

class AutoIdVector;
class CallArgs;

template <typename T>
class Rooted;

class CompileOptions;
class ReadOnlyCompileOptions;
class OwningCompileOptions;
class TransitiveCompileOptions;
class CompartmentOptions;

class Value;
struct Zone;

}






enum JSVersion {
    JSVERSION_ECMA_3 = 148,
    JSVERSION_1_6 = 160,
    JSVERSION_1_7 = 170,
    JSVERSION_1_8 = 180,
    JSVERSION_ECMA_5 = 185,
    JSVERSION_DEFAULT = 0,
    JSVERSION_UNKNOWN = -1,
    JSVERSION_LATEST = JSVERSION_ECMA_5
};


enum JSType {
    JSTYPE_UNDEFINED,
    JSTYPE_OBJECT,
    JSTYPE_FUNCTION,
    JSTYPE_STRING,
    JSTYPE_NUMBER,
    JSTYPE_BOOLEAN,
    JSTYPE_NULL,
    JSTYPE_SYMBOL,
    JSTYPE_LIMIT
};


enum JSProtoKey {

    JSProto_Null = 0, JSProto_Object = 1, JSProto_Function = 2, JSProto_Array = 3, JSProto_Boolean = 4, JSProto_JSON = 5, JSProto_Date = 6, JSProto_Math = 7, JSProto_Number = 8, JSProto_String = 9, JSProto_RegExp = 10, JSProto_Error = 11, JSProto_InternalError = 12, JSProto_EvalError = 13, JSProto_RangeError = 14, JSProto_ReferenceError = 15, JSProto_SyntaxError = 16, JSProto_TypeError = 17, JSProto_URIError = 18, JSProto_DebuggeeWouldRun = 19, JSProto_CompileError = 20, JSProto_LinkError = 21, JSProto_RuntimeError = 22, JSProto_Iterator = 23, JSProto_StopIteration = 24, JSProto_ArrayBuffer = 25, JSProto_Int8Array = 26, JSProto_Uint8Array = 27, JSProto_Int16Array = 28, JSProto_Uint16Array = 29, JSProto_Int32Array = 30, JSProto_Uint32Array = 31, JSProto_Float32Array = 32, JSProto_Float64Array = 33, JSProto_Uint8ClampedArray = 34, JSProto_Proxy = 35, JSProto_WeakMap = 36, JSProto_Map = 37, JSProto_Set = 38, JSProto_DataView = 39, JSProto_Symbol = 40, JSProto_SharedArrayBuffer = 41, JSProto_Intl = 42, JSProto_TypedObject = 43, JSProto_Reflect = 44, JSProto_SIMD = 45, JSProto_WeakSet = 46, JSProto_TypedArray = 47, JSProto_Atomics = 48, JSProto_SavedFrame = 49, JSProto_WebAssembly = 50, JSProto_WasmModule = 51, JSProto_WasmInstance = 52, JSProto_WasmMemory = 53, JSProto_WasmTable = 54, JSProto_Promise = 55,

    JSProto_LIMIT
};


struct JSClass;
struct JSCompartment;
struct JSCrossCompartmentCall;
class JSErrorReport;
struct JSExceptionState;
struct JSFunctionSpec;
struct JSLocaleCallbacks;
struct JSObjectMap;
struct JSPrincipals;
struct JSPropertyName;
struct JSPropertySpec;
struct JSRuntime;
struct JSSecurityCallbacks;
struct JSStructuredCloneCallbacks;
struct JSStructuredCloneReader;
struct JSStructuredCloneWriter;
class JSTracer;

class JSFlatString;

typedef bool (*JSInitCallback)(void);

template<typename T> struct JSConstScalarSpec;
typedef JSConstScalarSpec<double> JSConstDoubleSpec;
typedef JSConstScalarSpec<int32_t> JSConstIntegerSpec;





typedef void
(* JSTraceDataOp)(JSTracer* trc, void* data);

namespace js {
namespace gc {
class AutoTraceSession;
class StoreBuffer;
}

class CooperatingContext;

inline JSCompartment* GetContextCompartment(const JSContext* cx);
inline JS::Zone* GetContextZone(const JSContext* cx);



bool
CurrentThreadCanAccessRuntime(const JSRuntime* rt);






}

namespace JS {

class AutoEnterCycleCollection;
class AutoAssertOnBarrier;
struct PropertyDescriptor;

typedef void (*OffThreadCompileCallback)(void* token, void* callbackData);

enum class HeapState {
    Idle,
    Tracing,
    MajorCollecting,
    MinorCollecting,
    CycleCollecting
};

HeapState
CurrentThreadHeapState();

static inline bool
CurrentThreadIsHeapBusy()
{
    return CurrentThreadHeapState() != HeapState::Idle;
}

static inline bool
CurrentThreadIsHeapTracing()
{
    return CurrentThreadHeapState() == HeapState::Tracing;
}

static inline bool
CurrentThreadIsHeapMajorCollecting()
{
    return CurrentThreadHeapState() == HeapState::MajorCollecting;
}

static inline bool
CurrentThreadIsHeapMinorCollecting()
{
    return CurrentThreadHeapState() == HeapState::MinorCollecting;
}

static inline bool
CurrentThreadIsHeapCollecting()
{
    HeapState state = CurrentThreadHeapState();
    return state == HeapState::MajorCollecting || state == HeapState::MinorCollecting;
}

static inline bool
CurrentThreadIsHeapCycleCollecting()
{
    return CurrentThreadHeapState() == HeapState::CycleCollecting;
}



class AutoEnterCycleCollection
{







  public:
    explicit AutoEnterCycleCollection(JSContext* cx) {}
    ~AutoEnterCycleCollection() {}

};

class RootingContext;

class AutoGCRooter
{
  public:
    AutoGCRooter(JSContext* cx, ptrdiff_t tag);
    AutoGCRooter(RootingContext* cx, ptrdiff_t tag);

    ~AutoGCRooter() {
        do { } while (0);
        *stackTop = down;
    }


    inline void trace(JSTracer* trc);
    static void traceAll(const js::CooperatingContext& target, JSTracer* trc);
    static void traceAllWrappers(const js::CooperatingContext& target, JSTracer* trc);

  protected:
    AutoGCRooter * const down;
# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h"
    ptrdiff_t tag_;

    enum {
        VALARRAY = -2,
        PARSER = -3,
        VALVECTOR = -10,
        IDVECTOR = -11,
        OBJVECTOR = -14,
        IONMASM = -19,
        WRAPVECTOR = -20,
        WRAPPER = -21,
        CUSTOM = -26
    };

    static ptrdiff_t GetTag(const Value& value) { return VALVECTOR; }
    static ptrdiff_t GetTag(const jsid& id) { return IDVECTOR; }
    static ptrdiff_t GetTag(JSObject* obj) { return OBJVECTOR; }

  private:
    AutoGCRooter ** const stackTop;


    AutoGCRooter(AutoGCRooter& ida) = delete;
    void operator=(AutoGCRooter& ida) = delete;
};



template <>
struct MapTypeToRootKind<void*> {
    static const RootKind kind = RootKind::Traceable;
};

using RootedListHeads = mozilla::EnumeratedArray<RootKind, RootKind::Limit,
                                                 Rooted<void*>*>;






enum StackKind
{
    StackForSystemCode,
    StackForTrustedScript,
    StackForUntrustedScript,
    StackKindCount
};



class RootingContext
{

    RootedListHeads stackRoots_;
    template <typename T> friend class JS::Rooted;


    JS::AutoGCRooter* autoGCRooters_;
    friend class JS::AutoGCRooter;

  public:
    RootingContext();

    void traceStackRoots(JSTracer* trc);
    void checkNoGCRooters();

  protected:





    JSCompartment* compartment_;


    JS::Zone* zone_;

  public:

    uintptr_t nativeStackLimit[StackKindCount];

    static const RootingContext* get(const JSContext* cx) {
        return reinterpret_cast<const RootingContext*>(cx);
    }

    static RootingContext* get(JSContext* cx) {
        return reinterpret_cast<RootingContext*>(cx);
    }

    friend JSCompartment* js::GetContextCompartment(const JSContext* cx);
    friend JS::Zone* js::GetContextZone(const JSContext* cx);
};

}

namespace js {
# 352 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jspubtd.h"
inline JSCompartment*
GetContextCompartment(const JSContext* cx)
{
    return JS::RootingContext::get(cx)->compartment_;
}

inline JS::Zone*
GetContextZone(const JSContext* cx)
{
    return JS::RootingContext::get(cx)->zone_;
}

}

extern "C" {


typedef struct PRFileDesc PRFileDesc;

}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAnnotations.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 3
# 69 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 1 3
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
  namespace rel_ops
  {
# 85 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3
    template <class _Tp>
      inline bool
      operator!=(const _Tp& __x, const _Tp& __y)
      { return !(__x == __y); }
# 98 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3
    template <class _Tp>
      inline bool
      operator>(const _Tp& __x, const _Tp& __y)
      { return __y < __x; }
# 111 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3
    template <class _Tp>
      inline bool
      operator<=(const _Tp& __x, const _Tp& __y)
      { return !(__y < __x); }
# 124 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_relops.h" 3
    template <class _Tp>
      inline bool
      operator>=(const _Tp& __x, const _Tp& __y)
      { return !(__x < __y); }


  }

}
# 70 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/utility" 2 3








namespace std __attribute__ ((__visibility__ ("default")))
{



  template<typename _Tp>
    struct tuple_size;



  template<typename _Tp>
    struct tuple_size<const _Tp>
    : integral_constant<size_t, tuple_size<_Tp>::value> { };

  template<typename _Tp>
    struct tuple_size<volatile _Tp>
    : integral_constant<size_t, tuple_size<_Tp>::value> { };

  template<typename _Tp>
    struct tuple_size<const volatile _Tp>
    : integral_constant<size_t, tuple_size<_Tp>::value> { };


  template<std::size_t __i, typename _Tp>
    struct tuple_element;


  template<std::size_t __i, typename _Tp>
    using __tuple_element_t = typename tuple_element<__i, _Tp>::type;

  template<std::size_t __i, typename _Tp>
    struct tuple_element<__i, const _Tp>
    {
      typedef typename add_const<__tuple_element_t<__i, _Tp>>::type type;
    };

  template<std::size_t __i, typename _Tp>
    struct tuple_element<__i, volatile _Tp>
    {
      typedef typename add_volatile<__tuple_element_t<__i, _Tp>>::type type;
    };

  template<std::size_t __i, typename _Tp>
    struct tuple_element<__i, const volatile _Tp>
    {
      typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type;
    };




  template<std::size_t __i, typename _Tp>
    using tuple_element_t = typename tuple_element<__i, _Tp>::type;


  template<typename>
    struct __is_tuple_like_impl : false_type
    { };




  template<typename _T1, typename _T2>
    struct __is_tuple_like_impl<std::pair<_T1, _T2>> : true_type
    { };


  template<class _Tp1, class _Tp2>
    struct tuple_size<std::pair<_Tp1, _Tp2>>
    : public integral_constant<std::size_t, 2> { };


  template<class _Tp1, class _Tp2>
    struct tuple_element<0, std::pair<_Tp1, _Tp2>>
    { typedef _Tp1 type; };


  template<class _Tp1, class _Tp2>
    struct tuple_element<1, std::pair<_Tp1, _Tp2>>
    { typedef _Tp2 type; };

  template<std::size_t _Int>
    struct __pair_get;

  template<>
    struct __pair_get<0>
    {
      template<typename _Tp1, typename _Tp2>
        static constexpr _Tp1&
        __get(std::pair<_Tp1, _Tp2>& __pair) noexcept
        { return __pair.first; }

      template<typename _Tp1, typename _Tp2>
        static constexpr _Tp1&&
        __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept
        { return std::forward<_Tp1>(__pair.first); }

      template<typename _Tp1, typename _Tp2>
        static constexpr const _Tp1&
        __const_get(const std::pair<_Tp1, _Tp2>& __pair) noexcept
        { return __pair.first; }
    };

  template<>
    struct __pair_get<1>
    {
      template<typename _Tp1, typename _Tp2>
        static constexpr _Tp2&
        __get(std::pair<_Tp1, _Tp2>& __pair) noexcept
        { return __pair.second; }

      template<typename _Tp1, typename _Tp2>
        static constexpr _Tp2&&
        __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept
        { return std::forward<_Tp2>(__pair.second); }

      template<typename _Tp1, typename _Tp2>
        static constexpr const _Tp2&
        __const_get(const std::pair<_Tp1, _Tp2>& __pair) noexcept
        { return __pair.second; }
    };

  template<std::size_t _Int, class _Tp1, class _Tp2>
    constexpr typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&
    get(std::pair<_Tp1, _Tp2>& __in) noexcept
    { return __pair_get<_Int>::__get(__in); }

  template<std::size_t _Int, class _Tp1, class _Tp2>
    constexpr typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&&
    get(std::pair<_Tp1, _Tp2>&& __in) noexcept
    { return __pair_get<_Int>::__move_get(std::move(__in)); }

  template<std::size_t _Int, class _Tp1, class _Tp2>
    constexpr const typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&
    get(const std::pair<_Tp1, _Tp2>& __in) noexcept
    { return __pair_get<_Int>::__const_get(__in); }





  template <typename _Tp, typename _Up>
    constexpr _Tp&
    get(pair<_Tp, _Up>& __p) noexcept
    { return __p.first; }

  template <typename _Tp, typename _Up>
    constexpr const _Tp&
    get(const pair<_Tp, _Up>& __p) noexcept
    { return __p.first; }

  template <typename _Tp, typename _Up>
    constexpr _Tp&&
    get(pair<_Tp, _Up>&& __p) noexcept
    { return std::move(__p.first); }

  template <typename _Tp, typename _Up>
    constexpr _Tp&
    get(pair<_Up, _Tp>& __p) noexcept
    { return __p.second; }

  template <typename _Tp, typename _Up>
    constexpr const _Tp&
    get(const pair<_Up, _Tp>& __p) noexcept
    { return __p.second; }

  template <typename _Tp, typename _Up>
    constexpr _Tp&&
    get(pair<_Up, _Tp>&& __p) noexcept
    { return std::move(__p.second); }




  template <typename _Tp, typename _Up = _Tp>
    inline _Tp
    exchange(_Tp& __obj, _Up&& __new_val)
    { return std::__exchange(__obj, std::forward<_Up>(__new_val)); }




  template<size_t... _Indexes> struct _Index_tuple { };


  template<typename _Itup1, typename _Itup2> struct _Itup_cat;

  template<size_t... _Ind1, size_t... _Ind2>
    struct _Itup_cat<_Index_tuple<_Ind1...>, _Index_tuple<_Ind2...>>
    {
      using __type = _Index_tuple<_Ind1..., (_Ind2 + sizeof...(_Ind1))...>;
    };


  template<size_t _Num>
    struct _Build_index_tuple
    : _Itup_cat<typename _Build_index_tuple<_Num / 2>::__type,
  typename _Build_index_tuple<_Num - _Num / 2>::__type>
    { };

  template<>
    struct _Build_index_tuple<1>
    {
      typedef _Index_tuple<0> __type;
    };

  template<>
    struct _Build_index_tuple<0>
    {
      typedef _Index_tuple<> __type;
    };






  template<typename _Tp, _Tp... _Idx>
    struct integer_sequence
    {
      typedef _Tp value_type;
      static constexpr size_t size() { return sizeof...(_Idx); }
    };

  template<typename _Tp, _Tp _Num,
    typename _ISeq = typename _Build_index_tuple<_Num>::__type>
    struct _Make_integer_sequence;

  template<typename _Tp, _Tp _Num, size_t... _Idx>
    struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>>
    {
      static_assert( _Num >= 0,
       "Cannot make integer sequence of negative length" );

      typedef integer_sequence<_Tp, static_cast<_Tp>(_Idx)...> __type;
    };


  template<typename _Tp, _Tp _Num>
    using make_integer_sequence
      = typename _Make_integer_sequence<_Tp, _Num>::__type;


  template<size_t... _Idx>
    using index_sequence = integer_sequence<size_t, _Idx...>;


  template<size_t _Num>
    using make_index_sequence = make_integer_sequence<size_t, _Num>;


  template<typename... _Types>
    using index_sequence_for = make_index_sequence<sizeof...(_Types)>;



}
# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstdlib" 3
# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3








namespace std __attribute__ ((__visibility__ ("default")))
{
# 194 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3
  template<typename _IIter, typename _Predicate>
    bool
    all_of(_IIter, _IIter, _Predicate);

  template<typename _IIter, typename _Predicate>
    bool
    any_of(_IIter, _IIter, _Predicate);


  template<typename _FIter, typename _Tp>
    bool
    binary_search(_FIter, _FIter, const _Tp&);

  template<typename _FIter, typename _Tp, typename _Compare>
    bool
    binary_search(_FIter, _FIter, const _Tp&, _Compare);

  template<typename _IIter, typename _OIter>
    _OIter
    copy(_IIter, _IIter, _OIter);

  template<typename _BIter1, typename _BIter2>
    _BIter2
    copy_backward(_BIter1, _BIter1, _BIter2);


  template<typename _IIter, typename _OIter, typename _Predicate>
    _OIter
    copy_if(_IIter, _IIter, _OIter, _Predicate);

  template<typename _IIter, typename _Size, typename _OIter>
    _OIter
    copy_n(_IIter, _Size, _OIter);





  template<typename _FIter, typename _Tp>
    pair<_FIter, _FIter>
    equal_range(_FIter, _FIter, const _Tp&);

  template<typename _FIter, typename _Tp, typename _Compare>
    pair<_FIter, _FIter>
    equal_range(_FIter, _FIter, const _Tp&, _Compare);

  template<typename _FIter, typename _Tp>
    void
    fill(_FIter, _FIter, const _Tp&);

  template<typename _OIter, typename _Size, typename _Tp>
    _OIter
    fill_n(_OIter, _Size, const _Tp&);



  template<typename _FIter1, typename _FIter2>
    _FIter1
    find_end(_FIter1, _FIter1, _FIter2, _FIter2);

  template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
    _FIter1
    find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);





  template<typename _IIter, typename _Predicate>
    _IIter
    find_if_not(_IIter, _IIter, _Predicate);






  template<typename _IIter1, typename _IIter2>
    bool
    includes(_IIter1, _IIter1, _IIter2, _IIter2);

  template<typename _IIter1, typename _IIter2, typename _Compare>
    bool
    includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);

  template<typename _BIter>
    void
    inplace_merge(_BIter, _BIter, _BIter);

  template<typename _BIter, typename _Compare>
    void
    inplace_merge(_BIter, _BIter, _BIter, _Compare);


  template<typename _RAIter>
    bool
    is_heap(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    bool
    is_heap(_RAIter, _RAIter, _Compare);

  template<typename _RAIter>
    _RAIter
    is_heap_until(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    _RAIter
    is_heap_until(_RAIter, _RAIter, _Compare);

  template<typename _IIter, typename _Predicate>
    bool
    is_partitioned(_IIter, _IIter, _Predicate);

  template<typename _FIter1, typename _FIter2>
    bool
    is_permutation(_FIter1, _FIter1, _FIter2);

  template<typename _FIter1, typename _FIter2,
    typename _BinaryPredicate>
    bool
    is_permutation(_FIter1, _FIter1, _FIter2, _BinaryPredicate);

  template<typename _FIter>
    bool
    is_sorted(_FIter, _FIter);

  template<typename _FIter, typename _Compare>
    bool
    is_sorted(_FIter, _FIter, _Compare);

  template<typename _FIter>
    _FIter
    is_sorted_until(_FIter, _FIter);

  template<typename _FIter, typename _Compare>
    _FIter
    is_sorted_until(_FIter, _FIter, _Compare);


  template<typename _FIter1, typename _FIter2>
    void
    iter_swap(_FIter1, _FIter2);

  template<typename _FIter, typename _Tp>
    _FIter
    lower_bound(_FIter, _FIter, const _Tp&);

  template<typename _FIter, typename _Tp, typename _Compare>
    _FIter
    lower_bound(_FIter, _FIter, const _Tp&, _Compare);

  template<typename _RAIter>
    void
    make_heap(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    make_heap(_RAIter, _RAIter, _Compare);

  template<typename _Tp>
    constexpr
    const _Tp&
    max(const _Tp&, const _Tp&);

  template<typename _Tp, typename _Compare>
    constexpr
    const _Tp&
    max(const _Tp&, const _Tp&, _Compare);




  template<typename _Tp>
    constexpr
    const _Tp&
    min(const _Tp&, const _Tp&);

  template<typename _Tp, typename _Compare>
    constexpr
    const _Tp&
    min(const _Tp&, const _Tp&, _Compare);




  template<typename _Tp>
    constexpr
    pair<const _Tp&, const _Tp&>
    minmax(const _Tp&, const _Tp&);

  template<typename _Tp, typename _Compare>
    constexpr
    pair<const _Tp&, const _Tp&>
    minmax(const _Tp&, const _Tp&, _Compare);

  template<typename _FIter>
    constexpr
    pair<_FIter, _FIter>
    minmax_element(_FIter, _FIter);

  template<typename _FIter, typename _Compare>
    constexpr
    pair<_FIter, _FIter>
    minmax_element(_FIter, _FIter, _Compare);

  template<typename _Tp>
    constexpr
    _Tp
    min(initializer_list<_Tp>);

  template<typename _Tp, typename _Compare>
    constexpr
    _Tp
    min(initializer_list<_Tp>, _Compare);

  template<typename _Tp>
    constexpr
    _Tp
    max(initializer_list<_Tp>);

  template<typename _Tp, typename _Compare>
    constexpr
    _Tp
    max(initializer_list<_Tp>, _Compare);

  template<typename _Tp>
    constexpr
    pair<_Tp, _Tp>
    minmax(initializer_list<_Tp>);

  template<typename _Tp, typename _Compare>
    constexpr
    pair<_Tp, _Tp>
    minmax(initializer_list<_Tp>, _Compare);




  template<typename _BIter>
    bool
    next_permutation(_BIter, _BIter);

  template<typename _BIter, typename _Compare>
    bool
    next_permutation(_BIter, _BIter, _Compare);


  template<typename _IIter, typename _Predicate>
    bool
    none_of(_IIter, _IIter, _Predicate);





  template<typename _IIter, typename _RAIter>
    _RAIter
    partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);

  template<typename _IIter, typename _RAIter, typename _Compare>
    _RAIter
    partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);




  template<typename _IIter, typename _OIter1,
    typename _OIter2, typename _Predicate>
    pair<_OIter1, _OIter2>
    partition_copy(_IIter, _IIter, _OIter1, _OIter2, _Predicate);

  template<typename _FIter, typename _Predicate>
    _FIter
    partition_point(_FIter, _FIter, _Predicate);


  template<typename _RAIter>
    void
    pop_heap(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    pop_heap(_RAIter, _RAIter, _Compare);

  template<typename _BIter>
    bool
    prev_permutation(_BIter, _BIter);

  template<typename _BIter, typename _Compare>
    bool
    prev_permutation(_BIter, _BIter, _Compare);

  template<typename _RAIter>
    void
    push_heap(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    push_heap(_RAIter, _RAIter, _Compare);



  template<typename _FIter, typename _Tp>
    _FIter
    remove(_FIter, _FIter, const _Tp&);

  template<typename _FIter, typename _Predicate>
    _FIter
    remove_if(_FIter, _FIter, _Predicate);

  template<typename _IIter, typename _OIter, typename _Tp>
    _OIter
    remove_copy(_IIter, _IIter, _OIter, const _Tp&);

  template<typename _IIter, typename _OIter, typename _Predicate>
    _OIter
    remove_copy_if(_IIter, _IIter, _OIter, _Predicate);



  template<typename _IIter, typename _OIter, typename _Tp>
    _OIter
    replace_copy(_IIter, _IIter, _OIter, const _Tp&, const _Tp&);

  template<typename _Iter, typename _OIter, typename _Predicate, typename _Tp>
    _OIter
    replace_copy_if(_Iter, _Iter, _OIter, _Predicate, const _Tp&);



  template<typename _BIter>
    void
    reverse(_BIter, _BIter);

  template<typename _BIter, typename _OIter>
    _OIter
    reverse_copy(_BIter, _BIter, _OIter);

  inline namespace _V2
  {
    template<typename _FIter>
      _FIter
      rotate(_FIter, _FIter, _FIter);
  }

  template<typename _FIter, typename _OIter>
    _OIter
    rotate_copy(_FIter, _FIter, _FIter, _OIter);
# 552 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3
  template<typename _RAIter, typename _UGenerator>
    void
    shuffle(_RAIter, _RAIter, _UGenerator&&);


  template<typename _RAIter>
    void
    sort_heap(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    sort_heap(_RAIter, _RAIter, _Compare);

  template<typename _BIter, typename _Predicate>
    _BIter
    stable_partition(_BIter, _BIter, _Predicate);
# 581 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/algorithmfwd.h" 3
  template<typename _FIter1, typename _FIter2>
    _FIter2
    swap_ranges(_FIter1, _FIter1, _FIter2);



  template<typename _FIter>
    _FIter
    unique(_FIter, _FIter);

  template<typename _FIter, typename _BinaryPredicate>
    _FIter
    unique(_FIter, _FIter, _BinaryPredicate);



  template<typename _FIter, typename _Tp>
    _FIter
    upper_bound(_FIter, _FIter, const _Tp&);

  template<typename _FIter, typename _Tp, typename _Compare>
    _FIter
    upper_bound(_FIter, _FIter, const _Tp&, _Compare);





  template<typename _FIter>
    _FIter
    adjacent_find(_FIter, _FIter);

  template<typename _FIter, typename _BinaryPredicate>
    _FIter
    adjacent_find(_FIter, _FIter, _BinaryPredicate);

  template<typename _IIter, typename _Tp>
    typename iterator_traits<_IIter>::difference_type
    count(_IIter, _IIter, const _Tp&);

  template<typename _IIter, typename _Predicate>
    typename iterator_traits<_IIter>::difference_type
    count_if(_IIter, _IIter, _Predicate);

  template<typename _IIter1, typename _IIter2>
    bool
    equal(_IIter1, _IIter1, _IIter2);

  template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
    bool
    equal(_IIter1, _IIter1, _IIter2, _BinaryPredicate);

  template<typename _IIter, typename _Tp>
    _IIter
    find(_IIter, _IIter, const _Tp&);

  template<typename _FIter1, typename _FIter2>
    _FIter1
    find_first_of(_FIter1, _FIter1, _FIter2, _FIter2);

  template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
    _FIter1
    find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);

  template<typename _IIter, typename _Predicate>
    _IIter
    find_if(_IIter, _IIter, _Predicate);

  template<typename _IIter, typename _Funct>
    _Funct
    for_each(_IIter, _IIter, _Funct);

  template<typename _FIter, typename _Generator>
    void
    generate(_FIter, _FIter, _Generator);

  template<typename _OIter, typename _Size, typename _Generator>
    _OIter
    generate_n(_OIter, _Size, _Generator);

  template<typename _IIter1, typename _IIter2>
    bool
    lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);

  template<typename _IIter1, typename _IIter2, typename _Compare>
    bool
    lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);

  template<typename _FIter>
    constexpr
    _FIter
    max_element(_FIter, _FIter);

  template<typename _FIter, typename _Compare>
    constexpr
    _FIter
    max_element(_FIter, _FIter, _Compare);

  template<typename _IIter1, typename _IIter2, typename _OIter>
    _OIter
    merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);

  template<typename _IIter1, typename _IIter2, typename _OIter,
    typename _Compare>
    _OIter
    merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);

  template<typename _FIter>
    constexpr
    _FIter
    min_element(_FIter, _FIter);

  template<typename _FIter, typename _Compare>
    constexpr
    _FIter
    min_element(_FIter, _FIter, _Compare);

  template<typename _IIter1, typename _IIter2>
    pair<_IIter1, _IIter2>
    mismatch(_IIter1, _IIter1, _IIter2);

  template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
    pair<_IIter1, _IIter2>
    mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate);

  template<typename _RAIter>
    void
    nth_element(_RAIter, _RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    nth_element(_RAIter, _RAIter, _RAIter, _Compare);

  template<typename _RAIter>
    void
    partial_sort(_RAIter, _RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    partial_sort(_RAIter, _RAIter, _RAIter, _Compare);

  template<typename _BIter, typename _Predicate>
    _BIter
    partition(_BIter, _BIter, _Predicate);

  template<typename _RAIter>
    void
    random_shuffle(_RAIter, _RAIter);

  template<typename _RAIter, typename _Generator>
    void
    random_shuffle(_RAIter, _RAIter,

     _Generator&&);




  template<typename _FIter, typename _Tp>
    void
    replace(_FIter, _FIter, const _Tp&, const _Tp&);

  template<typename _FIter, typename _Predicate, typename _Tp>
    void
    replace_if(_FIter, _FIter, _Predicate, const _Tp&);

  template<typename _FIter1, typename _FIter2>
    _FIter1
    search(_FIter1, _FIter1, _FIter2, _FIter2);

  template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
    _FIter1
    search(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);

  template<typename _FIter, typename _Size, typename _Tp>
    _FIter
    search_n(_FIter, _FIter, _Size, const _Tp&);

  template<typename _FIter, typename _Size, typename _Tp,
    typename _BinaryPredicate>
    _FIter
    search_n(_FIter, _FIter, _Size, const _Tp&, _BinaryPredicate);

  template<typename _IIter1, typename _IIter2, typename _OIter>
    _OIter
    set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);

  template<typename _IIter1, typename _IIter2, typename _OIter,
    typename _Compare>
    _OIter
    set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);

  template<typename _IIter1, typename _IIter2, typename _OIter>
    _OIter
    set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);

  template<typename _IIter1, typename _IIter2, typename _OIter,
    typename _Compare>
    _OIter
    set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);

  template<typename _IIter1, typename _IIter2, typename _OIter>
    _OIter
    set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);

  template<typename _IIter1, typename _IIter2, typename _OIter,
    typename _Compare>
    _OIter
    set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2,
        _OIter, _Compare);

  template<typename _IIter1, typename _IIter2, typename _OIter>
    _OIter
    set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);

  template<typename _IIter1, typename _IIter2, typename _OIter,
    typename _Compare>
    _OIter
    set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);

  template<typename _RAIter>
    void
    sort(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    sort(_RAIter, _RAIter, _Compare);

  template<typename _RAIter>
    void
    stable_sort(_RAIter, _RAIter);

  template<typename _RAIter, typename _Compare>
    void
    stable_sort(_RAIter, _RAIter, _Compare);

  template<typename _IIter, typename _OIter, typename _UnaryOperation>
    _OIter
    transform(_IIter, _IIter, _OIter, _UnaryOperation);

  template<typename _IIter1, typename _IIter2, typename _OIter,
    typename _BinaryOperation>
    _OIter
    transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation);

  template<typename _IIter, typename _OIter>
    _OIter
    unique_copy(_IIter, _IIter, _OIter);

  template<typename _IIter, typename _OIter, typename _BinaryPredicate>
    _OIter
    unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate);


}
# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 1 3
# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{







  template<typename _RandomAccessIterator, typename _Distance,
    typename _Compare>
    _Distance
    __is_heap_until(_RandomAccessIterator __first, _Distance __n,
      _Compare __comp)
    {
      _Distance __parent = 0;
      for (_Distance __child = 1; __child < __n; ++__child)
 {
   if (__comp(__first + __parent, __first + __child))
     return __child;
   if ((__child & 1) == 0)
     ++__parent;
 }
      return __n;
    }



  template<typename _RandomAccessIterator, typename _Distance>
    inline bool
    __is_heap(_RandomAccessIterator __first, _Distance __n)
    {
      return std::__is_heap_until(__first, __n,
   __gnu_cxx::__ops::__iter_less_iter()) == __n;
    }

  template<typename _RandomAccessIterator, typename _Compare,
    typename _Distance>
    inline bool
    __is_heap(_RandomAccessIterator __first, _Compare __comp, _Distance __n)
    {
      return std::__is_heap_until(__first, __n,
 __gnu_cxx::__ops::__iter_comp_iter(__comp)) == __n;
    }

  template<typename _RandomAccessIterator>
    inline bool
    __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
    { return std::__is_heap(__first, std::distance(__first, __last)); }

  template<typename _RandomAccessIterator, typename _Compare>
    inline bool
    __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
       _Compare __comp)
    { return std::__is_heap(__first, __comp, std::distance(__first, __last)); }




  template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
    typename _Compare>
    void
    __push_heap(_RandomAccessIterator __first,
  _Distance __holeIndex, _Distance __topIndex, _Tp __value,
  _Compare __comp)
    {
      _Distance __parent = (__holeIndex - 1) / 2;
      while (__holeIndex > __topIndex && __comp(__first + __parent, __value))
 {
   *(__first + __holeIndex) = std::move(*(__first + __parent));
   __holeIndex = __parent;
   __parent = (__holeIndex - 1) / 2;
 }
      *(__first + __holeIndex) = std::move(__value);
    }
# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator>
    inline void
    push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
   _ValueType;
      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
   _DistanceType;





                                                     ;
                                                     ;
                                                  ;

      _ValueType __value = std::move(*(__last - 1));
      std::__push_heap(__first, _DistanceType((__last - __first) - 1),
         _DistanceType(0), std::move(__value),
         __gnu_cxx::__ops::__iter_less_val());
    }
# 183 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
       _Compare __comp)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
   _ValueType;
      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
   _DistanceType;




                                                     ;
                                                                  ;
                                                               ;

      _ValueType __value = std::move(*(__last - 1));
      std::__push_heap(__first, _DistanceType((__last - __first) - 1),
         _DistanceType(0), std::move(__value),
         __gnu_cxx::__ops::__iter_comp_val(__comp));
    }

  template<typename _RandomAccessIterator, typename _Distance,
    typename _Tp, typename _Compare>
    void
    __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
    _Distance __len, _Tp __value, _Compare __comp)
    {
      const _Distance __topIndex = __holeIndex;
      _Distance __secondChild = __holeIndex;
      while (__secondChild < (__len - 1) / 2)
 {
   __secondChild = 2 * (__secondChild + 1);
   if (__comp(__first + __secondChild,
       __first + (__secondChild - 1)))
     __secondChild--;
   *(__first + __holeIndex) = std::move(*(__first + __secondChild));
   __holeIndex = __secondChild;
 }
      if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
 {
   __secondChild = 2 * (__secondChild + 1);
   *(__first + __holeIndex) = std::move(*(__first + (__secondChild - 1)));

   __holeIndex = __secondChild - 1;
 }
      std::__push_heap(__first, __holeIndex, __topIndex,
         std::move(__value),
         __gnu_cxx::__ops::__iter_comp_val(__comp));
    }

  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
        _RandomAccessIterator __result, _Compare __comp)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
 _ValueType;
      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
 _DistanceType;

      _ValueType __value = std::move(*__result);
      *__result = std::move(*__first);
      std::__adjust_heap(__first, _DistanceType(0),
    _DistanceType(__last - __first),
    std::move(__value), __comp);
    }
# 263 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator>
    inline void
    pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {





                                                         ;
                                                     ;
                                                     ;
                                              ;

      if (__last - __first > 1)
 {
   --__last;
   std::__pop_heap(__first, __last, __last,
     __gnu_cxx::__ops::__iter_less_iter());
 }
    }
# 296 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    pop_heap(_RandomAccessIterator __first,
      _RandomAccessIterator __last, _Compare __comp)
    {



                                                     ;
                                                                  ;
                                                         ;
                                                           ;

      if (__last - __first > 1)
 {
   --__last;
   std::__pop_heap(__first, __last, __last,
     __gnu_cxx::__ops::__iter_comp_iter(__comp));
 }
    }

  template<typename _RandomAccessIterator, typename _Compare>
    void
    __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
  _Compare __comp)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
   _ValueType;
      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
   _DistanceType;

      if (__last - __first < 2)
 return;

      const _DistanceType __len = __last - __first;
      _DistanceType __parent = (__len - 2) / 2;
      while (true)
 {
   _ValueType __value = std::move(*(__first + __parent));
   std::__adjust_heap(__first, __parent, __len, std::move(__value),
        __comp);
   if (__parent == 0)
     return;
   __parent--;
 }
    }
# 351 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator>
    inline void
    make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {





                                                     ;
                                                     ;

      std::__make_heap(__first, __last,
         __gnu_cxx::__ops::__iter_less_iter());
    }
# 377 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
       _Compare __comp)
    {



                                                     ;
                                                                  ;

      std::__make_heap(__first, __last,
         __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _RandomAccessIterator, typename _Compare>
    void
    __sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
  _Compare __comp)
    {
      while (__last - __first > 1)
 {
   --__last;
   std::__pop_heap(__first, __last, __last, __comp);
 }
    }
# 412 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator>
    inline void
    sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {





                                                     ;
                                                     ;
                                              ;

      std::__sort_heap(__first, __last,
         __gnu_cxx::__ops::__iter_less_iter());
    }
# 439 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
       _Compare __comp)
    {



                                                     ;
                                                                  ;
                                                           ;

      std::__sort_heap(__first, __last,
         __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }
# 466 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator>
    inline _RandomAccessIterator
    is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {





                                                     ;
                                                     ;

      return __first +
 std::__is_heap_until(__first, std::distance(__first, __last),
        __gnu_cxx::__ops::__iter_less_iter());
    }
# 494 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline _RandomAccessIterator
    is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last,
    _Compare __comp)
    {



                                                     ;
                                                                  ;

      return __first
 + std::__is_heap_until(__first, std::distance(__first, __last),
          __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }
# 517 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator>
    inline bool
    is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
    { return std::is_heap_until(__first, __last) == __last; }
# 530 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_heap.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline bool
    is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
     _Compare __comp)
    { return std::is_heap_until(__first, __last, __comp) == __last; }



}
# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 1 3
# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_construct.h" 1 3
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_construct.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{







  template<typename _T1, typename... _Args>
    inline void
    _Construct(_T1* __p, _Args&&... __args)
    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
# 90 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_construct.h" 3
  template<typename _Tp>
    inline void
    _Destroy(_Tp* __pointer)
    { __pointer->~_Tp(); }

  template<bool>
    struct _Destroy_aux
    {
      template<typename _ForwardIterator>
        static void
        __destroy(_ForwardIterator __first, _ForwardIterator __last)
 {
   for (; __first != __last; ++__first)
     std::_Destroy(std::__addressof(*__first));
 }
    };

  template<>
    struct _Destroy_aux<true>
    {
      template<typename _ForwardIterator>
        static void
        __destroy(_ForwardIterator, _ForwardIterator) { }
    };






  template<typename _ForwardIterator>
    inline void
    _Destroy(_ForwardIterator __first, _ForwardIterator __last)
    {
      typedef typename iterator_traits<_ForwardIterator>::value_type
                       _Value_type;
      std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
 __destroy(__first, __last);
    }







  template<typename _ForwardIterator, typename _Allocator>
    void
    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
      _Allocator& __alloc)
    {
      typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
      for (; __first != __last; ++__first)
 __traits::destroy(__alloc, std::__addressof(*__first));
    }

  template<typename _ForwardIterator, typename _Tp>
    inline void
    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
      allocator<_Tp>&)
    {
      _Destroy(__first, __last);
    }


}
# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{
# 83 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3
  template<typename _Tp>
    pair<_Tp*, ptrdiff_t>
    get_temporary_buffer(ptrdiff_t __len) noexcept
    {
      const ptrdiff_t __max =
 __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
      if (__len > __max)
 __len = __max;

      while (__len > 0)
 {
   _Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp),
       std::nothrow));
   if (__tmp != 0)
     return std::pair<_Tp*, ptrdiff_t>(__tmp, __len);
   __len /= 2;
 }
      return std::pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0);
    }
# 110 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3
  template<typename _Tp>
    inline void
    return_temporary_buffer(_Tp* __p)
    { ::operator delete(__p, std::nothrow); }







  template<typename _ForwardIterator, typename _Tp>
    class _Temporary_buffer
    {



    public:
      typedef _Tp value_type;
      typedef value_type* pointer;
      typedef pointer iterator;
      typedef ptrdiff_t size_type;

    protected:
      size_type _M_original_len;
      size_type _M_len;
      pointer _M_buffer;

    public:

      size_type
      size() const
      { return _M_len; }


      size_type
      requested_size() const
      { return _M_original_len; }


      iterator
      begin()
      { return _M_buffer; }


      iterator
      end()
      { return _M_buffer + _M_len; }





      _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last);

      ~_Temporary_buffer()
      {
 std::_Destroy(_M_buffer, _M_buffer + _M_len);
 std::return_temporary_buffer(_M_buffer);
      }

    private:

      _Temporary_buffer(const _Temporary_buffer&);

      void
      operator=(const _Temporary_buffer&);
    };


  template<bool>
    struct __uninitialized_construct_buf_dispatch
    {
      template<typename _Pointer, typename _ForwardIterator>
        static void
        __ucr(_Pointer __first, _Pointer __last,
       _ForwardIterator __seed)
        {
   if(__first == __last)
     return;

   _Pointer __cur = __first;
   try
     {
       std::_Construct(std::__addressof(*__first),
         std::move(*__seed));
       _Pointer __prev = __cur;
       ++__cur;
       for(; __cur != __last; ++__cur, ++__prev)
  std::_Construct(std::__addressof(*__cur),
    std::move(*__prev));
       *__seed = std::move(*__prev);
     }
   catch(...)
     {
       std::_Destroy(__first, __cur);
       throw;
     }
 }
    };

  template<>
    struct __uninitialized_construct_buf_dispatch<true>
    {
      template<typename _Pointer, typename _ForwardIterator>
        static void
        __ucr(_Pointer, _Pointer, _ForwardIterator) { }
    };
# 229 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_tempbuf.h" 3
  template<typename _Pointer, typename _ForwardIterator>
    inline void
    __uninitialized_construct_buf(_Pointer __first, _Pointer __last,
      _ForwardIterator __seed)
    {
      typedef typename std::iterator_traits<_Pointer>::value_type
 _ValueType;

      std::__uninitialized_construct_buf_dispatch<
        __has_trivial_constructor(_ValueType)>::
   __ucr(__first, __last, __seed);
    }

  template<typename _ForwardIterator, typename _Tp>
    _Temporary_buffer<_ForwardIterator, _Tp>::
    _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
    : _M_original_len(std::distance(__first, __last)),
      _M_len(0), _M_buffer(0)
    {
      try
 {
   std::pair<pointer, size_type> __p(std::get_temporary_buffer<
         value_type>(_M_original_len));
   _M_buffer = __p.first;
   _M_len = __p.second;
   if (_M_buffer)
     std::__uninitialized_construct_buf(_M_buffer, _M_buffer + _M_len,
            __first);
 }
      catch(...)
 {
   std::return_temporary_buffer(_M_buffer);
   _M_buffer = 0;
   _M_len = 0;
   throw;
 }
    }


}
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 1 3
# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 1 3
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3
# 158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3
namespace std __attribute__ ((__visibility__ ("default")))
{







  enum float_round_style
  {
    round_indeterminate = -1,
    round_toward_zero = 0,
    round_to_nearest = 1,
    round_toward_infinity = 2,
    round_toward_neg_infinity = 3
  };







  enum float_denorm_style
  {

    denorm_indeterminate = -1,

    denorm_absent = 0,

    denorm_present = 1
  };
# 202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3
  struct __numeric_limits_base
  {


    static constexpr bool is_specialized = false;




    static constexpr int digits = 0;


    static constexpr int digits10 = 0;




    static constexpr int max_digits10 = 0;



    static constexpr bool is_signed = false;


    static constexpr bool is_integer = false;




    static constexpr bool is_exact = false;



    static constexpr int radix = 0;



    static constexpr int min_exponent = 0;



    static constexpr int min_exponent10 = 0;




    static constexpr int max_exponent = 0;



    static constexpr int max_exponent10 = 0;


    static constexpr bool has_infinity = false;



    static constexpr bool has_quiet_NaN = false;



    static constexpr bool has_signaling_NaN = false;


    static constexpr float_denorm_style has_denorm = denorm_absent;



    static constexpr bool has_denorm_loss = false;



    static constexpr bool is_iec559 = false;




    static constexpr bool is_bounded = false;
# 288 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3
    static constexpr bool is_modulo = false;


    static constexpr bool traps = false;


    static constexpr bool tinyness_before = false;




    static constexpr float_round_style round_style =
          round_toward_zero;
  };
# 314 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3
  template<typename _Tp>
    struct numeric_limits : public __numeric_limits_base
    {


      static constexpr _Tp
      min() noexcept { return _Tp(); }


      static constexpr _Tp
      max() noexcept { return _Tp(); }




      static constexpr _Tp
      lowest() noexcept { return _Tp(); }




      static constexpr _Tp
      epsilon() noexcept { return _Tp(); }


      static constexpr _Tp
      round_error() noexcept { return _Tp(); }


      static constexpr _Tp
      infinity() noexcept { return _Tp(); }



      static constexpr _Tp
      quiet_NaN() noexcept { return _Tp(); }



      static constexpr _Tp
      signaling_NaN() noexcept { return _Tp(); }




      static constexpr _Tp
      denorm_min() noexcept { return _Tp(); }
    };


  template<typename _Tp>
    struct numeric_limits<const _Tp>
    : public numeric_limits<_Tp> { };

  template<typename _Tp>
    struct numeric_limits<volatile _Tp>
    : public numeric_limits<_Tp> { };

  template<typename _Tp>
    struct numeric_limits<const volatile _Tp>
    : public numeric_limits<_Tp> { };






  template<>
    struct numeric_limits<bool>
    {
      static constexpr bool is_specialized = true;

      static constexpr bool
      min() noexcept { return false; }

      static constexpr bool
      max() noexcept { return true; }


      static constexpr bool
      lowest() noexcept { return min(); }

      static constexpr int digits = 1;
      static constexpr int digits10 = 0;

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = false;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr bool
      epsilon() noexcept { return false; }

      static constexpr bool
      round_error() noexcept { return false; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr bool
      infinity() noexcept { return false; }

      static constexpr bool
      quiet_NaN() noexcept { return false; }

      static constexpr bool
      signaling_NaN() noexcept { return false; }

      static constexpr bool
      denorm_min() noexcept { return false; }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;




      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<char>
    {
      static constexpr bool is_specialized = true;

      static constexpr char
      min() noexcept { return (((char)(-1) < 0) ? -(((char)(-1) < 0) ? (((((char)1 << ((sizeof(char) * 8 - ((char)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char)0) - 1 : (char)0); }

      static constexpr char
      max() noexcept { return (((char)(-1) < 0) ? (((((char)1 << ((sizeof(char) * 8 - ((char)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char)0); }


      static constexpr char
      lowest() noexcept { return min(); }


      static constexpr int digits = (sizeof(char) * 8 - ((char)(-1) < 0));
      static constexpr int digits10 = ((sizeof(char) * 8 - ((char)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = ((char)(-1) < 0);
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr char
      epsilon() noexcept { return 0; }

      static constexpr char
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr
      char infinity() noexcept { return char(); }

      static constexpr char
      quiet_NaN() noexcept { return char(); }

      static constexpr char
      signaling_NaN() noexcept { return char(); }

      static constexpr char
      denorm_min() noexcept { return static_cast<char>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = !is_signed;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<signed char>
    {
      static constexpr bool is_specialized = true;

      static constexpr signed char
      min() noexcept { return -127 - 1; }

      static constexpr signed char
      max() noexcept { return 127; }


      static constexpr signed char
      lowest() noexcept { return min(); }


      static constexpr int digits = (sizeof(signed char) * 8 - ((signed char)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(signed char) * 8 - ((signed char)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr signed char
      epsilon() noexcept { return 0; }

      static constexpr signed char
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr signed char
      infinity() noexcept { return static_cast<signed char>(0); }

      static constexpr signed char
      quiet_NaN() noexcept { return static_cast<signed char>(0); }

      static constexpr signed char
      signaling_NaN() noexcept
      { return static_cast<signed char>(0); }

      static constexpr signed char
      denorm_min() noexcept
      { return static_cast<signed char>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<unsigned char>
    {
      static constexpr bool is_specialized = true;

      static constexpr unsigned char
      min() noexcept { return 0; }

      static constexpr unsigned char
      max() noexcept { return 127 * 2U + 1; }


      static constexpr unsigned char
      lowest() noexcept { return min(); }


      static constexpr int digits
       = (sizeof(unsigned char) * 8 - ((unsigned char)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(unsigned char) * 8 - ((unsigned char)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = false;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr unsigned char
      epsilon() noexcept { return 0; }

      static constexpr unsigned char
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr unsigned char
      infinity() noexcept
      { return static_cast<unsigned char>(0); }

      static constexpr unsigned char
      quiet_NaN() noexcept
      { return static_cast<unsigned char>(0); }

      static constexpr unsigned char
      signaling_NaN() noexcept
      { return static_cast<unsigned char>(0); }

      static constexpr unsigned char
      denorm_min() noexcept
      { return static_cast<unsigned char>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = true;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<wchar_t>
    {
      static constexpr bool is_specialized = true;

      static constexpr wchar_t
      min() noexcept { return (((wchar_t)(-1) < 0) ? -(((wchar_t)(-1) < 0) ? (((((wchar_t)1 << ((sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(wchar_t)0) - 1 : (wchar_t)0); }

      static constexpr wchar_t
      max() noexcept { return (((wchar_t)(-1) < 0) ? (((((wchar_t)1 << ((sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(wchar_t)0); }


      static constexpr wchar_t
      lowest() noexcept { return min(); }


      static constexpr int digits = (sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(wchar_t) * 8 - ((wchar_t)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = ((wchar_t)(-1) < 0);
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr wchar_t
      epsilon() noexcept { return 0; }

      static constexpr wchar_t
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr wchar_t
      infinity() noexcept { return wchar_t(); }

      static constexpr wchar_t
      quiet_NaN() noexcept { return wchar_t(); }

      static constexpr wchar_t
      signaling_NaN() noexcept { return wchar_t(); }

      static constexpr wchar_t
      denorm_min() noexcept { return wchar_t(); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = !is_signed;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };



  template<>
    struct numeric_limits<char16_t>
    {
      static constexpr bool is_specialized = true;

      static constexpr char16_t
      min() noexcept { return (((char16_t)(-1) < 0) ? -(((char16_t)(-1) < 0) ? (((((char16_t)1 << ((sizeof(char16_t) * 8 - ((char16_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char16_t)0) - 1 : (char16_t)0); }

      static constexpr char16_t
      max() noexcept { return (((char16_t)(-1) < 0) ? (((((char16_t)1 << ((sizeof(char16_t) * 8 - ((char16_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char16_t)0); }

      static constexpr char16_t
      lowest() noexcept { return min(); }

      static constexpr int digits = (sizeof(char16_t) * 8 - ((char16_t)(-1) < 0));
      static constexpr int digits10 = ((sizeof(char16_t) * 8 - ((char16_t)(-1) < 0)) * 643L / 2136);
      static constexpr int max_digits10 = 0;
      static constexpr bool is_signed = ((char16_t)(-1) < 0);
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr char16_t
      epsilon() noexcept { return 0; }

      static constexpr char16_t
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr char16_t
      infinity() noexcept { return char16_t(); }

      static constexpr char16_t
      quiet_NaN() noexcept { return char16_t(); }

      static constexpr char16_t
      signaling_NaN() noexcept { return char16_t(); }

      static constexpr char16_t
      denorm_min() noexcept { return char16_t(); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = !is_signed;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style = round_toward_zero;
    };


  template<>
    struct numeric_limits<char32_t>
    {
      static constexpr bool is_specialized = true;

      static constexpr char32_t
      min() noexcept { return (((char32_t)(-1) < 0) ? -(((char32_t)(-1) < 0) ? (((((char32_t)1 << ((sizeof(char32_t) * 8 - ((char32_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char32_t)0) - 1 : (char32_t)0); }

      static constexpr char32_t
      max() noexcept { return (((char32_t)(-1) < 0) ? (((((char32_t)1 << ((sizeof(char32_t) * 8 - ((char32_t)(-1) < 0)) - 1)) - 1) << 1) + 1) : ~(char32_t)0); }

      static constexpr char32_t
      lowest() noexcept { return min(); }

      static constexpr int digits = (sizeof(char32_t) * 8 - ((char32_t)(-1) < 0));
      static constexpr int digits10 = ((sizeof(char32_t) * 8 - ((char32_t)(-1) < 0)) * 643L / 2136);
      static constexpr int max_digits10 = 0;
      static constexpr bool is_signed = ((char32_t)(-1) < 0);
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr char32_t
      epsilon() noexcept { return 0; }

      static constexpr char32_t
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr char32_t
      infinity() noexcept { return char32_t(); }

      static constexpr char32_t
      quiet_NaN() noexcept { return char32_t(); }

      static constexpr char32_t
      signaling_NaN() noexcept { return char32_t(); }

      static constexpr char32_t
      denorm_min() noexcept { return char32_t(); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = !is_signed;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style = round_toward_zero;
    };



  template<>
    struct numeric_limits<short>
    {
      static constexpr bool is_specialized = true;

      static constexpr short
      min() noexcept { return -32767 - 1; }

      static constexpr short
      max() noexcept { return 32767; }


      static constexpr short
      lowest() noexcept { return min(); }


      static constexpr int digits = (sizeof(short) * 8 - ((short)(-1) < 0));
      static constexpr int digits10 = ((sizeof(short) * 8 - ((short)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr short
      epsilon() noexcept { return 0; }

      static constexpr short
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr short
      infinity() noexcept { return short(); }

      static constexpr short
      quiet_NaN() noexcept { return short(); }

      static constexpr short
      signaling_NaN() noexcept { return short(); }

      static constexpr short
      denorm_min() noexcept { return short(); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<unsigned short>
    {
      static constexpr bool is_specialized = true;

      static constexpr unsigned short
      min() noexcept { return 0; }

      static constexpr unsigned short
      max() noexcept { return 32767 * 2U + 1; }


      static constexpr unsigned short
      lowest() noexcept { return min(); }


      static constexpr int digits
       = (sizeof(unsigned short) * 8 - ((unsigned short)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(unsigned short) * 8 - ((unsigned short)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = false;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr unsigned short
      epsilon() noexcept { return 0; }

      static constexpr unsigned short
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr unsigned short
      infinity() noexcept
      { return static_cast<unsigned short>(0); }

      static constexpr unsigned short
      quiet_NaN() noexcept
      { return static_cast<unsigned short>(0); }

      static constexpr unsigned short
      signaling_NaN() noexcept
      { return static_cast<unsigned short>(0); }

      static constexpr unsigned short
      denorm_min() noexcept
      { return static_cast<unsigned short>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = true;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<int>
    {
      static constexpr bool is_specialized = true;

      static constexpr int
      min() noexcept { return -2147483647 - 1; }

      static constexpr int
      max() noexcept { return 2147483647; }


      static constexpr int
      lowest() noexcept { return min(); }


      static constexpr int digits = (sizeof(int) * 8 - ((int)(-1) < 0));
      static constexpr int digits10 = ((sizeof(int) * 8 - ((int)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr int
      epsilon() noexcept { return 0; }

      static constexpr int
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr int
      infinity() noexcept { return static_cast<int>(0); }

      static constexpr int
      quiet_NaN() noexcept { return static_cast<int>(0); }

      static constexpr int
      signaling_NaN() noexcept { return static_cast<int>(0); }

      static constexpr int
      denorm_min() noexcept { return static_cast<int>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<unsigned int>
    {
      static constexpr bool is_specialized = true;

      static constexpr unsigned int
      min() noexcept { return 0; }

      static constexpr unsigned int
      max() noexcept { return 2147483647 * 2U + 1; }


      static constexpr unsigned int
      lowest() noexcept { return min(); }


      static constexpr int digits
       = (sizeof(unsigned int) * 8 - ((unsigned int)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(unsigned int) * 8 - ((unsigned int)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = false;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr unsigned int
      epsilon() noexcept { return 0; }

      static constexpr unsigned int
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr unsigned int
      infinity() noexcept { return static_cast<unsigned int>(0); }

      static constexpr unsigned int
      quiet_NaN() noexcept
      { return static_cast<unsigned int>(0); }

      static constexpr unsigned int
      signaling_NaN() noexcept
      { return static_cast<unsigned int>(0); }

      static constexpr unsigned int
      denorm_min() noexcept
      { return static_cast<unsigned int>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = true;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<long>
    {
      static constexpr bool is_specialized = true;

      static constexpr long
      min() noexcept { return -9223372036854775807L - 1; }

      static constexpr long
      max() noexcept { return 9223372036854775807L; }


      static constexpr long
      lowest() noexcept { return min(); }


      static constexpr int digits = (sizeof(long) * 8 - ((long)(-1) < 0));
      static constexpr int digits10 = ((sizeof(long) * 8 - ((long)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr long
      epsilon() noexcept { return 0; }

      static constexpr long
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr long
      infinity() noexcept { return static_cast<long>(0); }

      static constexpr long
      quiet_NaN() noexcept { return static_cast<long>(0); }

      static constexpr long
      signaling_NaN() noexcept { return static_cast<long>(0); }

      static constexpr long
      denorm_min() noexcept { return static_cast<long>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<unsigned long>
    {
      static constexpr bool is_specialized = true;

      static constexpr unsigned long
      min() noexcept { return 0; }

      static constexpr unsigned long
      max() noexcept { return 9223372036854775807L * 2UL + 1; }


      static constexpr unsigned long
      lowest() noexcept { return min(); }


      static constexpr int digits
       = (sizeof(unsigned long) * 8 - ((unsigned long)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(unsigned long) * 8 - ((unsigned long)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = false;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr unsigned long
      epsilon() noexcept { return 0; }

      static constexpr unsigned long
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr unsigned long
      infinity() noexcept
      { return static_cast<unsigned long>(0); }

      static constexpr unsigned long
      quiet_NaN() noexcept
      { return static_cast<unsigned long>(0); }

      static constexpr unsigned long
      signaling_NaN() noexcept
      { return static_cast<unsigned long>(0); }

      static constexpr unsigned long
      denorm_min() noexcept
      { return static_cast<unsigned long>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = true;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<long long>
    {
      static constexpr bool is_specialized = true;

      static constexpr long long
      min() noexcept { return -9223372036854775807LL - 1; }

      static constexpr long long
      max() noexcept { return 9223372036854775807LL; }


      static constexpr long long
      lowest() noexcept { return min(); }


      static constexpr int digits
       = (sizeof(long long) * 8 - ((long long)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(long long) * 8 - ((long long)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr long long
      epsilon() noexcept { return 0; }

      static constexpr long long
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr long long
      infinity() noexcept { return static_cast<long long>(0); }

      static constexpr long long
      quiet_NaN() noexcept { return static_cast<long long>(0); }

      static constexpr long long
      signaling_NaN() noexcept
      { return static_cast<long long>(0); }

      static constexpr long long
      denorm_min() noexcept { return static_cast<long long>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };


  template<>
    struct numeric_limits<unsigned long long>
    {
      static constexpr bool is_specialized = true;

      static constexpr unsigned long long
      min() noexcept { return 0; }

      static constexpr unsigned long long
      max() noexcept { return 9223372036854775807LL * 2ULL + 1; }


      static constexpr unsigned long long
      lowest() noexcept { return min(); }


      static constexpr int digits
       = (sizeof(unsigned long long) * 8 - ((unsigned long long)(-1) < 0));
      static constexpr int digits10
       = ((sizeof(unsigned long long) * 8 - ((unsigned long long)(-1) < 0)) * 643L / 2136);

      static constexpr int max_digits10 = 0;

      static constexpr bool is_signed = false;
      static constexpr bool is_integer = true;
      static constexpr bool is_exact = true;
      static constexpr int radix = 2;

      static constexpr unsigned long long
      epsilon() noexcept { return 0; }

      static constexpr unsigned long long
      round_error() noexcept { return 0; }

      static constexpr int min_exponent = 0;
      static constexpr int min_exponent10 = 0;
      static constexpr int max_exponent = 0;
      static constexpr int max_exponent10 = 0;

      static constexpr bool has_infinity = false;
      static constexpr bool has_quiet_NaN = false;
      static constexpr bool has_signaling_NaN = false;
      static constexpr float_denorm_style has_denorm
       = denorm_absent;
      static constexpr bool has_denorm_loss = false;

      static constexpr unsigned long long
      infinity() noexcept
      { return static_cast<unsigned long long>(0); }

      static constexpr unsigned long long
      quiet_NaN() noexcept
      { return static_cast<unsigned long long>(0); }

      static constexpr unsigned long long
      signaling_NaN() noexcept
      { return static_cast<unsigned long long>(0); }

      static constexpr unsigned long long
      denorm_min() noexcept
      { return static_cast<unsigned long long>(0); }

      static constexpr bool is_iec559 = false;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = true;

      static constexpr bool traps = true;
      static constexpr bool tinyness_before = false;
      static constexpr float_round_style round_style
       = round_toward_zero;
    };
# 1592 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/limits" 3
  template<>
    struct numeric_limits<float>
    {
      static constexpr bool is_specialized = true;

      static constexpr float
      min() noexcept { return 1.17549435e-38F; }

      static constexpr float
      max() noexcept { return 3.40282347e+38F; }


      static constexpr float
      lowest() noexcept { return -3.40282347e+38F; }


      static constexpr int digits = 24;
      static constexpr int digits10 = 6;

      static constexpr int max_digits10
  = (2 + (24) * 643L / 2136);

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = false;
      static constexpr bool is_exact = false;
      static constexpr int radix = 2;

      static constexpr float
      epsilon() noexcept { return 1.19209290e-7F; }

      static constexpr float
      round_error() noexcept { return 0.5F; }

      static constexpr int min_exponent = (-125);
      static constexpr int min_exponent10 = (-37);
      static constexpr int max_exponent = 128;
      static constexpr int max_exponent10 = 38;

      static constexpr bool has_infinity = 1;
      static constexpr bool has_quiet_NaN = 1;
      static constexpr bool has_signaling_NaN = has_quiet_NaN;
      static constexpr float_denorm_style has_denorm
 = bool(1) ? denorm_present : denorm_absent;
      static constexpr bool has_denorm_loss
       = false;

      static constexpr float
      infinity() noexcept { return __builtin_huge_valf(); }

      static constexpr float
      quiet_NaN() noexcept { return __builtin_nanf(""); }

      static constexpr float
      signaling_NaN() noexcept { return __builtin_nansf(""); }

      static constexpr float
      denorm_min() noexcept { return 1.40129846e-45F; }

      static constexpr bool is_iec559
 = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = false;
      static constexpr bool tinyness_before
       = false;
      static constexpr float_round_style round_style
       = round_to_nearest;
    };






  template<>
    struct numeric_limits<double>
    {
      static constexpr bool is_specialized = true;

      static constexpr double
      min() noexcept { return 2.2250738585072014e-308; }

      static constexpr double
      max() noexcept { return 1.7976931348623157e+308; }


      static constexpr double
      lowest() noexcept { return -1.7976931348623157e+308; }


      static constexpr int digits = 53;
      static constexpr int digits10 = 15;

      static constexpr int max_digits10
  = (2 + (53) * 643L / 2136);

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = false;
      static constexpr bool is_exact = false;
      static constexpr int radix = 2;

      static constexpr double
      epsilon() noexcept { return 2.2204460492503131e-16; }

      static constexpr double
      round_error() noexcept { return 0.5; }

      static constexpr int min_exponent = (-1021);
      static constexpr int min_exponent10 = (-307);
      static constexpr int max_exponent = 1024;
      static constexpr int max_exponent10 = 308;

      static constexpr bool has_infinity = 1;
      static constexpr bool has_quiet_NaN = 1;
      static constexpr bool has_signaling_NaN = has_quiet_NaN;
      static constexpr float_denorm_style has_denorm
 = bool(1) ? denorm_present : denorm_absent;
      static constexpr bool has_denorm_loss
        = false;

      static constexpr double
      infinity() noexcept { return __builtin_huge_val(); }

      static constexpr double
      quiet_NaN() noexcept { return __builtin_nan(""); }

      static constexpr double
      signaling_NaN() noexcept { return __builtin_nans(""); }

      static constexpr double
      denorm_min() noexcept { return 4.9406564584124654e-324; }

      static constexpr bool is_iec559
 = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = false;
      static constexpr bool tinyness_before
       = false;
      static constexpr float_round_style round_style
       = round_to_nearest;
    };






  template<>
    struct numeric_limits<long double>
    {
      static constexpr bool is_specialized = true;

      static constexpr long double
      min() noexcept { return 3.36210314311209350626e-4932L; }

      static constexpr long double
      max() noexcept { return 1.18973149535723176502e+4932L; }


      static constexpr long double
      lowest() noexcept { return -1.18973149535723176502e+4932L; }


      static constexpr int digits = 64;
      static constexpr int digits10 = 18;

      static constexpr int max_digits10
  = (2 + (64) * 643L / 2136);

      static constexpr bool is_signed = true;
      static constexpr bool is_integer = false;
      static constexpr bool is_exact = false;
      static constexpr int radix = 2;

      static constexpr long double
      epsilon() noexcept { return 1.08420217248550443401e-19L; }

      static constexpr long double
      round_error() noexcept { return 0.5L; }

      static constexpr int min_exponent = (-16381);
      static constexpr int min_exponent10 = (-4931);
      static constexpr int max_exponent = 16384;
      static constexpr int max_exponent10 = 4932;

      static constexpr bool has_infinity = 1;
      static constexpr bool has_quiet_NaN = 1;
      static constexpr bool has_signaling_NaN = has_quiet_NaN;
      static constexpr float_denorm_style has_denorm
 = bool(1) ? denorm_present : denorm_absent;
      static constexpr bool has_denorm_loss
 = false;

      static constexpr long double
      infinity() noexcept { return __builtin_huge_vall(); }

      static constexpr long double
      quiet_NaN() noexcept { return __builtin_nanl(""); }

      static constexpr long double
      signaling_NaN() noexcept { return __builtin_nansl(""); }

      static constexpr long double
      denorm_min() noexcept { return 3.64519953188247460253e-4951L; }

      static constexpr bool is_iec559
 = has_infinity && has_quiet_NaN && has_denorm == denorm_present;
      static constexpr bool is_bounded = true;
      static constexpr bool is_modulo = false;

      static constexpr bool traps = false;
      static constexpr bool tinyness_before =
      false;
      static constexpr float_round_style round_style =
            round_to_nearest;
    };






}
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{

  namespace __detail
  {


    template<typename _Tp>
      inline bool
      _Power_of_2(_Tp __x)
      {
 return ((__x - 1) & __x) == 0;
      };

  }
# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3
  template<typename _IntType = int>
    class uniform_int_distribution
    {
      static_assert(std::is_integral<_IntType>::value,
      "template argument not an integral type");

    public:

      typedef _IntType result_type;

      struct param_type
      {
 typedef uniform_int_distribution<_IntType> distribution_type;

 explicit
 param_type(_IntType __a = 0,
     _IntType __b = std::numeric_limits<_IntType>::max())
 : _M_a(__a), _M_b(__b)
 {
                                 ;
 }

 result_type
 a() const
 { return _M_a; }

 result_type
 b() const
 { return _M_b; }

 friend bool
 operator==(const param_type& __p1, const param_type& __p2)
 { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }

      private:
 _IntType _M_a;
 _IntType _M_b;
      };

    public:



      explicit
      uniform_int_distribution(_IntType __a = 0,
      _IntType __b = std::numeric_limits<_IntType>::max())
      : _M_param(__a, __b)
      { }

      explicit
      uniform_int_distribution(const param_type& __p)
      : _M_param(__p)
      { }






      void
      reset() { }

      result_type
      a() const
      { return _M_param.a(); }

      result_type
      b() const
      { return _M_param.b(); }




      param_type
      param() const
      { return _M_param; }





      void
      param(const param_type& __param)
      { _M_param = __param; }




      result_type
      min() const
      { return this->a(); }




      result_type
      max() const
      { return this->b(); }




      template<typename _UniformRandomNumberGenerator>
 result_type
 operator()(_UniformRandomNumberGenerator& __urng)
        { return this->operator()(__urng, _M_param); }

      template<typename _UniformRandomNumberGenerator>
 result_type
 operator()(_UniformRandomNumberGenerator& __urng,
     const param_type& __p);

      template<typename _ForwardIterator,
        typename _UniformRandomNumberGenerator>
 void
 __generate(_ForwardIterator __f, _ForwardIterator __t,
     _UniformRandomNumberGenerator& __urng)
 { this->__generate(__f, __t, __urng, _M_param); }

      template<typename _ForwardIterator,
        typename _UniformRandomNumberGenerator>
 void
 __generate(_ForwardIterator __f, _ForwardIterator __t,
     _UniformRandomNumberGenerator& __urng,
     const param_type& __p)
 { this->__generate_impl(__f, __t, __urng, __p); }

      template<typename _UniformRandomNumberGenerator>
 void
 __generate(result_type* __f, result_type* __t,
     _UniformRandomNumberGenerator& __urng,
     const param_type& __p)
 { this->__generate_impl(__f, __t, __urng, __p); }





      friend bool
      operator==(const uniform_int_distribution& __d1,
   const uniform_int_distribution& __d2)
      { return __d1._M_param == __d2._M_param; }

    private:
      template<typename _ForwardIterator,
        typename _UniformRandomNumberGenerator>
 void
 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
   _UniformRandomNumberGenerator& __urng,
   const param_type& __p);

      param_type _M_param;
    };

  template<typename _IntType>
    template<typename _UniformRandomNumberGenerator>
      typename uniform_int_distribution<_IntType>::result_type
      uniform_int_distribution<_IntType>::
      operator()(_UniformRandomNumberGenerator& __urng,
   const param_type& __param)
      {
 typedef typename _UniformRandomNumberGenerator::result_type
   _Gresult_type;
 typedef typename std::make_unsigned<result_type>::type __utype;
 typedef typename std::common_type<_Gresult_type, __utype>::type
   __uctype;

 const __uctype __urngmin = __urng.min();
 const __uctype __urngmax = __urng.max();
 const __uctype __urngrange = __urngmax - __urngmin;
 const __uctype __urange
   = __uctype(__param.b()) - __uctype(__param.a());

 __uctype __ret;

 if (__urngrange > __urange)
   {

     const __uctype __uerange = __urange + 1;
     const __uctype __scaling = __urngrange / __uerange;
     const __uctype __past = __uerange * __scaling;
     do
       __ret = __uctype(__urng()) - __urngmin;
     while (__ret >= __past);
     __ret /= __scaling;
   }
 else if (__urngrange < __urange)
   {
# 263 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3
     __uctype __tmp;
     do
       {
  const __uctype __uerngrange = __urngrange + 1;
  __tmp = (__uerngrange * operator()
    (__urng, param_type(0, __urange / __uerngrange)));
  __ret = __tmp + (__uctype(__urng()) - __urngmin);
       }
     while (__ret > __urange || __ret < __tmp);
   }
 else
   __ret = __uctype(__urng()) - __urngmin;

 return __ret + __param.a();
      }


  template<typename _IntType>
    template<typename _ForwardIterator,
      typename _UniformRandomNumberGenerator>
      void
      uniform_int_distribution<_IntType>::
      __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
        _UniformRandomNumberGenerator& __urng,
        const param_type& __param)
      {

 typedef typename _UniformRandomNumberGenerator::result_type
   _Gresult_type;
 typedef typename std::make_unsigned<result_type>::type __utype;
 typedef typename std::common_type<_Gresult_type, __utype>::type
   __uctype;

 const __uctype __urngmin = __urng.min();
 const __uctype __urngmax = __urng.max();
 const __uctype __urngrange = __urngmax - __urngmin;
 const __uctype __urange
   = __uctype(__param.b()) - __uctype(__param.a());

 __uctype __ret;

 if (__urngrange > __urange)
   {
     if (__detail::_Power_of_2(__urngrange + 1)
  && __detail::_Power_of_2(__urange + 1))
       {
  while (__f != __t)
    {
      __ret = __uctype(__urng()) - __urngmin;
      *__f++ = (__ret & __urange) + __param.a();
    }
       }
     else
       {

  const __uctype __uerange = __urange + 1;
  const __uctype __scaling = __urngrange / __uerange;
  const __uctype __past = __uerange * __scaling;
  while (__f != __t)
    {
      do
        __ret = __uctype(__urng()) - __urngmin;
      while (__ret >= __past);
      *__f++ = __ret / __scaling + __param.a();
    }
       }
   }
 else if (__urngrange < __urange)
   {
# 347 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uniform_int_dist.h" 3
     __uctype __tmp;
     while (__f != __t)
       {
  do
    {
      const __uctype __uerngrange = __urngrange + 1;
      __tmp = (__uerngrange * operator()
        (__urng, param_type(0, __urange / __uerngrange)));
      __ret = __tmp + (__uctype(__urng()) - __urngmin);
    }
  while (__ret > __urange || __ret < __tmp);
  *__f++ = __ret;
       }
   }
 else
   while (__f != __t)
     *__f++ = __uctype(__urng()) - __urngmin + __param.a();
      }


}
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 2 3




namespace std __attribute__ ((__visibility__ ("default")))
{



  template<typename _Iterator, typename _Compare>
    void
    __move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b,
      _Iterator __c, _Compare __comp)
    {
      if (__comp(__a, __b))
 {
   if (__comp(__b, __c))
     std::iter_swap(__result, __b);
   else if (__comp(__a, __c))
     std::iter_swap(__result, __c);
   else
     std::iter_swap(__result, __a);
 }
      else if (__comp(__a, __c))
 std::iter_swap(__result, __a);
      else if (__comp(__b, __c))
 std::iter_swap(__result, __c);
      else
 std::iter_swap(__result, __b);
    }


  template<typename _InputIterator, typename _Predicate>
    inline _InputIterator
    __find_if(_InputIterator __first, _InputIterator __last,
       _Predicate __pred, input_iterator_tag)
    {
      while (__first != __last && !__pred(__first))
 ++__first;
      return __first;
    }


  template<typename _RandomAccessIterator, typename _Predicate>
    _RandomAccessIterator
    __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
       _Predicate __pred, random_access_iterator_tag)
    {
      typename iterator_traits<_RandomAccessIterator>::difference_type
 __trip_count = (__last - __first) >> 2;

      for (; __trip_count > 0; --__trip_count)
 {
   if (__pred(__first))
     return __first;
   ++__first;

   if (__pred(__first))
     return __first;
   ++__first;

   if (__pred(__first))
     return __first;
   ++__first;

   if (__pred(__first))
     return __first;
   ++__first;
 }

      switch (__last - __first)
 {
 case 3:
   if (__pred(__first))
     return __first;
   ++__first;
 case 2:
   if (__pred(__first))
     return __first;
   ++__first;
 case 1:
   if (__pred(__first))
     return __first;
   ++__first;
 case 0:
 default:
   return __last;
 }
    }

  template<typename _Iterator, typename _Predicate>
    inline _Iterator
    __find_if(_Iterator __first, _Iterator __last, _Predicate __pred)
    {
      return __find_if(__first, __last, __pred,
         std::__iterator_category(__first));
    }


  template<typename _InputIterator, typename _Predicate>
    inline _InputIterator
    __find_if_not(_InputIterator __first, _InputIterator __last,
    _Predicate __pred)
    {
      return std::__find_if(__first, __last,
       __gnu_cxx::__ops::__negate(__pred),
       std::__iterator_category(__first));
    }




  template<typename _InputIterator, typename _Predicate, typename _Distance>
    _InputIterator
    __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred)
    {
      for (; __len; --__len, ++__first)
 if (!__pred(__first))
   break;
      return __first;
    }
# 202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    _ForwardIterator1
    __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
      _ForwardIterator2 __first2, _ForwardIterator2 __last2,
      _BinaryPredicate __predicate)
    {

      if (__first1 == __last1 || __first2 == __last2)
 return __first1;


      _ForwardIterator2 __p1(__first2);
      if (++__p1 == __last2)
 return std::__find_if(__first1, __last1,
  __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));


      _ForwardIterator2 __p;
      _ForwardIterator1 __current = __first1;

      for (;;)
 {
   __first1 =
     std::__find_if(__first1, __last1,
  __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));

   if (__first1 == __last1)
     return __last1;

   __p = __p1;
   __current = __first1;
   if (++__current == __last1)
     return __last1;

   while (__predicate(__current, __p))
     {
       if (++__p == __last2)
  return __first1;
       if (++__current == __last1)
  return __last1;
     }
   ++__first1;
 }
      return __first1;
    }






  template<typename _ForwardIterator, typename _Integer,
    typename _UnaryPredicate>
    _ForwardIterator
    __search_n_aux(_ForwardIterator __first, _ForwardIterator __last,
     _Integer __count, _UnaryPredicate __unary_pred,
     std::forward_iterator_tag)
    {
      __first = std::__find_if(__first, __last, __unary_pred);
      while (__first != __last)
 {
   typename iterator_traits<_ForwardIterator>::difference_type
     __n = __count;
   _ForwardIterator __i = __first;
   ++__i;
   while (__i != __last && __n != 1 && __unary_pred(__i))
     {
       ++__i;
       --__n;
     }
   if (__n == 1)
     return __first;
   if (__i == __last)
     return __last;
   __first = std::__find_if(++__i, __last, __unary_pred);
 }
      return __last;
    }





  template<typename _RandomAccessIter, typename _Integer,
    typename _UnaryPredicate>
    _RandomAccessIter
    __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last,
     _Integer __count, _UnaryPredicate __unary_pred,
     std::random_access_iterator_tag)
    {
      typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
 _DistanceType;

      _DistanceType __tailSize = __last - __first;
      _DistanceType __remainder = __count;

      while (__remainder <= __tailSize)
 {
   __first += __remainder;
   __tailSize -= __remainder;


   _RandomAccessIter __backTrack = __first;
   while (__unary_pred(--__backTrack))
     {
       if (--__remainder == 0)
  return (__first - __count);
     }
   __remainder = __count + 1 - (__first - __backTrack);
 }
      return __last;
    }

  template<typename _ForwardIterator, typename _Integer,
    typename _UnaryPredicate>
    _ForwardIterator
    __search_n(_ForwardIterator __first, _ForwardIterator __last,
        _Integer __count,
        _UnaryPredicate __unary_pred)
    {
      if (__count <= 0)
 return __first;

      if (__count == 1)
 return std::__find_if(__first, __last, __unary_pred);

      return std::__search_n_aux(__first, __last, __count, __unary_pred,
     std::__iterator_category(__first));
    }


  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    _ForwardIterator1
    __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
        _ForwardIterator2 __first2, _ForwardIterator2 __last2,
        forward_iterator_tag, forward_iterator_tag,
        _BinaryPredicate __comp)
    {
      if (__first2 == __last2)
 return __last1;

      _ForwardIterator1 __result = __last1;
      while (1)
 {
   _ForwardIterator1 __new_result
     = std::__search(__first1, __last1, __first2, __last2, __comp);
   if (__new_result == __last1)
     return __result;
   else
     {
       __result = __new_result;
       __first1 = __new_result;
       ++__first1;
     }
 }
    }


  template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
    typename _BinaryPredicate>
    _BidirectionalIterator1
    __find_end(_BidirectionalIterator1 __first1,
        _BidirectionalIterator1 __last1,
        _BidirectionalIterator2 __first2,
        _BidirectionalIterator2 __last2,
        bidirectional_iterator_tag, bidirectional_iterator_tag,
        _BinaryPredicate __comp)
    {






      typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
      typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;

      _RevIterator1 __rlast1(__first1);
      _RevIterator2 __rlast2(__first2);
      _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,
           _RevIterator2(__last2), __rlast2,
           __comp);

      if (__rresult == __rlast1)
 return __last1;
      else
 {
   _BidirectionalIterator1 __result = __rresult.base();
   std::advance(__result, -std::distance(__first2, __last2));
   return __result;
 }
    }
# 423 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2>
    inline _ForwardIterator1
    find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
      _ForwardIterator2 __first2, _ForwardIterator2 __last2)
    {






                                                       ;
                                                       ;

      return std::__find_end(__first1, __last1, __first2, __last2,
        std::__iterator_category(__first1),
        std::__iterator_category(__first2),
        __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 471 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    inline _ForwardIterator1
    find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
      _ForwardIterator2 __first2, _ForwardIterator2 __last2,
      _BinaryPredicate __comp)
    {






                                                       ;
                                                       ;

      return std::__find_end(__first1, __last1, __first2, __last2,
        std::__iterator_category(__first1),
        std::__iterator_category(__first2),
        __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }
# 506 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Predicate>
    inline bool
    all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
    { return __last == std::find_if_not(__first, __last, __pred); }
# 523 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Predicate>
    inline bool
    none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
    { return __last == std::find_if(__first, __last, __pred); }
# 541 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Predicate>
    inline bool
    any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
    { return !std::none_of(__first, __last, __pred); }
# 556 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Predicate>
    inline _InputIterator
    find_if_not(_InputIterator __first, _InputIterator __last,
  _Predicate __pred)
    {




                                                     ;
      return std::__find_if_not(__first, __last,
    __gnu_cxx::__ops::__pred_iter(__pred));
    }
# 580 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Predicate>
    inline bool
    is_partitioned(_InputIterator __first, _InputIterator __last,
     _Predicate __pred)
    {
      __first = std::find_if_not(__first, __last, __pred);
      return std::none_of(__first, __last, __pred);
    }
# 598 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Predicate>
    _ForwardIterator
    partition_point(_ForwardIterator __first, _ForwardIterator __last,
      _Predicate __pred)
    {






                                                     ;

      typedef typename iterator_traits<_ForwardIterator>::difference_type
 _DistanceType;

      _DistanceType __len = std::distance(__first, __last);
      _DistanceType __half;
      _ForwardIterator __middle;

      while (__len > 0)
 {
   __half = __len >> 1;
   __middle = __first;
   std::advance(__middle, __half);
   if (__pred(*__middle))
     {
       __first = __middle;
       ++__first;
       __len = __len - __half - 1;
     }
   else
     __len = __half;
 }
      return __first;
    }


  template<typename _InputIterator, typename _OutputIterator,
    typename _Predicate>
    _OutputIterator
    __remove_copy_if(_InputIterator __first, _InputIterator __last,
       _OutputIterator __result, _Predicate __pred)
    {
      for (; __first != __last; ++__first)
 if (!__pred(__first))
   {
     *__result = *__first;
     ++__result;
   }
      return __result;
    }
# 665 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator, typename _Tp>
    inline _OutputIterator
    remove_copy(_InputIterator __first, _InputIterator __last,
  _OutputIterator __result, const _Tp& __value)
    {






                                                     ;

      return std::__remove_copy_if(__first, __last, __result,
 __gnu_cxx::__ops::__iter_equals_val(__value));
    }
# 697 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator,
    typename _Predicate>
    inline _OutputIterator
    remove_copy_if(_InputIterator __first, _InputIterator __last,
     _OutputIterator __result, _Predicate __pred)
    {






                                                     ;

      return std::__remove_copy_if(__first, __last, __result,
       __gnu_cxx::__ops::__pred_iter(__pred));
    }
# 731 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator,
    typename _Predicate>
    _OutputIterator
    copy_if(_InputIterator __first, _InputIterator __last,
     _OutputIterator __result, _Predicate __pred)
    {






                                                     ;

      for (; __first != __last; ++__first)
 if (__pred(*__first))
   {
     *__result = *__first;
     ++__result;
   }
      return __result;
    }

  template<typename _InputIterator, typename _Size, typename _OutputIterator>
    _OutputIterator
    __copy_n(_InputIterator __first, _Size __n,
      _OutputIterator __result, input_iterator_tag)
    {
      if (__n > 0)
 {
   while (true)
     {
       *__result = *__first;
       ++__result;
       if (--__n > 0)
  ++__first;
       else
  break;
     }
 }
      return __result;
    }

  template<typename _RandomAccessIterator, typename _Size,
    typename _OutputIterator>
    inline _OutputIterator
    __copy_n(_RandomAccessIterator __first, _Size __n,
      _OutputIterator __result, random_access_iterator_tag)
    { return std::copy(__first, __first + __n, __result); }
# 794 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Size, typename _OutputIterator>
    inline _OutputIterator
    copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
    {





      return std::__copy_n(__first, __n, __result,
      std::__iterator_category(__first));
    }
# 822 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator1,
    typename _OutputIterator2, typename _Predicate>
    pair<_OutputIterator1, _OutputIterator2>
    partition_copy(_InputIterator __first, _InputIterator __last,
     _OutputIterator1 __out_true, _OutputIterator2 __out_false,
     _Predicate __pred)
    {
# 837 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                     ;

      for (; __first != __last; ++__first)
 if (__pred(*__first))
   {
     *__out_true = *__first;
     ++__out_true;
   }
 else
   {
     *__out_false = *__first;
     ++__out_false;
   }

      return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
    }


  template<typename _ForwardIterator, typename _Predicate>
    _ForwardIterator
    __remove_if(_ForwardIterator __first, _ForwardIterator __last,
  _Predicate __pred)
    {
      __first = std::__find_if(__first, __last, __pred);
      if (__first == __last)
 return __first;
      _ForwardIterator __result = __first;
      ++__first;
      for (; __first != __last; ++__first)
 if (!__pred(__first))
   {
     *__result = std::move(*__first);
     ++__result;
   }
      return __result;
    }
# 891 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp>
    inline _ForwardIterator
    remove(_ForwardIterator __first, _ForwardIterator __last,
    const _Tp& __value)
    {





                                                     ;

      return std::__remove_if(__first, __last,
  __gnu_cxx::__ops::__iter_equals_val(__value));
    }
# 924 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Predicate>
    inline _ForwardIterator
    remove_if(_ForwardIterator __first, _ForwardIterator __last,
       _Predicate __pred)
    {





                                                     ;

      return std::__remove_if(__first, __last,
         __gnu_cxx::__ops::__pred_iter(__pred));
    }

  template<typename _ForwardIterator, typename _BinaryPredicate>
    _ForwardIterator
    __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
      _BinaryPredicate __binary_pred)
    {
      if (__first == __last)
 return __last;
      _ForwardIterator __next = __first;
      while (++__next != __last)
 {
   if (__binary_pred(__first, __next))
     return __first;
   __first = __next;
 }
      return __last;
    }

  template<typename _ForwardIterator, typename _BinaryPredicate>
    _ForwardIterator
    __unique(_ForwardIterator __first, _ForwardIterator __last,
      _BinaryPredicate __binary_pred)
    {

      __first = std::__adjacent_find(__first, __last, __binary_pred);
      if (__first == __last)
 return __last;


      _ForwardIterator __dest = __first;
      ++__first;
      while (++__first != __last)
 if (!__binary_pred(__dest, __first))
   *++__dest = std::move(*__first);
      return ++__dest;
    }
# 990 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    inline _ForwardIterator
    unique(_ForwardIterator __first, _ForwardIterator __last)
    {





                                                     ;

      return std::__unique(__first, __last,
      __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 1020 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _BinaryPredicate>
    inline _ForwardIterator
    unique(_ForwardIterator __first, _ForwardIterator __last,
    _BinaryPredicate __binary_pred)
    {






                                                     ;

      return std::__unique(__first, __last,
      __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
    }







  template<typename _ForwardIterator, typename _OutputIterator,
    typename _BinaryPredicate>
    _OutputIterator
    __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
    _OutputIterator __result, _BinaryPredicate __binary_pred,
    forward_iterator_tag, output_iterator_tag)
    {





      _ForwardIterator __next = __first;
      *__result = *__first;
      while (++__next != __last)
 if (!__binary_pred(__first, __next))
   {
     __first = __next;
     *++__result = *__first;
   }
      return ++__result;
    }







  template<typename _InputIterator, typename _OutputIterator,
    typename _BinaryPredicate>
    _OutputIterator
    __unique_copy(_InputIterator __first, _InputIterator __last,
    _OutputIterator __result, _BinaryPredicate __binary_pred,
    input_iterator_tag, output_iterator_tag)
    {





      typename iterator_traits<_InputIterator>::value_type __value = *__first;
      __decltype(__gnu_cxx::__ops::__iter_comp_val(__binary_pred))
 __rebound_pred
 = __gnu_cxx::__ops::__iter_comp_val(__binary_pred);
      *__result = __value;
      while (++__first != __last)
 if (!__rebound_pred(__first, __value))
   {
     __value = *__first;
     *++__result = __value;
   }
      return ++__result;
    }







  template<typename _InputIterator, typename _ForwardIterator,
    typename _BinaryPredicate>
    _ForwardIterator
    __unique_copy(_InputIterator __first, _InputIterator __last,
    _ForwardIterator __result, _BinaryPredicate __binary_pred,
    input_iterator_tag, forward_iterator_tag)
    {




      *__result = *__first;
      while (++__first != __last)
 if (!__binary_pred(__result, __first))
   *++__result = *__first;
      return ++__result;
    }






  template<typename _BidirectionalIterator>
    void
    __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
       bidirectional_iterator_tag)
    {
      while (true)
 if (__first == __last || __first == --__last)
   return;
 else
   {
     std::iter_swap(__first, __last);
     ++__first;
   }
    }






  template<typename _RandomAccessIterator>
    void
    __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
       random_access_iterator_tag)
    {
      if (__first == __last)
 return;
      --__last;
      while (__first < __last)
 {
   std::iter_swap(__first, __last);
   ++__first;
   --__last;
 }
    }
# 1175 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator>
    inline void
    reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
    {



                                                     ;
      std::__reverse(__first, __last, std::__iterator_category(__first));
    }
# 1202 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator, typename _OutputIterator>
    _OutputIterator
    reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
   _OutputIterator __result)
    {





                                                     ;

      while (__first != __last)
 {
   --__last;
   *__result = *__last;
   ++__result;
 }
      return __result;
    }





  template<typename _EuclideanRingElement>
    _EuclideanRingElement
    __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
    {
      while (__n != 0)
 {
   _EuclideanRingElement __t = __m % __n;
   __m = __n;
   __n = __t;
 }
      return __m;
    }

  inline namespace _V2
  {


  template<typename _ForwardIterator>
    _ForwardIterator
    __rotate(_ForwardIterator __first,
      _ForwardIterator __middle,
      _ForwardIterator __last,
      forward_iterator_tag)
    {
      if (__first == __middle)
 return __last;
      else if (__last == __middle)
 return __first;

      _ForwardIterator __first2 = __middle;
      do
 {
   std::iter_swap(__first, __first2);
   ++__first;
   ++__first2;
   if (__first == __middle)
     __middle = __first2;
 }
      while (__first2 != __last);

      _ForwardIterator __ret = __first;

      __first2 = __middle;

      while (__first2 != __last)
 {
   std::iter_swap(__first, __first2);
   ++__first;
   ++__first2;
   if (__first == __middle)
     __middle = __first2;
   else if (__first2 == __last)
     __first2 = __middle;
 }
      return __ret;
    }


  template<typename _BidirectionalIterator>
    _BidirectionalIterator
    __rotate(_BidirectionalIterator __first,
      _BidirectionalIterator __middle,
      _BidirectionalIterator __last,
       bidirectional_iterator_tag)
    {




      if (__first == __middle)
 return __last;
      else if (__last == __middle)
 return __first;

      std::__reverse(__first, __middle, bidirectional_iterator_tag());
      std::__reverse(__middle, __last, bidirectional_iterator_tag());

      while (__first != __middle && __middle != __last)
 {
   std::iter_swap(__first, --__last);
   ++__first;
 }

      if (__first == __middle)
 {
   std::__reverse(__middle, __last, bidirectional_iterator_tag());
   return __last;
 }
      else
 {
   std::__reverse(__first, __middle, bidirectional_iterator_tag());
   return __first;
 }
    }


  template<typename _RandomAccessIterator>
    _RandomAccessIterator
    __rotate(_RandomAccessIterator __first,
      _RandomAccessIterator __middle,
      _RandomAccessIterator __last,
      random_access_iterator_tag)
    {




      if (__first == __middle)
 return __last;
      else if (__last == __middle)
 return __first;

      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
 _Distance;
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
 _ValueType;

      _Distance __n = __last - __first;
      _Distance __k = __middle - __first;

      if (__k == __n - __k)
 {
   std::swap_ranges(__first, __middle, __middle);
   return __middle;
 }

      _RandomAccessIterator __p = __first;
      _RandomAccessIterator __ret = __first + (__last - __middle);

      for (;;)
 {
   if (__k < __n - __k)
     {
       if (__is_pod(_ValueType) && __k == 1)
  {
    _ValueType __t = std::move(*__p);
    std::move(__p + 1, __p + __n, __p);
    *(__p + __n - 1) = std::move(__t);
    return __ret;
  }
       _RandomAccessIterator __q = __p + __k;
       for (_Distance __i = 0; __i < __n - __k; ++ __i)
  {
    std::iter_swap(__p, __q);
    ++__p;
    ++__q;
  }
       __n %= __k;
       if (__n == 0)
  return __ret;
       std::swap(__n, __k);
       __k = __n - __k;
     }
   else
     {
       __k = __n - __k;
       if (__is_pod(_ValueType) && __k == 1)
  {
    _ValueType __t = std::move(*(__p + __n - 1));
    std::move_backward(__p, __p + __n - 1, __p + __n);
    *__p = std::move(__t);
    return __ret;
  }
       _RandomAccessIterator __q = __p + __n;
       __p = __q - __k;
       for (_Distance __i = 0; __i < __n - __k; ++ __i)
  {
    --__p;
    --__q;
    std::iter_swap(__p, __q);
  }
       __n %= __k;
       if (__n == 0)
  return __ret;
       std::swap(__n, __k);
     }
 }
    }
# 1429 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    inline _ForwardIterator
    rotate(_ForwardIterator __first, _ForwardIterator __middle,
    _ForwardIterator __last)
    {



                                                       ;
                                                      ;

      return std::__rotate(__first, __middle, __last,
      std::__iterator_category(__first));
    }

  }
# 1466 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _OutputIterator>
    inline _OutputIterator
    rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
  _ForwardIterator __last, _OutputIterator __result)
    {




                                                       ;
                                                      ;

      return std::copy(__first, __middle,
         std::copy(__middle, __last, __result));
    }


  template<typename _ForwardIterator, typename _Predicate>
    _ForwardIterator
    __partition(_ForwardIterator __first, _ForwardIterator __last,
  _Predicate __pred, forward_iterator_tag)
    {
      if (__first == __last)
 return __first;

      while (__pred(*__first))
 if (++__first == __last)
   return __first;

      _ForwardIterator __next = __first;

      while (++__next != __last)
 if (__pred(*__next))
   {
     std::iter_swap(__first, __next);
     ++__first;
   }

      return __first;
    }


  template<typename _BidirectionalIterator, typename _Predicate>
    _BidirectionalIterator
    __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
  _Predicate __pred, bidirectional_iterator_tag)
    {
      while (true)
 {
   while (true)
     if (__first == __last)
       return __first;
     else if (__pred(*__first))
       ++__first;
     else
       break;
   --__last;
   while (true)
     if (__first == __last)
       return __first;
     else if (!bool(__pred(*__last)))
       --__last;
     else
       break;
   std::iter_swap(__first, __last);
   ++__first;
 }
    }
# 1543 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
    typename _Distance>
    _ForwardIterator
    __stable_partition_adaptive(_ForwardIterator __first,
    _ForwardIterator __last,
    _Predicate __pred, _Distance __len,
    _Pointer __buffer,
    _Distance __buffer_size)
    {
      if (__len == 1)
 return __first;

      if (__len <= __buffer_size)
 {
   _ForwardIterator __result1 = __first;
   _Pointer __result2 = __buffer;




   *__result2 = std::move(*__first);
   ++__result2;
   ++__first;
   for (; __first != __last; ++__first)
     if (__pred(__first))
       {
  *__result1 = std::move(*__first);
  ++__result1;
       }
     else
       {
  *__result2 = std::move(*__first);
  ++__result2;
       }

   std::move(__buffer, __result2, __result1);
   return __result1;
 }

      _ForwardIterator __middle = __first;
      std::advance(__middle, __len / 2);
      _ForwardIterator __left_split =
 std::__stable_partition_adaptive(__first, __middle, __pred,
      __len / 2, __buffer,
      __buffer_size);



      _Distance __right_len = __len - __len / 2;
      _ForwardIterator __right_split =
 std::__find_if_not_n(__middle, __right_len, __pred);

      if (__right_len)
 __right_split =
   std::__stable_partition_adaptive(__right_split, __last, __pred,
        __right_len,
        __buffer, __buffer_size);

      std::rotate(__left_split, __middle, __right_split);
      std::advance(__left_split, std::distance(__middle, __right_split));
      return __left_split;
    }

  template<typename _ForwardIterator, typename _Predicate>
    _ForwardIterator
    __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
         _Predicate __pred)
    {
      __first = std::__find_if_not(__first, __last, __pred);

      if (__first == __last)
 return __first;

      typedef typename iterator_traits<_ForwardIterator>::value_type
 _ValueType;
      typedef typename iterator_traits<_ForwardIterator>::difference_type
 _DistanceType;

      _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first, __last);
      return
 std::__stable_partition_adaptive(__first, __last, __pred,
      _DistanceType(__buf.requested_size()),
      __buf.begin(),
      _DistanceType(__buf.size()));
    }
# 1646 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Predicate>
    inline _ForwardIterator
    stable_partition(_ForwardIterator __first, _ForwardIterator __last,
       _Predicate __pred)
    {





                                                     ;

      return std::__stable_partition(__first, __last,
         __gnu_cxx::__ops::__pred_iter(__pred));
    }


  template<typename _RandomAccessIterator, typename _Compare>
    void
    __heap_select(_RandomAccessIterator __first,
    _RandomAccessIterator __middle,
    _RandomAccessIterator __last, _Compare __comp)
    {
      std::__make_heap(__first, __middle, __comp);
      for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
 if (__comp(__i, __first))
   std::__pop_heap(__first, __middle, __i, __comp);
    }



  template<typename _InputIterator, typename _RandomAccessIterator,
    typename _Compare>
    _RandomAccessIterator
    __partial_sort_copy(_InputIterator __first, _InputIterator __last,
   _RandomAccessIterator __result_first,
   _RandomAccessIterator __result_last,
   _Compare __comp)
    {
      typedef typename iterator_traits<_InputIterator>::value_type
 _InputValueType;
      typedef iterator_traits<_RandomAccessIterator> _RItTraits;
      typedef typename _RItTraits::difference_type _DistanceType;

      if (__result_first == __result_last)
 return __result_last;
      _RandomAccessIterator __result_real_last = __result_first;
      while (__first != __last && __result_real_last != __result_last)
 {
   *__result_real_last = *__first;
   ++__result_real_last;
   ++__first;
 }

      std::__make_heap(__result_first, __result_real_last, __comp);
      while (__first != __last)
 {
   if (__comp(__first, __result_first))
     std::__adjust_heap(__result_first, _DistanceType(0),
          _DistanceType(__result_real_last
          - __result_first),
          _InputValueType(*__first), __comp);
   ++__first;
 }
      std::__sort_heap(__result_first, __result_real_last, __comp);
      return __result_real_last;
    }
# 1732 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _RandomAccessIterator>
    inline _RandomAccessIterator
    partial_sort_copy(_InputIterator __first, _InputIterator __last,
        _RandomAccessIterator __result_first,
        _RandomAccessIterator __result_last)
    {
# 1752 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                     ;
                                                     ;
                                                                   ;

      return std::__partial_sort_copy(__first, __last,
          __result_first, __result_last,
          __gnu_cxx::__ops::__iter_less_iter());
    }
# 1781 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _RandomAccessIterator,
    typename _Compare>
    inline _RandomAccessIterator
    partial_sort_copy(_InputIterator __first, _InputIterator __last,
        _RandomAccessIterator __result_first,
        _RandomAccessIterator __result_last,
        _Compare __comp)
    {
# 1806 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                     ;
                                                                  ;
                                                                   ;

      return std::__partial_sort_copy(__first, __last,
          __result_first, __result_last,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }


  template<typename _RandomAccessIterator, typename _Compare>
    void
    __unguarded_linear_insert(_RandomAccessIterator __last,
         _Compare __comp)
    {
      typename iterator_traits<_RandomAccessIterator>::value_type
 __val = std::move(*__last);
      _RandomAccessIterator __next = __last;
      --__next;
      while (__comp(__val, __next))
 {
   *__last = std::move(*__next);
   __last = __next;
   --__next;
 }
      *__last = std::move(__val);
    }


  template<typename _RandomAccessIterator, typename _Compare>
    void
    __insertion_sort(_RandomAccessIterator __first,
       _RandomAccessIterator __last, _Compare __comp)
    {
      if (__first == __last) return;

      for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
 {
   if (__comp(__i, __first))
     {
       typename iterator_traits<_RandomAccessIterator>::value_type
  __val = std::move(*__i);
       std::move_backward(__first, __i, __i + 1);
       *__first = std::move(__val);
     }
   else
     std::__unguarded_linear_insert(__i,
    __gnu_cxx::__ops::__val_comp_iter(__comp));
 }
    }


  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    __unguarded_insertion_sort(_RandomAccessIterator __first,
          _RandomAccessIterator __last, _Compare __comp)
    {
      for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
 std::__unguarded_linear_insert(__i,
    __gnu_cxx::__ops::__val_comp_iter(__comp));
    }





  enum { _S_threshold = 16 };


  template<typename _RandomAccessIterator, typename _Compare>
    void
    __final_insertion_sort(_RandomAccessIterator __first,
      _RandomAccessIterator __last, _Compare __comp)
    {
      if (__last - __first > int(_S_threshold))
 {
   std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
   std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
       __comp);
 }
      else
 std::__insertion_sort(__first, __last, __comp);
    }


  template<typename _RandomAccessIterator, typename _Compare>
    _RandomAccessIterator
    __unguarded_partition(_RandomAccessIterator __first,
     _RandomAccessIterator __last,
     _RandomAccessIterator __pivot, _Compare __comp)
    {
      while (true)
 {
   while (__comp(__first, __pivot))
     ++__first;
   --__last;
   while (__comp(__pivot, __last))
     --__last;
   if (!(__first < __last))
     return __first;
   std::iter_swap(__first, __last);
   ++__first;
 }
    }


  template<typename _RandomAccessIterator, typename _Compare>
    inline _RandomAccessIterator
    __unguarded_partition_pivot(_RandomAccessIterator __first,
    _RandomAccessIterator __last, _Compare __comp)
    {
      _RandomAccessIterator __mid = __first + (__last - __first) / 2;
      std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,
      __comp);
      return std::__unguarded_partition(__first + 1, __last, __first, __comp);
    }

  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    __partial_sort(_RandomAccessIterator __first,
     _RandomAccessIterator __middle,
     _RandomAccessIterator __last,
     _Compare __comp)
    {
      std::__heap_select(__first, __middle, __last, __comp);
      std::__sort_heap(__first, __middle, __comp);
    }


  template<typename _RandomAccessIterator, typename _Size, typename _Compare>
    void
    __introsort_loop(_RandomAccessIterator __first,
       _RandomAccessIterator __last,
       _Size __depth_limit, _Compare __comp)
    {
      while (__last - __first > int(_S_threshold))
 {
   if (__depth_limit == 0)
     {
       std::__partial_sort(__first, __last, __last, __comp);
       return;
     }
   --__depth_limit;
   _RandomAccessIterator __cut =
     std::__unguarded_partition_pivot(__first, __last, __comp);
   std::__introsort_loop(__cut, __last, __depth_limit, __comp);
   __last = __cut;
 }
    }



  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
    _Compare __comp)
    {
      if (__first != __last)
 {
   std::__introsort_loop(__first, __last,
    std::__lg(__last - __first) * 2,
    __comp);
   std::__final_insertion_sort(__first, __last, __comp);
 }
    }

  template<typename _RandomAccessIterator, typename _Size, typename _Compare>
    void
    __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
    _RandomAccessIterator __last, _Size __depth_limit,
    _Compare __comp)
    {
      while (__last - __first > 3)
 {
   if (__depth_limit == 0)
     {
       std::__heap_select(__first, __nth + 1, __last, __comp);

       std::iter_swap(__first, __nth);
       return;
     }
   --__depth_limit;
   _RandomAccessIterator __cut =
     std::__unguarded_partition_pivot(__first, __last, __comp);
   if (__cut <= __nth)
     __first = __cut;
   else
     __last = __cut;
 }
      std::__insertion_sort(__first, __last, __comp);
    }
# 2018 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp, typename _Compare>
    inline _ForwardIterator
    lower_bound(_ForwardIterator __first, _ForwardIterator __last,
  const _Tp& __val, _Compare __comp)
    {





                    ;

      return std::__lower_bound(__first, __last, __val,
    __gnu_cxx::__ops::__iter_comp_val(__comp));
    }

  template<typename _ForwardIterator, typename _Tp, typename _Compare>
    _ForwardIterator
    __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
    const _Tp& __val, _Compare __comp)
    {
      typedef typename iterator_traits<_ForwardIterator>::difference_type
 _DistanceType;

      _DistanceType __len = std::distance(__first, __last);

      while (__len > 0)
 {
   _DistanceType __half = __len >> 1;
   _ForwardIterator __middle = __first;
   std::advance(__middle, __half);
   if (__comp(__val, __middle))
     __len = __half;
   else
     {
       __first = __middle;
       ++__first;
       __len = __len - __half - 1;
     }
 }
      return __first;
    }
# 2072 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp>
    inline _ForwardIterator
    upper_bound(_ForwardIterator __first, _ForwardIterator __last,
  const _Tp& __val)
    {




                                                                  ;

      return std::__upper_bound(__first, __last, __val,
    __gnu_cxx::__ops::__val_less_iter());
    }
# 2102 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp, typename _Compare>
    inline _ForwardIterator
    upper_bound(_ForwardIterator __first, _ForwardIterator __last,
  const _Tp& __val, _Compare __comp)
    {





                    ;

      return std::__upper_bound(__first, __last, __val,
    __gnu_cxx::__ops::__val_comp_iter(__comp));
    }

  template<typename _ForwardIterator, typename _Tp,
    typename _CompareItTp, typename _CompareTpIt>
    pair<_ForwardIterator, _ForwardIterator>
    __equal_range(_ForwardIterator __first, _ForwardIterator __last,
    const _Tp& __val,
    _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it)
    {
      typedef typename iterator_traits<_ForwardIterator>::difference_type
 _DistanceType;

      _DistanceType __len = std::distance(__first, __last);

      while (__len > 0)
 {
   _DistanceType __half = __len >> 1;
   _ForwardIterator __middle = __first;
   std::advance(__middle, __half);
   if (__comp_it_val(__middle, __val))
     {
       __first = __middle;
       ++__first;
       __len = __len - __half - 1;
     }
   else if (__comp_val_it(__val, __middle))
     __len = __half;
   else
     {
       _ForwardIterator __left
  = std::__lower_bound(__first, __middle, __val, __comp_it_val);
       std::advance(__first, __len);
       _ForwardIterator __right
  = std::__upper_bound(++__middle, __first, __val, __comp_val_it);
       return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
     }
 }
      return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
    }
# 2173 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp>
    inline pair<_ForwardIterator, _ForwardIterator>
    equal_range(_ForwardIterator __first, _ForwardIterator __last,
  const _Tp& __val)
    {






                                                                  ;
                                                                  ;

      return std::__equal_range(__first, __last, __val,
    __gnu_cxx::__ops::__iter_less_val(),
    __gnu_cxx::__ops::__val_less_iter());
    }
# 2209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp, typename _Compare>
    inline pair<_ForwardIterator, _ForwardIterator>
    equal_range(_ForwardIterator __first, _ForwardIterator __last,
  const _Tp& __val, _Compare __comp)
    {







                    ;

                    ;

      return std::__equal_range(__first, __last, __val,
    __gnu_cxx::__ops::__iter_comp_val(__comp),
    __gnu_cxx::__ops::__val_comp_iter(__comp));
    }
# 2242 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp>
    bool
    binary_search(_ForwardIterator __first, _ForwardIterator __last,
    const _Tp& __val)
    {




                                                                  ;
                                                                  ;

      _ForwardIterator __i
 = std::__lower_bound(__first, __last, __val,
        __gnu_cxx::__ops::__iter_less_val());
      return __i != __last && !(__val < *__i);
    }
# 2275 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp, typename _Compare>
    bool
    binary_search(_ForwardIterator __first, _ForwardIterator __last,
    const _Tp& __val, _Compare __comp)
    {





                    ;

                    ;

      _ForwardIterator __i
 = std::__lower_bound(__first, __last, __val,
        __gnu_cxx::__ops::__iter_comp_val(__comp));
      return __i != __last && !bool(__comp(__val, *__i));
    }




  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _Compare>
    void
    __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
     _InputIterator2 __first2, _InputIterator2 __last2,
     _OutputIterator __result, _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 {
   if (__comp(__first2, __first1))
     {
       *__result = std::move(*__first2);
       ++__first2;
     }
   else
     {
       *__result = std::move(*__first1);
       ++__first1;
     }
   ++__result;
 }
      if (__first1 != __last1)
 std::move(__first1, __last1, __result);
    }


  template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
    typename _BidirectionalIterator3, typename _Compare>
    void
    __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
       _BidirectionalIterator1 __last1,
       _BidirectionalIterator2 __first2,
       _BidirectionalIterator2 __last2,
       _BidirectionalIterator3 __result,
       _Compare __comp)
    {
      if (__first1 == __last1)
 {
   std::move_backward(__first2, __last2, __result);
   return;
 }
      else if (__first2 == __last2)
 return;

      --__last1;
      --__last2;
      while (true)
 {
   if (__comp(__last2, __last1))
     {
       *--__result = std::move(*__last1);
       if (__first1 == __last1)
  {
    std::move_backward(__first2, ++__last2, __result);
    return;
  }
       --__last1;
     }
   else
     {
       *--__result = std::move(*__last2);
       if (__first2 == __last2)
  return;
       --__last2;
     }
 }
    }


  template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
    typename _Distance>
    _BidirectionalIterator1
    __rotate_adaptive(_BidirectionalIterator1 __first,
        _BidirectionalIterator1 __middle,
        _BidirectionalIterator1 __last,
        _Distance __len1, _Distance __len2,
        _BidirectionalIterator2 __buffer,
        _Distance __buffer_size)
    {
      _BidirectionalIterator2 __buffer_end;
      if (__len1 > __len2 && __len2 <= __buffer_size)
 {
   if (__len2)
     {
       __buffer_end = std::move(__middle, __last, __buffer);
       std::move_backward(__first, __middle, __last);
       return std::move(__buffer, __buffer_end, __first);
     }
   else
     return __first;
 }
      else if (__len1 <= __buffer_size)
 {
   if (__len1)
     {
       __buffer_end = std::move(__first, __middle, __buffer);
       std::move(__middle, __last, __first);
       return std::move_backward(__buffer, __buffer_end, __last);
     }
   else
     return __last;
 }
      else
 {
   std::rotate(__first, __middle, __last);
   std::advance(__first, std::distance(__middle, __last));
   return __first;
 }
    }


  template<typename _BidirectionalIterator, typename _Distance,
    typename _Pointer, typename _Compare>
    void
    __merge_adaptive(_BidirectionalIterator __first,
       _BidirectionalIterator __middle,
       _BidirectionalIterator __last,
       _Distance __len1, _Distance __len2,
       _Pointer __buffer, _Distance __buffer_size,
       _Compare __comp)
    {
      if (__len1 <= __len2 && __len1 <= __buffer_size)
 {
   _Pointer __buffer_end = std::move(__first, __middle, __buffer);
   std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
         __first, __comp);
 }
      else if (__len2 <= __buffer_size)
 {
   _Pointer __buffer_end = std::move(__middle, __last, __buffer);
   std::__move_merge_adaptive_backward(__first, __middle, __buffer,
           __buffer_end, __last, __comp);
 }
      else
 {
   _BidirectionalIterator __first_cut = __first;
   _BidirectionalIterator __second_cut = __middle;
   _Distance __len11 = 0;
   _Distance __len22 = 0;
   if (__len1 > __len2)
     {
       __len11 = __len1 / 2;
       std::advance(__first_cut, __len11);
       __second_cut
  = std::__lower_bound(__middle, __last, *__first_cut,
         __gnu_cxx::__ops::__iter_comp_val(__comp));
       __len22 = std::distance(__middle, __second_cut);
     }
   else
     {
       __len22 = __len2 / 2;
       std::advance(__second_cut, __len22);
       __first_cut
  = std::__upper_bound(__first, __middle, *__second_cut,
         __gnu_cxx::__ops::__val_comp_iter(__comp));
       __len11 = std::distance(__first, __first_cut);
     }

   _BidirectionalIterator __new_middle
     = std::__rotate_adaptive(__first_cut, __middle, __second_cut,
         __len1 - __len11, __len22, __buffer,
         __buffer_size);
   std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
    __len22, __buffer, __buffer_size, __comp);
   std::__merge_adaptive(__new_middle, __second_cut, __last,
    __len1 - __len11,
    __len2 - __len22, __buffer,
    __buffer_size, __comp);
 }
    }


  template<typename _BidirectionalIterator, typename _Distance,
    typename _Compare>
    void
    __merge_without_buffer(_BidirectionalIterator __first,
      _BidirectionalIterator __middle,
      _BidirectionalIterator __last,
      _Distance __len1, _Distance __len2,
      _Compare __comp)
    {
      if (__len1 == 0 || __len2 == 0)
 return;

      if (__len1 + __len2 == 2)
 {
   if (__comp(__middle, __first))
     std::iter_swap(__first, __middle);
   return;
 }

      _BidirectionalIterator __first_cut = __first;
      _BidirectionalIterator __second_cut = __middle;
      _Distance __len11 = 0;
      _Distance __len22 = 0;
      if (__len1 > __len2)
 {
   __len11 = __len1 / 2;
   std::advance(__first_cut, __len11);
   __second_cut
     = std::__lower_bound(__middle, __last, *__first_cut,
     __gnu_cxx::__ops::__iter_comp_val(__comp));
   __len22 = std::distance(__middle, __second_cut);
 }
      else
 {
   __len22 = __len2 / 2;
   std::advance(__second_cut, __len22);
   __first_cut
     = std::__upper_bound(__first, __middle, *__second_cut,
     __gnu_cxx::__ops::__val_comp_iter(__comp));
   __len11 = std::distance(__first, __first_cut);
 }

      std::rotate(__first_cut, __middle, __second_cut);
      _BidirectionalIterator __new_middle = __first_cut;
      std::advance(__new_middle, std::distance(__middle, __second_cut));
      std::__merge_without_buffer(__first, __first_cut, __new_middle,
      __len11, __len22, __comp);
      std::__merge_without_buffer(__new_middle, __second_cut, __last,
      __len1 - __len11, __len2 - __len22, __comp);
    }

  template<typename _BidirectionalIterator, typename _Compare>
    void
    __inplace_merge(_BidirectionalIterator __first,
      _BidirectionalIterator __middle,
      _BidirectionalIterator __last,
      _Compare __comp)
    {
      typedef typename iterator_traits<_BidirectionalIterator>::value_type
   _ValueType;
      typedef typename iterator_traits<_BidirectionalIterator>::difference_type
   _DistanceType;

      if (__first == __middle || __middle == __last)
 return;

      const _DistanceType __len1 = std::distance(__first, __middle);
      const _DistanceType __len2 = std::distance(__middle, __last);

      typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf;
      _TmpBuf __buf(__first, __last);

      if (__buf.begin() == 0)
 std::__merge_without_buffer
   (__first, __middle, __last, __len1, __len2, __comp);
      else
 std::__merge_adaptive
   (__first, __middle, __last, __len1, __len2, __buf.begin(),
    _DistanceType(__buf.size()), __comp);
    }
# 2569 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator>
    inline void
    inplace_merge(_BidirectionalIterator __first,
    _BidirectionalIterator __middle,
    _BidirectionalIterator __last)
    {





                                                  ;
                                                 ;
                                                     ;

      std::__inplace_merge(__first, __middle, __last,
      __gnu_cxx::__ops::__iter_less_iter());
    }
# 2610 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator, typename _Compare>
    inline void
    inplace_merge(_BidirectionalIterator __first,
    _BidirectionalIterator __middle,
    _BidirectionalIterator __last,
    _Compare __comp)
    {






                                                               ;
                                                              ;
                                                                  ;

      std::__inplace_merge(__first, __middle, __last,
      __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }



  template<typename _InputIterator, typename _OutputIterator,
    typename _Compare>
    _OutputIterator
    __move_merge(_InputIterator __first1, _InputIterator __last1,
   _InputIterator __first2, _InputIterator __last2,
   _OutputIterator __result, _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 {
   if (__comp(__first2, __first1))
     {
       *__result = std::move(*__first2);
       ++__first2;
     }
   else
     {
       *__result = std::move(*__first1);
       ++__first1;
     }
   ++__result;
 }
      return std::move(__first2, __last2, std::move(__first1, __last1, __result));


    }

  template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
    typename _Distance, typename _Compare>
    void
    __merge_sort_loop(_RandomAccessIterator1 __first,
        _RandomAccessIterator1 __last,
        _RandomAccessIterator2 __result, _Distance __step_size,
        _Compare __comp)
    {
      const _Distance __two_step = 2 * __step_size;

      while (__last - __first >= __two_step)
 {
   __result = std::__move_merge(__first, __first + __step_size,
           __first + __step_size,
           __first + __two_step,
           __result, __comp);
   __first += __two_step;
 }
      __step_size = std::min(_Distance(__last - __first), __step_size);

      std::__move_merge(__first, __first + __step_size,
   __first + __step_size, __last, __result, __comp);
    }

  template<typename _RandomAccessIterator, typename _Distance,
    typename _Compare>
    void
    __chunk_insertion_sort(_RandomAccessIterator __first,
      _RandomAccessIterator __last,
      _Distance __chunk_size, _Compare __comp)
    {
      while (__last - __first >= __chunk_size)
 {
   std::__insertion_sort(__first, __first + __chunk_size, __comp);
   __first += __chunk_size;
 }
      std::__insertion_sort(__first, __last, __comp);
    }

  enum { _S_chunk_size = 7 };

  template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
    void
    __merge_sort_with_buffer(_RandomAccessIterator __first,
        _RandomAccessIterator __last,
        _Pointer __buffer, _Compare __comp)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
 _Distance;

      const _Distance __len = __last - __first;
      const _Pointer __buffer_last = __buffer + __len;

      _Distance __step_size = _S_chunk_size;
      std::__chunk_insertion_sort(__first, __last, __step_size, __comp);

      while (__step_size < __len)
 {
   std::__merge_sort_loop(__first, __last, __buffer,
     __step_size, __comp);
   __step_size *= 2;
   std::__merge_sort_loop(__buffer, __buffer_last, __first,
     __step_size, __comp);
   __step_size *= 2;
 }
    }

  template<typename _RandomAccessIterator, typename _Pointer,
    typename _Distance, typename _Compare>
    void
    __stable_sort_adaptive(_RandomAccessIterator __first,
      _RandomAccessIterator __last,
      _Pointer __buffer, _Distance __buffer_size,
      _Compare __comp)
    {
      const _Distance __len = (__last - __first + 1) / 2;
      const _RandomAccessIterator __middle = __first + __len;
      if (__len > __buffer_size)
 {
   std::__stable_sort_adaptive(__first, __middle, __buffer,
          __buffer_size, __comp);
   std::__stable_sort_adaptive(__middle, __last, __buffer,
          __buffer_size, __comp);
 }
      else
 {
   std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
   std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
 }
      std::__merge_adaptive(__first, __middle, __last,
       _Distance(__middle - __first),
       _Distance(__last - __middle),
       __buffer, __buffer_size,
       __comp);
    }


  template<typename _RandomAccessIterator, typename _Compare>
    void
    __inplace_stable_sort(_RandomAccessIterator __first,
     _RandomAccessIterator __last, _Compare __comp)
    {
      if (__last - __first < 15)
 {
   std::__insertion_sort(__first, __last, __comp);
   return;
 }
      _RandomAccessIterator __middle = __first + (__last - __first) / 2;
      std::__inplace_stable_sort(__first, __middle, __comp);
      std::__inplace_stable_sort(__middle, __last, __comp);
      std::__merge_without_buffer(__first, __middle, __last,
      __middle - __first,
      __last - __middle,
      __comp);
    }
# 2782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _Compare>
    bool
    __includes(_InputIterator1 __first1, _InputIterator1 __last1,
        _InputIterator2 __first2, _InputIterator2 __last2,
        _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 if (__comp(__first2, __first1))
   return false;
 else if (__comp(__first1, __first2))
   ++__first1;
 else
   {
     ++__first1;
     ++__first2;
   }

      return __first2 == __last2;
    }
# 2821 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2>
    inline bool
    includes(_InputIterator1 __first1, _InputIterator1 __last1,
      _InputIterator2 __first2, _InputIterator2 __last2)
    {
# 2835 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                ;
                                                                ;
                                                        ;
                                                        ;

      return std::__includes(__first1, __last1, __first2, __last2,
        __gnu_cxx::__ops::__iter_less_iter());
    }
# 2865 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _Compare>
    inline bool
    includes(_InputIterator1 __first1, _InputIterator1 __last1,
      _InputIterator2 __first2, _InputIterator2 __last2,
      _Compare __comp)
    {
# 2881 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                             ;
                                                                             ;
                                                                     ;
                                                                     ;

      return std::__includes(__first1, __last1, __first2, __last2,
        __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }
# 2900 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator, typename _Compare>
    bool
    __next_permutation(_BidirectionalIterator __first,
         _BidirectionalIterator __last, _Compare __comp)
    {
      if (__first == __last)
 return false;
      _BidirectionalIterator __i = __first;
      ++__i;
      if (__i == __last)
 return false;
      __i = __last;
      --__i;

      for(;;)
 {
   _BidirectionalIterator __ii = __i;
   --__i;
   if (__comp(__i, __ii))
     {
       _BidirectionalIterator __j = __last;
       while (!__comp(__i, --__j))
  {}
       std::iter_swap(__i, __j);
       std::__reverse(__ii, __last,
        std::__iterator_category(__first));
       return true;
     }
   if (__i == __first)
     {
       std::__reverse(__first, __last,
        std::__iterator_category(__first));
       return false;
     }
 }
    }
# 2949 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator>
    inline bool
    next_permutation(_BidirectionalIterator __first,
       _BidirectionalIterator __last)
    {





                                                     ;
                                                     ;

      return std::__next_permutation
 (__first, __last, __gnu_cxx::__ops::__iter_less_iter());
    }
# 2981 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator, typename _Compare>
    inline bool
    next_permutation(_BidirectionalIterator __first,
       _BidirectionalIterator __last, _Compare __comp)
    {






                                                     ;
                                                                  ;

      return std::__next_permutation
 (__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _BidirectionalIterator, typename _Compare>
    bool
    __prev_permutation(_BidirectionalIterator __first,
         _BidirectionalIterator __last, _Compare __comp)
    {
      if (__first == __last)
 return false;
      _BidirectionalIterator __i = __first;
      ++__i;
      if (__i == __last)
 return false;
      __i = __last;
      --__i;

      for(;;)
 {
   _BidirectionalIterator __ii = __i;
   --__i;
   if (__comp(__ii, __i))
     {
       _BidirectionalIterator __j = __last;
       while (!__comp(--__j, __i))
  {}
       std::iter_swap(__i, __j);
       std::__reverse(__ii, __last,
        std::__iterator_category(__first));
       return true;
     }
   if (__i == __first)
     {
       std::__reverse(__first, __last,
        std::__iterator_category(__first));
       return false;
     }
 }
    }
# 3049 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator>
    inline bool
    prev_permutation(_BidirectionalIterator __first,
       _BidirectionalIterator __last)
    {





                                                     ;
                                                     ;

      return std::__prev_permutation(__first, __last,
         __gnu_cxx::__ops::__iter_less_iter());
    }
# 3081 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _BidirectionalIterator, typename _Compare>
    inline bool
    prev_permutation(_BidirectionalIterator __first,
       _BidirectionalIterator __last, _Compare __comp)
    {






                                                     ;
                                                                  ;

      return std::__prev_permutation(__first, __last,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }




  template<typename _InputIterator, typename _OutputIterator,
    typename _Predicate, typename _Tp>
    _OutputIterator
    __replace_copy_if(_InputIterator __first, _InputIterator __last,
        _OutputIterator __result,
        _Predicate __pred, const _Tp& __new_value)
    {
      for (; __first != __last; ++__first, (void)++__result)
 if (__pred(__first))
   *__result = __new_value;
 else
   *__result = *__first;
      return __result;
    }
# 3131 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator, typename _Tp>
    inline _OutputIterator
    replace_copy(_InputIterator __first, _InputIterator __last,
   _OutputIterator __result,
   const _Tp& __old_value, const _Tp& __new_value)
    {






                                                     ;

      return std::__replace_copy_if(__first, __last, __result,
   __gnu_cxx::__ops::__iter_equals_val(__old_value),
           __new_value);
    }
# 3165 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator,
    typename _Predicate, typename _Tp>
    inline _OutputIterator
    replace_copy_if(_InputIterator __first, _InputIterator __last,
      _OutputIterator __result,
      _Predicate __pred, const _Tp& __new_value)
    {






                                                     ;

      return std::__replace_copy_if(__first, __last, __result,
    __gnu_cxx::__ops::__pred_iter(__pred),
           __new_value);
    }

  template<typename _InputIterator, typename _Predicate>
    typename iterator_traits<_InputIterator>::difference_type
    __count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
    {
      typename iterator_traits<_InputIterator>::difference_type __n = 0;
      for (; __first != __last; ++__first)
 if (__pred(__first))
   ++__n;
      return __n;
    }
# 3204 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    inline bool
    is_sorted(_ForwardIterator __first, _ForwardIterator __last)
    { return std::is_sorted_until(__first, __last) == __last; }
# 3218 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Compare>
    inline bool
    is_sorted(_ForwardIterator __first, _ForwardIterator __last,
       _Compare __comp)
    { return std::is_sorted_until(__first, __last, __comp) == __last; }

  template<typename _ForwardIterator, typename _Compare>
    _ForwardIterator
    __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
        _Compare __comp)
    {
      if (__first == __last)
 return __last;

      _ForwardIterator __next = __first;
      for (++__next; __next != __last; __first = __next, (void)++__next)
 if (__comp(__next, __first))
   return __next;
      return __next;
    }
# 3247 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    inline _ForwardIterator
    is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
    {




                                                     ;
                                                     ;

      return std::__is_sorted_until(__first, __last,
        __gnu_cxx::__ops::__iter_less_iter());
    }
# 3271 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Compare>
    inline _ForwardIterator
    is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
      _Compare __comp)
    {





                                                     ;
                                                                  ;

      return std::__is_sorted_until(__first, __last,
        __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }
# 3296 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _Tp>
    constexpr
    inline pair<const _Tp&, const _Tp&>
    minmax(const _Tp& __a, const _Tp& __b)
    {



      return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
         : pair<const _Tp&, const _Tp&>(__a, __b);
    }
# 3317 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _Tp, typename _Compare>
    constexpr
    inline pair<const _Tp&, const _Tp&>
    minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
    {
      return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a)
         : pair<const _Tp&, const _Tp&>(__a, __b);
    }

  template<typename _ForwardIterator, typename _Compare>
    constexpr
    pair<_ForwardIterator, _ForwardIterator>
    __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
       _Compare __comp)
    {
      _ForwardIterator __next = __first;
      if (__first == __last
   || ++__next == __last)
 return std::make_pair(__first, __first);

      _ForwardIterator __min{}, __max{};
      if (__comp(__next, __first))
 {
   __min = __next;
   __max = __first;
 }
      else
 {
   __min = __first;
   __max = __next;
 }

      __first = __next;
      ++__first;

      while (__first != __last)
 {
   __next = __first;
   if (++__next == __last)
     {
       if (__comp(__first, __min))
  __min = __first;
       else if (!__comp(__first, __max))
  __max = __first;
       break;
     }

   if (__comp(__next, __first))
     {
       if (__comp(__next, __min))
  __min = __next;
       if (!__comp(__first, __max))
  __max = __first;
     }
   else
     {
       if (__comp(__first, __min))
  __min = __first;
       if (!__comp(__next, __max))
  __max = __next;
     }

   __first = __next;
   ++__first;
 }

      return std::make_pair(__min, __max);
    }
# 3397 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    constexpr
    inline pair<_ForwardIterator, _ForwardIterator>
    minmax_element(_ForwardIterator __first, _ForwardIterator __last)
    {




                                                     ;
                                                     ;

      return std::__minmax_element(__first, __last,
       __gnu_cxx::__ops::__iter_less_iter());
    }
# 3425 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Compare>
    constexpr
    inline pair<_ForwardIterator, _ForwardIterator>
    minmax_element(_ForwardIterator __first, _ForwardIterator __last,
     _Compare __comp)
    {





                                                     ;
                                                                  ;

      return std::__minmax_element(__first, __last,
       __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }


  template<typename _Tp>
    constexpr
    inline _Tp
    min(initializer_list<_Tp> __l)
    { return *std::min_element(__l.begin(), __l.end()); }

  template<typename _Tp, typename _Compare>
    constexpr
    inline _Tp
    min(initializer_list<_Tp> __l, _Compare __comp)
    { return *std::min_element(__l.begin(), __l.end(), __comp); }

  template<typename _Tp>
    constexpr
    inline _Tp
    max(initializer_list<_Tp> __l)
    { return *std::max_element(__l.begin(), __l.end()); }

  template<typename _Tp, typename _Compare>
    constexpr
    inline _Tp
    max(initializer_list<_Tp> __l, _Compare __comp)
    { return *std::max_element(__l.begin(), __l.end(), __comp); }

  template<typename _Tp>
    constexpr
    inline pair<_Tp, _Tp>
    minmax(initializer_list<_Tp> __l)
    {
      pair<const _Tp*, const _Tp*> __p =
 std::minmax_element(__l.begin(), __l.end());
      return std::make_pair(*__p.first, *__p.second);
    }

  template<typename _Tp, typename _Compare>
    constexpr
    inline pair<_Tp, _Tp>
    minmax(initializer_list<_Tp> __l, _Compare __comp)
    {
      pair<const _Tp*, const _Tp*> __p =
 std::minmax_element(__l.begin(), __l.end(), __comp);
      return std::make_pair(*__p.first, *__p.second);
    }

  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    bool
    __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
       _ForwardIterator2 __first2, _BinaryPredicate __pred)
    {


      for (; __first1 != __last1; ++__first1, (void)++__first2)
 if (!__pred(__first1, __first2))
   break;

      if (__first1 == __last1)
 return true;



      _ForwardIterator2 __last2 = __first2;
      std::advance(__last2, std::distance(__first1, __last1));
      for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
 {
   if (__scan != std::__find_if(__first1, __scan,
     __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
     continue;

   auto __matches
     = std::__count_if(__first2, __last2,
   __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
   if (0 == __matches ||
       std::__count_if(__scan, __last1,
   __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
       != __matches)
     return false;
 }
      return true;
    }
# 3537 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2>
    inline bool
    is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     _ForwardIterator2 __first2)
    {






                                                       ;

      return std::__is_permutation(__first1, __last1, __first2,
       __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 3568 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    inline bool
    is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     _ForwardIterator2 __first2, _BinaryPredicate __pred)
    {






                                                       ;

      return std::__is_permutation(__first1, __last1, __first2,
       __gnu_cxx::__ops::__iter_comp_iter(__pred));
    }


  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    bool
    __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
       _ForwardIterator2 __first2, _ForwardIterator2 __last2,
       _BinaryPredicate __pred)
    {
      using _Cat1
 = typename iterator_traits<_ForwardIterator1>::iterator_category;
      using _Cat2
 = typename iterator_traits<_ForwardIterator2>::iterator_category;
      using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
      using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
      constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA();
      if (__ra_iters)
 {
   auto __d1 = std::distance(__first1, __last1);
   auto __d2 = std::distance(__first2, __last2);
   if (__d1 != __d2)
     return false;
 }



      for (; __first1 != __last1 && __first2 != __last2;
   ++__first1, (void)++__first2)
 if (!__pred(__first1, __first2))
   break;

      if (__ra_iters)
 {
   if (__first1 == __last1)
     return true;
 }
      else
 {
   auto __d1 = std::distance(__first1, __last1);
   auto __d2 = std::distance(__first2, __last2);
   if (__d1 == 0 && __d2 == 0)
     return true;
   if (__d1 != __d2)
     return false;
 }

      for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
 {
   if (__scan != std::__find_if(__first1, __scan,
   __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
     continue;

   auto __matches = std::__count_if(__first2, __last2,
  __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
   if (0 == __matches
       || std::__count_if(__scan, __last1,
   __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
       != __matches)
     return false;
 }
      return true;
    }
# 3661 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2>
    inline bool
    is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     _ForwardIterator2 __first2, _ForwardIterator2 __last2)
    {
                                                       ;
                                                       ;

      return
 std::__is_permutation(__first1, __last1, __first2, __last2,
         __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 3688 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    inline bool
    is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     _ForwardIterator2 __first2, _ForwardIterator2 __last2,
     _BinaryPredicate __pred)
    {
                                                       ;
                                                       ;

      return std::__is_permutation(__first1, __last1, __first2, __last2,
       __gnu_cxx::__ops::__iter_comp_iter(__pred));
    }
# 3716 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator,
    typename _UniformRandomNumberGenerator>
    void
    shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
     _UniformRandomNumberGenerator&& __g)
    {



                                                     ;

      if (__first == __last)
 return;

      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
 _DistanceType;

      typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
      typedef typename std::uniform_int_distribution<__ud_type> __distr_type;
      typedef typename __distr_type::param_type __p_type;
      __distr_type __d;

      for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
 std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
    }
# 3761 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Function>
    _Function
    for_each(_InputIterator __first, _InputIterator __last, _Function __f)
    {


                                                     ;
      for (; __first != __last; ++__first)
 __f(*__first);
      return std::move(__f);
    }
# 3782 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Tp>
    inline _InputIterator
    find(_InputIterator __first, _InputIterator __last,
  const _Tp& __val)
    {




                                                     ;
      return std::__find_if(__first, __last,
       __gnu_cxx::__ops::__iter_equals_val(__val));
    }
# 3806 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Predicate>
    inline _InputIterator
    find_if(_InputIterator __first, _InputIterator __last,
     _Predicate __pred)
    {




                                                     ;

      return std::__find_if(__first, __last,
       __gnu_cxx::__ops::__pred_iter(__pred));
    }
# 3837 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _ForwardIterator>
    _InputIterator
    find_first_of(_InputIterator __first1, _InputIterator __last1,
    _ForwardIterator __first2, _ForwardIterator __last2)
    {






                                                       ;
                                                       ;

      for (; __first1 != __last1; ++__first1)
 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
   if (*__first1 == *__iter)
     return __first1;
      return __last1;
    }
# 3877 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _ForwardIterator,
    typename _BinaryPredicate>
    _InputIterator
    find_first_of(_InputIterator __first1, _InputIterator __last1,
    _ForwardIterator __first2, _ForwardIterator __last2,
    _BinaryPredicate __comp)
    {






                                                       ;
                                                       ;

      for (; __first1 != __last1; ++__first1)
 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
   if (__comp(*__first1, *__iter))
     return __first1;
      return __last1;
    }
# 3909 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    inline _ForwardIterator
    adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
    {




                                                     ;

      return std::__adjacent_find(__first, __last,
      __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 3934 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _BinaryPredicate>
    inline _ForwardIterator
    adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
    _BinaryPredicate __binary_pred)
    {





                                                     ;

      return std::__adjacent_find(__first, __last,
   __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
    }
# 3959 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Tp>
    inline typename iterator_traits<_InputIterator>::difference_type
    count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
    {




                                                     ;

      return std::__count_if(__first, __last,
        __gnu_cxx::__ops::__iter_equals_val(__value));
    }
# 3982 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _Predicate>
    inline typename iterator_traits<_InputIterator>::difference_type
    count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
    {




                                                     ;

      return std::__count_if(__first, __last,
        __gnu_cxx::__ops::__pred_iter(__pred));
    }
# 4022 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2>
    inline _ForwardIterator1
    search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    _ForwardIterator2 __first2, _ForwardIterator2 __last2)
    {






                                                       ;
                                                       ;

      return std::__search(__first1, __last1, __first2, __last2,
      __gnu_cxx::__ops::__iter_equal_to_iter());
    }
# 4061 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator1, typename _ForwardIterator2,
    typename _BinaryPredicate>
    inline _ForwardIterator1
    search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    _ForwardIterator2 __first2, _ForwardIterator2 __last2,
    _BinaryPredicate __predicate)
    {






                                                       ;
                                                       ;

      return std::__search(__first1, __last1, __first2, __last2,
      __gnu_cxx::__ops::__iter_comp_iter(__predicate));
    }
# 4096 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Integer, typename _Tp>
    inline _ForwardIterator
    search_n(_ForwardIterator __first, _ForwardIterator __last,
      _Integer __count, const _Tp& __val)
    {




                                                     ;

      return std::__search_n(__first, __last, __count,
        __gnu_cxx::__ops::__iter_equals_val(__val));
    }
# 4129 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Integer, typename _Tp,
    typename _BinaryPredicate>
    inline _ForwardIterator
    search_n(_ForwardIterator __first, _ForwardIterator __last,
      _Integer __count, const _Tp& __val,
      _BinaryPredicate __binary_pred)
    {




                                                     ;

      return std::__search_n(__first, __last, __count,
  __gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val));
    }
# 4163 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator,
    typename _UnaryOperation>
    _OutputIterator
    transform(_InputIterator __first, _InputIterator __last,
       _OutputIterator __result, _UnaryOperation __unary_op)
    {





                                                     ;

      for (; __first != __last; ++__first, (void)++__result)
 *__result = __unary_op(*__first);
      return __result;
    }
# 4200 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _BinaryOperation>
    _OutputIterator
    transform(_InputIterator1 __first1, _InputIterator1 __last1,
       _InputIterator2 __first2, _OutputIterator __result,
       _BinaryOperation __binary_op)
    {






                                                       ;

      for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
 *__result = __binary_op(*__first1, *__first2);
      return __result;
    }
# 4233 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Tp>
    void
    replace(_ForwardIterator __first, _ForwardIterator __last,
     const _Tp& __old_value, const _Tp& __new_value)
    {







                                                     ;

      for (; __first != __last; ++__first)
 if (*__first == __old_value)
   *__first = __new_value;
    }
# 4265 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Predicate, typename _Tp>
    void
    replace_if(_ForwardIterator __first, _ForwardIterator __last,
        _Predicate __pred, const _Tp& __new_value)
    {







                                                     ;

      for (; __first != __last; ++__first)
 if (__pred(*__first))
   *__first = __new_value;
    }
# 4297 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Generator>
    void
    generate(_ForwardIterator __first, _ForwardIterator __last,
      _Generator __gen)
    {




                                                     ;

      for (; __first != __last; ++__first)
 *__first = __gen();
    }
# 4328 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _OutputIterator, typename _Size, typename _Generator>
    _OutputIterator
    generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
    {





      for (__decltype(__n + 0) __niter = __n;
    __niter > 0; --__niter, ++__first)
 *__first = __gen();
      return __first;
    }
# 4364 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator>
    inline _OutputIterator
    unique_copy(_InputIterator __first, _InputIterator __last,
  _OutputIterator __result)
    {






                                                     ;

      if (__first == __last)
 return __result;
      return std::__unique_copy(__first, __last, __result,
    __gnu_cxx::__ops::__iter_equal_to_iter(),
    std::__iterator_category(__first),
    std::__iterator_category(__result));
    }
# 4404 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator, typename _OutputIterator,
    typename _BinaryPredicate>
    inline _OutputIterator
    unique_copy(_InputIterator __first, _InputIterator __last,
  _OutputIterator __result,
  _BinaryPredicate __binary_pred)
    {




                                                     ;

      if (__first == __last)
 return __result;
      return std::__unique_copy(__first, __last, __result,
   __gnu_cxx::__ops::__iter_comp_iter(__binary_pred),
    std::__iterator_category(__first),
    std::__iterator_category(__result));
    }
# 4437 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator>
    inline void
    random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {



                                                     ;

      if (__first != __last)
 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
   {

     _RandomAccessIterator __j = __first
     + std::rand() % ((__i - __first) + 1);
     if (__i != __j)
       std::iter_swap(__i, __j);
   }
    }
# 4472 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
    void
    random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,

     _RandomNumberGenerator&& __rand)



    {



                                                     ;

      if (__first == __last)
 return;
      for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
 {
   _RandomAccessIterator __j = __first + __rand((__i - __first) + 1);
   if (__i != __j)
     std::iter_swap(__i, __j);
 }
    }
# 4512 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Predicate>
    inline _ForwardIterator
    partition(_ForwardIterator __first, _ForwardIterator __last,
       _Predicate __pred)
    {





                                                     ;

      return std::__partition(__first, __last, __pred,
         std::__iterator_category(__first));
    }
# 4545 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator>
    inline void
    partial_sort(_RandomAccessIterator __first,
   _RandomAccessIterator __middle,
   _RandomAccessIterator __last)
    {





                                                       ;
                                                      ;
                                                     ;

      std::__partial_sort(__first, __middle, __last,
     __gnu_cxx::__ops::__iter_less_iter());
    }
# 4583 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    partial_sort(_RandomAccessIterator __first,
   _RandomAccessIterator __middle,
   _RandomAccessIterator __last,
   _Compare __comp)
    {






                                                       ;
                                                      ;
                                                                  ;

      std::__partial_sort(__first, __middle, __last,
     __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }
# 4619 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator>
    inline void
    nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
  _RandomAccessIterator __last)
    {





                                                    ;
                                                   ;
                                                     ;

      if (__first == __last || __nth == __last)
 return;

      std::__introselect(__first, __nth, __last,
    std::__lg(__last - __first) * 2,
    __gnu_cxx::__ops::__iter_less_iter());
    }
# 4658 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
  _RandomAccessIterator __last, _Compare __comp)
    {






                                                    ;
                                                   ;
                                                                  ;

      if (__first == __last || __nth == __last)
 return;

      std::__introselect(__first, __nth, __last,
    std::__lg(__last - __first) * 2,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }
# 4695 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator>
    inline void
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {





                                                     ;
                                                     ;

      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
    }
# 4725 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
  _Compare __comp)
    {






                                                     ;
                                                                  ;

      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _Compare>
    _OutputIterator
    __merge(_InputIterator1 __first1, _InputIterator1 __last1,
     _InputIterator2 __first2, _InputIterator2 __last2,
     _OutputIterator __result, _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 {
   if (__comp(__first2, __first1))
     {
       *__result = *__first2;
       ++__first2;
     }
   else
     {
       *__result = *__first1;
       ++__first1;
     }
   ++__result;
 }
      return std::copy(__first2, __last2,
         std::copy(__first1, __last1, __result));
    }
# 4786 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator>
    inline _OutputIterator
    merge(_InputIterator1 __first1, _InputIterator1 __last1,
   _InputIterator2 __first2, _InputIterator2 __last2,
   _OutputIterator __result)
    {
# 4803 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                ;
                                                                ;
                                                        ;
                                                        ;

      return std::__merge(__first1, __last1,
         __first2, __last2, __result,
         __gnu_cxx::__ops::__iter_less_iter());
    }
# 4836 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _Compare>
    inline _OutputIterator
    merge(_InputIterator1 __first1, _InputIterator1 __last1,
   _InputIterator2 __first2, _InputIterator2 __last2,
   _OutputIterator __result, _Compare __comp)
    {
# 4853 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                             ;
                                                                             ;
                                                                     ;
                                                                     ;

      return std::__merge(__first1, __last1,
    __first2, __last2, __result,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
    _Compare __comp)
    {
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
 _ValueType;
      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
 _DistanceType;

      typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf;
      _TmpBuf __buf(__first, __last);

      if (__buf.begin() == 0)
 std::__inplace_stable_sort(__first, __last, __comp);
      else
 std::__stable_sort_adaptive(__first, __last, __buf.begin(),
        _DistanceType(__buf.size()), __comp);
    }
# 4900 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator>
    inline void
    stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
    {





                                                     ;
                                                     ;

      std::__stable_sort(__first, __last,
        __gnu_cxx::__ops::__iter_less_iter());
    }
# 4934 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
  _Compare __comp)
    {






                                                     ;
                                                                  ;

      std::__stable_sort(__first, __last,
        __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator,
    typename _Compare>
    _OutputIterator
    __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
  _InputIterator2 __first2, _InputIterator2 __last2,
  _OutputIterator __result, _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 {
   if (__comp(__first1, __first2))
     {
       *__result = *__first1;
       ++__first1;
     }
   else if (__comp(__first2, __first1))
     {
       *__result = *__first2;
       ++__first2;
     }
   else
     {
       *__result = *__first1;
       ++__first1;
       ++__first2;
     }
   ++__result;
 }
      return std::copy(__first2, __last2,
         std::copy(__first1, __last1, __result));
    }
# 5002 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator>
    inline _OutputIterator
    set_union(_InputIterator1 __first1, _InputIterator1 __last1,
       _InputIterator2 __first2, _InputIterator2 __last2,
       _OutputIterator __result)
    {
# 5022 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                ;
                                                                ;
                                                        ;
                                                        ;

      return std::__set_union(__first1, __last1,
    __first2, __last2, __result,
    __gnu_cxx::__ops::__iter_less_iter());
    }
# 5051 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _Compare>
    inline _OutputIterator
    set_union(_InputIterator1 __first1, _InputIterator1 __last1,
       _InputIterator2 __first2, _InputIterator2 __last2,
       _OutputIterator __result, _Compare __comp)
    {
# 5071 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                             ;
                                                                             ;
                                                                     ;
                                                                     ;

      return std::__set_union(__first1, __last1,
    __first2, __last2, __result,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator,
    typename _Compare>
    _OutputIterator
    __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
         _InputIterator2 __first2, _InputIterator2 __last2,
         _OutputIterator __result, _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 if (__comp(__first1, __first2))
   ++__first1;
 else if (__comp(__first2, __first1))
   ++__first2;
 else
   {
     *__result = *__first1;
     ++__first1;
     ++__first2;
     ++__result;
   }
      return __result;
    }
# 5121 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator>
    inline _OutputIterator
    set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
       _InputIterator2 __first2, _InputIterator2 __last2,
       _OutputIterator __result)
    {
# 5139 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                ;
                                                                ;
                                                        ;
                                                        ;

      return std::__set_intersection(__first1, __last1,
         __first2, __last2, __result,
         __gnu_cxx::__ops::__iter_less_iter());
    }
# 5169 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _Compare>
    inline _OutputIterator
    set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
       _InputIterator2 __first2, _InputIterator2 __last2,
       _OutputIterator __result, _Compare __comp)
    {
# 5187 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                             ;
                                                                             ;
                                                                     ;
                                                                     ;

      return std::__set_intersection(__first1, __last1,
    __first2, __last2, __result,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator,
    typename _Compare>
    _OutputIterator
    __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
       _InputIterator2 __first2, _InputIterator2 __last2,
       _OutputIterator __result, _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 if (__comp(__first1, __first2))
   {
     *__result = *__first1;
     ++__first1;
     ++__result;
   }
 else if (__comp(__first2, __first1))
   ++__first2;
 else
   {
     ++__first1;
     ++__first2;
   }
      return std::copy(__first1, __last1, __result);
    }
# 5241 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator>
    inline _OutputIterator
    set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
     _InputIterator2 __first2, _InputIterator2 __last2,
     _OutputIterator __result)
    {
# 5259 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                ;
                                                                ;
                                                        ;
                                                        ;

      return std::__set_difference(__first1, __last1,
       __first2, __last2, __result,
       __gnu_cxx::__ops::__iter_less_iter());
    }
# 5291 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _Compare>
    inline _OutputIterator
    set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
     _InputIterator2 __first2, _InputIterator2 __last2,
     _OutputIterator __result, _Compare __comp)
    {
# 5309 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                             ;
                                                                             ;
                                                                     ;
                                                                     ;

      return std::__set_difference(__first1, __last1,
       __first2, __last2, __result,
       __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator,
    typename _Compare>
    _OutputIterator
    __set_symmetric_difference(_InputIterator1 __first1,
          _InputIterator1 __last1,
          _InputIterator2 __first2,
          _InputIterator2 __last2,
          _OutputIterator __result,
          _Compare __comp)
    {
      while (__first1 != __last1 && __first2 != __last2)
 if (__comp(__first1, __first2))
   {
     *__result = *__first1;
     ++__first1;
     ++__result;
   }
 else if (__comp(__first2, __first1))
   {
     *__result = *__first2;
     ++__first2;
     ++__result;
   }
 else
   {
     ++__first1;
     ++__first2;
   }
      return std::copy(__first2, __last2,
         std::copy(__first1, __last1, __result));
    }
# 5369 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator>
    inline _OutputIterator
    set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
        _InputIterator2 __first2, _InputIterator2 __last2,
        _OutputIterator __result)
    {
# 5389 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                ;
                                                                ;
                                                        ;
                                                        ;

      return std::__set_symmetric_difference(__first1, __last1,
     __first2, __last2, __result,
     __gnu_cxx::__ops::__iter_less_iter());
    }
# 5419 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _OutputIterator, typename _Compare>
    inline _OutputIterator
    set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
        _InputIterator2 __first2, _InputIterator2 __last2,
        _OutputIterator __result,
        _Compare __comp)
    {
# 5440 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
                                                                             ;
                                                                             ;
                                                                     ;
                                                                     ;

      return std::__set_symmetric_difference(__first1, __last1,
    __first2, __last2, __result,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _ForwardIterator, typename _Compare>
    constexpr
    _ForwardIterator
    __min_element(_ForwardIterator __first, _ForwardIterator __last,
    _Compare __comp)
    {
      if (__first == __last)
 return __first;
      _ForwardIterator __result = __first;
      while (++__first != __last)
 if (__comp(__first, __result))
   __result = __first;
      return __result;
    }
# 5472 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    constexpr
    _ForwardIterator
    inline min_element(_ForwardIterator __first, _ForwardIterator __last)
    {




                                                     ;
                                                     ;

      return std::__min_element(__first, __last,
    __gnu_cxx::__ops::__iter_less_iter());
    }
# 5497 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Compare>
    constexpr
    inline _ForwardIterator
    min_element(_ForwardIterator __first, _ForwardIterator __last,
  _Compare __comp)
    {





                                                     ;
                                                                  ;

      return std::__min_element(__first, __last,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

  template<typename _ForwardIterator, typename _Compare>
    constexpr
    _ForwardIterator
    __max_element(_ForwardIterator __first, _ForwardIterator __last,
    _Compare __comp)
    {
      if (__first == __last) return __first;
      _ForwardIterator __result = __first;
      while (++__first != __last)
 if (__comp(__result, __first))
   __result = __first;
      return __result;
    }
# 5536 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator>
    constexpr
    inline _ForwardIterator
    max_element(_ForwardIterator __first, _ForwardIterator __last)
    {




                                                     ;
                                                     ;

      return std::__max_element(__first, __last,
    __gnu_cxx::__ops::__iter_less_iter());
    }
# 5561 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h" 3
  template<typename _ForwardIterator, typename _Compare>
    constexpr
    inline _ForwardIterator
    max_element(_ForwardIterator __first, _ForwardIterator __last,
  _Compare __comp)
    {





                                                     ;
                                                                  ;

      return std::__max_element(__first, __last,
    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }


}
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/algorithm" 2 3
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3





# 1 "/usr/include/math.h" 1 3 4
# 28 "/usr/include/math.h" 3 4
extern "C" {



# 1 "/usr/include/bits/math-vector.h" 1 3 4
# 25 "/usr/include/bits/math-vector.h" 3 4
# 1 "/usr/include/bits/libm-simd-decl-stubs.h" 1 3 4
# 26 "/usr/include/bits/math-vector.h" 2 3 4
# 32 "/usr/include/math.h" 2 3 4



# 1 "/usr/include/bits/huge_val.h" 1 3 4
# 36 "/usr/include/math.h" 2 3 4

# 1 "/usr/include/bits/huge_valf.h" 1 3 4
# 38 "/usr/include/math.h" 2 3 4
# 1 "/usr/include/bits/huge_vall.h" 1 3 4
# 39 "/usr/include/math.h" 2 3 4


# 1 "/usr/include/bits/inf.h" 1 3 4
# 42 "/usr/include/math.h" 2 3 4


# 1 "/usr/include/bits/nan.h" 1 3 4
# 45 "/usr/include/math.h" 2 3 4



# 1 "/usr/include/bits/mathdef.h" 1 3 4
# 28 "/usr/include/bits/mathdef.h" 3 4
typedef float float_t;
typedef double double_t;
# 49 "/usr/include/math.h" 2 3 4
# 83 "/usr/include/math.h" 3 4
# 1 "/usr/include/bits/mathcalls.h" 1 3 4
# 54 "/usr/include/bits/mathcalls.h" 3 4
extern double acos (double __x) throw (); extern double __acos (double __x) throw ();

extern double asin (double __x) throw (); extern double __asin (double __x) throw ();

extern double atan (double __x) throw (); extern double __atan (double __x) throw ();

extern double atan2 (double __y, double __x) throw (); extern double __atan2 (double __y, double __x) throw ();


 extern double cos (double __x) throw (); extern double __cos (double __x) throw ();

 extern double sin (double __x) throw (); extern double __sin (double __x) throw ();

extern double tan (double __x) throw (); extern double __tan (double __x) throw ();




extern double cosh (double __x) throw (); extern double __cosh (double __x) throw ();

extern double sinh (double __x) throw (); extern double __sinh (double __x) throw ();

extern double tanh (double __x) throw (); extern double __tanh (double __x) throw ();




 extern void sincos (double __x, double *__sinx, double *__cosx) throw (); extern void __sincos (double __x, double *__sinx, double *__cosx) throw ();






extern double acosh (double __x) throw (); extern double __acosh (double __x) throw ();

extern double asinh (double __x) throw (); extern double __asinh (double __x) throw ();

extern double atanh (double __x) throw (); extern double __atanh (double __x) throw ();







 extern double exp (double __x) throw (); extern double __exp (double __x) throw ();


extern double frexp (double __x, int *__exponent) throw (); extern double __frexp (double __x, int *__exponent) throw ();


extern double ldexp (double __x, int __exponent) throw (); extern double __ldexp (double __x, int __exponent) throw ();


 extern double log (double __x) throw (); extern double __log (double __x) throw ();


extern double log10 (double __x) throw (); extern double __log10 (double __x) throw ();


extern double modf (double __x, double *__iptr) throw (); extern double __modf (double __x, double *__iptr) throw () __attribute__ ((__nonnull__ (2)));




extern double exp10 (double __x) throw (); extern double __exp10 (double __x) throw ();

extern double pow10 (double __x) throw (); extern double __pow10 (double __x) throw ();





extern double expm1 (double __x) throw (); extern double __expm1 (double __x) throw ();


extern double log1p (double __x) throw (); extern double __log1p (double __x) throw ();


extern double logb (double __x) throw (); extern double __logb (double __x) throw ();






extern double exp2 (double __x) throw (); extern double __exp2 (double __x) throw ();


extern double log2 (double __x) throw (); extern double __log2 (double __x) throw ();
# 153 "/usr/include/bits/mathcalls.h" 3 4
 extern double pow (double __x, double __y) throw (); extern double __pow (double __x, double __y) throw ();


extern double sqrt (double __x) throw (); extern double __sqrt (double __x) throw ();





extern double hypot (double __x, double __y) throw (); extern double __hypot (double __x, double __y) throw ();






extern double cbrt (double __x) throw (); extern double __cbrt (double __x) throw ();
# 178 "/usr/include/bits/mathcalls.h" 3 4
extern double ceil (double __x) throw () __attribute__ ((__const__)); extern double __ceil (double __x) throw () __attribute__ ((__const__));


extern double fabs (double __x) throw () __attribute__ ((__const__)); extern double __fabs (double __x) throw () __attribute__ ((__const__));


extern double floor (double __x) throw () __attribute__ ((__const__)); extern double __floor (double __x) throw () __attribute__ ((__const__));


extern double fmod (double __x, double __y) throw (); extern double __fmod (double __x, double __y) throw ();




extern int __isinf (double __value) throw () __attribute__ ((__const__));


extern int __finite (double __value) throw () __attribute__ ((__const__));
# 208 "/usr/include/bits/mathcalls.h" 3 4
extern int finite (double __value) throw () __attribute__ ((__const__));


extern double drem (double __x, double __y) throw (); extern double __drem (double __x, double __y) throw ();



extern double significand (double __x) throw (); extern double __significand (double __x) throw ();





extern double copysign (double __x, double __y) throw () __attribute__ ((__const__)); extern double __copysign (double __x, double __y) throw () __attribute__ ((__const__));






extern double nan (const char *__tagb) throw () __attribute__ ((__const__)); extern double __nan (const char *__tagb) throw () __attribute__ ((__const__));





extern int __isnan (double __value) throw () __attribute__ ((__const__));
# 247 "/usr/include/bits/mathcalls.h" 3 4
extern double j0 (double) throw (); extern double __j0 (double) throw ();
extern double j1 (double) throw (); extern double __j1 (double) throw ();
extern double jn (int, double) throw (); extern double __jn (int, double) throw ();
extern double y0 (double) throw (); extern double __y0 (double) throw ();
extern double y1 (double) throw (); extern double __y1 (double) throw ();
extern double yn (int, double) throw (); extern double __yn (int, double) throw ();






extern double erf (double) throw (); extern double __erf (double) throw ();
extern double erfc (double) throw (); extern double __erfc (double) throw ();
extern double lgamma (double) throw (); extern double __lgamma (double) throw ();






extern double tgamma (double) throw (); extern double __tgamma (double) throw ();





extern double gamma (double) throw (); extern double __gamma (double) throw ();






extern double lgamma_r (double, int *__signgamp) throw (); extern double __lgamma_r (double, int *__signgamp) throw ();







extern double rint (double __x) throw (); extern double __rint (double __x) throw ();


extern double nextafter (double __x, double __y) throw () __attribute__ ((__const__)); extern double __nextafter (double __x, double __y) throw () __attribute__ ((__const__));

extern double nexttoward (double __x, long double __y) throw () __attribute__ ((__const__)); extern double __nexttoward (double __x, long double __y) throw () __attribute__ ((__const__));




extern double nextdown (double __x) throw (); extern double __nextdown (double __x) throw ();

extern double nextup (double __x) throw (); extern double __nextup (double __x) throw ();



extern double remainder (double __x, double __y) throw (); extern double __remainder (double __x, double __y) throw ();



extern double scalbn (double __x, int __n) throw (); extern double __scalbn (double __x, int __n) throw ();



extern int ilogb (double __x) throw (); extern int __ilogb (double __x) throw ();




extern double scalbln (double __x, long int __n) throw (); extern double __scalbln (double __x, long int __n) throw ();



extern double nearbyint (double __x) throw (); extern double __nearbyint (double __x) throw ();



extern double round (double __x) throw () __attribute__ ((__const__)); extern double __round (double __x) throw () __attribute__ ((__const__));



extern double trunc (double __x) throw () __attribute__ ((__const__)); extern double __trunc (double __x) throw () __attribute__ ((__const__));




extern double remquo (double __x, double __y, int *__quo) throw (); extern double __remquo (double __x, double __y, int *__quo) throw ();






extern long int lrint (double __x) throw (); extern long int __lrint (double __x) throw ();
__extension__
extern long long int llrint (double __x) throw (); extern long long int __llrint (double __x) throw ();



extern long int lround (double __x) throw (); extern long int __lround (double __x) throw ();
__extension__
extern long long int llround (double __x) throw (); extern long long int __llround (double __x) throw ();



extern double fdim (double __x, double __y) throw (); extern double __fdim (double __x, double __y) throw ();


extern double fmax (double __x, double __y) throw () __attribute__ ((__const__)); extern double __fmax (double __x, double __y) throw () __attribute__ ((__const__));


extern double fmin (double __x, double __y) throw () __attribute__ ((__const__)); extern double __fmin (double __x, double __y) throw () __attribute__ ((__const__));



extern int __fpclassify (double __value) throw ()
     __attribute__ ((__const__));


extern int __signbit (double __value) throw ()
     __attribute__ ((__const__));



extern double fma (double __x, double __y, double __z) throw (); extern double __fma (double __x, double __y, double __z) throw ();
# 382 "/usr/include/bits/mathcalls.h" 3 4
extern int __issignaling (double __value) throw ()
     __attribute__ ((__const__));






extern double scalb (double __x, double __n) throw (); extern double __scalb (double __x, double __n) throw ();
# 84 "/usr/include/math.h" 2 3 4
# 104 "/usr/include/math.h" 3 4
# 1 "/usr/include/bits/mathcalls.h" 1 3 4
# 54 "/usr/include/bits/mathcalls.h" 3 4
extern float acosf (float __x) throw (); extern float __acosf (float __x) throw ();

extern float asinf (float __x) throw (); extern float __asinf (float __x) throw ();

extern float atanf (float __x) throw (); extern float __atanf (float __x) throw ();

extern float atan2f (float __y, float __x) throw (); extern float __atan2f (float __y, float __x) throw ();


 extern float cosf (float __x) throw (); extern float __cosf (float __x) throw ();

 extern float sinf (float __x) throw (); extern float __sinf (float __x) throw ();

extern float tanf (float __x) throw (); extern float __tanf (float __x) throw ();




extern float coshf (float __x) throw (); extern float __coshf (float __x) throw ();

extern float sinhf (float __x) throw (); extern float __sinhf (float __x) throw ();

extern float tanhf (float __x) throw (); extern float __tanhf (float __x) throw ();




 extern void sincosf (float __x, float *__sinx, float *__cosx) throw (); extern void __sincosf (float __x, float *__sinx, float *__cosx) throw ();






extern float acoshf (float __x) throw (); extern float __acoshf (float __x) throw ();

extern float asinhf (float __x) throw (); extern float __asinhf (float __x) throw ();

extern float atanhf (float __x) throw (); extern float __atanhf (float __x) throw ();







 extern float expf (float __x) throw (); extern float __expf (float __x) throw ();


extern float frexpf (float __x, int *__exponent) throw (); extern float __frexpf (float __x, int *__exponent) throw ();


extern float ldexpf (float __x, int __exponent) throw (); extern float __ldexpf (float __x, int __exponent) throw ();


 extern float logf (float __x) throw (); extern float __logf (float __x) throw ();


extern float log10f (float __x) throw (); extern float __log10f (float __x) throw ();


extern float modff (float __x, float *__iptr) throw (); extern float __modff (float __x, float *__iptr) throw () __attribute__ ((__nonnull__ (2)));




extern float exp10f (float __x) throw (); extern float __exp10f (float __x) throw ();

extern float pow10f (float __x) throw (); extern float __pow10f (float __x) throw ();





extern float expm1f (float __x) throw (); extern float __expm1f (float __x) throw ();


extern float log1pf (float __x) throw (); extern float __log1pf (float __x) throw ();


extern float logbf (float __x) throw (); extern float __logbf (float __x) throw ();






extern float exp2f (float __x) throw (); extern float __exp2f (float __x) throw ();


extern float log2f (float __x) throw (); extern float __log2f (float __x) throw ();
# 153 "/usr/include/bits/mathcalls.h" 3 4
 extern float powf (float __x, float __y) throw (); extern float __powf (float __x, float __y) throw ();


extern float sqrtf (float __x) throw (); extern float __sqrtf (float __x) throw ();





extern float hypotf (float __x, float __y) throw (); extern float __hypotf (float __x, float __y) throw ();






extern float cbrtf (float __x) throw (); extern float __cbrtf (float __x) throw ();
# 178 "/usr/include/bits/mathcalls.h" 3 4
extern float ceilf (float __x) throw () __attribute__ ((__const__)); extern float __ceilf (float __x) throw () __attribute__ ((__const__));


extern float fabsf (float __x) throw () __attribute__ ((__const__)); extern float __fabsf (float __x) throw () __attribute__ ((__const__));


extern float floorf (float __x) throw () __attribute__ ((__const__)); extern float __floorf (float __x) throw () __attribute__ ((__const__));


extern float fmodf (float __x, float __y) throw (); extern float __fmodf (float __x, float __y) throw ();




extern int __isinff (float __value) throw () __attribute__ ((__const__));


extern int __finitef (float __value) throw () __attribute__ ((__const__));
# 204 "/usr/include/bits/mathcalls.h" 3 4
extern int isinff (float __value) throw () __attribute__ ((__const__));



extern int finitef (float __value) throw () __attribute__ ((__const__));


extern float dremf (float __x, float __y) throw (); extern float __dremf (float __x, float __y) throw ();



extern float significandf (float __x) throw (); extern float __significandf (float __x) throw ();





extern float copysignf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __copysignf (float __x, float __y) throw () __attribute__ ((__const__));






extern float nanf (const char *__tagb) throw () __attribute__ ((__const__)); extern float __nanf (const char *__tagb) throw () __attribute__ ((__const__));





extern int __isnanf (float __value) throw () __attribute__ ((__const__));






extern int isnanf (float __value) throw () __attribute__ ((__const__));





extern float j0f (float) throw (); extern float __j0f (float) throw ();
extern float j1f (float) throw (); extern float __j1f (float) throw ();
extern float jnf (int, float) throw (); extern float __jnf (int, float) throw ();
extern float y0f (float) throw (); extern float __y0f (float) throw ();
extern float y1f (float) throw (); extern float __y1f (float) throw ();
extern float ynf (int, float) throw (); extern float __ynf (int, float) throw ();






extern float erff (float) throw (); extern float __erff (float) throw ();
extern float erfcf (float) throw (); extern float __erfcf (float) throw ();
extern float lgammaf (float) throw (); extern float __lgammaf (float) throw ();






extern float tgammaf (float) throw (); extern float __tgammaf (float) throw ();





extern float gammaf (float) throw (); extern float __gammaf (float) throw ();






extern float lgammaf_r (float, int *__signgamp) throw (); extern float __lgammaf_r (float, int *__signgamp) throw ();







extern float rintf (float __x) throw (); extern float __rintf (float __x) throw ();


extern float nextafterf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __nextafterf (float __x, float __y) throw () __attribute__ ((__const__));

extern float nexttowardf (float __x, long double __y) throw () __attribute__ ((__const__)); extern float __nexttowardf (float __x, long double __y) throw () __attribute__ ((__const__));




extern float nextdownf (float __x) throw (); extern float __nextdownf (float __x) throw ();

extern float nextupf (float __x) throw (); extern float __nextupf (float __x) throw ();



extern float remainderf (float __x, float __y) throw (); extern float __remainderf (float __x, float __y) throw ();



extern float scalbnf (float __x, int __n) throw (); extern float __scalbnf (float __x, int __n) throw ();



extern int ilogbf (float __x) throw (); extern int __ilogbf (float __x) throw ();




extern float scalblnf (float __x, long int __n) throw (); extern float __scalblnf (float __x, long int __n) throw ();



extern float nearbyintf (float __x) throw (); extern float __nearbyintf (float __x) throw ();



extern float roundf (float __x) throw () __attribute__ ((__const__)); extern float __roundf (float __x) throw () __attribute__ ((__const__));



extern float truncf (float __x) throw () __attribute__ ((__const__)); extern float __truncf (float __x) throw () __attribute__ ((__const__));




extern float remquof (float __x, float __y, int *__quo) throw (); extern float __remquof (float __x, float __y, int *__quo) throw ();






extern long int lrintf (float __x) throw (); extern long int __lrintf (float __x) throw ();
__extension__
extern long long int llrintf (float __x) throw (); extern long long int __llrintf (float __x) throw ();



extern long int lroundf (float __x) throw (); extern long int __lroundf (float __x) throw ();
__extension__
extern long long int llroundf (float __x) throw (); extern long long int __llroundf (float __x) throw ();



extern float fdimf (float __x, float __y) throw (); extern float __fdimf (float __x, float __y) throw ();


extern float fmaxf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __fmaxf (float __x, float __y) throw () __attribute__ ((__const__));


extern float fminf (float __x, float __y) throw () __attribute__ ((__const__)); extern float __fminf (float __x, float __y) throw () __attribute__ ((__const__));



extern int __fpclassifyf (float __value) throw ()
     __attribute__ ((__const__));


extern int __signbitf (float __value) throw ()
     __attribute__ ((__const__));



extern float fmaf (float __x, float __y, float __z) throw (); extern float __fmaf (float __x, float __y, float __z) throw ();
# 382 "/usr/include/bits/mathcalls.h" 3 4
extern int __issignalingf (float __value) throw ()
     __attribute__ ((__const__));






extern float scalbf (float __x, float __n) throw (); extern float __scalbf (float __x, float __n) throw ();
# 105 "/usr/include/math.h" 2 3 4
# 151 "/usr/include/math.h" 3 4
# 1 "/usr/include/bits/mathcalls.h" 1 3 4
# 54 "/usr/include/bits/mathcalls.h" 3 4
extern long double acosl (long double __x) throw (); extern long double __acosl (long double __x) throw ();

extern long double asinl (long double __x) throw (); extern long double __asinl (long double __x) throw ();

extern long double atanl (long double __x) throw (); extern long double __atanl (long double __x) throw ();

extern long double atan2l (long double __y, long double __x) throw (); extern long double __atan2l (long double __y, long double __x) throw ();


 extern long double cosl (long double __x) throw (); extern long double __cosl (long double __x) throw ();

 extern long double sinl (long double __x) throw (); extern long double __sinl (long double __x) throw ();

extern long double tanl (long double __x) throw (); extern long double __tanl (long double __x) throw ();




extern long double coshl (long double __x) throw (); extern long double __coshl (long double __x) throw ();

extern long double sinhl (long double __x) throw (); extern long double __sinhl (long double __x) throw ();

extern long double tanhl (long double __x) throw (); extern long double __tanhl (long double __x) throw ();




 extern void sincosl (long double __x, long double *__sinx, long double *__cosx) throw (); extern void __sincosl (long double __x, long double *__sinx, long double *__cosx) throw ();






extern long double acoshl (long double __x) throw (); extern long double __acoshl (long double __x) throw ();

extern long double asinhl (long double __x) throw (); extern long double __asinhl (long double __x) throw ();

extern long double atanhl (long double __x) throw (); extern long double __atanhl (long double __x) throw ();







 extern long double expl (long double __x) throw (); extern long double __expl (long double __x) throw ();


extern long double frexpl (long double __x, int *__exponent) throw (); extern long double __frexpl (long double __x, int *__exponent) throw ();


extern long double ldexpl (long double __x, int __exponent) throw (); extern long double __ldexpl (long double __x, int __exponent) throw ();


 extern long double logl (long double __x) throw (); extern long double __logl (long double __x) throw ();


extern long double log10l (long double __x) throw (); extern long double __log10l (long double __x) throw ();


extern long double modfl (long double __x, long double *__iptr) throw (); extern long double __modfl (long double __x, long double *__iptr) throw () __attribute__ ((__nonnull__ (2)));




extern long double exp10l (long double __x) throw (); extern long double __exp10l (long double __x) throw ();

extern long double pow10l (long double __x) throw (); extern long double __pow10l (long double __x) throw ();





extern long double expm1l (long double __x) throw (); extern long double __expm1l (long double __x) throw ();


extern long double log1pl (long double __x) throw (); extern long double __log1pl (long double __x) throw ();


extern long double logbl (long double __x) throw (); extern long double __logbl (long double __x) throw ();






extern long double exp2l (long double __x) throw (); extern long double __exp2l (long double __x) throw ();


extern long double log2l (long double __x) throw (); extern long double __log2l (long double __x) throw ();
# 153 "/usr/include/bits/mathcalls.h" 3 4
 extern long double powl (long double __x, long double __y) throw (); extern long double __powl (long double __x, long double __y) throw ();


extern long double sqrtl (long double __x) throw (); extern long double __sqrtl (long double __x) throw ();





extern long double hypotl (long double __x, long double __y) throw (); extern long double __hypotl (long double __x, long double __y) throw ();






extern long double cbrtl (long double __x) throw (); extern long double __cbrtl (long double __x) throw ();
# 178 "/usr/include/bits/mathcalls.h" 3 4
extern long double ceill (long double __x) throw () __attribute__ ((__const__)); extern long double __ceill (long double __x) throw () __attribute__ ((__const__));


extern long double fabsl (long double __x) throw () __attribute__ ((__const__)); extern long double __fabsl (long double __x) throw () __attribute__ ((__const__));


extern long double floorl (long double __x) throw () __attribute__ ((__const__)); extern long double __floorl (long double __x) throw () __attribute__ ((__const__));


extern long double fmodl (long double __x, long double __y) throw (); extern long double __fmodl (long double __x, long double __y) throw ();




extern int __isinfl (long double __value) throw () __attribute__ ((__const__));


extern int __finitel (long double __value) throw () __attribute__ ((__const__));
# 204 "/usr/include/bits/mathcalls.h" 3 4
extern int isinfl (long double __value) throw () __attribute__ ((__const__));



extern int finitel (long double __value) throw () __attribute__ ((__const__));


extern long double dreml (long double __x, long double __y) throw (); extern long double __dreml (long double __x, long double __y) throw ();



extern long double significandl (long double __x) throw (); extern long double __significandl (long double __x) throw ();





extern long double copysignl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __copysignl (long double __x, long double __y) throw () __attribute__ ((__const__));






extern long double nanl (const char *__tagb) throw () __attribute__ ((__const__)); extern long double __nanl (const char *__tagb) throw () __attribute__ ((__const__));





extern int __isnanl (long double __value) throw () __attribute__ ((__const__));






extern int isnanl (long double __value) throw () __attribute__ ((__const__));





extern long double j0l (long double) throw (); extern long double __j0l (long double) throw ();
extern long double j1l (long double) throw (); extern long double __j1l (long double) throw ();
extern long double jnl (int, long double) throw (); extern long double __jnl (int, long double) throw ();
extern long double y0l (long double) throw (); extern long double __y0l (long double) throw ();
extern long double y1l (long double) throw (); extern long double __y1l (long double) throw ();
extern long double ynl (int, long double) throw (); extern long double __ynl (int, long double) throw ();






extern long double erfl (long double) throw (); extern long double __erfl (long double) throw ();
extern long double erfcl (long double) throw (); extern long double __erfcl (long double) throw ();
extern long double lgammal (long double) throw (); extern long double __lgammal (long double) throw ();






extern long double tgammal (long double) throw (); extern long double __tgammal (long double) throw ();





extern long double gammal (long double) throw (); extern long double __gammal (long double) throw ();






extern long double lgammal_r (long double, int *__signgamp) throw (); extern long double __lgammal_r (long double, int *__signgamp) throw ();







extern long double rintl (long double __x) throw (); extern long double __rintl (long double __x) throw ();


extern long double nextafterl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __nextafterl (long double __x, long double __y) throw () __attribute__ ((__const__));

extern long double nexttowardl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __nexttowardl (long double __x, long double __y) throw () __attribute__ ((__const__));




extern long double nextdownl (long double __x) throw (); extern long double __nextdownl (long double __x) throw ();

extern long double nextupl (long double __x) throw (); extern long double __nextupl (long double __x) throw ();



extern long double remainderl (long double __x, long double __y) throw (); extern long double __remainderl (long double __x, long double __y) throw ();



extern long double scalbnl (long double __x, int __n) throw (); extern long double __scalbnl (long double __x, int __n) throw ();



extern int ilogbl (long double __x) throw (); extern int __ilogbl (long double __x) throw ();




extern long double scalblnl (long double __x, long int __n) throw (); extern long double __scalblnl (long double __x, long int __n) throw ();



extern long double nearbyintl (long double __x) throw (); extern long double __nearbyintl (long double __x) throw ();



extern long double roundl (long double __x) throw () __attribute__ ((__const__)); extern long double __roundl (long double __x) throw () __attribute__ ((__const__));



extern long double truncl (long double __x) throw () __attribute__ ((__const__)); extern long double __truncl (long double __x) throw () __attribute__ ((__const__));




extern long double remquol (long double __x, long double __y, int *__quo) throw (); extern long double __remquol (long double __x, long double __y, int *__quo) throw ();






extern long int lrintl (long double __x) throw (); extern long int __lrintl (long double __x) throw ();
__extension__
extern long long int llrintl (long double __x) throw (); extern long long int __llrintl (long double __x) throw ();



extern long int lroundl (long double __x) throw (); extern long int __lroundl (long double __x) throw ();
__extension__
extern long long int llroundl (long double __x) throw (); extern long long int __llroundl (long double __x) throw ();



extern long double fdiml (long double __x, long double __y) throw (); extern long double __fdiml (long double __x, long double __y) throw ();


extern long double fmaxl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __fmaxl (long double __x, long double __y) throw () __attribute__ ((__const__));


extern long double fminl (long double __x, long double __y) throw () __attribute__ ((__const__)); extern long double __fminl (long double __x, long double __y) throw () __attribute__ ((__const__));



extern int __fpclassifyl (long double __value) throw ()
     __attribute__ ((__const__));


extern int __signbitl (long double __value) throw ()
     __attribute__ ((__const__));



extern long double fmal (long double __x, long double __y, long double __z) throw (); extern long double __fmal (long double __x, long double __y, long double __z) throw ();
# 382 "/usr/include/bits/mathcalls.h" 3 4
extern int __issignalingl (long double __value) throw ()
     __attribute__ ((__const__));






extern long double scalbl (long double __x, long double __n) throw (); extern long double __scalbl (long double __x, long double __n) throw ();
# 152 "/usr/include/math.h" 2 3 4
# 168 "/usr/include/math.h" 3 4
extern int signgam;
# 209 "/usr/include/math.h" 3 4
enum
  {
    FP_NAN =

      0,
    FP_INFINITE =

      1,
    FP_ZERO =

      2,
    FP_SUBNORMAL =

      3,
    FP_NORMAL =

      4
  };
# 347 "/usr/include/math.h" 3 4
typedef enum
{
  _IEEE_ = -1,
  _SVID_,
  _XOPEN_,
  _POSIX_,
  _ISOC_
} _LIB_VERSION_TYPE;




extern _LIB_VERSION_TYPE _LIB_VERSION;
# 370 "/usr/include/math.h" 3 4
struct __exception



  {
    int type;
    char *name;
    double arg1;
    double arg2;
    double retval;
  };


extern int matherr (struct __exception *__exc) throw ();
# 534 "/usr/include/math.h" 3 4
}
# 46 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 2 3
# 77 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
extern "C++"
{
namespace std __attribute__ ((__visibility__ ("default")))
{



  inline constexpr double
  abs(double __x)
  { return __builtin_fabs(__x); }



  inline constexpr float
  abs(float __x)
  { return __builtin_fabsf(__x); }

  inline constexpr long double
  abs(long double __x)
  { return __builtin_fabsl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    abs(_Tp __x)
    { return __builtin_fabs(__x); }

  using ::acos;


  inline constexpr float
  acos(float __x)
  { return __builtin_acosf(__x); }

  inline constexpr long double
  acos(long double __x)
  { return __builtin_acosl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    acos(_Tp __x)
    { return __builtin_acos(__x); }

  using ::asin;


  inline constexpr float
  asin(float __x)
  { return __builtin_asinf(__x); }

  inline constexpr long double
  asin(long double __x)
  { return __builtin_asinl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    asin(_Tp __x)
    { return __builtin_asin(__x); }

  using ::atan;


  inline constexpr float
  atan(float __x)
  { return __builtin_atanf(__x); }

  inline constexpr long double
  atan(long double __x)
  { return __builtin_atanl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    atan(_Tp __x)
    { return __builtin_atan(__x); }

  using ::atan2;


  inline constexpr float
  atan2(float __y, float __x)
  { return __builtin_atan2f(__y, __x); }

  inline constexpr long double
  atan2(long double __y, long double __x)
  { return __builtin_atan2l(__y, __x); }


  template<typename _Tp, typename _Up>
    inline constexpr
    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    atan2(_Tp __y, _Up __x)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return atan2(__type(__y), __type(__x));
    }

  using ::ceil;


  inline constexpr float
  ceil(float __x)
  { return __builtin_ceilf(__x); }

  inline constexpr long double
  ceil(long double __x)
  { return __builtin_ceill(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    ceil(_Tp __x)
    { return __builtin_ceil(__x); }

  using ::cos;


  inline constexpr float
  cos(float __x)
  { return __builtin_cosf(__x); }

  inline constexpr long double
  cos(long double __x)
  { return __builtin_cosl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    cos(_Tp __x)
    { return __builtin_cos(__x); }

  using ::cosh;


  inline constexpr float
  cosh(float __x)
  { return __builtin_coshf(__x); }

  inline constexpr long double
  cosh(long double __x)
  { return __builtin_coshl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    cosh(_Tp __x)
    { return __builtin_cosh(__x); }

  using ::exp;


  inline constexpr float
  exp(float __x)
  { return __builtin_expf(__x); }

  inline constexpr long double
  exp(long double __x)
  { return __builtin_expl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    exp(_Tp __x)
    { return __builtin_exp(__x); }

  using ::fabs;


  inline constexpr float
  fabs(float __x)
  { return __builtin_fabsf(__x); }

  inline constexpr long double
  fabs(long double __x)
  { return __builtin_fabsl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    fabs(_Tp __x)
    { return __builtin_fabs(__x); }

  using ::floor;


  inline constexpr float
  floor(float __x)
  { return __builtin_floorf(__x); }

  inline constexpr long double
  floor(long double __x)
  { return __builtin_floorl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    floor(_Tp __x)
    { return __builtin_floor(__x); }

  using ::fmod;


  inline constexpr float
  fmod(float __x, float __y)
  { return __builtin_fmodf(__x, __y); }

  inline constexpr long double
  fmod(long double __x, long double __y)
  { return __builtin_fmodl(__x, __y); }


  template<typename _Tp, typename _Up>
    inline constexpr
    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    fmod(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return fmod(__type(__x), __type(__y));
    }

  using ::frexp;


  inline float
  frexp(float __x, int* __exp)
  { return __builtin_frexpf(__x, __exp); }

  inline long double
  frexp(long double __x, int* __exp)
  { return __builtin_frexpl(__x, __exp); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    frexp(_Tp __x, int* __exp)
    { return __builtin_frexp(__x, __exp); }

  using ::ldexp;


  inline constexpr float
  ldexp(float __x, int __exp)
  { return __builtin_ldexpf(__x, __exp); }

  inline constexpr long double
  ldexp(long double __x, int __exp)
  { return __builtin_ldexpl(__x, __exp); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    ldexp(_Tp __x, int __exp)
    { return __builtin_ldexp(__x, __exp); }

  using ::log;


  inline constexpr float
  log(float __x)
  { return __builtin_logf(__x); }

  inline constexpr long double
  log(long double __x)
  { return __builtin_logl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    log(_Tp __x)
    { return __builtin_log(__x); }

  using ::log10;


  inline constexpr float
  log10(float __x)
  { return __builtin_log10f(__x); }

  inline constexpr long double
  log10(long double __x)
  { return __builtin_log10l(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    log10(_Tp __x)
    { return __builtin_log10(__x); }

  using ::modf;


  inline float
  modf(float __x, float* __iptr)
  { return __builtin_modff(__x, __iptr); }

  inline long double
  modf(long double __x, long double* __iptr)
  { return __builtin_modfl(__x, __iptr); }


  using ::pow;


  inline constexpr float
  pow(float __x, float __y)
  { return __builtin_powf(__x, __y); }

  inline constexpr long double
  pow(long double __x, long double __y)
  { return __builtin_powl(__x, __y); }
# 435 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
  template<typename _Tp, typename _Up>
    inline constexpr
    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    pow(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return pow(__type(__x), __type(__y));
    }

  using ::sin;


  inline constexpr float
  sin(float __x)
  { return __builtin_sinf(__x); }

  inline constexpr long double
  sin(long double __x)
  { return __builtin_sinl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    sin(_Tp __x)
    { return __builtin_sin(__x); }

  using ::sinh;


  inline constexpr float
  sinh(float __x)
  { return __builtin_sinhf(__x); }

  inline constexpr long double
  sinh(long double __x)
  { return __builtin_sinhl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    sinh(_Tp __x)
    { return __builtin_sinh(__x); }

  using ::sqrt;


  inline constexpr float
  sqrt(float __x)
  { return __builtin_sqrtf(__x); }

  inline constexpr long double
  sqrt(long double __x)
  { return __builtin_sqrtl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    sqrt(_Tp __x)
    { return __builtin_sqrt(__x); }

  using ::tan;


  inline constexpr float
  tan(float __x)
  { return __builtin_tanf(__x); }

  inline constexpr long double
  tan(long double __x)
  { return __builtin_tanl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    tan(_Tp __x)
    { return __builtin_tan(__x); }

  using ::tanh;


  inline constexpr float
  tanh(float __x)
  { return __builtin_tanhf(__x); }

  inline constexpr long double
  tanh(long double __x)
  { return __builtin_tanhl(__x); }


  template<typename _Tp>
    inline constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    double>::__type
    tanh(_Tp __x)
    { return __builtin_tanh(__x); }


}
# 559 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
namespace std __attribute__ ((__visibility__ ("default")))
{





  constexpr int
  fpclassify(float __x)
  { return __builtin_fpclassify(0, 1, 4,
    3, 2, __x); }

  constexpr int
  fpclassify(double __x)
  { return __builtin_fpclassify(0, 1, 4,
    3, 2, __x); }

  constexpr int
  fpclassify(long double __x)
  { return __builtin_fpclassify(0, 1, 4,
    3, 2, __x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              int>::__type
    fpclassify(_Tp __x)
    { return __x != 0 ? 4 : 2; }



  constexpr bool
  isfinite(float __x)
  { return __builtin_isfinite(__x); }

  constexpr bool
  isfinite(double __x)
  { return __builtin_isfinite(__x); }

  constexpr bool
  isfinite(long double __x)
  { return __builtin_isfinite(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              bool>::__type
    isfinite(_Tp __x)
    { return true; }



  constexpr bool
  isinf(float __x)
  { return __builtin_isinf(__x); }





  constexpr bool
  isinf(double __x)
  { return __builtin_isinf(__x); }


  constexpr bool
  isinf(long double __x)
  { return __builtin_isinf(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              bool>::__type
    isinf(_Tp __x)
    { return false; }



  constexpr bool
  isnan(float __x)
  { return __builtin_isnan(__x); }





  constexpr bool
  isnan(double __x)
  { return __builtin_isnan(__x); }


  constexpr bool
  isnan(long double __x)
  { return __builtin_isnan(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              bool>::__type
    isnan(_Tp __x)
    { return false; }



  constexpr bool
  isnormal(float __x)
  { return __builtin_isnormal(__x); }

  constexpr bool
  isnormal(double __x)
  { return __builtin_isnormal(__x); }

  constexpr bool
  isnormal(long double __x)
  { return __builtin_isnormal(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              bool>::__type
    isnormal(_Tp __x)
    { return __x != 0 ? true : false; }




  constexpr bool
  signbit(float __x)
  { return __builtin_signbit(__x); }

  constexpr bool
  signbit(double __x)
  { return __builtin_signbit(__x); }

  constexpr bool
  signbit(long double __x)
  { return __builtin_signbit(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              bool>::__type
    signbit(_Tp __x)
    { return __x < 0 ? true : false; }



  constexpr bool
  isgreater(float __x, float __y)
  { return __builtin_isgreater(__x, __y); }

  constexpr bool
  isgreater(double __x, double __y)
  { return __builtin_isgreater(__x, __y); }

  constexpr bool
  isgreater(long double __x, long double __y)
  { return __builtin_isgreater(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename
    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
       && __is_arithmetic<_Up>::__value), bool>::__type
    isgreater(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return __builtin_isgreater(__type(__x), __type(__y));
    }



  constexpr bool
  isgreaterequal(float __x, float __y)
  { return __builtin_isgreaterequal(__x, __y); }

  constexpr bool
  isgreaterequal(double __x, double __y)
  { return __builtin_isgreaterequal(__x, __y); }

  constexpr bool
  isgreaterequal(long double __x, long double __y)
  { return __builtin_isgreaterequal(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename
    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
       && __is_arithmetic<_Up>::__value), bool>::__type
    isgreaterequal(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return __builtin_isgreaterequal(__type(__x), __type(__y));
    }



  constexpr bool
  isless(float __x, float __y)
  { return __builtin_isless(__x, __y); }

  constexpr bool
  isless(double __x, double __y)
  { return __builtin_isless(__x, __y); }

  constexpr bool
  isless(long double __x, long double __y)
  { return __builtin_isless(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename
    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
       && __is_arithmetic<_Up>::__value), bool>::__type
    isless(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return __builtin_isless(__type(__x), __type(__y));
    }



  constexpr bool
  islessequal(float __x, float __y)
  { return __builtin_islessequal(__x, __y); }

  constexpr bool
  islessequal(double __x, double __y)
  { return __builtin_islessequal(__x, __y); }

  constexpr bool
  islessequal(long double __x, long double __y)
  { return __builtin_islessequal(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename
    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
       && __is_arithmetic<_Up>::__value), bool>::__type
    islessequal(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return __builtin_islessequal(__type(__x), __type(__y));
    }



  constexpr bool
  islessgreater(float __x, float __y)
  { return __builtin_islessgreater(__x, __y); }

  constexpr bool
  islessgreater(double __x, double __y)
  { return __builtin_islessgreater(__x, __y); }

  constexpr bool
  islessgreater(long double __x, long double __y)
  { return __builtin_islessgreater(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename
    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
       && __is_arithmetic<_Up>::__value), bool>::__type
    islessgreater(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return __builtin_islessgreater(__type(__x), __type(__y));
    }



  constexpr bool
  isunordered(float __x, float __y)
  { return __builtin_isunordered(__x, __y); }

  constexpr bool
  isunordered(double __x, double __y)
  { return __builtin_isunordered(__x, __y); }

  constexpr bool
  isunordered(long double __x, long double __y)
  { return __builtin_isunordered(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename
    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
       && __is_arithmetic<_Up>::__value), bool>::__type
    isunordered(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return __builtin_isunordered(__type(__x), __type(__y));
    }
# 981 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
}
# 1096 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
namespace std __attribute__ ((__visibility__ ("default")))
{



  using ::double_t;
  using ::float_t;


  using ::acosh;
  using ::acoshf;
  using ::acoshl;

  using ::asinh;
  using ::asinhf;
  using ::asinhl;

  using ::atanh;
  using ::atanhf;
  using ::atanhl;

  using ::cbrt;
  using ::cbrtf;
  using ::cbrtl;

  using ::copysign;
  using ::copysignf;
  using ::copysignl;

  using ::erf;
  using ::erff;
  using ::erfl;

  using ::erfc;
  using ::erfcf;
  using ::erfcl;

  using ::exp2;
  using ::exp2f;
  using ::exp2l;

  using ::expm1;
  using ::expm1f;
  using ::expm1l;

  using ::fdim;
  using ::fdimf;
  using ::fdiml;

  using ::fma;
  using ::fmaf;
  using ::fmal;

  using ::fmax;
  using ::fmaxf;
  using ::fmaxl;

  using ::fmin;
  using ::fminf;
  using ::fminl;

  using ::hypot;
  using ::hypotf;
  using ::hypotl;

  using ::ilogb;
  using ::ilogbf;
  using ::ilogbl;

  using ::lgamma;
  using ::lgammaf;
  using ::lgammal;

  using ::llrint;
  using ::llrintf;
  using ::llrintl;

  using ::llround;
  using ::llroundf;
  using ::llroundl;

  using ::log1p;
  using ::log1pf;
  using ::log1pl;

  using ::log2;
  using ::log2f;
  using ::log2l;

  using ::logb;
  using ::logbf;
  using ::logbl;

  using ::lrint;
  using ::lrintf;
  using ::lrintl;

  using ::lround;
  using ::lroundf;
  using ::lroundl;

  using ::nan;
  using ::nanf;
  using ::nanl;

  using ::nearbyint;
  using ::nearbyintf;
  using ::nearbyintl;

  using ::nextafter;
  using ::nextafterf;
  using ::nextafterl;

  using ::nexttoward;
  using ::nexttowardf;
  using ::nexttowardl;

  using ::remainder;
  using ::remainderf;
  using ::remainderl;

  using ::remquo;
  using ::remquof;
  using ::remquol;

  using ::rint;
  using ::rintf;
  using ::rintl;

  using ::round;
  using ::roundf;
  using ::roundl;

  using ::scalbln;
  using ::scalblnf;
  using ::scalblnl;

  using ::scalbn;
  using ::scalbnf;
  using ::scalbnl;

  using ::tgamma;
  using ::tgammaf;
  using ::tgammal;

  using ::trunc;
  using ::truncf;
  using ::truncl;



  constexpr float
  acosh(float __x)
  { return __builtin_acoshf(__x); }

  constexpr long double
  acosh(long double __x)
  { return __builtin_acoshl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    acosh(_Tp __x)
    { return __builtin_acosh(__x); }



  constexpr float
  asinh(float __x)
  { return __builtin_asinhf(__x); }

  constexpr long double
  asinh(long double __x)
  { return __builtin_asinhl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    asinh(_Tp __x)
    { return __builtin_asinh(__x); }



  constexpr float
  atanh(float __x)
  { return __builtin_atanhf(__x); }

  constexpr long double
  atanh(long double __x)
  { return __builtin_atanhl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    atanh(_Tp __x)
    { return __builtin_atanh(__x); }



  constexpr float
  cbrt(float __x)
  { return __builtin_cbrtf(__x); }

  constexpr long double
  cbrt(long double __x)
  { return __builtin_cbrtl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    cbrt(_Tp __x)
    { return __builtin_cbrt(__x); }



  constexpr float
  copysign(float __x, float __y)
  { return __builtin_copysignf(__x, __y); }

  constexpr long double
  copysign(long double __x, long double __y)
  { return __builtin_copysignl(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    copysign(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return copysign(__type(__x), __type(__y));
    }



  constexpr float
  erf(float __x)
  { return __builtin_erff(__x); }

  constexpr long double
  erf(long double __x)
  { return __builtin_erfl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    erf(_Tp __x)
    { return __builtin_erf(__x); }



  constexpr float
  erfc(float __x)
  { return __builtin_erfcf(__x); }

  constexpr long double
  erfc(long double __x)
  { return __builtin_erfcl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    erfc(_Tp __x)
    { return __builtin_erfc(__x); }



  constexpr float
  exp2(float __x)
  { return __builtin_exp2f(__x); }

  constexpr long double
  exp2(long double __x)
  { return __builtin_exp2l(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    exp2(_Tp __x)
    { return __builtin_exp2(__x); }



  constexpr float
  expm1(float __x)
  { return __builtin_expm1f(__x); }

  constexpr long double
  expm1(long double __x)
  { return __builtin_expm1l(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    expm1(_Tp __x)
    { return __builtin_expm1(__x); }



  constexpr float
  fdim(float __x, float __y)
  { return __builtin_fdimf(__x, __y); }

  constexpr long double
  fdim(long double __x, long double __y)
  { return __builtin_fdiml(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    fdim(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return fdim(__type(__x), __type(__y));
    }



  constexpr float
  fma(float __x, float __y, float __z)
  { return __builtin_fmaf(__x, __y, __z); }

  constexpr long double
  fma(long double __x, long double __y, long double __z)
  { return __builtin_fmal(__x, __y, __z); }



  template<typename _Tp, typename _Up, typename _Vp>
    constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
    fma(_Tp __x, _Up __y, _Vp __z)
    {
      typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
      return fma(__type(__x), __type(__y), __type(__z));
    }



  constexpr float
  fmax(float __x, float __y)
  { return __builtin_fmaxf(__x, __y); }

  constexpr long double
  fmax(long double __x, long double __y)
  { return __builtin_fmaxl(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    fmax(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return fmax(__type(__x), __type(__y));
    }



  constexpr float
  fmin(float __x, float __y)
  { return __builtin_fminf(__x, __y); }

  constexpr long double
  fmin(long double __x, long double __y)
  { return __builtin_fminl(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    fmin(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return fmin(__type(__x), __type(__y));
    }



  constexpr float
  hypot(float __x, float __y)
  { return __builtin_hypotf(__x, __y); }

  constexpr long double
  hypot(long double __x, long double __y)
  { return __builtin_hypotl(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    hypot(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return hypot(__type(__x), __type(__y));
    }



  constexpr int
  ilogb(float __x)
  { return __builtin_ilogbf(__x); }

  constexpr int
  ilogb(long double __x)
  { return __builtin_ilogbl(__x); }



  template<typename _Tp>
    constexpr
    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                    int>::__type
    ilogb(_Tp __x)
    { return __builtin_ilogb(__x); }



  constexpr float
  lgamma(float __x)
  { return __builtin_lgammaf(__x); }

  constexpr long double
  lgamma(long double __x)
  { return __builtin_lgammal(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    lgamma(_Tp __x)
    { return __builtin_lgamma(__x); }



  constexpr long long
  llrint(float __x)
  { return __builtin_llrintf(__x); }

  constexpr long long
  llrint(long double __x)
  { return __builtin_llrintl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              long long>::__type
    llrint(_Tp __x)
    { return __builtin_llrint(__x); }



  constexpr long long
  llround(float __x)
  { return __builtin_llroundf(__x); }

  constexpr long long
  llround(long double __x)
  { return __builtin_llroundl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              long long>::__type
    llround(_Tp __x)
    { return __builtin_llround(__x); }



  constexpr float
  log1p(float __x)
  { return __builtin_log1pf(__x); }

  constexpr long double
  log1p(long double __x)
  { return __builtin_log1pl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    log1p(_Tp __x)
    { return __builtin_log1p(__x); }




  constexpr float
  log2(float __x)
  { return __builtin_log2f(__x); }

  constexpr long double
  log2(long double __x)
  { return __builtin_log2l(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    log2(_Tp __x)
    { return __builtin_log2(__x); }



  constexpr float
  logb(float __x)
  { return __builtin_logbf(__x); }

  constexpr long double
  logb(long double __x)
  { return __builtin_logbl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    logb(_Tp __x)
    { return __builtin_logb(__x); }



  constexpr long
  lrint(float __x)
  { return __builtin_lrintf(__x); }

  constexpr long
  lrint(long double __x)
  { return __builtin_lrintl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              long>::__type
    lrint(_Tp __x)
    { return __builtin_lrint(__x); }



  constexpr long
  lround(float __x)
  { return __builtin_lroundf(__x); }

  constexpr long
  lround(long double __x)
  { return __builtin_lroundl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              long>::__type
    lround(_Tp __x)
    { return __builtin_lround(__x); }



  constexpr float
  nearbyint(float __x)
  { return __builtin_nearbyintf(__x); }

  constexpr long double
  nearbyint(long double __x)
  { return __builtin_nearbyintl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    nearbyint(_Tp __x)
    { return __builtin_nearbyint(__x); }



  constexpr float
  nextafter(float __x, float __y)
  { return __builtin_nextafterf(__x, __y); }

  constexpr long double
  nextafter(long double __x, long double __y)
  { return __builtin_nextafterl(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    nextafter(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return nextafter(__type(__x), __type(__y));
    }



  constexpr float
  nexttoward(float __x, long double __y)
  { return __builtin_nexttowardf(__x, __y); }

  constexpr long double
  nexttoward(long double __x, long double __y)
  { return __builtin_nexttowardl(__x, __y); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    nexttoward(_Tp __x, long double __y)
    { return __builtin_nexttoward(__x, __y); }



  constexpr float
  remainder(float __x, float __y)
  { return __builtin_remainderf(__x, __y); }

  constexpr long double
  remainder(long double __x, long double __y)
  { return __builtin_remainderl(__x, __y); }



  template<typename _Tp, typename _Up>
    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    remainder(_Tp __x, _Up __y)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return remainder(__type(__x), __type(__y));
    }



  inline float
  remquo(float __x, float __y, int* __pquo)
  { return __builtin_remquof(__x, __y, __pquo); }

  inline long double
  remquo(long double __x, long double __y, int* __pquo)
  { return __builtin_remquol(__x, __y, __pquo); }



  template<typename _Tp, typename _Up>
    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    remquo(_Tp __x, _Up __y, int* __pquo)
    {
      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
      return remquo(__type(__x), __type(__y), __pquo);
    }



  constexpr float
  rint(float __x)
  { return __builtin_rintf(__x); }

  constexpr long double
  rint(long double __x)
  { return __builtin_rintl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    rint(_Tp __x)
    { return __builtin_rint(__x); }



  constexpr float
  round(float __x)
  { return __builtin_roundf(__x); }

  constexpr long double
  round(long double __x)
  { return __builtin_roundl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    round(_Tp __x)
    { return __builtin_round(__x); }



  constexpr float
  scalbln(float __x, long __ex)
  { return __builtin_scalblnf(__x, __ex); }

  constexpr long double
  scalbln(long double __x, long __ex)
  { return __builtin_scalblnl(__x, __ex); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    scalbln(_Tp __x, long __ex)
    { return __builtin_scalbln(__x, __ex); }



  constexpr float
  scalbn(float __x, int __ex)
  { return __builtin_scalbnf(__x, __ex); }

  constexpr long double
  scalbn(long double __x, int __ex)
  { return __builtin_scalbnl(__x, __ex); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    scalbn(_Tp __x, int __ex)
    { return __builtin_scalbn(__x, __ex); }



  constexpr float
  tgamma(float __x)
  { return __builtin_tgammaf(__x); }

  constexpr long double
  tgamma(long double __x)
  { return __builtin_tgammal(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    tgamma(_Tp __x)
    { return __builtin_tgamma(__x); }



  constexpr float
  trunc(float __x)
  { return __builtin_truncf(__x); }

  constexpr long double
  trunc(long double __x)
  { return __builtin_truncl(__x); }



  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                                              double>::__type
    trunc(_Tp __x)
    { return __builtin_trunc(__x); }



}
# 1889 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h" 2



namespace mozilla {


template<typename IntegerType>
__attribute__((always_inline)) inline IntegerType
EuclidGCD(IntegerType aA, IntegerType aB)
{


  do { } while (0);
  do { } while (0);

  while (aA != aB) {
    if (aA > aB) {
      aA = aA - aB;
    } else {
      aB = aB - aA;
    }
  }

  return aA;
}


template<typename IntegerType>
__attribute__((always_inline)) inline IntegerType
EuclidLCM(IntegerType aA, IntegerType aB)
{

  return (aA / EuclidGCD(aA, aB)) * aB;
}

namespace detail {

template<typename T>
struct AllowDeprecatedAbsFixed : FalseType {};

template<> struct AllowDeprecatedAbsFixed<int32_t> : TrueType {};
template<> struct AllowDeprecatedAbsFixed<int64_t> : TrueType {};

template<typename T>
struct AllowDeprecatedAbs : AllowDeprecatedAbsFixed<T> {};

template<> struct AllowDeprecatedAbs<int> : TrueType {};
template<> struct AllowDeprecatedAbs<long> : TrueType {};

}



template<typename T>
inline typename mozilla::EnableIf<detail::AllowDeprecatedAbs<T>::value, T>::Type
DeprecatedAbs(const T aValue)
{
# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
  do { } while (0);


  return aValue >= 0 ? aValue : -aValue;
}

namespace detail {





template<typename T>
struct AbsReturnTypeFixed;

template<> struct AbsReturnTypeFixed<int8_t> { typedef uint8_t Type; };
template<> struct AbsReturnTypeFixed<int16_t> { typedef uint16_t Type; };
template<> struct AbsReturnTypeFixed<int32_t> { typedef uint32_t Type; };
template<> struct AbsReturnTypeFixed<int64_t> { typedef uint64_t Type; };

template<typename T>
struct AbsReturnType : AbsReturnTypeFixed<T> {};

template<> struct AbsReturnType<char> :
  EnableIf<char(-1) < char(0), unsigned char> {};
template<> struct AbsReturnType<signed char> { typedef unsigned char Type; };
template<> struct AbsReturnType<short> { typedef unsigned short Type; };
template<> struct AbsReturnType<int> { typedef unsigned int Type; };
template<> struct AbsReturnType<long> { typedef unsigned long Type; };
template<> struct AbsReturnType<long long> { typedef unsigned long long Type; };
template<> struct AbsReturnType<float> { typedef float Type; };
template<> struct AbsReturnType<double> { typedef double Type; };
template<> struct AbsReturnType<long double> { typedef long double Type; };

}

template<typename T>
inline typename detail::AbsReturnType<T>::Type
Abs(const T aValue)
{
  typedef typename detail::AbsReturnType<T>::Type ReturnType;
  return aValue >= 0 ? ReturnType(aValue) : ~ReturnType(aValue) + 1;
}

template<>
inline float
Abs<float>(const float aFloat)
{
  return std::fabs(aFloat);
}

template<>
inline double
Abs<double>(const double aDouble)
{
  return std::fabs(aDouble);
}

template<>
inline long double
Abs<long double>(const long double aLongDouble)
{
  return std::fabs(aLongDouble);
}

}
# 163 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
namespace mozilla {

namespace detail {
# 250 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
inline uint_fast8_t
CountLeadingZeroes32(uint32_t aValue)
{
  return __builtin_clz(aValue);
}

inline uint_fast8_t
CountTrailingZeroes32(uint32_t aValue)
{
  return __builtin_ctz(aValue);
}

inline uint_fast8_t
CountPopulation32(uint32_t aValue)
{
  return __builtin_popcount(aValue);
}

inline uint_fast8_t
CountPopulation64(uint64_t aValue)
{
  return __builtin_popcountll(aValue);
}

inline uint_fast8_t
CountLeadingZeroes64(uint64_t aValue)
{
  return __builtin_clzll(aValue);
}

inline uint_fast8_t
CountTrailingZeroes64(uint64_t aValue)
{
  return __builtin_ctzll(aValue);
}
# 296 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
}
# 309 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
inline uint_fast8_t
CountLeadingZeroes32(uint32_t aValue)
{
  do { } while (0);
  return detail::CountLeadingZeroes32(aValue);
}
# 327 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
inline uint_fast8_t
CountTrailingZeroes32(uint32_t aValue)
{
  do { } while (0);
  return detail::CountTrailingZeroes32(aValue);
}




inline uint_fast8_t
CountPopulation32(uint32_t aValue)
{
  return detail::CountPopulation32(aValue);
}


inline uint_fast8_t
CountPopulation64(uint64_t aValue)
{
  return detail::CountPopulation64(aValue);
}


inline uint_fast8_t
CountLeadingZeroes64(uint64_t aValue)
{
  do { } while (0);
  return detail::CountLeadingZeroes64(aValue);
}


inline uint_fast8_t
CountTrailingZeroes64(uint64_t aValue)
{
  do { } while (0);
  return detail::CountTrailingZeroes64(aValue);
}

namespace detail {

template<typename T, size_t Size = sizeof(T)>
class CeilingLog2;

template<typename T>
class CeilingLog2<T, 4>
{
public:
  static uint_fast8_t compute(const T aValue)
  {

    return aValue <= 1 ? 0u : 32u - CountLeadingZeroes32(aValue - 1);
  }
};

template<typename T>
class CeilingLog2<T, 8>
{
public:
  static uint_fast8_t compute(const T aValue)
  {

    return aValue <= 1 ? 0u : 64u - CountLeadingZeroes64(aValue - 1);
  }
};

}
# 404 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
template<typename T>
inline uint_fast8_t
CeilingLog2(const T aValue)
{
  return detail::CeilingLog2<T>::compute(aValue);
}


inline uint_fast8_t
CeilingLog2Size(size_t aValue)
{
  return CeilingLog2(aValue);
}

namespace detail {

template<typename T, size_t Size = sizeof(T)>
class FloorLog2;

template<typename T>
class FloorLog2<T, 4>
{
public:
  static uint_fast8_t compute(const T aValue)
  {
    return 31u - CountLeadingZeroes32(aValue | 1);
  }
};

template<typename T>
class FloorLog2<T, 8>
{
public:
  static uint_fast8_t compute(const T aValue)
  {
    return 63u - CountLeadingZeroes64(aValue | 1);
  }
};

}
# 453 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MathAlgorithms.h"
template<typename T>
inline uint_fast8_t
FloorLog2(const T aValue)
{
  return detail::FloorLog2<T>::compute(aValue);
}


inline uint_fast8_t
FloorLog2Size(size_t aValue)
{
  return FloorLog2(aValue);
}





inline size_t
RoundUpPow2(size_t aValue)
{
  do { } while (0);

  return size_t(1) << CeilingLog2(aValue);
}




template<typename T>
inline T
RotateLeft(const T aValue, uint_fast8_t aShift)
{
  do { } while (0);
  do { } while (0);




  static_assert(IsUnsigned<T>::value, "Rotates require unsigned values");
  return (aValue << aShift) | (aValue >> (sizeof(T) * 8 - aShift));
}




template<typename T>
inline T
RotateRight(const T aValue, uint_fast8_t aShift)
{
  do { } while (0);
  do { } while (0);




  static_assert(IsUnsigned<T>::value, "Rotates require unsigned values");
  return (aValue >> aShift) | (aValue << (sizeof(T) * 8 - aShift));
}





template<typename T>
constexpr bool
IsPowerOfTwo(T x)
{
    static_assert(IsUnsigned<T>::value,
                  "IsPowerOfTwo requires unsigned values");
    return x && (x & (x - 1)) == 0;
}

template<typename T>
inline T
Clamp(const T aValue, const T aMin, const T aMax)
{
    static_assert(IsIntegral<T>::value,
                  "Clamp accepts only integral types, so that it doesn't have"
                  " to distinguish differently-signed zeroes (which users may"
                  " or may not care to distinguish, likely at a perf cost) or"
                  " to decide how to clamp NaN or a range with a NaN"
                  " endpoint.");
    do { } while (0);

    if (aValue <= aMin)
        return aMin;
    if (aValue >= aMax)
        return aMax;
    return aValue;
}

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h" 2




namespace mozilla {
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
struct FloatTypeTraits
{
  typedef uint32_t Bits;

  static const unsigned kExponentBias = 127;
  static const unsigned kExponentShift = 23;

  static const Bits kSignBit = 0x80000000UL;
  static const Bits kExponentBits = 0x7F800000UL;
  static const Bits kSignificandBits = 0x007FFFFFUL;
};

struct DoubleTypeTraits
{
  typedef uint64_t Bits;

  static const unsigned kExponentBias = 1023;
  static const unsigned kExponentShift = 52;

  static const Bits kSignBit = 0x8000000000000000ULL;
  static const Bits kExponentBits = 0x7ff0000000000000ULL;
  static const Bits kSignificandBits = 0x000fffffffffffffULL;
};

template<typename T> struct SelectTrait;
template<> struct SelectTrait<float> : public FloatTypeTraits {};
template<> struct SelectTrait<double> : public DoubleTypeTraits {};
# 91 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
template<typename T>
struct FloatingPoint : public SelectTrait<T>
{
  typedef SelectTrait<T> Base;
  typedef typename Base::Bits Bits;

  static_assert((Base::kSignBit & Base::kExponentBits) == 0,
                "sign bit shouldn't overlap exponent bits");
  static_assert((Base::kSignBit & Base::kSignificandBits) == 0,
                "sign bit shouldn't overlap significand bits");
  static_assert((Base::kExponentBits & Base::kSignificandBits) == 0,
                "exponent bits shouldn't overlap significand bits");

  static_assert((Base::kSignBit | Base::kExponentBits | Base::kSignificandBits) ==
                ~Bits(0),
                "all bits accounted for");
# 115 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
  static_assert(sizeof(T) == sizeof(Bits), "Bits must be same size as T");
};


template<typename T>
static __attribute__((always_inline)) inline bool
IsNaN(T aValue)
{




  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  return (BitwiseCast<Bits>(aValue) & Traits::kExponentBits) == Traits::kExponentBits &&
         (BitwiseCast<Bits>(aValue) & Traits::kSignificandBits) != 0;
}


template<typename T>
static __attribute__((always_inline)) inline bool
IsInfinite(T aValue)
{

  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  Bits bits = BitwiseCast<Bits>(aValue);
  return (bits & ~Traits::kSignBit) == Traits::kExponentBits;
}


template<typename T>
static __attribute__((always_inline)) inline bool
IsFinite(T aValue)
{




  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  Bits bits = BitwiseCast<Bits>(aValue);
  return (bits & Traits::kExponentBits) != Traits::kExponentBits;
}





template<typename T>
static __attribute__((always_inline)) inline bool
IsNegative(T aValue)
{
  do { } while (0);


  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  Bits bits = BitwiseCast<Bits>(aValue);
  return (bits & Traits::kSignBit) != 0;
}


template<typename T>
static __attribute__((always_inline)) inline bool
IsNegativeZero(T aValue)
{

  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  Bits bits = BitwiseCast<Bits>(aValue);
  return bits == Traits::kSignBit;
}


template<typename T>
static __attribute__((always_inline)) inline bool
IsPositiveZero(T aValue)
{

  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  Bits bits = BitwiseCast<Bits>(aValue);
  return bits == 0;
}





template<typename T>
static __attribute__((always_inline)) inline T
ToZeroIfNonfinite(T aValue)
{
  return IsFinite(aValue) ? aValue : 0;
}







template<typename T>
static __attribute__((always_inline)) inline int_fast16_t
ExponentComponent(T aValue)
{




  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  Bits bits = BitwiseCast<Bits>(aValue);
  return int_fast16_t((bits & Traits::kExponentBits) >> Traits::kExponentShift) -
         int_fast16_t(Traits::kExponentBias);
}


template<typename T>
static __attribute__((always_inline)) inline T
PositiveInfinity()
{




  typedef FloatingPoint<T> Traits;
  return BitwiseCast<T>(Traits::kExponentBits);
}


template<typename T>
static __attribute__((always_inline)) inline T
NegativeInfinity()
{




  typedef FloatingPoint<T> Traits;
  return BitwiseCast<T>(Traits::kSignBit | Traits::kExponentBits);
}





template<typename T,
         int SignBit,
         typename FloatingPoint<T>::Bits Significand>
struct SpecificNaNBits
{
  using Traits = FloatingPoint<T>;

  static_assert(SignBit == 0 || SignBit == 1, "bad sign bit");
  static_assert((Significand & ~Traits::kSignificandBits) == 0,
                "significand must only have significand bits set");
  static_assert(Significand & Traits::kSignificandBits,
                "significand must be nonzero");

  static constexpr typename Traits::Bits value =
    (SignBit * Traits::kSignBit) | Traits::kExponentBits | Significand;
};
# 296 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
template<typename T>
static __attribute__((always_inline)) inline void
SpecificNaN(int signbit, typename FloatingPoint<T>::Bits significand, T* result)
{
  typedef FloatingPoint<T> Traits;
  do { } while (0);
  do { } while (0);
  do { } while (0);

  BitwiseCast<T>((signbit ? Traits::kSignBit : 0) |
                  Traits::kExponentBits |
                  significand,
                  result);
  do { } while (0);
}

template<typename T>
static __attribute__((always_inline)) inline T
SpecificNaN(int signbit, typename FloatingPoint<T>::Bits significand)
{
  T t;
  SpecificNaN(signbit, significand, &t);
  return t;
}


template<typename T>
static __attribute__((always_inline)) inline T
MinNumberValue()
{
  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  return BitwiseCast<T>(Bits(1));
}
# 338 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
template<typename T>
static __attribute__((always_inline)) inline bool
NumberEqualsInt32(T aValue, int32_t* aInt32)
{






  return aValue == (*aInt32 = int32_t(aValue));
}
# 358 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
template<typename T>
static __attribute__((always_inline)) inline bool
NumberIsInt32(T aValue, int32_t* aInt32)
{
  return !IsNegativeZero(aValue) && NumberEqualsInt32(aValue, aInt32);
}





template<typename T>
static __attribute__((always_inline)) inline T
UnspecifiedNaN()
{






  typedef FloatingPoint<T> Traits;
  return SpecificNaN<T>(1, Traits::kSignificandBits);
}






template<typename T>
static inline bool
NumbersAreIdentical(T aValue1, T aValue2)
{
  typedef FloatingPoint<T> Traits;
  typedef typename Traits::Bits Bits;
  if (IsNaN(aValue1)) {
    return IsNaN(aValue2);
  }
  return BitwiseCast<Bits>(aValue1) == BitwiseCast<Bits>(aValue2);
}

namespace detail {

template<typename T>
struct FuzzyEqualsEpsilon;

template<>
struct FuzzyEqualsEpsilon<float>
{

  static float value() { return 1.0f / (1 << 17); }
};

template<>
struct FuzzyEqualsEpsilon<double>
{

  static double value() { return 1.0 / (1LL << 40); }
};

}
# 433 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
template<typename T>
static __attribute__((always_inline)) inline bool
FuzzyEqualsAdditive(T aValue1, T aValue2,
                    T aEpsilon = detail::FuzzyEqualsEpsilon<T>::value())
{
  static_assert(IsFloatingPoint<T>::value, "floating point type required");
  return Abs(aValue1 - aValue2) <= aEpsilon;
}
# 454 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
template<typename T>
static __attribute__((always_inline)) inline bool
FuzzyEqualsMultiplicative(T aValue1, T aValue2,
                          T aEpsilon = detail::FuzzyEqualsEpsilon<T>::value())
{
  static_assert(IsFloatingPoint<T>::value, "floating point type required");

  T smaller = Abs(aValue1) < Abs(aValue2) ? Abs(aValue1) : Abs(aValue2);
  return Abs(aValue1 - aValue2) <= aEpsilon * smaller;
}
# 473 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FloatingPoint.h"
__attribute__ ((warn_unused_result))
extern __attribute__((weak)) __attribute__((visibility("default"))) bool
IsFloat32Representable(double aFloat32);

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h" 2



namespace IPC {
template<typename T> struct ParamTraits;
}







namespace mozilla {


typedef uint64_t TimeStampValue;


class TimeStamp;




class BaseTimeDurationPlatformUtils
{
public:
  static __attribute__((weak)) __attribute__((visibility("default"))) double ToSeconds(int64_t aTicks);
  static __attribute__((weak)) __attribute__((visibility("default"))) double ToSecondsSigDigits(int64_t aTicks);
  static __attribute__((weak)) __attribute__((visibility("default"))) int64_t TicksFromMilliseconds(double aMilliseconds);
  static __attribute__((weak)) __attribute__((visibility("default"))) int64_t ResolutionInTicks();
};
# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
template <typename ValueCalculator>
class BaseTimeDuration
{
public:

  constexpr BaseTimeDuration() : mValue(0) {}


  struct _SomethingVeryRandomHere;
               BaseTimeDuration(_SomethingVeryRandomHere* aZero) : mValue(0)
  {
    do { } while (0);
  }



  template <typename E>
  explicit BaseTimeDuration(const BaseTimeDuration<E>& aOther)
    : mValue(aOther.mValue)
  { }

  template <typename E>
  BaseTimeDuration& operator=(const BaseTimeDuration<E>& aOther)
  {
    mValue = aOther.mValue;
    return *this;
  }

  double ToSeconds() const
  {
    if (mValue == (9223372036854775807L)) {
      return PositiveInfinity<double>();
    }
    if (mValue == (-9223372036854775807L -1)) {
      return NegativeInfinity<double>();
    }
    return BaseTimeDurationPlatformUtils::ToSeconds(mValue);
  }



  double ToSecondsSigDigits() const
  {
    if (mValue == (9223372036854775807L)) {
      return PositiveInfinity<double>();
    }
    if (mValue == (-9223372036854775807L -1)) {
      return NegativeInfinity<double>();
    }
    return BaseTimeDurationPlatformUtils::ToSecondsSigDigits(mValue);
  }
  double ToMilliseconds() const { return ToSeconds() * 1000.0; }
  double ToMicroseconds() const { return ToMilliseconds() * 1000.0; }






  static inline BaseTimeDuration FromSeconds(double aSeconds)
  {
    return FromMilliseconds(aSeconds * 1000.0);
  }
  static BaseTimeDuration FromMilliseconds(double aMilliseconds)
  {
    if (aMilliseconds == PositiveInfinity<double>()) {
      return Forever();
    }
    if (aMilliseconds == NegativeInfinity<double>()) {
      return FromTicks((-9223372036854775807L -1));
    }
    return FromTicks(
      BaseTimeDurationPlatformUtils::TicksFromMilliseconds(aMilliseconds));
  }
  static inline BaseTimeDuration FromMicroseconds(double aMicroseconds)
  {
    return FromMilliseconds(aMicroseconds / 1000.0);
  }

  static BaseTimeDuration Forever()
  {
    return FromTicks((9223372036854775807L));
  }

  BaseTimeDuration operator+(const BaseTimeDuration& aOther) const
  {
    return FromTicks(ValueCalculator::Add(mValue, aOther.mValue));
  }
  BaseTimeDuration operator-(const BaseTimeDuration& aOther) const
  {
    return FromTicks(ValueCalculator::Subtract(mValue, aOther.mValue));
  }
  BaseTimeDuration& operator+=(const BaseTimeDuration& aOther)
  {
    mValue = ValueCalculator::Add(mValue, aOther.mValue);
    return *this;
  }
  BaseTimeDuration& operator-=(const BaseTimeDuration& aOther)
  {
    mValue = ValueCalculator::Subtract(mValue, aOther.mValue);
    return *this;
  }
  BaseTimeDuration operator-() const
  {


    int64_t ticks;
    if (mValue == (9223372036854775807L)) {
      ticks = (-9223372036854775807L -1);
    } else if (mValue == (-9223372036854775807L -1)) {
      ticks = (9223372036854775807L);
    } else {
      ticks = -mValue;
    }

    return FromTicks(ticks);
  }

  static BaseTimeDuration Max(const BaseTimeDuration& aA,
                              const BaseTimeDuration& aB)
  {
    return FromTicks(std::max(aA.mValue, aB.mValue));
  }
  static BaseTimeDuration Min(const BaseTimeDuration& aA,
                              const BaseTimeDuration& aB)
  {
    return FromTicks(std::min(aA.mValue, aB.mValue));
  }

private:


  BaseTimeDuration operator*(const double aMultiplier) const = delete;




  BaseTimeDuration operator/(const double aDivisor) const = delete;

public:
  BaseTimeDuration MultDouble(double aMultiplier) const
  {
    return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier));
  }
  BaseTimeDuration operator*(const int32_t aMultiplier) const
  {
    return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier));
  }
  BaseTimeDuration operator*(const uint32_t aMultiplier) const
  {
    return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier));
  }
  BaseTimeDuration operator*(const int64_t aMultiplier) const
  {
    return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier));
  }
  BaseTimeDuration operator*(const uint64_t aMultiplier) const
  {
    if (aMultiplier > (9223372036854775807L)) {
      return Forever();
    }
    return FromTicks(ValueCalculator::Multiply(mValue, aMultiplier));
  }
  BaseTimeDuration operator/(const int64_t aDivisor) const
  {
    do { } while (0);
    return FromTicks(ValueCalculator::Divide(mValue, aDivisor));
  }
  double operator/(const BaseTimeDuration& aOther) const
  {


    do { } while (0);

    return ValueCalculator::DivideDouble(mValue, aOther.mValue);
  }
  BaseTimeDuration operator%(const BaseTimeDuration& aOther) const
  {
    do { } while (0);
    return FromTicks(ValueCalculator::Modulo(mValue, aOther.mValue));
  }

  template<typename E>
  bool operator<(const BaseTimeDuration<E>& aOther) const
  {
    return mValue < aOther.mValue;
  }
  template<typename E>
  bool operator<=(const BaseTimeDuration<E>& aOther) const
  {
    return mValue <= aOther.mValue;
  }
  template<typename E>
  bool operator>=(const BaseTimeDuration<E>& aOther) const
  {
    return mValue >= aOther.mValue;
  }
  template<typename E>
  bool operator>(const BaseTimeDuration<E>& aOther) const
  {
    return mValue > aOther.mValue;
  }
  template<typename E>
  bool operator==(const BaseTimeDuration<E>& aOther) const
  {
    return mValue == aOther.mValue;
  }
  template<typename E>
  bool operator!=(const BaseTimeDuration<E>& aOther) const
  {
    return mValue != aOther.mValue;
  }
  bool IsZero() const
  {
    return mValue == 0;
  }
  explicit operator bool() const
  {
    return mValue != 0;
  }

  friend std::ostream& operator<<(std::ostream& aStream,
                                  const BaseTimeDuration& aDuration) {
    return aStream << aDuration.ToMilliseconds() << " ms";
  }





  static BaseTimeDuration Resolution() {
    return FromTicks(BaseTimeDurationPlatformUtils::ResolutionInTicks());
  }
# 303 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
private:
  friend class TimeStamp;
  friend struct IPC::ParamTraits<mozilla::BaseTimeDuration<ValueCalculator>>;
  template <typename>
  friend class BaseTimeDuration;

  static BaseTimeDuration FromTicks(int64_t aTicks)
  {
    BaseTimeDuration t;
    t.mValue = aTicks;
    return t;
  }

  static BaseTimeDuration FromTicks(double aTicks)
  {


    if (aTicks >= double((9223372036854775807L))) {
      return FromTicks((9223372036854775807L));
    }


    if (aTicks <= double((-9223372036854775807L -1))) {
      return FromTicks((-9223372036854775807L -1));
    }

    return FromTicks(int64_t(aTicks));
  }


  int64_t mValue;
};





class TimeDurationValueCalculator
{
public:
  static int64_t Add(int64_t aA, int64_t aB) { return aA + aB; }
  static int64_t Subtract(int64_t aA, int64_t aB) { return aA - aB; }

  template <typename T>
  static int64_t Multiply(int64_t aA, T aB)
  {
    static_assert(IsIntegral<T>::value,
                  "Using integer multiplication routine with non-integer type."
                  " Further specialization required");
    return aA * static_cast<int64_t>(aB);
  }

  static int64_t Divide(int64_t aA, int64_t aB) { return aA / aB; }
  static double DivideDouble(int64_t aA, int64_t aB)
  {
    return static_cast<double>(aA) / aB;
  }
  static int64_t Modulo(int64_t aA, int64_t aB) { return aA % aB; }
};

template <>
inline int64_t
TimeDurationValueCalculator::Multiply<double>(int64_t aA, double aB)
{
  return static_cast<int64_t>(aA * aB);
}
# 378 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
typedef BaseTimeDuration<TimeDurationValueCalculator> TimeDuration;
# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
class TimeStamp
{
public:



  constexpr TimeStamp() : mValue(0) {}
# 443 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
  bool IsNull() const { return mValue == 0; }





  explicit operator bool() const
  {
    return mValue != 0;
  }
# 467 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
  static TimeStamp Now() { return Now(true); }
  static TimeStamp NowLoRes() { return Now(false); }
# 482 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
  static __attribute__((weak)) __attribute__((visibility("default"))) TimeStamp ProcessCreation(bool& aIsInconsistent);






  static __attribute__((weak)) __attribute__((visibility("default"))) void RecordProcessRestart();




  TimeDuration operator-(const TimeStamp& aOther) const
  {
    do { } while (0);
    do { } while (0);
    static_assert(-(9223372036854775807L) > (-9223372036854775807L -1), "int64_t sanity check");
    int64_t ticks = int64_t(mValue - aOther.mValue);

    if (mValue > aOther.mValue) {
      if (ticks < 0) {
        ticks = (9223372036854775807L);
      }
    } else {
      if (ticks > 0) {
        ticks = (-9223372036854775807L -1);
      }
    }
    return TimeDuration::FromTicks(ticks);
  }

  TimeStamp operator+(const TimeDuration& aOther) const
  {
    TimeStamp result = *this;
    result += aOther;
    return result;
  }
  TimeStamp operator-(const TimeDuration& aOther) const
  {
    TimeStamp result = *this;
    result -= aOther;
    return result;
  }
  TimeStamp& operator+=(const TimeDuration& aOther)
  {
    do { } while (0);
    TimeStampValue value = mValue + aOther.mValue;



    if (aOther.mValue < 0 && value > mValue) {
      value = 0;
    }
    mValue = value;
    return *this;
  }
  TimeStamp& operator-=(const TimeDuration& aOther)
  {
    do { } while (0);
    TimeStampValue value = mValue - aOther.mValue;



    if (aOther.mValue > 0 && value > mValue) {
      value = 0;
    }
    mValue = value;
    return *this;
  }

  bool operator<(const TimeStamp& aOther) const
  {
    do { } while (0);
    do { } while (0);
    return mValue < aOther.mValue;
  }
  bool operator<=(const TimeStamp& aOther) const
  {
    do { } while (0);
    do { } while (0);
    return mValue <= aOther.mValue;
  }
  bool operator>=(const TimeStamp& aOther) const
  {
    do { } while (0);
    do { } while (0);
    return mValue >= aOther.mValue;
  }
  bool operator>(const TimeStamp& aOther) const
  {
    do { } while (0);
    do { } while (0);
    return mValue > aOther.mValue;
  }
  bool operator==(const TimeStamp& aOther) const
  {
    return IsNull()
           ? aOther.IsNull()
           : !aOther.IsNull() && mValue == aOther.mValue;
  }
  bool operator!=(const TimeStamp& aOther) const
  {
    return !(*this == aOther);
  }





  static __attribute__((weak)) __attribute__((visibility("default"))) void Startup();
  static __attribute__((weak)) __attribute__((visibility("default"))) void Shutdown();

private:
  friend struct IPC::ParamTraits<mozilla::TimeStamp>;
  friend void StartupTimelineRecordExternal(int, uint64_t);

               TimeStamp(TimeStampValue aValue) : mValue(aValue) {}

  static __attribute__((weak)) __attribute__((visibility("default"))) TimeStamp Now(bool aHighResolution);
# 610 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
  static __attribute__((weak)) __attribute__((visibility("default"))) uint64_t ComputeProcessUptime();
# 625 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TimeStamp.h"
  TimeStampValue mValue;
};

}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" 2
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h" 2

namespace mozilla {
# 71 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AllocPolicy.h"
class MallocAllocPolicy
{
public:
  template <typename T>
  T* maybe_pod_malloc(size_t aNumElems)
  {
    if (aNumElems & mozilla::tl::MulOverflowMask<sizeof(T)>::value) {
      return nullptr;
    }
    return static_cast<T*>(malloc(aNumElems * sizeof(T)));
  }

  template <typename T>
  T* maybe_pod_calloc(size_t aNumElems)
  {
    return static_cast<T*>(calloc(aNumElems, sizeof(T)));
  }

  template <typename T>
  T* maybe_pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize)
  {
    if (aNewSize & mozilla::tl::MulOverflowMask<sizeof(T)>::value) {
      return nullptr;
    }
    return static_cast<T*>(realloc(aPtr, aNewSize * sizeof(T)));
  }

  template <typename T>
  T* pod_malloc(size_t aNumElems)
  {
    return maybe_pod_malloc<T>(aNumElems);
  }

  template <typename T>
  T* pod_calloc(size_t aNumElems)
  {
    return maybe_pod_calloc<T>(aNumElems);
  }

  template <typename T>
  T* pod_realloc(T* aPtr, size_t aOldSize, size_t aNewSize)
  {
    return maybe_pod_realloc<T>(aPtr, aOldSize, aNewSize);
  }

  void free_(void* aPtr)
  {
    free(aPtr);
  }

  void reportAllocOverflow() const
  {
  }

  __attribute__ ((warn_unused_result)) bool checkSimulatedOOM() const
  {
    return true;
  }
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" 2







# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReentrancyGuard.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ReentrancyGuard.h"
namespace mozilla {


class ReentrancyGuard
{





public:
  template<class T>





  explicit ReentrancyGuard(T&
                                                          )

  {
    do { } while (0);




  }
  ~ReentrancyGuard()
  {



  }

private:
  ReentrancyGuard(const ReentrancyGuard&) = delete;
  void operator=(const ReentrancyGuard&) = delete;
};

}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h" 2
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
namespace mozilla {

template<typename T, size_t N, class AllocPolicy>
class Vector;

namespace detail {






template<typename T>
static bool CapacityHasExcessSpace(size_t aCapacity)
{
  size_t size = aCapacity * sizeof(T);
  return RoundUpPow2(size) - size >= sizeof(T);
}





template<typename T, size_t N, class AP, bool IsPod>
struct VectorImpl
{



  template<typename... Args>
  __attribute__ ((nonnull(1)))
  static inline void new_(T* aDst, Args&&... aArgs)
  {
    new(KnownNotNull, aDst) T(Forward<Args>(aArgs)...);
  }


  static inline void destroy(T* aBegin, T* aEnd)
  {
    do { } while (0);
    for (T* p = aBegin; p < aEnd; ++p) {
      p->~T();
    }
  }


  static inline void initialize(T* aBegin, T* aEnd)
  {
    do { } while (0);
    for (T* p = aBegin; p < aEnd; ++p) {
      new_(p);
    }
  }





  template<typename U>
  static inline void copyConstruct(T* aDst,
                                   const U* aSrcStart, const U* aSrcEnd)
  {
    do { } while (0);
    for (const U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) {
      new_(aDst, *p);
    }
  }





  template<typename U>
  static inline void moveConstruct(T* aDst, U* aSrcStart, U* aSrcEnd)
  {
    do { } while (0);
    for (U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) {
      new_(aDst, Move(*p));
    }
  }





  template<typename U>
  static inline void copyConstructN(T* aDst, size_t aN, const U& aU)
  {
    for (T* end = aDst + aN; aDst < end; ++aDst) {
      new_(aDst, aU);
    }
  }







  static inline __attribute__ ((warn_unused_result)) bool
  growTo(Vector<T, N, AP>& aV, size_t aNewCap)
  {
    do { } while (0);
    do { } while (0);
    T* newbuf = aV.template pod_malloc<T>(aNewCap);
    if ((__builtin_expect(!!(!newbuf), 0))) {
      return false;
    }
    T* dst = newbuf;
    T* src = aV.beginNoCheck();
    for (; src < aV.endNoCheck(); ++dst, ++src) {
      new_(dst, Move(*src));
    }
    VectorImpl::destroy(aV.beginNoCheck(), aV.endNoCheck());
    aV.free_(aV.mBegin);
    aV.mBegin = newbuf;

    aV.mTail.mCapacity = aNewCap;
    return true;
  }
};






template<typename T, size_t N, class AP>
struct VectorImpl<T, N, AP, true>
{
  template<typename... Args>
  __attribute__ ((nonnull(1)))
  static inline void new_(T* aDst, Args&&... aArgs)
  {




    T temp(Forward<Args>(aArgs)...);
    *aDst = temp;
  }

  static inline void destroy(T*, T*) {}

  static inline void initialize(T* aBegin, T* aEnd)
  {
# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
    do { } while (0);
    for (T* p = aBegin; p < aEnd; ++p) {
      new_(p);
    }
  }

  template<typename U>
  static inline void copyConstruct(T* aDst,
                                   const U* aSrcStart, const U* aSrcEnd)
  {







    do { } while (0);
    for (const U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) {
      new_(aDst, *p);
    }
  }

  template<typename U>
  static inline void moveConstruct(T* aDst,
                                   const U* aSrcStart, const U* aSrcEnd)
  {
    copyConstruct(aDst, aSrcStart, aSrcEnd);
  }

  static inline void copyConstructN(T* aDst, size_t aN, const T& aT)
  {
    for (T* end = aDst + aN; aDst < end; ++aDst) {
      new_(aDst, aT);
    }
  }

  static inline __attribute__ ((warn_unused_result)) bool
  growTo(Vector<T, N, AP>& aV, size_t aNewCap)
  {
    do { } while (0);
    do { } while (0);
    T* newbuf =
      aV.template pod_realloc<T>(aV.mBegin, aV.mTail.mCapacity, aNewCap);
    if ((__builtin_expect(!!(!newbuf), 0))) {
      return false;
    }
    aV.mBegin = newbuf;

    aV.mTail.mCapacity = aNewCap;
    return true;
  }

  static inline void
  podResizeToFit(Vector<T, N, AP>& aV)
  {
    if (aV.usingInlineStorage() || aV.mLength == aV.mTail.mCapacity) {
      return;
    }
    T* newbuf =
      aV.template pod_realloc<T>(aV.mBegin, aV.mTail.mCapacity, aV.mLength);
    if ((__builtin_expect(!!(!newbuf), 0))) {
      return;
    }
    aV.mBegin = newbuf;
    aV.mTail.mCapacity = aV.mLength;
  }
};



struct VectorTesting;

}
# 280 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
template<typename T,
         size_t MinInlineCapacity = 0,
         class AllocPolicy = MallocAllocPolicy>
class Vector final : private AllocPolicy
{


  static const bool kElemIsPod = IsPod<T>::value;
  typedef detail::VectorImpl<T, MinInlineCapacity, AllocPolicy, kElemIsPod> Impl;
  friend struct detail::VectorImpl<T, MinInlineCapacity, AllocPolicy, kElemIsPod>;

  friend struct detail::VectorTesting;

  __attribute__ ((warn_unused_result)) bool growStorageBy(size_t aIncr);
  __attribute__ ((warn_unused_result)) bool convertToHeapStorage(size_t aNewCap);
  __attribute__ ((warn_unused_result)) bool maybeCheckSimulatedOOM(size_t aRequestedSize);
# 305 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  static constexpr size_t kMaxInlineBytes =
    1024 - (sizeof(AllocPolicy) + sizeof(T*) + sizeof(size_t) + sizeof(size_t));
# 317 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  template<size_t MinimumInlineCapacity, size_t Dummy>
  struct ComputeCapacity
  {
    static constexpr size_t value =
      tl::Min<MinimumInlineCapacity, kMaxInlineBytes / sizeof(T)>::value;
  };

  template<size_t Dummy>
  struct ComputeCapacity<0, Dummy>
  {
    static constexpr size_t value = 0;
  };


  static constexpr size_t kInlineCapacity =
    ComputeCapacity<MinInlineCapacity, 0>::value;
# 343 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  T* mBegin;


  size_t mLength;
# 367 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  struct CapacityAndReserved
  {
    explicit CapacityAndReserved(size_t aCapacity, size_t aReserved)
      : mCapacity(aCapacity)



    {}
    CapacityAndReserved() = default;


    size_t mCapacity;





  };
# 393 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  template<size_t Capacity, size_t Dummy>
  struct CRAndStorage : CapacityAndReserved
  {
    explicit CRAndStorage(size_t aCapacity, size_t aReserved)
      : CapacityAndReserved(aCapacity, aReserved)
    {}
    CRAndStorage() = default;

    alignas(T) unsigned char mBytes[Capacity * sizeof(T)];



    void* data() { return mBytes; }

    T* storage() { return static_cast<T*>(data()); }
  };

  template<size_t Dummy>
  struct CRAndStorage<0, Dummy> : CapacityAndReserved
  {
    explicit CRAndStorage(size_t aCapacity, size_t aReserved)
      : CapacityAndReserved(aCapacity, aReserved)
    {}
    CRAndStorage() = default;

    T* storage() { return nullptr; }
  };

  CRAndStorage<kInlineCapacity, 0> mTail;
# 434 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  bool usingInlineStorage() const
  {
    return mBegin == const_cast<Vector*>(this)->inlineStorage();
  }

  T* inlineStorage()
  {
    return mTail.storage();
  }

  T* beginNoCheck() const
  {
    return mBegin;
  }

  T* endNoCheck()
  {
    return mBegin + mLength;
  }

  const T* endNoCheck() const
  {
    return mBegin + mLength;
  }
# 476 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  template<typename U> void internalAppend(U&& aU);
  template<typename U, size_t O, class BP>
  void internalAppendAll(const Vector<U, O, BP>& aU);
  void internalAppendN(const T& aT, size_t aN);
  template<typename U> void internalAppend(const U* aBegin, size_t aLength);

public:
  static const size_t sMaxInlineStorage = MinInlineCapacity;

  typedef T ElementType;

  explicit Vector(AllocPolicy = AllocPolicy());
  Vector(Vector&&);
  Vector& operator=(Vector&&);
  ~Vector();



  const AllocPolicy& allocPolicy() const { return *this; }

  AllocPolicy& allocPolicy() { return *this; }

  enum { InlineLength = MinInlineCapacity };

  size_t length() const { return mLength; }

  bool empty() const { return mLength == 0; }

  size_t capacity() const { return mTail.mCapacity; }

  T* begin()
  {
    do { } while (0);
    return mBegin;
  }

  const T* begin() const
  {
    do { } while (0);
    return mBegin;
  }

  T* end()
  {
    do { } while (0);
    return mBegin + mLength;
  }

  const T* end() const
  {
    do { } while (0);
    return mBegin + mLength;
  }

  T& operator[](size_t aIndex)
  {
    do { } while (0);
    do { } while (0);
    return begin()[aIndex];
  }

  const T& operator[](size_t aIndex) const
  {
    do { } while (0);
    do { } while (0);
    return begin()[aIndex];
  }

  T& back()
  {
    do { } while (0);
    do { } while (0);
    return *(end() - 1);
  }

  const T& back() const
  {
    do { } while (0);
    do { } while (0);
    return *(end() - 1);
  }

  class Range
  {
    friend class Vector;
    T* mCur;
    T* mEnd;
    Range(T* aCur, T* aEnd)
      : mCur(aCur)
      , mEnd(aEnd)
    {
      do { } while (0);
    }

  public:
    bool empty() const { return mCur == mEnd; }
    size_t remain() const { return PointerRangeSize(mCur, mEnd); }
    T& front() const { do { } while (0); return *mCur; }
    void popFront() { do { } while (0); ++mCur; }
    T popCopyFront() { do { } while (0); return *mCur++; }
  };

  class ConstRange
  {
    friend class Vector;
    const T* mCur;
    const T* mEnd;
    ConstRange(const T* aCur, const T* aEnd)
      : mCur(aCur)
      , mEnd(aEnd)
    {
      do { } while (0);
    }

  public:
    bool empty() const { return mCur == mEnd; }
    size_t remain() const { return PointerRangeSize(mCur, mEnd); }
    const T& front() const { do { } while (0); return *mCur; }
    void popFront() { do { } while (0); ++mCur; }
    T popCopyFront() { do { } while (0); return *mCur++; }
  };

  Range all() { return Range(begin(), end()); }
  ConstRange all() const { return ConstRange(begin(), end()); }






  void reverse();





  __attribute__ ((warn_unused_result)) bool initCapacity(size_t aRequest);
# 621 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  __attribute__ ((warn_unused_result)) bool initLengthUninitialized(size_t aRequest);
# 631 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  __attribute__ ((warn_unused_result)) bool reserve(size_t aRequest);





  void shrinkBy(size_t aIncr);





  void shrinkTo(size_t aNewLength);


  __attribute__ ((warn_unused_result)) bool growBy(size_t aIncr);


  __attribute__ ((warn_unused_result)) bool resize(size_t aNewLength);





  __attribute__ ((warn_unused_result)) bool growByUninitialized(size_t aIncr);
  void infallibleGrowByUninitialized(size_t aIncr);
  __attribute__ ((warn_unused_result)) bool resizeUninitialized(size_t aNewLength);


  void clear();


  void clearAndFree();






  void podResizeToFit();







  bool canAppendWithoutRealloc(size_t aNeeded) const;
# 687 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  template<typename U> __attribute__ ((warn_unused_result)) bool append(U&& aU);




  template<typename... Args>
  __attribute__ ((warn_unused_result)) bool emplaceBack(Args&&... aArgs)
  {
    if (!growByUninitialized(1))
      return false;
    Impl::new_(&back(), Forward<Args>(aArgs)...);
    return true;
  }

  template<typename U, size_t O, class BP>
  __attribute__ ((warn_unused_result)) bool appendAll(const Vector<U, O, BP>& aU);
  __attribute__ ((warn_unused_result)) bool appendN(const T& aT, size_t aN);
  template<typename U> __attribute__ ((warn_unused_result)) bool append(const U* aBegin, const U* aEnd);
  template<typename U> __attribute__ ((warn_unused_result)) bool append(const U* aBegin, size_t aLength);






  template<typename U> void infallibleAppend(U&& aU)
  {
    internalAppend(Forward<U>(aU));
  }
  void infallibleAppendN(const T& aT, size_t aN)
  {
    internalAppendN(aT, aN);
  }
  template<typename U> void infallibleAppend(const U* aBegin, const U* aEnd)
  {
    internalAppend(aBegin, PointerRangeSize(aBegin, aEnd));
  }
  template<typename U> void infallibleAppend(const U* aBegin, size_t aLength)
  {
    internalAppend(aBegin, aLength);
  }
  template<typename... Args>
  void infallibleEmplaceBack(Args&&... aArgs)
  {
    infallibleGrowByUninitialized(1);
    Impl::new_(&back(), Forward<Args>(aArgs)...);
  }

  void popBack();

  T popCopy();
# 749 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  __attribute__ ((warn_unused_result)) T* extractRawBuffer();
# 767 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  __attribute__ ((warn_unused_result)) T* extractOrCopyRawBuffer();
# 777 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  void replaceRawBuffer(T* aP, size_t aLength);
# 794 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  template<typename U>
  __attribute__ ((warn_unused_result)) T* insert(T* aP, U&& aVal);





  void erase(T* aT);






  void erase(T* aBegin, T* aEnd);




  size_t sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;





  size_t sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;

  void swap(Vector& aOther);

private:
  Vector(const Vector&) = delete;
  void operator=(const Vector&) = delete;
};
# 838 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline
Vector<T, N, AP>::Vector(AP aAP)
  : AP(aAP)
  , mLength(0)
  , mTail(kInlineCapacity, 0)



{
  mBegin = inlineStorage();
}


template<typename T, size_t N, class AllocPolicy>
__attribute__((always_inline)) inline
Vector<T, N, AllocPolicy>::Vector(Vector&& aRhs)
  : AllocPolicy(Move(aRhs))



{
  mLength = aRhs.mLength;
  mTail.mCapacity = aRhs.mTail.mCapacity;




  if (aRhs.usingInlineStorage()) {

    mBegin = inlineStorage();
    Impl::moveConstruct(mBegin, aRhs.beginNoCheck(), aRhs.endNoCheck());




  } else {




    mBegin = aRhs.mBegin;
    aRhs.mBegin = aRhs.inlineStorage();
    aRhs.mTail.mCapacity = kInlineCapacity;
    aRhs.mLength = 0;



  }
}


template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline Vector<T, N, AP>&
Vector<T, N, AP>::operator=(Vector&& aRhs)
{
  do { } while (0);
  this->~Vector();
  new(KnownNotNull, this) Vector(Move(aRhs));
  return *this;
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline
Vector<T, N, AP>::~Vector()
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  Impl::destroy(beginNoCheck(), endNoCheck());
  if (!usingInlineStorage()) {
    this->free_(beginNoCheck());
  }
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::reverse() {
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  T* elems = mBegin;
  size_t len = mLength;
  size_t mid = len / 2;
  for (size_t i = 0; i < mid; i++) {
    Swap(elems[i], elems[len - i - 1]);
  }
}






template<typename T, size_t N, class AP>
inline bool
Vector<T, N, AP>::convertToHeapStorage(size_t aNewCap)
{
  do { } while (0);


  do { } while (0);
  T* newBuf = this->template pod_malloc<T>(aNewCap);
  if ((__builtin_expect(!!(!newBuf), 0))) {
    return false;
  }


  Impl::moveConstruct(newBuf, beginNoCheck(), endNoCheck());
  Impl::destroy(beginNoCheck(), endNoCheck());


  mBegin = newBuf;

  mTail.mCapacity = aNewCap;
  return true;
}

template<typename T, size_t N, class AP>
__attribute__((noinline)) bool
Vector<T, N, AP>::growStorageBy(size_t aIncr)
{
  do { } while (0);
# 966 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
  size_t newCap;

  if (aIncr == 1) {
    if (usingInlineStorage()) {

      size_t newSize =
        tl::RoundUpPow2<(kInlineCapacity + 1) * sizeof(T)>::value;
      newCap = newSize / sizeof(T);
      goto convert;
    }

    if (mLength == 0) {

      newCap = 1;
      goto grow;
    }
# 994 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Vector.h"
    if ((__builtin_expect(!!(mLength & tl::MulOverflowMask<4 * sizeof(T)>::value), 0))) {
      this->reportAllocOverflow();
      return false;
    }






    newCap = mLength * 2;
    if (detail::CapacityHasExcessSpace<T>(newCap)) {
      newCap += 1;
    }
  } else {

    size_t newMinCap = mLength + aIncr;


    if ((__builtin_expect(!!(newMinCap < mLength || newMinCap & tl::MulOverflowMask<2 * sizeof(T)>::value), 0)))

    {
      this->reportAllocOverflow();
      return false;
    }

    size_t newMinSize = newMinCap * sizeof(T);
    size_t newSize = RoundUpPow2(newMinSize);
    newCap = newSize / sizeof(T);
  }

  if (usingInlineStorage()) {
convert:
    return convertToHeapStorage(newCap);
  }

grow:
  return Impl::growTo(*this, newCap);
}

template<typename T, size_t N, class AP>
inline bool
Vector<T, N, AP>::initCapacity(size_t aRequest)
{
  do { } while (0);
  do { } while (0);
  if (aRequest == 0) {
    return true;
  }
  T* newbuf = this->template pod_malloc<T>(aRequest);
  if ((__builtin_expect(!!(!newbuf), 0))) {
    return false;
  }
  mBegin = newbuf;
  mTail.mCapacity = aRequest;



  return true;
}

template<typename T, size_t N, class AP>
inline bool
Vector<T, N, AP>::initLengthUninitialized(size_t aRequest)
{
  if (!initCapacity(aRequest)) {
    return false;
  }
  infallibleGrowByUninitialized(aRequest);
  return true;
}

template<typename T, size_t N, class AP>
inline bool
Vector<T, N, AP>::maybeCheckSimulatedOOM(size_t aRequestedSize)
{
  if (aRequestedSize <= N) {
    return true;
  }







  return allocPolicy().checkSimulatedOOM();
}

template<typename T, size_t N, class AP>
inline bool
Vector<T, N, AP>::reserve(size_t aRequest)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  if (aRequest > mTail.mCapacity) {
    if ((__builtin_expect(!!(!growStorageBy(aRequest - mLength)), 0))) {
      return false;
    }
  } else if (!maybeCheckSimulatedOOM(aRequest)) {
    return false;
  }







  return true;
}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::shrinkBy(size_t aIncr)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  do { } while (0);
  Impl::destroy(endNoCheck() - aIncr, endNoCheck());
  mLength -= aIncr;
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::shrinkTo(size_t aNewLength)
{
  do { } while (0);
  shrinkBy(mLength - aNewLength);
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::growBy(size_t aIncr)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  if (aIncr > mTail.mCapacity - mLength) {
    if ((__builtin_expect(!!(!growStorageBy(aIncr)), 0))) {
      return false;
    }
  } else if (!maybeCheckSimulatedOOM(mLength + aIncr)) {
    return false;
  }
  do { } while (0);
  T* newend = endNoCheck() + aIncr;
  Impl::initialize(endNoCheck(), newend);
  mLength += aIncr;





  return true;
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::growByUninitialized(size_t aIncr)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  if (aIncr > mTail.mCapacity - mLength) {
    if ((__builtin_expect(!!(!growStorageBy(aIncr)), 0))) {
      return false;
    }
  } else if (!maybeCheckSimulatedOOM(mLength + aIncr)) {
    return false;
  }





  infallibleGrowByUninitialized(aIncr);
  return true;
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::infallibleGrowByUninitialized(size_t aIncr)
{
  do { } while (0);
  mLength += aIncr;
}

template<typename T, size_t N, class AP>
inline bool
Vector<T, N, AP>::resize(size_t aNewLength)
{
  size_t curLength = mLength;
  if (aNewLength > curLength) {
    return growBy(aNewLength - curLength);
  }
  shrinkBy(curLength - aNewLength);
  return true;
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::resizeUninitialized(size_t aNewLength)
{
  size_t curLength = mLength;
  if (aNewLength > curLength) {
    return growByUninitialized(aNewLength - curLength);
  }
  shrinkBy(curLength - aNewLength);
  return true;
}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::clear()
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  Impl::destroy(beginNoCheck(), endNoCheck());
  mLength = 0;
}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::clearAndFree()
{
  clear();

  if (usingInlineStorage()) {
    return;
  }
  this->free_(beginNoCheck());
  mBegin = inlineStorage();
  mTail.mCapacity = kInlineCapacity;



}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::podResizeToFit()
{


  Impl::podResizeToFit(*this);
}

template<typename T, size_t N, class AP>
inline bool
Vector<T, N, AP>::canAppendWithoutRealloc(size_t aNeeded) const
{
  return mLength + aNeeded <= mTail.mCapacity;
}

template<typename T, size_t N, class AP>
template<typename U, size_t O, class BP>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::internalAppendAll(const Vector<U, O, BP>& aOther)
{
  internalAppend(aOther.begin(), aOther.length());
}

template<typename T, size_t N, class AP>
template<typename U>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::internalAppend(U&& aU)
{
  do { } while (0);
  do { } while (0);
  Impl::new_(endNoCheck(), Forward<U>(aU));
  ++mLength;
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::appendN(const T& aT, size_t aNeeded)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  if (mLength + aNeeded > mTail.mCapacity) {
    if ((__builtin_expect(!!(!growStorageBy(aNeeded)), 0))) {
      return false;
    }
  } else if (!maybeCheckSimulatedOOM(mLength + aNeeded)) {
    return false;
  }





  internalAppendN(aT, aNeeded);
  return true;
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::internalAppendN(const T& aT, size_t aNeeded)
{
  do { } while (0);
  do { } while (0);
  Impl::copyConstructN(endNoCheck(), aNeeded, aT);
  mLength += aNeeded;
}

template<typename T, size_t N, class AP>
template<typename U>
inline T*
Vector<T, N, AP>::insert(T* aP, U&& aVal)
{
  do { } while (0);
  do { } while (0);
  size_t pos = aP - begin();
  do { } while (0);
  size_t oldLength = mLength;
  if (pos == oldLength) {
    if (!append(Forward<U>(aVal))) {
      return nullptr;
    }
  } else {
    T oldBack = Move(back());
    if (!append(Move(oldBack))) {
      return nullptr;
    }
    for (size_t i = oldLength - 1; i > pos; --i) {
      (*this)[i] = Move((*this)[i - 1]);
    }
    (*this)[pos] = Forward<U>(aVal);
  }
  return begin() + pos;
}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::erase(T* aIt)
{
  do { } while (0);
  do { } while (0);
  while (aIt + 1 < end()) {
    *aIt = Move(*(aIt + 1));
    ++aIt;
  }
  popBack();
}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::erase(T* aBegin, T* aEnd)
{
  do { } while (0);
  do { } while (0);
  do { } while (0);
  while (aEnd < end()) {
    *aBegin++ = Move(*aEnd++);
  }
  shrinkBy(aEnd - aBegin);
}

template<typename T, size_t N, class AP>
template<typename U>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::append(const U* aInsBegin, const U* aInsEnd)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  size_t aNeeded = PointerRangeSize(aInsBegin, aInsEnd);
  if (mLength + aNeeded > mTail.mCapacity) {
    if ((__builtin_expect(!!(!growStorageBy(aNeeded)), 0))) {
      return false;
    }
  } else if (!maybeCheckSimulatedOOM(mLength + aNeeded)) {
      return false;
  }





  internalAppend(aInsBegin, aNeeded);
  return true;
}

template<typename T, size_t N, class AP>
template<typename U>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::internalAppend(const U* aInsBegin, size_t aInsLength)
{
  do { } while (0);
  do { } while (0);
  Impl::copyConstruct(endNoCheck(), aInsBegin, aInsBegin + aInsLength);
  mLength += aInsLength;
}

template<typename T, size_t N, class AP>
template<typename U>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::append(U&& aU)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  if (mLength == mTail.mCapacity) {
    if ((__builtin_expect(!!(!growStorageBy(1)), 0))) {
      return false;
    }
  } else if (!maybeCheckSimulatedOOM(mLength + 1)) {
      return false;
  }





  internalAppend(Forward<U>(aU));
  return true;
}

template<typename T, size_t N, class AP>
template<typename U, size_t O, class BP>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::appendAll(const Vector<U, O, BP>& aOther)
{
  return append(aOther.begin(), aOther.length());
}

template<typename T, size_t N, class AP>
template<class U>
__attribute__((always_inline)) inline bool
Vector<T, N, AP>::append(const U* aInsBegin, size_t aInsLength)
{
  return append(aInsBegin, aInsBegin + aInsLength);
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline void
Vector<T, N, AP>::popBack()
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);
  do { } while (0);
  --mLength;
  endNoCheck()->~T();
}

template<typename T, size_t N, class AP>
__attribute__((always_inline)) inline T
Vector<T, N, AP>::popCopy()
{
  T ret = back();
  popBack();
  return ret;
}

template<typename T, size_t N, class AP>
inline T*
Vector<T, N, AP>::extractRawBuffer()
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);

  if (usingInlineStorage()) {
    return nullptr;
  }

  T* ret = mBegin;
  mBegin = inlineStorage();
  mLength = 0;
  mTail.mCapacity = kInlineCapacity;



  return ret;
}

template<typename T, size_t N, class AP>
inline T*
Vector<T, N, AP>::extractOrCopyRawBuffer()
{
  if (T* ret = extractRawBuffer()) {
    return ret;
  }

  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);

  T* copy = this->template pod_malloc<T>(mLength);
  if (!copy) {
    return nullptr;
  }

  Impl::moveConstruct(copy, beginNoCheck(), endNoCheck());
  Impl::destroy(beginNoCheck(), endNoCheck());
  mBegin = inlineStorage();
  mLength = 0;
  mTail.mCapacity = kInlineCapacity;



  return copy;
}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::replaceRawBuffer(T* aP, size_t aLength)
{
  ReentrancyGuard g(*this); do { } while (0); do { } while (0); do { } while (0); do { } while (0);


  Impl::destroy(beginNoCheck(), endNoCheck());
  if (!usingInlineStorage()) {
    this->free_(beginNoCheck());
  }


  if (aLength <= kInlineCapacity) {





    mBegin = inlineStorage();
    mLength = aLength;
    mTail.mCapacity = kInlineCapacity;
    Impl::moveConstruct(mBegin, aP, aP + aLength);
    Impl::destroy(aP, aP + aLength);
    this->free_(aP);
  } else {
    mBegin = aP;
    mLength = aLength;
    mTail.mCapacity = aLength;
  }



}

template<typename T, size_t N, class AP>
inline size_t
Vector<T, N, AP>::sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
  return usingInlineStorage() ? 0 : aMallocSizeOf(beginNoCheck());
}

template<typename T, size_t N, class AP>
inline size_t
Vector<T, N, AP>::sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
  return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf);
}

template<typename T, size_t N, class AP>
inline void
Vector<T, N, AP>::swap(Vector& aOther)
{
  static_assert(N == 0,
                "still need to implement this for N != 0");


  if (!usingInlineStorage() && aOther.usingInlineStorage()) {
    aOther.mBegin = mBegin;
    mBegin = inlineStorage();
  } else if (usingInlineStorage() && !aOther.usingInlineStorage()) {
    mBegin = aOther.mBegin;
    aOther.mBegin = aOther.inlineStorage();
  } else if (!usingInlineStorage() && !aOther.usingInlineStorage()) {
    Swap(mBegin, aOther.mBegin);
  } else {

  }

  Swap(mLength, aOther.mLength);
  Swap(mTail.mCapacity, aOther.mTail.mCapacity);



}

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" 1
# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
namespace mozilla {
# 81 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
enum MemoryOrdering {
# 111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
  Relaxed,
# 133 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
  ReleaseAcquire,
# 162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
  SequentiallyConsistent,
};

}





# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/atomic" 1 3
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/atomic" 3





# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 55 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3
  typedef enum memory_order
    {
      memory_order_relaxed,
      memory_order_consume,
      memory_order_acquire,
      memory_order_release,
      memory_order_acq_rel,
      memory_order_seq_cst
    } memory_order;

  enum __memory_order_modifier
    {
      __memory_order_mask = 0x0ffff,
      __memory_order_modifier_mask = 0xffff0000,
      __memory_order_hle_acquire = 0x10000,
      __memory_order_hle_release = 0x20000
    };

  constexpr memory_order
  operator|(memory_order __m, __memory_order_modifier __mod)
  {
    return memory_order(__m | int(__mod));
  }

  constexpr memory_order
  operator&(memory_order __m, __memory_order_modifier __mod)
  {
    return memory_order(__m & int(__mod));
  }


  constexpr memory_order
  __cmpexch_failure_order2(memory_order __m) noexcept
  {
    return __m == memory_order_acq_rel ? memory_order_acquire
      : __m == memory_order_release ? memory_order_relaxed : __m;
  }

  constexpr memory_order
  __cmpexch_failure_order(memory_order __m) noexcept
  {
    return memory_order(__cmpexch_failure_order2(__m & __memory_order_mask)
      | (__m & __memory_order_modifier_mask));
  }

  inline __attribute__((__always_inline__)) void
  atomic_thread_fence(memory_order __m) noexcept
  { __atomic_thread_fence(__m); }

  inline __attribute__((__always_inline__)) void
  atomic_signal_fence(memory_order __m) noexcept
  { __atomic_signal_fence(__m); }


  template<typename _Tp>
    inline _Tp
    kill_dependency(_Tp __y) noexcept
    {
      _Tp __ret(__y);
      return __ret;
    }



  template<typename _IntTp>
    struct __atomic_base;




  template<typename _Tp>
    struct atomic;

  template<typename _Tp>
    struct atomic<_Tp*>;



    typedef bool __atomic_flag_data_type;
# 148 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3
  extern "C" {

  struct __atomic_flag_base
  {
    __atomic_flag_data_type _M_i;
  };

  }




  struct atomic_flag : public __atomic_flag_base
  {
    atomic_flag() noexcept = default;
    ~atomic_flag() noexcept = default;
    atomic_flag(const atomic_flag&) = delete;
    atomic_flag& operator=(const atomic_flag&) = delete;
    atomic_flag& operator=(const atomic_flag&) volatile = delete;


    constexpr atomic_flag(bool __i) noexcept
      : __atomic_flag_base{ _S_init(__i) }
    { }

    inline __attribute__((__always_inline__)) bool
    test_and_set(memory_order __m = memory_order_seq_cst) noexcept
    {
      return __atomic_test_and_set (&_M_i, __m);
    }

    inline __attribute__((__always_inline__)) bool
    test_and_set(memory_order __m = memory_order_seq_cst) volatile noexcept
    {
      return __atomic_test_and_set (&_M_i, __m);
    }

    inline __attribute__((__always_inline__)) void
    clear(memory_order __m = memory_order_seq_cst) noexcept
    {
      memory_order __b = __m & __memory_order_mask;
                                                   ;
                                                   ;
                                                   ;

      __atomic_clear (&_M_i, __m);
    }

    inline __attribute__((__always_inline__)) void
    clear(memory_order __m = memory_order_seq_cst) volatile noexcept
    {
      memory_order __b = __m & __memory_order_mask;
                                                   ;
                                                   ;
                                                   ;

      __atomic_clear (&_M_i, __m);
    }

  private:
    static constexpr __atomic_flag_data_type
    _S_init(bool __i)
    { return __i ? 1 : 0; }
  };
# 237 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/atomic_base.h" 3
  template<typename _ITp>
    struct __atomic_base
    {
    private:
      typedef _ITp __int_type;

      static constexpr int _S_alignment =
 sizeof(_ITp) > alignof(_ITp) ? sizeof(_ITp) : alignof(_ITp);

      alignas(_S_alignment) __int_type _M_i;

    public:
      __atomic_base() noexcept = default;
      ~__atomic_base() noexcept = default;
      __atomic_base(const __atomic_base&) = delete;
      __atomic_base& operator=(const __atomic_base&) = delete;
      __atomic_base& operator=(const __atomic_base&) volatile = delete;


      constexpr __atomic_base(__int_type __i) noexcept : _M_i (__i) { }

      operator __int_type() const noexcept
      { return load(); }

      operator __int_type() const volatile noexcept
      { return load(); }

      __int_type
      operator=(__int_type __i) noexcept
      {
 store(__i);
 return __i;
      }

      __int_type
      operator=(__int_type __i) volatile noexcept
      {
 store(__i);
 return __i;
      }

      __int_type
      operator++(int) noexcept
      { return fetch_add(1); }

      __int_type
      operator++(int) volatile noexcept
      { return fetch_add(1); }

      __int_type
      operator--(int) noexcept
      { return fetch_sub(1); }

      __int_type
      operator--(int) volatile noexcept
      { return fetch_sub(1); }

      __int_type
      operator++() noexcept
      { return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); }

      __int_type
      operator++() volatile noexcept
      { return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); }

      __int_type
      operator--() noexcept
      { return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); }

      __int_type
      operator--() volatile noexcept
      { return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); }

      __int_type
      operator+=(__int_type __i) noexcept
      { return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator+=(__int_type __i) volatile noexcept
      { return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator-=(__int_type __i) noexcept
      { return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator-=(__int_type __i) volatile noexcept
      { return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator&=(__int_type __i) noexcept
      { return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator&=(__int_type __i) volatile noexcept
      { return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator|=(__int_type __i) noexcept
      { return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator|=(__int_type __i) volatile noexcept
      { return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator^=(__int_type __i) noexcept
      { return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); }

      __int_type
      operator^=(__int_type __i) volatile noexcept
      { return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); }

      bool
      is_lock_free() const noexcept
      {

 return __atomic_is_lock_free(sizeof(_M_i),
     reinterpret_cast<void *>(-__alignof(_M_i)));
      }

      bool
      is_lock_free() const volatile noexcept
      {

 return __atomic_is_lock_free(sizeof(_M_i),
     reinterpret_cast<void *>(-__alignof(_M_i)));
      }

      inline __attribute__((__always_inline__)) void
      store(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept
      {
        memory_order __b = __m & __memory_order_mask;
                                              ;
                                              ;
                                              ;

 __atomic_store_n(&_M_i, __i, __m);
      }

      inline __attribute__((__always_inline__)) void
      store(__int_type __i,
     memory_order __m = memory_order_seq_cst) volatile noexcept
      {
        memory_order __b = __m & __memory_order_mask;
                                              ;
                                              ;
                                              ;

 __atomic_store_n(&_M_i, __i, __m);
      }

      inline __attribute__((__always_inline__)) __int_type
      load(memory_order __m = memory_order_seq_cst) const noexcept
      {
       memory_order __b = __m & __memory_order_mask;
                                              ;
                                              ;

 return __atomic_load_n(&_M_i, __m);
      }

      inline __attribute__((__always_inline__)) __int_type
      load(memory_order __m = memory_order_seq_cst) const volatile noexcept
      {
        memory_order __b = __m & __memory_order_mask;
                                              ;
                                              ;

 return __atomic_load_n(&_M_i, __m);
      }

      inline __attribute__((__always_inline__)) __int_type
      exchange(__int_type __i,
        memory_order __m = memory_order_seq_cst) noexcept
      {
 return __atomic_exchange_n(&_M_i, __i, __m);
      }


      inline __attribute__((__always_inline__)) __int_type
      exchange(__int_type __i,
        memory_order __m = memory_order_seq_cst) volatile noexcept
      {
 return __atomic_exchange_n(&_M_i, __i, __m);
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_weak(__int_type& __i1, __int_type __i2,
       memory_order __m1, memory_order __m2) noexcept
      {
       memory_order __b2 = __m2 & __memory_order_mask;
       memory_order __b1 = __m1 & __memory_order_mask;
                                               ;
                                               ;
                               ;

 return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2);
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_weak(__int_type& __i1, __int_type __i2,
       memory_order __m1,
       memory_order __m2) volatile noexcept
      {
       memory_order __b2 = __m2 & __memory_order_mask;
       memory_order __b1 = __m1 & __memory_order_mask;
                                               ;
                                               ;
                               ;

 return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2);
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_weak(__int_type& __i1, __int_type __i2,
       memory_order __m = memory_order_seq_cst) noexcept
      {
 return compare_exchange_weak(__i1, __i2, __m,
         __cmpexch_failure_order(__m));
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_weak(__int_type& __i1, __int_type __i2,
     memory_order __m = memory_order_seq_cst) volatile noexcept
      {
 return compare_exchange_weak(__i1, __i2, __m,
         __cmpexch_failure_order(__m));
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_strong(__int_type& __i1, __int_type __i2,
         memory_order __m1, memory_order __m2) noexcept
      {
        memory_order __b2 = __m2 & __memory_order_mask;
        memory_order __b1 = __m1 & __memory_order_mask;
                                               ;
                                               ;
                               ;

 return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2);
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_strong(__int_type& __i1, __int_type __i2,
         memory_order __m1,
         memory_order __m2) volatile noexcept
      {
        memory_order __b2 = __m2 & __memory_order_mask;
        memory_order __b1 = __m1 & __memory_order_mask;

                                               ;
                                               ;
                               ;

 return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2);
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_strong(__int_type& __i1, __int_type __i2,
         memory_order __m = memory_order_seq_cst) noexcept
      {
 return compare_exchange_strong(__i1, __i2, __m,
           __cmpexch_failure_order(__m));
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_strong(__int_type& __i1, __int_type __i2,
   memory_order __m = memory_order_seq_cst) volatile noexcept
      {
 return compare_exchange_strong(__i1, __i2, __m,
           __cmpexch_failure_order(__m));
      }

      inline __attribute__((__always_inline__)) __int_type
      fetch_add(__int_type __i,
  memory_order __m = memory_order_seq_cst) noexcept
      { return __atomic_fetch_add(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_add(__int_type __i,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return __atomic_fetch_add(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_sub(__int_type __i,
  memory_order __m = memory_order_seq_cst) noexcept
      { return __atomic_fetch_sub(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_sub(__int_type __i,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return __atomic_fetch_sub(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_and(__int_type __i,
  memory_order __m = memory_order_seq_cst) noexcept
      { return __atomic_fetch_and(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_and(__int_type __i,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return __atomic_fetch_and(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_or(__int_type __i,
        memory_order __m = memory_order_seq_cst) noexcept
      { return __atomic_fetch_or(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_or(__int_type __i,
        memory_order __m = memory_order_seq_cst) volatile noexcept
      { return __atomic_fetch_or(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_xor(__int_type __i,
  memory_order __m = memory_order_seq_cst) noexcept
      { return __atomic_fetch_xor(&_M_i, __i, __m); }

      inline __attribute__((__always_inline__)) __int_type
      fetch_xor(__int_type __i,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return __atomic_fetch_xor(&_M_i, __i, __m); }
    };



  template<typename _PTp>
    struct __atomic_base<_PTp*>
    {
    private:
      typedef _PTp* __pointer_type;

      __pointer_type _M_p;


      constexpr ptrdiff_t
      _M_type_size(ptrdiff_t __d) const { return __d * sizeof(_PTp); }

      constexpr ptrdiff_t
      _M_type_size(ptrdiff_t __d) const volatile { return __d * sizeof(_PTp); }

    public:
      __atomic_base() noexcept = default;
      ~__atomic_base() noexcept = default;
      __atomic_base(const __atomic_base&) = delete;
      __atomic_base& operator=(const __atomic_base&) = delete;
      __atomic_base& operator=(const __atomic_base&) volatile = delete;


      constexpr __atomic_base(__pointer_type __p) noexcept : _M_p (__p) { }

      operator __pointer_type() const noexcept
      { return load(); }

      operator __pointer_type() const volatile noexcept
      { return load(); }

      __pointer_type
      operator=(__pointer_type __p) noexcept
      {
 store(__p);
 return __p;
      }

      __pointer_type
      operator=(__pointer_type __p) volatile noexcept
      {
 store(__p);
 return __p;
      }

      __pointer_type
      operator++(int) noexcept
      { return fetch_add(1); }

      __pointer_type
      operator++(int) volatile noexcept
      { return fetch_add(1); }

      __pointer_type
      operator--(int) noexcept
      { return fetch_sub(1); }

      __pointer_type
      operator--(int) volatile noexcept
      { return fetch_sub(1); }

      __pointer_type
      operator++() noexcept
      { return __atomic_add_fetch(&_M_p, _M_type_size(1),
      memory_order_seq_cst); }

      __pointer_type
      operator++() volatile noexcept
      { return __atomic_add_fetch(&_M_p, _M_type_size(1),
      memory_order_seq_cst); }

      __pointer_type
      operator--() noexcept
      { return __atomic_sub_fetch(&_M_p, _M_type_size(1),
      memory_order_seq_cst); }

      __pointer_type
      operator--() volatile noexcept
      { return __atomic_sub_fetch(&_M_p, _M_type_size(1),
      memory_order_seq_cst); }

      __pointer_type
      operator+=(ptrdiff_t __d) noexcept
      { return __atomic_add_fetch(&_M_p, _M_type_size(__d),
      memory_order_seq_cst); }

      __pointer_type
      operator+=(ptrdiff_t __d) volatile noexcept
      { return __atomic_add_fetch(&_M_p, _M_type_size(__d),
      memory_order_seq_cst); }

      __pointer_type
      operator-=(ptrdiff_t __d) noexcept
      { return __atomic_sub_fetch(&_M_p, _M_type_size(__d),
      memory_order_seq_cst); }

      __pointer_type
      operator-=(ptrdiff_t __d) volatile noexcept
      { return __atomic_sub_fetch(&_M_p, _M_type_size(__d),
      memory_order_seq_cst); }

      bool
      is_lock_free() const noexcept
      {

 return __atomic_is_lock_free(sizeof(_M_p),
     reinterpret_cast<void *>(-__alignof(_M_p)));
      }

      bool
      is_lock_free() const volatile noexcept
      {

 return __atomic_is_lock_free(sizeof(_M_p),
     reinterpret_cast<void *>(-__alignof(_M_p)));
      }

      inline __attribute__((__always_inline__)) void
      store(__pointer_type __p,
     memory_order __m = memory_order_seq_cst) noexcept
      {
        memory_order __b = __m & __memory_order_mask;

                                              ;
                                              ;
                                              ;

 __atomic_store_n(&_M_p, __p, __m);
      }

      inline __attribute__((__always_inline__)) void
      store(__pointer_type __p,
     memory_order __m = memory_order_seq_cst) volatile noexcept
      {
        memory_order __b = __m & __memory_order_mask;
                                              ;
                                              ;
                                              ;

 __atomic_store_n(&_M_p, __p, __m);
      }

      inline __attribute__((__always_inline__)) __pointer_type
      load(memory_order __m = memory_order_seq_cst) const noexcept
      {
        memory_order __b = __m & __memory_order_mask;
                                              ;
                                              ;

 return __atomic_load_n(&_M_p, __m);
      }

      inline __attribute__((__always_inline__)) __pointer_type
      load(memory_order __m = memory_order_seq_cst) const volatile noexcept
      {
        memory_order __b = __m & __memory_order_mask;
                                              ;
                                              ;

 return __atomic_load_n(&_M_p, __m);
      }

      inline __attribute__((__always_inline__)) __pointer_type
      exchange(__pointer_type __p,
        memory_order __m = memory_order_seq_cst) noexcept
      {
 return __atomic_exchange_n(&_M_p, __p, __m);
      }


      inline __attribute__((__always_inline__)) __pointer_type
      exchange(__pointer_type __p,
        memory_order __m = memory_order_seq_cst) volatile noexcept
      {
 return __atomic_exchange_n(&_M_p, __p, __m);
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
         memory_order __m1,
         memory_order __m2) noexcept
      {
        memory_order __b2 = __m2 & __memory_order_mask;
        memory_order __b1 = __m1 & __memory_order_mask;
                                               ;
                                               ;
                               ;

 return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2);
      }

      inline __attribute__((__always_inline__)) bool
      compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
         memory_order __m1,
         memory_order __m2) volatile noexcept
      {
        memory_order __b2 = __m2 & __memory_order_mask;
        memory_order __b1 = __m1 & __memory_order_mask;

                                               ;
                                               ;
                               ;

 return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2);
      }

      inline __attribute__((__always_inline__)) __pointer_type
      fetch_add(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) noexcept
      { return __atomic_fetch_add(&_M_p, _M_type_size(__d), __m); }

      inline __attribute__((__always_inline__)) __pointer_type
      fetch_add(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return __atomic_fetch_add(&_M_p, _M_type_size(__d), __m); }

      inline __attribute__((__always_inline__)) __pointer_type
      fetch_sub(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) noexcept
      { return __atomic_fetch_sub(&_M_p, _M_type_size(__d), __m); }

      inline __attribute__((__always_inline__)) __pointer_type
      fetch_sub(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return __atomic_fetch_sub(&_M_p, _M_type_size(__d), __m); }
    };




}
# 42 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/atomic" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{







  template<typename _Tp>
    struct atomic;



  template<>
  struct atomic<bool>
  {
  private:
    __atomic_base<bool> _M_base;

  public:
    atomic() noexcept = default;
    ~atomic() noexcept = default;
    atomic(const atomic&) = delete;
    atomic& operator=(const atomic&) = delete;
    atomic& operator=(const atomic&) volatile = delete;

    constexpr atomic(bool __i) noexcept : _M_base(__i) { }

    bool
    operator=(bool __i) noexcept
    { return _M_base.operator=(__i); }

    bool
    operator=(bool __i) volatile noexcept
    { return _M_base.operator=(__i); }

    operator bool() const noexcept
    { return _M_base.load(); }

    operator bool() const volatile noexcept
    { return _M_base.load(); }

    bool
    is_lock_free() const noexcept { return _M_base.is_lock_free(); }

    bool
    is_lock_free() const volatile noexcept { return _M_base.is_lock_free(); }

    void
    store(bool __i, memory_order __m = memory_order_seq_cst) noexcept
    { _M_base.store(__i, __m); }

    void
    store(bool __i, memory_order __m = memory_order_seq_cst) volatile noexcept
    { _M_base.store(__i, __m); }

    bool
    load(memory_order __m = memory_order_seq_cst) const noexcept
    { return _M_base.load(__m); }

    bool
    load(memory_order __m = memory_order_seq_cst) const volatile noexcept
    { return _M_base.load(__m); }

    bool
    exchange(bool __i, memory_order __m = memory_order_seq_cst) noexcept
    { return _M_base.exchange(__i, __m); }

    bool
    exchange(bool __i,
      memory_order __m = memory_order_seq_cst) volatile noexcept
    { return _M_base.exchange(__i, __m); }

    bool
    compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1,
     memory_order __m2) noexcept
    { return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }

    bool
    compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1,
     memory_order __m2) volatile noexcept
    { return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }

    bool
    compare_exchange_weak(bool& __i1, bool __i2,
     memory_order __m = memory_order_seq_cst) noexcept
    { return _M_base.compare_exchange_weak(__i1, __i2, __m); }

    bool
    compare_exchange_weak(bool& __i1, bool __i2,
       memory_order __m = memory_order_seq_cst) volatile noexcept
    { return _M_base.compare_exchange_weak(__i1, __i2, __m); }

    bool
    compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1,
       memory_order __m2) noexcept
    { return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }

    bool
    compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1,
       memory_order __m2) volatile noexcept
    { return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }

    bool
    compare_exchange_strong(bool& __i1, bool __i2,
       memory_order __m = memory_order_seq_cst) noexcept
    { return _M_base.compare_exchange_strong(__i1, __i2, __m); }

    bool
    compare_exchange_strong(bool& __i1, bool __i2,
      memory_order __m = memory_order_seq_cst) volatile noexcept
    { return _M_base.compare_exchange_strong(__i1, __i2, __m); }
  };







  template<typename _Tp>
    struct atomic
    {
    private:

      static constexpr int _S_min_alignment
 = (sizeof(_Tp) & (sizeof(_Tp) - 1)) || sizeof(_Tp) > 16
 ? 0 : sizeof(_Tp);

      static constexpr int _S_alignment
        = _S_min_alignment > alignof(_Tp) ? _S_min_alignment : alignof(_Tp);

      alignas(_S_alignment) _Tp _M_i;

      static_assert(__is_trivially_copyable(_Tp),
      "std::atomic requires a trivially copyable type");

      static_assert(sizeof(_Tp) > 0,
      "Incomplete or zero-sized types are not supported");

    public:
      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(_Tp __i) noexcept : _M_i(__i) { }

      operator _Tp() const noexcept
      { return load(); }

      operator _Tp() const volatile noexcept
      { return load(); }

      _Tp
      operator=(_Tp __i) noexcept
      { store(__i); return __i; }

      _Tp
      operator=(_Tp __i) volatile noexcept
      { store(__i); return __i; }

      bool
      is_lock_free() const noexcept
      {

 return __atomic_is_lock_free(sizeof(_M_i),
     reinterpret_cast<void *>(-__alignof(_M_i)));
      }

      bool
      is_lock_free() const volatile noexcept
      {

 return __atomic_is_lock_free(sizeof(_M_i),
     reinterpret_cast<void *>(-__alignof(_M_i)));
      }

      void
      store(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept
      { __atomic_store(&_M_i, &__i, __m); }

      void
      store(_Tp __i, memory_order __m = memory_order_seq_cst) volatile noexcept
      { __atomic_store(&_M_i, &__i, __m); }

      _Tp
      load(memory_order __m = memory_order_seq_cst) const noexcept
      {
        _Tp tmp;
 __atomic_load(&_M_i, &tmp, __m);
 return tmp;
      }

      _Tp
      load(memory_order __m = memory_order_seq_cst) const volatile noexcept
      {
        _Tp tmp;
 __atomic_load(&_M_i, &tmp, __m);
 return tmp;
      }

      _Tp
      exchange(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept
      {
        _Tp tmp;
 __atomic_exchange(&_M_i, &__i, &tmp, __m);
 return tmp;
      }

      _Tp
      exchange(_Tp __i,
        memory_order __m = memory_order_seq_cst) volatile noexcept
      {
        _Tp tmp;
 __atomic_exchange(&_M_i, &__i, &tmp, __m);
 return tmp;
      }

      bool
      compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s,
       memory_order __f) noexcept
      {
 return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f);
      }

      bool
      compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s,
       memory_order __f) volatile noexcept
      {
 return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f);
      }

      bool
      compare_exchange_weak(_Tp& __e, _Tp __i,
       memory_order __m = memory_order_seq_cst) noexcept
      { return compare_exchange_weak(__e, __i, __m,
                                     __cmpexch_failure_order(__m)); }

      bool
      compare_exchange_weak(_Tp& __e, _Tp __i,
       memory_order __m = memory_order_seq_cst) volatile noexcept
      { return compare_exchange_weak(__e, __i, __m,
                                     __cmpexch_failure_order(__m)); }

      bool
      compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s,
         memory_order __f) noexcept
      {
 return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f);
      }

      bool
      compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s,
         memory_order __f) volatile noexcept
      {
 return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f);
      }

      bool
      compare_exchange_strong(_Tp& __e, _Tp __i,
          memory_order __m = memory_order_seq_cst) noexcept
      { return compare_exchange_strong(__e, __i, __m,
                                       __cmpexch_failure_order(__m)); }

      bool
      compare_exchange_strong(_Tp& __e, _Tp __i,
       memory_order __m = memory_order_seq_cst) volatile noexcept
      { return compare_exchange_strong(__e, __i, __m,
                                       __cmpexch_failure_order(__m)); }
    };



  template<typename _Tp>
    struct atomic<_Tp*>
    {
      typedef _Tp* __pointer_type;
      typedef __atomic_base<_Tp*> __base_type;
      __base_type _M_b;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__pointer_type __p) noexcept : _M_b(__p) { }

      operator __pointer_type() const noexcept
      { return __pointer_type(_M_b); }

      operator __pointer_type() const volatile noexcept
      { return __pointer_type(_M_b); }

      __pointer_type
      operator=(__pointer_type __p) noexcept
      { return _M_b.operator=(__p); }

      __pointer_type
      operator=(__pointer_type __p) volatile noexcept
      { return _M_b.operator=(__p); }

      __pointer_type
      operator++(int) noexcept
      { return _M_b++; }

      __pointer_type
      operator++(int) volatile noexcept
      { return _M_b++; }

      __pointer_type
      operator--(int) noexcept
      { return _M_b--; }

      __pointer_type
      operator--(int) volatile noexcept
      { return _M_b--; }

      __pointer_type
      operator++() noexcept
      { return ++_M_b; }

      __pointer_type
      operator++() volatile noexcept
      { return ++_M_b; }

      __pointer_type
      operator--() noexcept
      { return --_M_b; }

      __pointer_type
      operator--() volatile noexcept
      { return --_M_b; }

      __pointer_type
      operator+=(ptrdiff_t __d) noexcept
      { return _M_b.operator+=(__d); }

      __pointer_type
      operator+=(ptrdiff_t __d) volatile noexcept
      { return _M_b.operator+=(__d); }

      __pointer_type
      operator-=(ptrdiff_t __d) noexcept
      { return _M_b.operator-=(__d); }

      __pointer_type
      operator-=(ptrdiff_t __d) volatile noexcept
      { return _M_b.operator-=(__d); }

      bool
      is_lock_free() const noexcept
      { return _M_b.is_lock_free(); }

      bool
      is_lock_free() const volatile noexcept
      { return _M_b.is_lock_free(); }

      void
      store(__pointer_type __p,
     memory_order __m = memory_order_seq_cst) noexcept
      { return _M_b.store(__p, __m); }

      void
      store(__pointer_type __p,
     memory_order __m = memory_order_seq_cst) volatile noexcept
      { return _M_b.store(__p, __m); }

      __pointer_type
      load(memory_order __m = memory_order_seq_cst) const noexcept
      { return _M_b.load(__m); }

      __pointer_type
      load(memory_order __m = memory_order_seq_cst) const volatile noexcept
      { return _M_b.load(__m); }

      __pointer_type
      exchange(__pointer_type __p,
        memory_order __m = memory_order_seq_cst) noexcept
      { return _M_b.exchange(__p, __m); }

      __pointer_type
      exchange(__pointer_type __p,
        memory_order __m = memory_order_seq_cst) volatile noexcept
      { return _M_b.exchange(__p, __m); }

      bool
      compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
       memory_order __m1, memory_order __m2) noexcept
      { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }

      bool
      compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
       memory_order __m1,
       memory_order __m2) volatile noexcept
      { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }

      bool
      compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
       memory_order __m = memory_order_seq_cst) noexcept
      {
 return compare_exchange_weak(__p1, __p2, __m,
         __cmpexch_failure_order(__m));
      }

      bool
      compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
      memory_order __m = memory_order_seq_cst) volatile noexcept
      {
 return compare_exchange_weak(__p1, __p2, __m,
         __cmpexch_failure_order(__m));
      }

      bool
      compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
         memory_order __m1, memory_order __m2) noexcept
      { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }

      bool
      compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
         memory_order __m1,
         memory_order __m2) volatile noexcept
      { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }

      bool
      compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
         memory_order __m = memory_order_seq_cst) noexcept
      {
 return _M_b.compare_exchange_strong(__p1, __p2, __m,
         __cmpexch_failure_order(__m));
      }

      bool
      compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
      memory_order __m = memory_order_seq_cst) volatile noexcept
      {
 return _M_b.compare_exchange_strong(__p1, __p2, __m,
         __cmpexch_failure_order(__m));
      }

      __pointer_type
      fetch_add(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) noexcept
      { return _M_b.fetch_add(__d, __m); }

      __pointer_type
      fetch_add(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return _M_b.fetch_add(__d, __m); }

      __pointer_type
      fetch_sub(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) noexcept
      { return _M_b.fetch_sub(__d, __m); }

      __pointer_type
      fetch_sub(ptrdiff_t __d,
  memory_order __m = memory_order_seq_cst) volatile noexcept
      { return _M_b.fetch_sub(__d, __m); }
    };



  template<>
    struct atomic<char> : __atomic_base<char>
    {
      typedef char __integral_type;
      typedef __atomic_base<char> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<signed char> : __atomic_base<signed char>
    {
      typedef signed char __integral_type;
      typedef __atomic_base<signed char> __base_type;

      atomic() noexcept= default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<unsigned char> : __atomic_base<unsigned char>
    {
      typedef unsigned char __integral_type;
      typedef __atomic_base<unsigned char> __base_type;

      atomic() noexcept= default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<short> : __atomic_base<short>
    {
      typedef short __integral_type;
      typedef __atomic_base<short> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<unsigned short> : __atomic_base<unsigned short>
    {
      typedef unsigned short __integral_type;
      typedef __atomic_base<unsigned short> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<int> : __atomic_base<int>
    {
      typedef int __integral_type;
      typedef __atomic_base<int> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<unsigned int> : __atomic_base<unsigned int>
    {
      typedef unsigned int __integral_type;
      typedef __atomic_base<unsigned int> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<long> : __atomic_base<long>
    {
      typedef long __integral_type;
      typedef __atomic_base<long> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<unsigned long> : __atomic_base<unsigned long>
    {
      typedef unsigned long __integral_type;
      typedef __atomic_base<unsigned long> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<long long> : __atomic_base<long long>
    {
      typedef long long __integral_type;
      typedef __atomic_base<long long> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<unsigned long long> : __atomic_base<unsigned long long>
    {
      typedef unsigned long long __integral_type;
      typedef __atomic_base<unsigned long long> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<wchar_t> : __atomic_base<wchar_t>
    {
      typedef wchar_t __integral_type;
      typedef __atomic_base<wchar_t> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<char16_t> : __atomic_base<char16_t>
    {
      typedef char16_t __integral_type;
      typedef __atomic_base<char16_t> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };


  template<>
    struct atomic<char32_t> : __atomic_base<char32_t>
    {
      typedef char32_t __integral_type;
      typedef __atomic_base<char32_t> __base_type;

      atomic() noexcept = default;
      ~atomic() noexcept = default;
      atomic(const atomic&) = delete;
      atomic& operator=(const atomic&) = delete;
      atomic& operator=(const atomic&) volatile = delete;

      constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }

      using __base_type::operator __integral_type;
      using __base_type::operator=;
    };



  typedef atomic<bool> atomic_bool;


  typedef atomic<char> atomic_char;


  typedef atomic<signed char> atomic_schar;


  typedef atomic<unsigned char> atomic_uchar;


  typedef atomic<short> atomic_short;


  typedef atomic<unsigned short> atomic_ushort;


  typedef atomic<int> atomic_int;


  typedef atomic<unsigned int> atomic_uint;


  typedef atomic<long> atomic_long;


  typedef atomic<unsigned long> atomic_ulong;


  typedef atomic<long long> atomic_llong;


  typedef atomic<unsigned long long> atomic_ullong;


  typedef atomic<wchar_t> atomic_wchar_t;


  typedef atomic<char16_t> atomic_char16_t;


  typedef atomic<char32_t> atomic_char32_t;



  typedef atomic<int_least8_t> atomic_int_least8_t;


  typedef atomic<uint_least8_t> atomic_uint_least8_t;


  typedef atomic<int_least16_t> atomic_int_least16_t;


  typedef atomic<uint_least16_t> atomic_uint_least16_t;


  typedef atomic<int_least32_t> atomic_int_least32_t;


  typedef atomic<uint_least32_t> atomic_uint_least32_t;


  typedef atomic<int_least64_t> atomic_int_least64_t;


  typedef atomic<uint_least64_t> atomic_uint_least64_t;



  typedef atomic<int_fast8_t> atomic_int_fast8_t;


  typedef atomic<uint_fast8_t> atomic_uint_fast8_t;


  typedef atomic<int_fast16_t> atomic_int_fast16_t;


  typedef atomic<uint_fast16_t> atomic_uint_fast16_t;


  typedef atomic<int_fast32_t> atomic_int_fast32_t;


  typedef atomic<uint_fast32_t> atomic_uint_fast32_t;


  typedef atomic<int_fast64_t> atomic_int_fast64_t;


  typedef atomic<uint_fast64_t> atomic_uint_fast64_t;



  typedef atomic<intptr_t> atomic_intptr_t;


  typedef atomic<uintptr_t> atomic_uintptr_t;


  typedef atomic<size_t> atomic_size_t;


  typedef atomic<intmax_t> atomic_intmax_t;


  typedef atomic<uintmax_t> atomic_uintmax_t;


  typedef atomic<ptrdiff_t> atomic_ptrdiff_t;



  inline bool
  atomic_flag_test_and_set_explicit(atomic_flag* __a,
        memory_order __m) noexcept
  { return __a->test_and_set(__m); }

  inline bool
  atomic_flag_test_and_set_explicit(volatile atomic_flag* __a,
        memory_order __m) noexcept
  { return __a->test_and_set(__m); }

  inline void
  atomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept
  { __a->clear(__m); }

  inline void
  atomic_flag_clear_explicit(volatile atomic_flag* __a,
        memory_order __m) noexcept
  { __a->clear(__m); }

  inline bool
  atomic_flag_test_and_set(atomic_flag* __a) noexcept
  { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }

  inline bool
  atomic_flag_test_and_set(volatile atomic_flag* __a) noexcept
  { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }

  inline void
  atomic_flag_clear(atomic_flag* __a) noexcept
  { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }

  inline void
  atomic_flag_clear(volatile atomic_flag* __a) noexcept
  { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }



  template<typename _ITp>
    inline bool
    atomic_is_lock_free(const atomic<_ITp>* __a) noexcept
    { return __a->is_lock_free(); }

  template<typename _ITp>
    inline bool
    atomic_is_lock_free(const volatile atomic<_ITp>* __a) noexcept
    { return __a->is_lock_free(); }

  template<typename _ITp>
    inline void
    atomic_init(atomic<_ITp>* __a, _ITp __i) noexcept
    { __a->store(__i, memory_order_relaxed); }

  template<typename _ITp>
    inline void
    atomic_init(volatile atomic<_ITp>* __a, _ITp __i) noexcept
    { __a->store(__i, memory_order_relaxed); }

  template<typename _ITp>
    inline void
    atomic_store_explicit(atomic<_ITp>* __a, _ITp __i,
     memory_order __m) noexcept
    { __a->store(__i, __m); }

  template<typename _ITp>
    inline void
    atomic_store_explicit(volatile atomic<_ITp>* __a, _ITp __i,
     memory_order __m) noexcept
    { __a->store(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_load_explicit(const atomic<_ITp>* __a, memory_order __m) noexcept
    { return __a->load(__m); }

  template<typename _ITp>
    inline _ITp
    atomic_load_explicit(const volatile atomic<_ITp>* __a,
    memory_order __m) noexcept
    { return __a->load(__m); }

  template<typename _ITp>
    inline _ITp
    atomic_exchange_explicit(atomic<_ITp>* __a, _ITp __i,
        memory_order __m) noexcept
    { return __a->exchange(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_exchange_explicit(volatile atomic<_ITp>* __a, _ITp __i,
        memory_order __m) noexcept
    { return __a->exchange(__i, __m); }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_weak_explicit(atomic<_ITp>* __a,
       _ITp* __i1, _ITp __i2,
       memory_order __m1,
       memory_order __m2) noexcept
    { return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_weak_explicit(volatile atomic<_ITp>* __a,
       _ITp* __i1, _ITp __i2,
       memory_order __m1,
       memory_order __m2) noexcept
    { return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_strong_explicit(atomic<_ITp>* __a,
         _ITp* __i1, _ITp __i2,
         memory_order __m1,
         memory_order __m2) noexcept
    { return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_strong_explicit(volatile atomic<_ITp>* __a,
         _ITp* __i1, _ITp __i2,
         memory_order __m1,
         memory_order __m2) noexcept
    { return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }


  template<typename _ITp>
    inline void
    atomic_store(atomic<_ITp>* __a, _ITp __i) noexcept
    { atomic_store_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline void
    atomic_store(volatile atomic<_ITp>* __a, _ITp __i) noexcept
    { atomic_store_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_load(const atomic<_ITp>* __a) noexcept
    { return atomic_load_explicit(__a, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_load(const volatile atomic<_ITp>* __a) noexcept
    { return atomic_load_explicit(__a, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_exchange(atomic<_ITp>* __a, _ITp __i) noexcept
    { return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_exchange(volatile atomic<_ITp>* __a, _ITp __i) noexcept
    { return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_weak(atomic<_ITp>* __a,
     _ITp* __i1, _ITp __i2) noexcept
    {
      return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,
         memory_order_seq_cst,
         memory_order_seq_cst);
    }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_weak(volatile atomic<_ITp>* __a,
     _ITp* __i1, _ITp __i2) noexcept
    {
      return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,
         memory_order_seq_cst,
         memory_order_seq_cst);
    }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_strong(atomic<_ITp>* __a,
       _ITp* __i1, _ITp __i2) noexcept
    {
      return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,
           memory_order_seq_cst,
           memory_order_seq_cst);
    }

  template<typename _ITp>
    inline bool
    atomic_compare_exchange_strong(volatile atomic<_ITp>* __a,
       _ITp* __i1, _ITp __i2) noexcept
    {
      return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,
           memory_order_seq_cst,
           memory_order_seq_cst);
    }





  template<typename _ITp>
    inline _ITp
    atomic_fetch_add_explicit(__atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_add(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_add_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_add(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_sub_explicit(__atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_sub(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_sub_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_sub(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_and_explicit(__atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_and(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_and_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_and(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_or_explicit(__atomic_base<_ITp>* __a, _ITp __i,
        memory_order __m) noexcept
    { return __a->fetch_or(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_or_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
        memory_order __m) noexcept
    { return __a->fetch_or(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_xor_explicit(__atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_xor(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_xor_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
         memory_order __m) noexcept
    { return __a->fetch_xor(__i, __m); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_add(__atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_add(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_sub(__atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_sub(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_and(__atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_and(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_or(__atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_or(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_xor(__atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }

  template<typename _ITp>
    inline _ITp
    atomic_fetch_xor(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
    { return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }



  template<typename _ITp>
    inline _ITp*
    atomic_fetch_add_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,
         memory_order __m) noexcept
    { return __a->fetch_add(__d, __m); }

  template<typename _ITp>
    inline _ITp*
    atomic_fetch_add_explicit(volatile atomic<_ITp*>* __a, ptrdiff_t __d,
         memory_order __m) noexcept
    { return __a->fetch_add(__d, __m); }

  template<typename _ITp>
    inline _ITp*
    atomic_fetch_add(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
    { return __a->fetch_add(__d); }

  template<typename _ITp>
    inline _ITp*
    atomic_fetch_add(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
    { return __a->fetch_add(__d); }

  template<typename _ITp>
    inline _ITp*
    atomic_fetch_sub_explicit(volatile atomic<_ITp*>* __a,
         ptrdiff_t __d, memory_order __m) noexcept
    { return __a->fetch_sub(__d, __m); }

  template<typename _ITp>
    inline _ITp*
    atomic_fetch_sub_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,
         memory_order __m) noexcept
    { return __a->fetch_sub(__d, __m); }

  template<typename _ITp>
    inline _ITp*
    atomic_fetch_sub(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
    { return __a->fetch_sub(__d); }

  template<typename _ITp>
    inline _ITp*
    atomic_fetch_sub(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
    { return __a->fetch_sub(__d); }



}
# 171 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h" 2

namespace mozilla {
namespace detail {





template<MemoryOrdering Order> struct AtomicOrderConstraints;

template<>
struct AtomicOrderConstraints<Relaxed>
{
  static const std::memory_order AtomicRMWOrder = std::memory_order_relaxed;
  static const std::memory_order LoadOrder = std::memory_order_relaxed;
  static const std::memory_order StoreOrder = std::memory_order_relaxed;
  static const std::memory_order CompareExchangeFailureOrder =
    std::memory_order_relaxed;
};

template<>
struct AtomicOrderConstraints<ReleaseAcquire>
{
  static const std::memory_order AtomicRMWOrder = std::memory_order_acq_rel;
  static const std::memory_order LoadOrder = std::memory_order_acquire;
  static const std::memory_order StoreOrder = std::memory_order_release;
  static const std::memory_order CompareExchangeFailureOrder =
    std::memory_order_acquire;
};

template<>
struct AtomicOrderConstraints<SequentiallyConsistent>
{
  static const std::memory_order AtomicRMWOrder = std::memory_order_seq_cst;
  static const std::memory_order LoadOrder = std::memory_order_seq_cst;
  static const std::memory_order StoreOrder = std::memory_order_seq_cst;
  static const std::memory_order CompareExchangeFailureOrder =
    std::memory_order_seq_cst;
};

template<typename T, MemoryOrdering Order>
struct IntrinsicBase
{
  typedef std::atomic<T> ValueType;
  typedef AtomicOrderConstraints<Order> OrderedOp;
};

template<typename T, MemoryOrdering Order>
struct IntrinsicMemoryOps : public IntrinsicBase<T, Order>
{
  typedef IntrinsicBase<T, Order> Base;

  static T load(const typename Base::ValueType& aPtr)
  {
    return aPtr.load(Base::OrderedOp::LoadOrder);
  }

  static void store(typename Base::ValueType& aPtr, T aVal)
  {
    aPtr.store(aVal, Base::OrderedOp::StoreOrder);
  }

  static T exchange(typename Base::ValueType& aPtr, T aVal)
  {
    return aPtr.exchange(aVal, Base::OrderedOp::AtomicRMWOrder);
  }

  static bool compareExchange(typename Base::ValueType& aPtr,
                              T aOldVal, T aNewVal)
  {
    return aPtr.compare_exchange_strong(aOldVal, aNewVal,
                                        Base::OrderedOp::AtomicRMWOrder,
                                        Base::OrderedOp::CompareExchangeFailureOrder);
  }
};

template<typename T, MemoryOrdering Order>
struct IntrinsicAddSub : public IntrinsicBase<T, Order>
{
  typedef IntrinsicBase<T, Order> Base;

  static T add(typename Base::ValueType& aPtr, T aVal)
  {
    return aPtr.fetch_add(aVal, Base::OrderedOp::AtomicRMWOrder);
  }

  static T sub(typename Base::ValueType& aPtr, T aVal)
  {
    return aPtr.fetch_sub(aVal, Base::OrderedOp::AtomicRMWOrder);
  }
};

template<typename T, MemoryOrdering Order>
struct IntrinsicAddSub<T*, Order> : public IntrinsicBase<T*, Order>
{
  typedef IntrinsicBase<T*, Order> Base;

  static T* add(typename Base::ValueType& aPtr, ptrdiff_t aVal)
  {
    return aPtr.fetch_add(aVal, Base::OrderedOp::AtomicRMWOrder);
  }

  static T* sub(typename Base::ValueType& aPtr, ptrdiff_t aVal)
  {
    return aPtr.fetch_sub(aVal, Base::OrderedOp::AtomicRMWOrder);
  }
};

template<typename T, MemoryOrdering Order>
struct IntrinsicIncDec : public IntrinsicAddSub<T, Order>
{
  typedef IntrinsicBase<T, Order> Base;

  static T inc(typename Base::ValueType& aPtr)
  {
    return IntrinsicAddSub<T, Order>::add(aPtr, 1);
  }

  static T dec(typename Base::ValueType& aPtr)
  {
    return IntrinsicAddSub<T, Order>::sub(aPtr, 1);
  }
};

template<typename T, MemoryOrdering Order>
struct AtomicIntrinsics : public IntrinsicMemoryOps<T, Order>,
                          public IntrinsicIncDec<T, Order>
{
  typedef IntrinsicBase<T, Order> Base;

  static T or_(typename Base::ValueType& aPtr, T aVal)
  {
    return aPtr.fetch_or(aVal, Base::OrderedOp::AtomicRMWOrder);
  }

  static T xor_(typename Base::ValueType& aPtr, T aVal)
  {
    return aPtr.fetch_xor(aVal, Base::OrderedOp::AtomicRMWOrder);
  }

  static T and_(typename Base::ValueType& aPtr, T aVal)
  {
    return aPtr.fetch_and(aVal, Base::OrderedOp::AtomicRMWOrder);
  }
};

template<typename T, MemoryOrdering Order>
struct AtomicIntrinsics<T*, Order>
  : public IntrinsicMemoryOps<T*, Order>, public IntrinsicIncDec<T*, Order>
{
};

template<typename T>
struct ToStorageTypeArgument
{
  static constexpr T convert (T aT) { return aT; }
};

}
}
# 533 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
namespace mozilla {

namespace detail {

template<typename T, MemoryOrdering Order>
class AtomicBase
{
  static_assert(sizeof(T) == 4 || sizeof(T) == 8,
                "mozilla/Atomics.h only supports 32-bit and 64-bit types");

protected:
  typedef typename detail::AtomicIntrinsics<T, Order> Intrinsics;
  typedef typename Intrinsics::ValueType ValueType;
  ValueType mValue;

public:
  constexpr AtomicBase() : mValue() {}
  explicit constexpr AtomicBase(T aInit)
    : mValue(ToStorageTypeArgument<T>::convert(aInit))
  {}






  T operator=(T aVal)
  {
    Intrinsics::store(mValue, aVal);
    return aVal;
  }





  T exchange(T aVal)
  {
    return Intrinsics::exchange(mValue, aVal);
  }
# 585 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
  bool compareExchange(T aOldValue, T aNewValue)
  {
    return Intrinsics::compareExchange(mValue, aOldValue, aNewValue);
  }

private:
  template<MemoryOrdering AnyOrder>
  AtomicBase(const AtomicBase<T, AnyOrder>& aCopy) = delete;
};

template<typename T, MemoryOrdering Order>
class AtomicBaseIncDec : public AtomicBase<T, Order>
{
  typedef typename detail::AtomicBase<T, Order> Base;

public:
  constexpr AtomicBaseIncDec() : Base() {}
  explicit constexpr AtomicBaseIncDec(T aInit) : Base(aInit) {}

  using Base::operator=;

  operator T() const { return Base::Intrinsics::load(Base::mValue); }
  T operator++(int) { return Base::Intrinsics::inc(Base::mValue); }
  T operator--(int) { return Base::Intrinsics::dec(Base::mValue); }
  T operator++() { return Base::Intrinsics::inc(Base::mValue) + 1; }
  T operator--() { return Base::Intrinsics::dec(Base::mValue) - 1; }

private:
  template<MemoryOrdering AnyOrder>
  AtomicBaseIncDec(const AtomicBaseIncDec<T, AnyOrder>& aCopy) = delete;
};

}
# 636 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
template<typename T,
         MemoryOrdering Order = SequentiallyConsistent,
         typename Enable = void>
class Atomic;
# 649 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
template<typename T, MemoryOrdering Order>
class Atomic<T, Order, typename EnableIf<IsIntegral<T>::value &&
                       !IsSame<T, bool>::value>::Type>
  : public detail::AtomicBaseIncDec<T, Order>
{
  typedef typename detail::AtomicBaseIncDec<T, Order> Base;

public:
  constexpr Atomic() : Base() {}
  explicit constexpr Atomic(T aInit) : Base(aInit) {}

  using Base::operator=;

  T operator+=(T aDelta)
  {
    return Base::Intrinsics::add(Base::mValue, aDelta) + aDelta;
  }

  T operator-=(T aDelta)
  {
    return Base::Intrinsics::sub(Base::mValue, aDelta) - aDelta;
  }

  T operator|=(T aVal)
  {
    return Base::Intrinsics::or_(Base::mValue, aVal) | aVal;
  }

  T operator^=(T aVal)
  {
    return Base::Intrinsics::xor_(Base::mValue, aVal) ^ aVal;
  }

  T operator&=(T aVal)
  {
    return Base::Intrinsics::and_(Base::mValue, aVal) & aVal;
  }

private:
  Atomic(Atomic<T, Order>& aOther) = delete;
};
# 699 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
template<typename T, MemoryOrdering Order>
class Atomic<T*, Order> : public detail::AtomicBaseIncDec<T*, Order>
{
  typedef typename detail::AtomicBaseIncDec<T*, Order> Base;

public:
  constexpr Atomic() : Base() {}
  explicit constexpr Atomic(T* aInit) : Base(aInit) {}

  using Base::operator=;

  T* operator+=(ptrdiff_t aDelta)
  {
    return Base::Intrinsics::add(Base::mValue, aDelta) + aDelta;
  }

  T* operator-=(ptrdiff_t aDelta)
  {
    return Base::Intrinsics::sub(Base::mValue, aDelta) - aDelta;
  }

private:
  Atomic(Atomic<T*, Order>& aOther) = delete;
};






template<typename T, MemoryOrdering Order>
class Atomic<T, Order, typename EnableIf<IsEnum<T>::value>::Type>
  : public detail::AtomicBase<T, Order>
{
  typedef typename detail::AtomicBase<T, Order> Base;

public:
  constexpr Atomic() : Base() {}
  explicit constexpr Atomic(T aInit) : Base(aInit) {}

  operator T() const { return T(Base::Intrinsics::load(Base::mValue)); }

  using Base::operator=;

private:
  Atomic(Atomic<T, Order>& aOther) = delete;
};
# 763 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Atomics.h"
template<MemoryOrdering Order>
class Atomic<bool, Order>
  : protected detail::AtomicBase<uint32_t, Order>
{
  typedef typename detail::AtomicBase<uint32_t, Order> Base;

public:
  constexpr Atomic() : Base() {}
  explicit constexpr Atomic(bool aInit) : Base(aInit) {}


               operator bool() const
  {
    return Base::Intrinsics::load(Base::mValue);
  }

  bool operator=(bool aVal)
  {
    return Base::operator=(aVal);
  }

  bool exchange(bool aVal)
  {
    return Base::exchange(aVal);
  }

  bool compareExchange(bool aOldValue, bool aNewValue)
  {
    return Base::compareExchange(aOldValue, aNewValue);
  }

private:
  Atomic(Atomic<bool, Order>& aOther) = delete;
};

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h" 1
# 50 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h"
namespace mozilla {
# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h"
template<typename Traits>
class Scoped
{
public:
  typedef typename Traits::type Resource;

  explicit Scoped()
    : mValue(Traits::empty())
  {
    do { } while (0);
  }

  explicit Scoped(const Resource& aValue
                                                 )
    : mValue(aValue)
  {
    do { } while (0);
  }


  Scoped(Scoped&& aOther
                                        )
    : mValue(Move(aOther.mValue))
  {
    do { } while (0);
    aOther.mValue = Traits::empty();
  }

  ~Scoped() { Traits::release(mValue); }


  operator const Resource&() const { return mValue; }
  const Resource& operator->() const { return mValue; }
  const Resource& get() const { return mValue; }

  Resource& rwget() { return mValue; }
# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h"
  Resource forget()
  {
    Resource tmp = mValue;
    mValue = Traits::empty();
    return tmp;
  }






  void dispose()
  {
    Traits::release(mValue);
    mValue = Traits::empty();
  }

  bool operator==(const Resource& aOther) const { return mValue == aOther; }
# 141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h"
  Scoped& operator=(const Resource& aOther) { return reset(aOther); }

  Scoped& reset(const Resource& aOther)
  {
    Traits::release(mValue);
    mValue = aOther;
    return *this;
  }


  Scoped& operator=(Scoped&& aRhs)
  {
    do { } while (0);
    this->~Scoped();
    new(this) Scoped(Move(aRhs));
    return *this;
  }

private:
  explicit Scoped(const Scoped& aValue) = delete;
  Scoped& operator=(const Scoped& aValue) = delete;

private:
  Resource mValue;

};
# 236 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Scoped.h"
template <typename T> void TypeSpecificDelete(T* aValue);

template <typename T>
struct TypeSpecificScopedPointerTraits
{
  typedef T* type;
  static type empty() { return nullptr; }
  static void release(type aValue)
  {
    if (aValue) {
      TypeSpecificDelete(aValue);
    }
  }
};

template<typename Type> struct TypeSpecificScopedPointer : public mozilla::Scoped<TypeSpecificScopedPointerTraits<Type> > { typedef mozilla::Scoped<TypeSpecificScopedPointerTraits<Type> > Super; typedef typename Super::Resource Resource; TypeSpecificScopedPointer& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } TypeSpecificScopedPointer& operator=(TypeSpecificScopedPointer&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit TypeSpecificScopedPointer() : Super() {} explicit TypeSpecificScopedPointer(Resource aRhs ) : Super(aRhs ) {} TypeSpecificScopedPointer(TypeSpecificScopedPointer&& aRhs ) : Super(Move(aRhs) ) {} private: explicit TypeSpecificScopedPointer(TypeSpecificScopedPointer&) = delete; TypeSpecificScopedPointer& operator=(TypeSpecificScopedPointer&) = delete; };

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 2



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h" 2
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
namespace JS {}


namespace mozilla {}


namespace js {}




extern __attribute__((noreturn)) __attribute__ ((cold)) void
JS_Assert(const char* s, const char* file, int ln);
# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
namespace js {
namespace oom {







enum ThreadType {
    THREAD_TYPE_NONE = 0,
    THREAD_TYPE_COOPERATING,
    THREAD_TYPE_WASM,
    THREAD_TYPE_ION,
    THREAD_TYPE_PARSE,
    THREAD_TYPE_COMPRESS,
    THREAD_TYPE_GCHELPER,
    THREAD_TYPE_GCPARALLEL,
    THREAD_TYPE_PROMISE_TASK,
    THREAD_TYPE_MAX
};
# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
inline bool InitThreadType(void) { return true; }
inline void SetThreadType(ThreadType t) {};
inline uint32_t GetThreadType(void) { return 0; }


}
}
# 169 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
namespace js {
namespace oom {
static inline bool IsSimulatedOOMAllocation() { return false; }
static inline bool ShouldFailWithOOM() { return false; }
}
}



namespace js {


struct AutoEnterOOMUnsafeRegion
{
    __attribute__((noreturn)) __attribute__ ((cold)) void crash(const char* reason);
    __attribute__((noreturn)) __attribute__ ((cold)) void crash(size_t size, const char* reason);

    using AnnotateOOMAllocationSizeCallback = void(*)(size_t);
    static AnnotateOOMAllocationSizeCallback annotateOOMSizeCallback;
    static void setAnnotateOOMAllocationSizeCallback(AnnotateOOMAllocationSizeCallback callback) {
        annotateOOMSizeCallback = callback;
    }
# 222 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
};

}

static inline void* js_malloc(size_t bytes)
{
    do {} while(0);
    return malloc(bytes);
}

static inline void* js_calloc(size_t bytes)
{
    do {} while(0);
    return calloc(bytes, 1);
}

static inline void* js_calloc(size_t nmemb, size_t size)
{
    do {} while(0);
    return calloc(nmemb, size);
}

static inline void* js_realloc(void* p, size_t bytes)
{



    do { } while (0);

    do {} while(0);
    return realloc(p, bytes);
}

static inline void js_free(void* p)
{
    free(p);
}

static inline char* js_strdup(const char* s)
{
    do {} while(0);
    return strdup(s);
}
# 346 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
template <class T, typename... Args> static __attribute__((always_inline)) inline T * js_new(Args&&... args) { void* memory = js_malloc(sizeof(T)); return (__builtin_expect(!!(memory), 1)) ? new(memory) T(mozilla::Forward<Args>(args)...) : nullptr; }

namespace js {





template <typename T>
__attribute__ ((warn_unused_result)) inline bool
CalculateAllocSize(size_t numElems, size_t* bytesOut)
{
    *bytesOut = numElems * sizeof(T);
    return (numElems & mozilla::tl::MulOverflowMask<sizeof(T)>::value) == 0;
}






template <typename T, typename Extra>
__attribute__ ((warn_unused_result)) inline bool
CalculateAllocSizeWithExtra(size_t numExtra, size_t* bytesOut)
{
    *bytesOut = sizeof(T) + numExtra * sizeof(Extra);
    return (numExtra & mozilla::tl::MulOverflowMask<sizeof(Extra)>::value) == 0 &&
           *bytesOut >= sizeof(T);
}

}

template <class T>
static __attribute__((always_inline)) inline void
js_delete(const T* p)
{
    if (p) {
        p->~T();
        js_free(const_cast<T*>(p));
    }
}

template<class T>
static __attribute__((always_inline)) inline void
js_delete_poison(const T* p)
{
    if (p) {
        p->~T();
        memset(const_cast<T*>(p), 0x3B, sizeof(T));
        js_free(const_cast<T*>(p));
    }
}

template <class T>
static __attribute__((always_inline)) inline T*
js_pod_malloc()
{
    return static_cast<T*>(js_malloc(sizeof(T)));
}

template <class T>
static __attribute__((always_inline)) inline T*
js_pod_calloc()
{
    return static_cast<T*>(js_calloc(sizeof(T)));
}

template <class T>
static __attribute__((always_inline)) inline T*
js_pod_malloc(size_t numElems)
{
    size_t bytes;
    if ((__builtin_expect(!!(!js::CalculateAllocSize<T>(numElems, &bytes)), 0)))
        return nullptr;
    return static_cast<T*>(js_malloc(bytes));
}

template <class T>
static __attribute__((always_inline)) inline T*
js_pod_calloc(size_t numElems)
{
    size_t bytes;
    if ((__builtin_expect(!!(!js::CalculateAllocSize<T>(numElems, &bytes)), 0)))
        return nullptr;
    return static_cast<T*>(js_calloc(bytes));
}

template <class T>
static __attribute__((always_inline)) inline T*
js_pod_realloc(T* prior, size_t oldSize, size_t newSize)
{
    do { } while (0);
    size_t bytes;
    if ((__builtin_expect(!!(!js::CalculateAllocSize<T>(newSize, &bytes)), 0)))
        return nullptr;
    return static_cast<T*>(js_realloc(prior, bytes));
}

namespace js {

template<typename T>
struct ScopedFreePtrTraits
{
    typedef T* type;
    static T* empty() { return nullptr; }
    static void release(T* ptr) { js_free(ptr); }
};
template<typename Type> struct ScopedJSFreePtr : public mozilla::Scoped<ScopedFreePtrTraits<Type> > { typedef mozilla::Scoped<ScopedFreePtrTraits<Type> > Super; typedef typename Super::Resource Resource; ScopedJSFreePtr& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } ScopedJSFreePtr& operator=(ScopedJSFreePtr&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit ScopedJSFreePtr() : Super() {} explicit ScopedJSFreePtr(Resource aRhs ) : Super(aRhs ) {} ScopedJSFreePtr(ScopedJSFreePtr&& aRhs ) : Super(Move(aRhs) ) {} private: explicit ScopedJSFreePtr(ScopedJSFreePtr&) = delete; ScopedJSFreePtr& operator=(ScopedJSFreePtr&) = delete; };

template <typename T>
struct ScopedDeletePtrTraits : public ScopedFreePtrTraits<T>
{
    static void release(T* ptr) { js_delete(ptr); }
};
template<typename Type> struct ScopedJSDeletePtr : public mozilla::Scoped<ScopedDeletePtrTraits<Type> > { typedef mozilla::Scoped<ScopedDeletePtrTraits<Type> > Super; typedef typename Super::Resource Resource; ScopedJSDeletePtr& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } ScopedJSDeletePtr& operator=(ScopedJSDeletePtr&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit ScopedJSDeletePtr() : Super() {} explicit ScopedJSDeletePtr(Resource aRhs ) : Super(aRhs ) {} ScopedJSDeletePtr(ScopedJSDeletePtr&& aRhs ) : Super(Move(aRhs) ) {} private: explicit ScopedJSDeletePtr(ScopedJSDeletePtr&) = delete; ScopedJSDeletePtr& operator=(ScopedJSDeletePtr&) = delete; };

template <typename T>
struct ScopedReleasePtrTraits : public ScopedFreePtrTraits<T>
{
    static void release(T* ptr) { if (ptr) ptr->release(); }
};
template<typename Type> struct ScopedReleasePtr : public mozilla::Scoped<ScopedReleasePtrTraits<Type> > { typedef mozilla::Scoped<ScopedReleasePtrTraits<Type> > Super; typedef typename Super::Resource Resource; ScopedReleasePtr& operator=(Resource aRhs) { Super::operator=(aRhs); return *this; } ScopedReleasePtr& operator=(ScopedReleasePtr&& aRhs) { Super::operator=(Move(aRhs)); return *this; } explicit ScopedReleasePtr() : Super() {} explicit ScopedReleasePtr(Resource aRhs ) : Super(aRhs ) {} ScopedReleasePtr(ScopedReleasePtr&& aRhs ) : Super(Move(aRhs) ) {} private: explicit ScopedReleasePtr(ScopedReleasePtr&) = delete; ScopedReleasePtr& operator=(ScopedReleasePtr&) = delete; };

}

namespace JS {

template<typename T>
struct DeletePolicy
{
    constexpr DeletePolicy() {}

    template<typename U>
                 DeletePolicy(DeletePolicy<U> other,
                              typename mozilla::EnableIf<mozilla::IsConvertible<U*, T*>::value,
                                                         int>::Type dummy = 0)
    {}

    void operator()(const T* ptr) {
        js_delete(const_cast<T*>(ptr));
    }
};

struct FreePolicy
{
    void operator()(const void* ptr) {
        js_free(const_cast<void*>(ptr));
    }
};

typedef mozilla::UniquePtr<char[], JS::FreePolicy> UniqueChars;
typedef mozilla::UniquePtr<char16_t[], JS::FreePolicy> UniqueTwoByteChars;

}

namespace js {


typedef uint32_t HashNumber;
const unsigned HashNumberSizeBits = 32;

namespace detail {
# 524 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
inline HashNumber
ScrambleHashCode(HashNumber h)
{
# 542 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Utility.h"
    static const HashNumber goldenRatio = 0x9E3779B9U;
    return h * goldenRatio;
}

}

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h" 2


namespace js {

bool
CurrentThreadCanAccessZone(JS::Zone* zone);

namespace gc {

struct Cell;

const size_t ArenaShift = 12;
const size_t ArenaSize = size_t(1) << ArenaShift;
const size_t ArenaMask = ArenaSize - 1;




const size_t ChunkShift = 20;

const size_t ChunkSize = size_t(1) << ChunkShift;
const size_t ChunkMask = ChunkSize - 1;

const size_t CellShift = 3;
const size_t CellSize = size_t(1) << CellShift;
const size_t CellMask = CellSize - 1;






const size_t ChunkMarkBitmapOffset = 1032352;
const size_t ChunkMarkBitmapBits = 129024;

const size_t ChunkRuntimeOffset = ChunkSize - sizeof(void*);
const size_t ChunkTrailerSize = 2 * sizeof(uintptr_t) + sizeof(uint64_t);
const size_t ChunkLocationOffset = ChunkSize - ChunkTrailerSize;
const size_t ArenaZoneOffset = sizeof(size_t);
const size_t ArenaHeaderSize = sizeof(size_t) + 2 * sizeof(uintptr_t) +
                               sizeof(size_t) + sizeof(uintptr_t);






static const uint32_t BLACK = 0;
static const uint32_t GRAY = 1;





enum class ChunkLocation : uint32_t
{
    Invalid = 0,
    Nursery = 1,
    TenuredHeap = 2
};



extern void
AssertGCThingHasType(js::gc::Cell* cell, JS::TraceKind kind);





__attribute__((always_inline)) inline bool IsInsideNursery(const js::gc::Cell* cell);

}
}

namespace JS {
struct Zone;


const uint32_t DefaultNurseryBytes = 16 * js::gc::ChunkSize;


const uint32_t DefaultHeapMaxBytes = 32 * 1024 * 1024;

namespace shadow {

struct Zone
{
  protected:
    JSRuntime* const runtime_;
    JSTracer* const barrierTracer_;

  public:
    bool needsIncrementalBarrier_;

    Zone(JSRuntime* runtime, JSTracer* barrierTracerArg)
      : runtime_(runtime),
        barrierTracer_(barrierTracerArg),
        needsIncrementalBarrier_(false)
    {}

    bool needsIncrementalBarrier() const {
        return needsIncrementalBarrier_;
    }

    JSTracer* barrierTracer() {
        do { } while (0);
        do { } while (0);
        return barrierTracer_;
    }

    JSRuntime* runtimeFromActiveCooperatingThread() const {
        do { } while (0);
        return runtime_;
    }



    JSRuntime* runtimeFromAnyThread() const {
        return runtime_;
    }

    static __attribute__((always_inline)) inline JS::shadow::Zone* asShadowZone(JS::Zone* zone) {
        return reinterpret_cast<JS::shadow::Zone*>(zone);
    }
};

}
# 152 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HeapAPI.h"
class GCCellPtr
{
  public:

    GCCellPtr(void* gcthing, JS::TraceKind traceKind) : ptr(checkedCast(gcthing, traceKind)) {}


                 GCCellPtr(decltype(nullptr)) : ptr(checkedCast(nullptr, JS::TraceKind::Null)) {}


    template <typename T>
    explicit GCCellPtr(T* p) : ptr(checkedCast(p, JS::MapTypeToTraceKind<T>::kind)) { }
    explicit GCCellPtr(JSFunction* p) : ptr(checkedCast(p, JS::TraceKind::Object)) { }
    explicit GCCellPtr(JSFlatString* str) : ptr(checkedCast(str, JS::TraceKind::String)) { }
    explicit GCCellPtr(const Value& v);

    JS::TraceKind kind() const {
        JS::TraceKind traceKind = JS::TraceKind(ptr & OutOfLineTraceKindMask);
        if (uintptr_t(traceKind) != OutOfLineTraceKindMask)
            return traceKind;
        return outOfLineKind();
    }


    explicit operator bool() const {
        do { } while (0);
        return asCell();
    }


    template <typename T>
    bool is() const { return kind() == JS::MapTypeToTraceKind<T>::kind; }



    template <typename T>
    T& as() const {
        do { } while (0);


        return *reinterpret_cast<T*>(asCell());
    }




    js::gc::Cell* asCell() const {
        return reinterpret_cast<js::gc::Cell*>(ptr & ~OutOfLineTraceKindMask);
    }


    uint64_t unsafeAsInteger() const {
        return static_cast<uint64_t>(unsafeAsUIntPtr());
    }

    uintptr_t unsafeAsUIntPtr() const {
        do { } while (0);
        do { } while (0);
        return reinterpret_cast<uintptr_t>(asCell());
    }

    bool mayBeOwnedByOtherRuntime() const;

  private:
    static uintptr_t checkedCast(void* p, JS::TraceKind traceKind) {
        js::gc::Cell* cell = static_cast<js::gc::Cell*>(p);
        do { } while (0);
        AssertGCThingHasType(cell, traceKind);


        do { } while (0);

        return uintptr_t(p) | (uintptr_t(traceKind) & OutOfLineTraceKindMask);
    }

    JS::TraceKind outOfLineKind() const;

    uintptr_t ptr;
};

inline bool
operator==(const GCCellPtr& ptr1, const GCCellPtr& ptr2)
{
    return ptr1.asCell() == ptr2.asCell();
}

inline bool
operator!=(const GCCellPtr& ptr1, const GCCellPtr& ptr2)
{
    return !(ptr1 == ptr2);
}



template <typename F, typename... Args>
auto
DispatchTyped(F f, GCCellPtr thing, Args&&... args)
  -> decltype(f(static_cast<JSObject*>(nullptr), mozilla::Forward<Args>(args)...))
{
    switch (thing.kind()) {



      case JS::TraceKind::BaseShape: return f(&thing.as<js::BaseShape>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::JitCode: return f(&thing.as<js::jit::JitCode>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::LazyScript: return f(&thing.as<js::LazyScript>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::Scope: return f(&thing.as<js::Scope>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::Object: return f(&thing.as<JSObject>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::ObjectGroup: return f(&thing.as<js::ObjectGroup>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::Script: return f(&thing.as<JSScript>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::Shape: return f(&thing.as<js::Shape>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::String: return f(&thing.as<JSString>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::Symbol: return f(&thing.as<JS::Symbol>(), mozilla::Forward<Args>(args)...); case JS::TraceKind::RegExpShared: return f(&thing.as<js::RegExpShared>(), mozilla::Forward<Args>(args)...);;

      default:
          do { AnnotateMozCrashReason("MOZ_CRASH(" "Invalid trace kind in DispatchTyped for GCCellPtr." ")"); do { *((volatile int*) __null) = 258; ::abort(); } while (0); } while (0);
    }
}

}

namespace js {
namespace gc {
namespace detail {

static __attribute__((always_inline)) inline uintptr_t*
GetGCThingMarkBitmap(const uintptr_t addr)
{
    do { } while (0);
    const uintptr_t bmap_addr = (addr & ~ChunkMask) | ChunkMarkBitmapOffset;
    return reinterpret_cast<uintptr_t*>(bmap_addr);
}

static __attribute__((always_inline)) inline void
GetGCThingMarkWordAndMask(const uintptr_t addr, uint32_t color,
                          uintptr_t** wordp, uintptr_t* maskp)
{
    do { } while (0);
    const size_t bit = (addr & js::gc::ChunkMask) / js::gc::CellSize + color;
    do { } while (0);
    uintptr_t* bitmap = GetGCThingMarkBitmap(addr);
    const uintptr_t nbits = sizeof(*bitmap) * 8;
    *maskp = uintptr_t(1) << (bit % nbits);
    *wordp = &bitmap[bit / nbits];
}

static __attribute__((always_inline)) inline JS::Zone*
GetGCThingZone(const uintptr_t addr)
{
    do { } while (0);
    const uintptr_t zone_addr = (addr & ~ArenaMask) | ArenaZoneOffset;
    return *reinterpret_cast<JS::Zone**>(zone_addr);

}

static __attribute__((always_inline)) inline bool
CellIsMarkedGray(const Cell* cell)
{
    do { } while (0);
    if (js::gc::IsInsideNursery(cell))
        return false;

    uintptr_t* word, mask;
    js::gc::detail::GetGCThingMarkWordAndMask(uintptr_t(cell), js::gc::GRAY, &word, &mask);
    return *word & mask;
}

extern bool
CellIsMarkedGrayIfKnown(const Cell* cell);






}

__attribute__((always_inline)) inline bool
IsInsideNursery(const js::gc::Cell* cell)
{
    if (!cell)
        return false;
    uintptr_t addr = uintptr_t(cell);
    addr &= ~js::gc::ChunkMask;
    addr |= js::gc::ChunkLocationOffset;
    auto location = *reinterpret_cast<ChunkLocation*>(addr);
    do { } while (0);
    return location == ChunkLocation::Nursery;
}

}
}

namespace JS {

static __attribute__((always_inline)) inline Zone*
GetTenuredGCThingZone(GCCellPtr thing)
{
    do { } while (0);
    return js::gc::detail::GetGCThingZone(thing.unsafeAsUIntPtr());
}

static __attribute__((always_inline)) inline Zone*
GetStringZone(JSString* str)
{
    return js::gc::detail::GetGCThingZone(uintptr_t(str));
}

extern Zone*
GetObjectZone(JSObject* obj);

static __attribute__((always_inline)) inline bool
GCThingIsMarkedGray(GCCellPtr thing)
{
    if (thing.mayBeOwnedByOtherRuntime())
        return false;
    return js::gc::detail::CellIsMarkedGrayIfKnown(thing.asCell());
}

extern JS::TraceKind
GCThingTraceKind(void* thing);

}

namespace js {
namespace gc {

static __attribute__((always_inline)) inline bool
IsIncrementalBarrierNeededOnTenuredGCThing(const JS::GCCellPtr thing)
{
    do { } while (0);
    do { } while (0);




    do { } while (0);

    JS::Zone* zone = JS::GetTenuredGCThingZone(thing);
    return JS::shadow::Zone::asShadowZone(zone)->needsIncrementalBarrier();
}






extern JSObject*
NewMemoryInfoObject(JSContext* cx);

}
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/UniquePtr.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/UniquePtr.h"
namespace js {


template <typename T, typename D = JS::DeletePolicy<T>>
using UniquePtr = mozilla::UniquePtr<T, D>;

namespace detail {

template<typename T>
struct UniqueSelector
{
  typedef UniquePtr<T> SingleObject;
};

template<typename T>
struct UniqueSelector<T[]>
{
  typedef UniquePtr<T[]> UnknownBound;
};

template<typename T, decltype(sizeof(int)) N>
struct UniqueSelector<T[N]>
{
  typedef UniquePtr<T[N]> KnownBound;
};

}



template<typename T, typename... Args>
typename detail::UniqueSelector<T>::SingleObject
MakeUnique(Args&&... aArgs)
{
  return UniquePtr<T>(js_new<T>(mozilla::Forward<Args>(aArgs)...));
}

template<typename T>
typename detail::UniqueSelector<T>::UnknownBound
MakeUnique(decltype(sizeof(int)) aN) = delete;

template<typename T, typename... Args>
typename detail::UniqueSelector<T>::KnownBound
MakeUnique(Args&&... aArgs) = delete;

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h" 2

namespace js {
namespace gc {
class GCRuntime;
}
namespace gcstats {
struct Statistics;
}
}

typedef enum JSGCMode {

    JSGC_MODE_GLOBAL = 0,


    JSGC_MODE_ZONE = 1,





    JSGC_MODE_INCREMENTAL = 2
} JSGCMode;




typedef enum JSGCInvocationKind {

    GC_NORMAL = 0,


    GC_SHRINK = 1
} JSGCInvocationKind;

namespace JS {
# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
namespace gcreason {


enum Reason {

    API, EAGER_ALLOC_TRIGGER, DESTROY_RUNTIME, UNUSED0, LAST_DITCH, TOO_MUCH_MALLOC, ALLOC_TRIGGER, DEBUG_GC, COMPARTMENT_REVIVED, RESET, OUT_OF_NURSERY, EVICT_NURSERY, FULL_STORE_BUFFER, SHARED_MEMORY_LIMIT, UNUSED1, INCREMENTAL_TOO_SLOW, ABORT_GC, RESERVED0, RESERVED1, RESERVED2, RESERVED3, RESERVED4, RESERVED5, RESERVED6, RESERVED7, RESERVED8, RESERVED9, RESERVED10, RESERVED11, RESERVED12, RESERVED13, RESERVED14, RESERVED15, DOM_WINDOW_UTILS, COMPONENT_UTILS, MEM_PRESSURE, CC_WAITING, CC_FORCED, LOAD_END, POST_COMPARTMENT, PAGE_HIDE, NSJSCONTEXT_DESTROY, SET_NEW_DOCUMENT, SET_DOC_SHELL, DOM_UTILS, DOM_IPC, DOM_WORKER, INTER_SLICE_GC, REFRESH_FRAME, FULL_GC_TIMER, SHUTDOWN_CC, FINISH_LARGE_EVALUATE, USER_INACTIVE, XPCONNECT_SHUTDOWN,

    NO_REASON,
    NUM_REASONS,







    NUM_TELEMETRY_REASONS = 100
};




extern const char*
ExplainReason(JS::gcreason::Reason reason);

}
# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
extern void
PrepareZoneForGC(Zone* zone);




extern void
PrepareForFullGC(JSContext* cx);






extern void
PrepareForIncrementalGC(JSContext* cx);





extern bool
IsGCScheduled(JSContext* cx);





extern void
SkipZoneForGC(Zone* zone);
# 204 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
extern void
GCForReason(JSContext* cx, JSGCInvocationKind gckind, gcreason::Reason reason);
# 236 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
extern void
StartIncrementalGC(JSContext* cx, JSGCInvocationKind gckind, gcreason::Reason reason,
                   int64_t millis = 0);
# 248 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
extern void
IncrementalGCSlice(JSContext* cx, gcreason::Reason reason, int64_t millis = 0);







extern void
FinishIncrementalGC(JSContext* cx, gcreason::Reason reason);







extern void
AbortIncrementalGC(JSContext* cx);

namespace dbg {




class GarbageCollectionEvent
{

    uint64_t majorGCNumber_;



    const char* reason;




    const char* nonincrementalReason;



    struct Collection {
        mozilla::TimeStamp startTimestamp;
        mozilla::TimeStamp endTimestamp;
    };


    mozilla::Vector<Collection> collections;

    GarbageCollectionEvent(const GarbageCollectionEvent& rhs) = delete;
    GarbageCollectionEvent& operator=(const GarbageCollectionEvent& rhs) = delete;

  public:
    explicit GarbageCollectionEvent(uint64_t majorGCNum)
        : majorGCNumber_(majorGCNum)
        , reason(nullptr)
        , nonincrementalReason(nullptr)
        , collections()
    { }

    using Ptr = js::UniquePtr<GarbageCollectionEvent>;
    static Ptr Create(JSRuntime* rt, ::js::gcstats::Statistics& stats, uint64_t majorGCNumber);

    JSObject* toJSObject(JSContext* cx) const;

    uint64_t majorGCNumber() const { return majorGCNumber_; }
};

}

enum GCProgress {
# 330 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
    GC_CYCLE_BEGIN,
    GC_SLICE_BEGIN,
    GC_SLICE_END,
    GC_CYCLE_END
};

struct GCDescription {
    bool isZone_;
    JSGCInvocationKind invocationKind_;
    gcreason::Reason reason_;

    GCDescription(bool isZone, JSGCInvocationKind kind, gcreason::Reason reason)
      : isZone_(isZone), invocationKind_(kind), reason_(reason) {}

    char16_t* formatSliceMessage(JSContext* cx) const;
    char16_t* formatSummaryMessage(JSContext* cx) const;
    char16_t* formatJSON(JSContext* cx, uint64_t timestamp) const;

    JS::dbg::GarbageCollectionEvent::Ptr toGCEvent(JSContext* cx) const;
};

typedef void
(* GCSliceCallback)(JSContext* cx, GCProgress progress, const GCDescription& desc);






extern GCSliceCallback
SetGCSliceCallback(JSContext* cx, GCSliceCallback callback);




enum class GCNurseryProgress {



    GC_NURSERY_COLLECTION_START,



    GC_NURSERY_COLLECTION_END
};





using GCNurseryCollectionCallback = void(*)(JSContext* cx, GCNurseryProgress progress,
                                            gcreason::Reason reason);





extern GCNurseryCollectionCallback
SetGCNurseryCollectionCallback(JSContext* cx, GCNurseryCollectionCallback callback);

typedef void
(* DoCycleCollectionCallback)(JSContext* cx);





extern DoCycleCollectionCallback
SetDoCycleCollectionCallback(JSContext* cx, DoCycleCollectionCallback callback);







extern void
DisableIncrementalGC(JSContext* cx);
# 417 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
extern bool
IsIncrementalGCEnabled(JSContext* cx);





extern bool
IsIncrementalGCInProgress(JSContext* cx);







extern bool
IsIncrementalBarrierNeeded(JSContext* cx);





extern void
IncrementalPreWriteBarrier(JSObject* obj);





extern void
IncrementalReadBarrier(GCCellPtr thing);




extern bool
WasIncrementalGC(JSContext* cx);
# 465 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
class AutoDisableGenerationalGC
{
    JSContext* cx;

  public:
    explicit AutoDisableGenerationalGC(JSContext* cx);
    ~AutoDisableGenerationalGC();
};





extern bool
IsGenerationalGCEnabled(JSRuntime* rt);






extern size_t
GetGCNumber();






class AutoRequireNoGC
{
  protected:
    AutoRequireNoGC() {}
    ~AutoRequireNoGC() {}
};
# 509 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
class AutoAssertNoGC : public AutoRequireNoGC
{
    JSContext* cx_;

  public:
    explicit AutoAssertNoGC(JSContext* cx = nullptr);
    ~AutoAssertNoGC();
};





class AutoAssertNoAlloc
{

    js::gc::GCRuntime* gc;

  public:
    AutoAssertNoAlloc() : gc(nullptr) {}
    explicit AutoAssertNoAlloc(JSContext* cx);
    void disallowAlloc(JSRuntime* rt);
    ~AutoAssertNoAlloc();






};





class AutoAssertOnBarrier
{
    JSContext* context;
    bool prev;

  public:
    explicit AutoAssertOnBarrier(JSContext* cx);
    ~AutoAssertOnBarrier();
};
# 568 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
class AutoSuppressGCAnalysis : public AutoAssertNoAlloc
{
  public:
    AutoSuppressGCAnalysis() : AutoAssertNoAlloc() {}
    explicit AutoSuppressGCAnalysis(JSContext* cx) : AutoAssertNoAlloc(cx) {}
} ;
# 583 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
class AutoAssertGCCallback : public AutoSuppressGCAnalysis
{
  public:
    explicit AutoAssertGCCallback(JSObject* obj);
};
# 608 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCAPI.h"
class AutoCheckCannotGC : public AutoRequireNoGC
{
  public:
    explicit AutoCheckCannotGC(JSContext* cx = nullptr) {}
} ;







extern bool
UnmarkGrayGCThingRecursively(GCCellPtr thing);

}

namespace js {
namespace gc {

extern bool
BarriersAreAllowedOnCurrentThread();

static __attribute__((always_inline)) inline void
ExposeGCThingToActiveJS(JS::GCCellPtr thing)
{



    if (IsInsideNursery(thing.asCell()))
        return;



    if (thing.mayBeOwnedByOtherRuntime())
        return;

    do { static_assert(mozilla::detail::AssertionConditionType<decltype(BarriersAreAllowedOnCurrentThread())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(BarriersAreAllowedOnCurrentThread()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "BarriersAreAllowedOnCurrentThread()" ")"); do { *((volatile int*) __null) = 645; ::abort(); } while (0); } } while (0);

    if (IsIncrementalBarrierNeededOnTenuredGCThing(thing))
        JS::IncrementalReadBarrier(thing);
    else if (js::gc::detail::CellIsMarkedGray(thing.asCell()))
        JS::UnmarkGrayGCThingRecursively(thing);

    do { } while (0);
}

}
}

namespace JS {







static __attribute__((always_inline)) inline void
ExposeObjectToActiveJS(JSObject* obj)
{
    do { } while (0);
    js::gc::ExposeGCThingToActiveJS(GCCellPtr(obj));
}

static __attribute__((always_inline)) inline void
ExposeScriptToActiveJS(JSScript* script)
{
    js::gc::ExposeGCThingToActiveJS(GCCellPtr(script));
}






extern void
PokeGC(JSContext* cx);




extern void
NotifyDidPaint(JSContext* cx);

}
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h" 1
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsalloc.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsalloc.h"
namespace js {

enum class AllocFunction {
    Malloc,
    Calloc,
    Realloc
};


class SystemAllocPolicy
{
  public:
    template <typename T> T* maybe_pod_malloc(size_t numElems) { return js_pod_malloc<T>(numElems); }
    template <typename T> T* maybe_pod_calloc(size_t numElems) { return js_pod_calloc<T>(numElems); }
    template <typename T> T* maybe_pod_realloc(T* p, size_t oldSize, size_t newSize) {
        return js_pod_realloc<T>(p, oldSize, newSize);
    }
    template <typename T> T* pod_malloc(size_t numElems) { return maybe_pod_malloc<T>(numElems); }
    template <typename T> T* pod_calloc(size_t numElems) { return maybe_pod_calloc<T>(numElems); }
    template <typename T> T* pod_realloc(T* p, size_t oldSize, size_t newSize) {
        return maybe_pod_realloc<T>(p, oldSize, newSize);
    }
    void free_(void* p) { js_free(p); }
    void reportAllocOverflow() const {}
    bool checkSimulatedOOM() const {
        return !js::oom::ShouldFailWithOOM();
    }
};

void ReportOutOfMemory(JSContext* cx);
# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsalloc.h"
class TempAllocPolicy
{
    JSContext* const cx_;





    void* onOutOfMemory(AllocFunction allocFunc, size_t nbytes,
                                       void* reallocPtr = nullptr);

    template <typename T>
    T* onOutOfMemoryTyped(AllocFunction allocFunc, size_t numElems, void* reallocPtr = nullptr) {
        size_t bytes;
        if ((__builtin_expect(!!(!CalculateAllocSize<T>(numElems, &bytes)), 0)))
            return nullptr;
        return static_cast<T*>(onOutOfMemory(allocFunc, bytes, reallocPtr));
    }

  public:
                 TempAllocPolicy(JSContext* cx) : cx_(cx) {}

    template <typename T>
    T* maybe_pod_malloc(size_t numElems) {
        return js_pod_malloc<T>(numElems);
    }

    template <typename T>
    T* maybe_pod_calloc(size_t numElems) {
        return js_pod_calloc<T>(numElems);
    }

    template <typename T>
    T* maybe_pod_realloc(T* prior, size_t oldSize, size_t newSize) {
        return js_pod_realloc<T>(prior, oldSize, newSize);
    }

    template <typename T>
    T* pod_malloc(size_t numElems) {
        T* p = maybe_pod_malloc<T>(numElems);
        if ((__builtin_expect(!!(!p), 0)))
            p = onOutOfMemoryTyped<T>(AllocFunction::Malloc, numElems);
        return p;
    }

    template <typename T>
    T* pod_calloc(size_t numElems) {
        T* p = maybe_pod_calloc<T>(numElems);
        if ((__builtin_expect(!!(!p), 0)))
            p = onOutOfMemoryTyped<T>(AllocFunction::Calloc, numElems);
        return p;
    }

    template <typename T>
    T* pod_realloc(T* prior, size_t oldSize, size_t newSize) {
        T* p2 = maybe_pod_realloc<T>(prior, oldSize, newSize);
        if ((__builtin_expect(!!(!p2), 0)))
            p2 = onOutOfMemoryTyped<T>(AllocFunction::Realloc, newSize, prior);
        return p2;
    }

    void free_(void* p) {
        js_free(p);
    }

    void reportAllocOverflow() const;

    bool checkSimulatedOOM() const {
        if (js::oom::ShouldFailWithOOM()) {
            ReportOutOfMemory(cx_);
            return false;
        }

        return true;
    }
};

}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h" 1
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h"
namespace mozilla {




static const uint32_t kGoldenRatioU32 = 0x9E3779B9U;

inline uint32_t
RotateBitsLeft32(uint32_t aValue, uint8_t aBits)
{
  do { } while (0);
  return (aValue << aBits) | (aValue >> (32 - aBits));
}

namespace detail {

inline uint32_t
AddU32ToHash(uint32_t aHash, uint32_t aValue)
{
# 117 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h"
  return kGoldenRatioU32 * (RotateBitsLeft32(aHash, 5) ^ aValue);
}




template<size_t PtrSize>
inline uint32_t
AddUintptrToHash(uint32_t aHash, uintptr_t aValue);

template<>
inline uint32_t
AddUintptrToHash<4>(uint32_t aHash, uintptr_t aValue)
{
  return AddU32ToHash(aHash, static_cast<uint32_t>(aValue));
}

template<>
inline uint32_t
AddUintptrToHash<8>(uint32_t aHash, uintptr_t aValue)
{







  uint32_t v1 = static_cast<uint32_t>(aValue);
  uint32_t v2 = static_cast<uint32_t>(static_cast<uint64_t>(aValue) >> 32);
  return AddU32ToHash(AddU32ToHash(aHash, v1), v2);
}

}
# 159 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h"
template<typename A>
__attribute__ ((warn_unused_result)) inline uint32_t
AddToHash(uint32_t aHash, A aA)
{




  return detail::AddU32ToHash(aHash, aA);
}

template<typename A>
__attribute__ ((warn_unused_result)) inline uint32_t
AddToHash(uint32_t aHash, A* aA)
{





  static_assert(sizeof(aA) == sizeof(uintptr_t), "Strange pointer!");

  return detail::AddUintptrToHash<sizeof(uintptr_t)>(aHash, uintptr_t(aA));
}

template<>
__attribute__ ((warn_unused_result)) inline uint32_t
AddToHash(uint32_t aHash, uintptr_t aA)
{
  return detail::AddUintptrToHash<sizeof(uintptr_t)>(aHash, aA);
}

template<typename A, typename... Args>
__attribute__ ((warn_unused_result)) uint32_t
AddToHash(uint32_t aHash, A aArg, Args... aArgs)
{
  return AddToHash(AddToHash(aHash, aArg), aArgs...);
}
# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h"
template<typename... Args>
__attribute__ ((warn_unused_result)) inline uint32_t
HashGeneric(Args... aArgs)
{
  return AddToHash(0, aArgs...);
}

namespace detail {

template<typename T>
uint32_t
HashUntilZero(const T* aStr)
{
  uint32_t hash = 0;
  for (T c; (c = *aStr); aStr++) {
    hash = AddToHash(hash, c);
  }
  return hash;
}

template<typename T>
uint32_t
HashKnownLength(const T* aStr, size_t aLength)
{
  uint32_t hash = 0;
  for (size_t i = 0; i < aLength; i++) {
    hash = AddToHash(hash, aStr[i]);
  }
  return hash;
}

}







__attribute__ ((warn_unused_result)) inline uint32_t
HashString(const char* aStr)
{
  return detail::HashUntilZero(reinterpret_cast<const unsigned char*>(aStr));
}

__attribute__ ((warn_unused_result)) inline uint32_t
HashString(const char* aStr, size_t aLength)
{
  return detail::HashKnownLength(reinterpret_cast<const unsigned char*>(aStr), aLength);
}

__attribute__ ((warn_unused_result))
inline uint32_t
HashString(const unsigned char* aStr, size_t aLength)
{
  return detail::HashKnownLength(aStr, aLength);
}

__attribute__ ((warn_unused_result)) inline uint32_t
HashString(const char16_t* aStr)
{
  return detail::HashUntilZero(aStr);
}

__attribute__ ((warn_unused_result)) inline uint32_t
HashString(const char16_t* aStr, size_t aLength)
{
  return detail::HashKnownLength(aStr, aLength);
}
# 299 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h"
__attribute__ ((warn_unused_result)) extern __attribute__((weak)) __attribute__((visibility("default"))) uint32_t
HashBytes(const void* bytes, size_t aLength);
# 318 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HashFunctions.h"
class HashCodeScrambler
{
  struct SipHasher;

  uint64_t mK0, mK1;

public:

  constexpr HashCodeScrambler(uint64_t aK0, uint64_t aK1) : mK0(aK0), mK1(aK1) {}





  uint32_t scramble(uint32_t aHashCode) const
  {
    SipHasher hasher(mK0, mK1);
    return uint32_t(hasher.sipHash(aHashCode));
  }

private:
  struct SipHasher
  {
    SipHasher(uint64_t aK0, uint64_t aK1)
    {

      mV0 = aK0 ^ 0x736f6d6570736575UL;
      mV1 = aK1 ^ 0x646f72616e646f6dUL;
      mV2 = aK0 ^ 0x6c7967656e657261UL;
      mV3 = aK1 ^ 0x7465646279746573UL;
    }

    uint64_t sipHash(uint64_t aM)
    {

      mV3 ^= aM;
      sipRound();
      mV0 ^= aM;


      mV2 ^= 0xff;
      for (int i = 0; i < 3; i++)
        sipRound();
      return mV0 ^ mV1 ^ mV2 ^ mV3;
    }

    void sipRound()
    {
      mV0 += mV1;
      mV1 = RotateLeft(mV1, 13);
      mV1 ^= mV0;
      mV0 = RotateLeft(mV0, 32);
      mV2 += mV3;
      mV3 = RotateLeft(mV3, 16);
      mV3 ^= mV2;
      mV0 += mV3;
      mV3 = RotateLeft(mV3, 21);
      mV3 ^= mV0;
      mV2 += mV1;
      mV1 = RotateLeft(mV1, 17);
      mV1 ^= mV2;
      mV2 = RotateLeft(mV2, 32);
    }

    uint64_t mV0, mV1, mV2, mV3;
  };
};

}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Opaque.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Opaque.h"
namespace mozilla {






template<typename T>
class Opaque final
{
  static_assert(mozilla::IsIntegral<T>::value,
                "mozilla::Opaque only supports integral types");

  T mValue;

public:
  Opaque() {}
  explicit Opaque(T aValue) : mValue(aValue) {}

  bool operator==(const Opaque& aOther) const {
    return mValue == aOther.mValue;
  }

  bool operator!=(const Opaque& aOther) const {
    return !(*this == aOther);
  }
};

}
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h" 2








namespace js {

class TempAllocPolicy;
template <class> struct DefaultHasher;
template <class, class> class HashMapEntry;
namespace detail {
    template <class T> class HashTableEntry;
    template <class T, class HashPolicy, class AllocPolicy> class HashTable;
}
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
using Generation = mozilla::Opaque<uint64_t>;
# 65 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
template <class Key,
          class Value,
          class HashPolicy = DefaultHasher<Key>,
          class AllocPolicy = TempAllocPolicy>
class HashMap
{
    typedef HashMapEntry<Key, Value> TableEntry;

    struct MapHashPolicy : HashPolicy
    {
        using Base = HashPolicy;
        typedef Key KeyType;
        static const Key& getKey(TableEntry& e) { return e.key(); }
        static void setKey(TableEntry& e, Key& k) { HashPolicy::rekey(e.mutableKey(), k); }
    };

    typedef detail::HashTable<TableEntry, MapHashPolicy, AllocPolicy> Impl;
    Impl impl;

  public:
    typedef typename HashPolicy::Lookup Lookup;
    typedef TableEntry Entry;



    explicit HashMap(AllocPolicy a = AllocPolicy()) : impl(a) {}
    __attribute__ ((warn_unused_result)) bool init(uint32_t len = 16) { return impl.init(len); }
    bool initialized() const { return impl.initialized(); }
# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::Ptr Ptr;
    __attribute__((always_inline)) inline Ptr lookup(const Lookup& l) const { return impl.lookup(l); }



    __attribute__((always_inline)) inline Ptr readonlyThreadsafeLookup(const Lookup& l) const {
        return impl.readonlyThreadsafeLookup(l);
    }


    void remove(Ptr p) { impl.remove(p); }
# 150 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::AddPtr AddPtr;
    __attribute__((always_inline)) inline AddPtr lookupForAdd(const Lookup& l) const {
        return impl.lookupForAdd(l);
    }

    template<typename KeyInput, typename ValueInput>
    __attribute__ ((warn_unused_result)) bool add(AddPtr& p, KeyInput&& k, ValueInput&& v) {
        return impl.add(p,
                        mozilla::Forward<KeyInput>(k),
                        mozilla::Forward<ValueInput>(v));
    }

    template<typename KeyInput>
    __attribute__ ((warn_unused_result)) bool add(AddPtr& p, KeyInput&& k) {
        return impl.add(p, mozilla::Forward<KeyInput>(k), Value());
    }

    template<typename KeyInput, typename ValueInput>
    __attribute__ ((warn_unused_result)) bool relookupOrAdd(AddPtr& p, KeyInput&& k, ValueInput&& v) {
        return impl.relookupOrAdd(p, k,
                                  mozilla::Forward<KeyInput>(k),
                                  mozilla::Forward<ValueInput>(v));
    }
# 182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::Range Range;
    Range all() const { return impl.all(); }
# 196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::Enum Enum;



    void clear() { impl.clear(); }



    void clearAndShrink() { impl.clearAndShrink(); }



    void finish() { impl.finish(); }


    bool empty() const { return impl.empty(); }


    uint32_t count() const { return impl.count(); }



    size_t capacity() const { return impl.capacity(); }



    size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return impl.sizeOfExcludingThis(mallocSizeOf);
    }
    size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return mallocSizeOf(this) + impl.sizeOfExcludingThis(mallocSizeOf);
    }

    Generation generation() const {
        return impl.generation();
    }



    bool has(const Lookup& l) const {
        return impl.lookup(l).found();
    }


    template<typename KeyInput, typename ValueInput>
    __attribute__ ((warn_unused_result)) bool put(KeyInput&& k, ValueInput&& v) {
        AddPtr p = lookupForAdd(k);
        if (p) {
            p->value() = mozilla::Forward<ValueInput>(v);
            return true;
        }
        return add(p, mozilla::Forward<KeyInput>(k), mozilla::Forward<ValueInput>(v));
    }


    template<typename KeyInput, typename ValueInput>
    __attribute__ ((warn_unused_result)) bool putNew(KeyInput&& k, ValueInput&& v) {
        return impl.putNew(k, mozilla::Forward<KeyInput>(k), mozilla::Forward<ValueInput>(v));
    }


    template<typename KeyInput, typename ValueInput>
    void putNewInfallible(KeyInput&& k, ValueInput&& v) {
        impl.putNewInfallible(k, mozilla::Forward<KeyInput>(k), mozilla::Forward<ValueInput>(v));
    }


    Ptr lookupWithDefault(const Key& k, const Value& defaultValue) {
        AddPtr p = lookupForAdd(k);
        if (p)
            return p;
        bool ok = add(p, k, defaultValue);
        do { } while (0);
        (void)ok;
        return p;
    }


    void remove(const Lookup& l) {
        if (Ptr p = lookup(l))
            remove(p);
    }



    void rekeyIfMoved(const Key& old_key, const Key& new_key) {
        if (old_key != new_key)
            rekeyAs(old_key, new_key, new_key);
    }


    bool rekeyAs(const Lookup& old_lookup, const Lookup& new_lookup, const Key& new_key) {
        if (Ptr p = lookup(old_lookup)) {
            impl.rekeyAndMaybeRehash(p, new_lookup, new_key);
            return true;
        }
        return false;
    }


    HashMap(HashMap&& rhs) : impl(mozilla::Move(rhs.impl)) {}
    void operator=(HashMap&& rhs) {
        do { } while (0);
        impl = mozilla::Move(rhs.impl);
    }

  private:

    HashMap(const HashMap& hm) = delete;
    HashMap& operator=(const HashMap& hm) = delete;

    friend class Impl::Enum;
};
# 327 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
template <class T,
          class HashPolicy = DefaultHasher<T>,
          class AllocPolicy = TempAllocPolicy>
class HashSet
{
    struct SetOps : HashPolicy
    {
        using Base = HashPolicy;
        typedef T KeyType;
        static const KeyType& getKey(const T& t) { return t; }
        static void setKey(T& t, KeyType& k) { HashPolicy::rekey(t, k); }
    };

    typedef detail::HashTable<const T, SetOps, AllocPolicy> Impl;
    Impl impl;

  public:
    typedef typename HashPolicy::Lookup Lookup;
    typedef T Entry;



    explicit HashSet(AllocPolicy a = AllocPolicy()) : impl(a) {}
    __attribute__ ((warn_unused_result)) bool init(uint32_t len = 16) { return impl.init(len); }
    bool initialized() const { return impl.initialized(); }
# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::Ptr Ptr;
    __attribute__((always_inline)) inline Ptr lookup(const Lookup& l) const { return impl.lookup(l); }



    __attribute__((always_inline)) inline Ptr readonlyThreadsafeLookup(const Lookup& l) const {
        return impl.readonlyThreadsafeLookup(l);
    }


    void remove(Ptr p) { impl.remove(p); }
# 406 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::AddPtr AddPtr;
    __attribute__((always_inline)) inline AddPtr lookupForAdd(const Lookup& l) const {
        return impl.lookupForAdd(l);
    }

    template <typename U>
    __attribute__ ((warn_unused_result)) bool add(AddPtr& p, U&& u) {
        return impl.add(p, mozilla::Forward<U>(u));
    }

    template <typename U>
    __attribute__ ((warn_unused_result)) bool relookupOrAdd(AddPtr& p, const Lookup& l, U&& u) {
        return impl.relookupOrAdd(p, l, mozilla::Forward<U>(u));
    }
# 429 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::Range Range;
    Range all() const { return impl.all(); }
# 443 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
    typedef typename Impl::Enum Enum;



    void clear() { impl.clear(); }



    void clearAndShrink() { impl.clearAndShrink(); }



    void finish() { impl.finish(); }


    bool empty() const { return impl.empty(); }


    uint32_t count() const { return impl.count(); }



    size_t capacity() const { return impl.capacity(); }



    size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return impl.sizeOfExcludingThis(mallocSizeOf);
    }
    size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return mallocSizeOf(this) + impl.sizeOfExcludingThis(mallocSizeOf);
    }

    Generation generation() const {
        return impl.generation();
    }



    bool has(const Lookup& l) const {
        return impl.lookup(l).found();
    }


    template <typename U>
    __attribute__ ((warn_unused_result)) bool put(U&& u) {
        AddPtr p = lookupForAdd(u);
        return p ? true : add(p, mozilla::Forward<U>(u));
    }


    template <typename U>
    __attribute__ ((warn_unused_result)) bool putNew(U&& u) {
        return impl.putNew(u, mozilla::Forward<U>(u));
    }

    template <typename U>
    __attribute__ ((warn_unused_result)) bool putNew(const Lookup& l, U&& u) {
        return impl.putNew(l, mozilla::Forward<U>(u));
    }


    template <typename U>
    void putNewInfallible(const Lookup& l, U&& u) {
        impl.putNewInfallible(l, mozilla::Forward<U>(u));
    }

    void remove(const Lookup& l) {
        if (Ptr p = lookup(l))
            remove(p);
    }



    void rekeyIfMoved(const Lookup& old_value, const T& new_value) {
        if (old_value != new_value)
            rekeyAs(old_value, new_value, new_value);
    }


    bool rekeyAs(const Lookup& old_lookup, const Lookup& new_lookup, const T& new_value) {
        if (Ptr p = lookup(old_lookup)) {
            impl.rekeyAndMaybeRehash(p, new_lookup, new_value);
            return true;
        }
        return false;
    }





    void replaceKey(Ptr p, const T& new_value) {
        do { } while (0);
        do { } while (0);
        do { } while (0);
        do { } while (0);
        const_cast<T&>(*p) = new_value;
    }


    HashSet(HashSet&& rhs) : impl(mozilla::Move(rhs.impl)) {}
    void operator=(HashSet&& rhs) {
        do { } while (0);
        impl = mozilla::Move(rhs.impl);
    }

  private:

    HashSet(const HashSet& hs) = delete;
    HashSet& operator=(const HashSet& hs) = delete;

    friend class Impl::Enum;
};
# 587 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
template <typename Key, size_t zeroBits>
struct PointerHasher
{
    typedef Key Lookup;
    static HashNumber hash(const Lookup& l) {
        size_t word = reinterpret_cast<size_t>(l) >> zeroBits;
        static_assert(sizeof(HashNumber) == 4,
                      "subsequent code assumes a four-byte hash");



        static_assert(sizeof(word) == 8,
                      "unexpected word size, new hashing strategy required to "
                      "properly incorporate all bits");
        return HashNumber((word >> 32) ^ word);

    }
    static bool match(const Key& k, const Lookup& l) {
        return k == l;
    }
    static void rekey(Key& k, const Key& newKey) {
        k = newKey;
    }
};





template <class Key>
struct DefaultHasher
{
    typedef Key Lookup;
    static HashNumber hash(const Lookup& l) {

        return l;
    }
    static bool match(const Key& k, const Lookup& l) {

        return k == l;
    }
    static void rekey(Key& k, const Key& newKey) {
        k = newKey;
    }
};



template <class T>
struct DefaultHasher<T*> : PointerHasher<T*, mozilla::tl::FloorLog2<sizeof(void*)>::value>
{};



template <class T, class D>
struct DefaultHasher<mozilla::UniquePtr<T, D>>
{
    using Lookup = mozilla::UniquePtr<T, D>;
    using PtrHasher = PointerHasher<T*, mozilla::tl::FloorLog2<sizeof(void*)>::value>;

    static HashNumber hash(const Lookup& l) {
        return PtrHasher::hash(l.get());
    }
    static bool match(const mozilla::UniquePtr<T, D>& k, const Lookup& l) {
        return PtrHasher::match(k.get(), l.get());
    }
    static void rekey(mozilla::UniquePtr<T, D>& k, mozilla::UniquePtr<T, D>&& newKey) {
        k = mozilla::Move(newKey);
    }
};


template <>
struct DefaultHasher<double>
{
    typedef double Lookup;
    static HashNumber hash(double d) {
        static_assert(sizeof(HashNumber) == 4,
                      "subsequent code assumes a four-byte hash");
        uint64_t u = mozilla::BitwiseCast<uint64_t>(d);
        return HashNumber(u ^ (u >> 32));
    }
    static bool match(double lhs, double rhs) {
        return mozilla::BitwiseCast<uint64_t>(lhs) == mozilla::BitwiseCast<uint64_t>(rhs);
    }
};

template <>
struct DefaultHasher<float>
{
    typedef float Lookup;
    static HashNumber hash(float f) {
        static_assert(sizeof(HashNumber) == 4,
                      "subsequent code assumes a four-byte hash");
        return HashNumber(mozilla::BitwiseCast<uint32_t>(f));
    }
    static bool match(float lhs, float rhs) {
        return mozilla::BitwiseCast<uint32_t>(lhs) == mozilla::BitwiseCast<uint32_t>(rhs);
    }
};


struct CStringHasher
{
    typedef const char* Lookup;
    static js::HashNumber hash(Lookup l) {
        return mozilla::HashString(l);
    }
    static bool match(const char* key, Lookup lookup) {
        return strcmp(key, lookup) == 0;
    }
};
# 708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
template <typename HashPolicy>
struct FallibleHashMethods
{


    template <typename Lookup> static bool hasHash(Lookup&& l) { return true; }



    template <typename Lookup> static bool ensureHash(Lookup&& l) { return true; }
};

template <typename HashPolicy, typename Lookup>
static bool
HasHash(Lookup&& l) {
    return FallibleHashMethods<typename HashPolicy::Base>::hasHash(mozilla::Forward<Lookup>(l));
}

template <typename HashPolicy, typename Lookup>
static bool
EnsureHash(Lookup&& l) {
    return FallibleHashMethods<typename HashPolicy::Base>::ensureHash(mozilla::Forward<Lookup>(l));
}
# 739 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
template <class Key, class Value>
class HashMapEntry
{
    Key key_;
    Value value_;

    template <class, class, class> friend class detail::HashTable;
    template <class> friend class detail::HashTableEntry;
    template <class, class, class, class> friend class HashMap;

  public:
    template<typename KeyInput, typename ValueInput>
    HashMapEntry(KeyInput&& k, ValueInput&& v)
      : key_(mozilla::Forward<KeyInput>(k)),
        value_(mozilla::Forward<ValueInput>(v))
    {}

    HashMapEntry(HashMapEntry&& rhs)
      : key_(mozilla::Move(rhs.key_)),
        value_(mozilla::Move(rhs.value_))
    {}

    void operator=(HashMapEntry&& rhs) {
        key_ = mozilla::Move(rhs.key_);
        value_ = mozilla::Move(rhs.value_);
    }

    typedef Key KeyType;
    typedef Value ValueType;

    const Key& key() const { return key_; }
    Key& mutableKey() { return key_; }
    const Value& value() const { return value_; }
    Value& value() { return value_; }

  private:
    HashMapEntry(const HashMapEntry&) = delete;
    void operator=(const HashMapEntry&) = delete;
};

}

namespace mozilla {

template <typename T>
struct IsPod<js::detail::HashTableEntry<T> > : IsPod<T> {};

template <typename K, typename V>
struct IsPod<js::HashMapEntry<K, V> >
  : IntegralConstant<bool, IsPod<K>::value && IsPod<V>::value>
{};

}

namespace js {

namespace detail {

template <class T, class HashPolicy, class AllocPolicy>
class HashTable;

template <class T>
class HashTableEntry
{
    template <class, class, class> friend class HashTable;
    typedef typename mozilla::RemoveConst<T>::Type NonConstT;

    HashNumber keyHash;
    mozilla::AlignedStorage2<NonConstT> mem;

    static const HashNumber sFreeKey = 0;
    static const HashNumber sRemovedKey = 1;
    static const HashNumber sCollisionBit = 1;

    static bool isLiveHash(HashNumber hash)
    {
        return hash > sRemovedKey;
    }

    HashTableEntry(const HashTableEntry&) = delete;
    void operator=(const HashTableEntry&) = delete;
    ~HashTableEntry() = delete;

  public:


    void destroyIfLive() {
        if (isLive())
            mem.addr()->~T();
    }

    void destroy() {
        do { } while (0);
        mem.addr()->~T();
    }

    void swap(HashTableEntry* other) {
        if (this == other)
            return;
        do { } while (0);
        if (other->isLive()) {
            mozilla::Swap(*mem.addr(), *other->mem.addr());
        } else {
            *other->mem.addr() = mozilla::Move(*mem.addr());
            destroy();
        }
        mozilla::Swap(keyHash, other->keyHash);
    }

    T& get() { do { } while (0); return *mem.addr(); }
    NonConstT& getMutable() { do { } while (0); return *mem.addr(); }

    bool isFree() const { return keyHash == sFreeKey; }
    void clearLive() { do { } while (0); keyHash = sFreeKey; mem.addr()->~T(); }
    void clear() { if (isLive()) mem.addr()->~T(); keyHash = sFreeKey; }
    bool isRemoved() const { return keyHash == sRemovedKey; }
    void removeLive() { do { } while (0); keyHash = sRemovedKey; mem.addr()->~T(); }
    bool isLive() const { return isLiveHash(keyHash); }
    void setCollision() { do { } while (0); keyHash |= sCollisionBit; }
    void unsetCollision() { keyHash &= ~sCollisionBit; }
    bool hasCollision() const { return keyHash & sCollisionBit; }
    bool matchHash(HashNumber hn) { return (keyHash & ~sCollisionBit) == hn; }
    HashNumber getKeyHash() const { return keyHash & ~sCollisionBit; }

    template <typename... Args>
    void setLive(HashNumber hn, Args&&... args)
    {
        do { } while (0);
        keyHash = hn;
        new(mem.addr()) T(mozilla::Forward<Args>(args)...);
        do { } while (0);
    }
};

template <class T, class HashPolicy, class AllocPolicy>
class HashTable : private AllocPolicy
{
    friend class mozilla::ReentrancyGuard;

    typedef typename mozilla::RemoveConst<T>::Type NonConstT;
    typedef typename HashPolicy::KeyType Key;
    typedef typename HashPolicy::Lookup Lookup;

  public:
    typedef HashTableEntry<T> Entry;





    class Ptr
    {
        friend class HashTable;

        Entry* entry_;

        const HashTable* table_;
        Generation generation;


      protected:
        Ptr(Entry& entry, const HashTable& tableArg)
          : entry_(&entry)

          , table_(&tableArg)
          , generation(tableArg.generation())

        {}

      public:
        Ptr()
          : entry_(nullptr)

          , table_(nullptr)
          , generation(0)

        {}

        bool isValid() const {
            return !entry_;
        }

        bool found() const {
            if (isValid())
                return false;

            do { } while (0);

            return entry_->isLive();
        }

        explicit operator bool() const {
            return found();
        }

        bool operator==(const Ptr& rhs) const {
            do { } while (0);
            return entry_ == rhs.entry_;
        }

        bool operator!=(const Ptr& rhs) const {

            do { } while (0);

            return !(*this == rhs);
        }

        T& operator*() const {

            do { } while (0);
            do { } while (0);

            return entry_->get();
        }

        T* operator->() const {

            do { } while (0);
            do { } while (0);

            return &entry_->get();
        }
    };


    class AddPtr : public Ptr
    {
        friend class HashTable;
        HashNumber keyHash;

        uint64_t mutationCount;


        AddPtr(Entry& entry, const HashTable& tableArg, HashNumber hn)
          : Ptr(entry, tableArg)
          , keyHash(hn)

          , mutationCount(tableArg.mutationCount)

        {}

      public:
        AddPtr() : keyHash(0) {}
    };





    class Range
    {
      protected:
        friend class HashTable;

        Range(const HashTable& tableArg, Entry* c, Entry* e)
          : cur(c)
          , end(e)

          , table_(&tableArg)
          , mutationCount(tableArg.mutationCount)
          , generation(tableArg.generation())
          , validEntry(true)

        {
            while (cur < end && !cur->isLive())
                ++cur;
        }

        Entry* cur;
        Entry* end;

        const HashTable* table_;
        uint64_t mutationCount;
        Generation generation;
        bool validEntry;


      public:
        Range()
          : cur(nullptr)
          , end(nullptr)

          , table_(nullptr)
          , mutationCount(0)
          , generation(0)
          , validEntry(false)

        {}

        bool empty() const {

            do { } while (0);
            do { } while (0);

            return cur == end;
        }

        T& front() const {
            do { } while (0);

            do { } while (0);
            do { } while (0);
            do { } while (0);

            return cur->get();
        }

        void popFront() {
            do { } while (0);

            do { } while (0);
            do { } while (0);

            while (++cur < end && !cur->isLive())
                continue;

            validEntry = true;

        }
    };






    class Enum : public Range
    {
        friend class HashTable;

        HashTable& table_;
        bool rekeyed;
        bool removed;


        Enum(const Enum&) = delete;
        void operator=(const Enum&) = delete;

      public:
        template<class Map> explicit
        Enum(Map& map) : Range(map.all()), table_(map.impl), rekeyed(false), removed(false) {}
# 1088 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/HashTable.h"
        void removeFront() {
            table_.remove(*this->cur);
            removed = true;

            this->validEntry = false;
            this->mutationCount = table_.mutationCount;

        }

        NonConstT& mutableFront() {
            do { } while (0);

            do { } while (0);
            do { } while (0);
            do { } while (0);

            return this->cur->getMutable();
        }




        void rekeyFront(const Lookup& l, const Key& k) {
            do { } while (0);
            Ptr p(*this->cur, table_);
            table_.rekeyWithoutRehash(p, l, k);
            rekeyed = true;

            this->validEntry = false;
            this->mutationCount = table_.mutationCount;

        }

        void rekeyFront(const Key& k) {
            rekeyFront(k, k);
        }


        ~Enum() {
            if (rekeyed) {
                table_.gen++;
                table_.checkOverRemoved();
            }

            if (removed)
                table_.compactIfUnderloaded();
        }
    };


    HashTable(HashTable&& rhs)
      : AllocPolicy(rhs)
    {
        mozilla::PodAssign(this, &rhs);
        rhs.table = nullptr;
    }
    void operator=(HashTable&& rhs) {
        do { } while (0);
        if (table)
            destroyTable(*this, table, capacity());
        mozilla::PodAssign(this, &rhs);
        rhs.table = nullptr;
    }

  private:

    HashTable(const HashTable&) = delete;
    void operator=(const HashTable&) = delete;

  private:
    static const size_t CAP_BITS = 30;

  public:
    uint64_t gen:56;
    uint64_t hashShift:8;
    Entry* table;
    uint32_t entryCount;
    uint32_t removedCount;


    uint64_t mutationCount;
    mutable bool mEntered;


    mutable struct Stats
    {
        uint32_t searches;
        uint32_t steps;
        uint32_t hits;
        uint32_t misses;
        uint32_t addOverRemoved;
        uint32_t removes;
        uint32_t removeFrees;
        uint32_t grows;
        uint32_t shrinks;
        uint32_t compresses;
        uint32_t rehashes;
    } stats;







    static const unsigned sMinCapacityLog2 = 2;
    static const unsigned sMinCapacity = 1 << sMinCapacityLog2;
    static const unsigned sMaxInit = ((uint32_t)1 << (CAP_BITS - 1));
    static const unsigned sMaxCapacity = ((uint32_t)1 << (CAP_BITS));
    static const unsigned sHashBits = mozilla::tl::BitSize<HashNumber>::value;



    static const uint8_t sAlphaDenominator = 4;
    static const uint8_t sMinAlphaNumerator = 1;
    static const uint8_t sMaxAlphaNumerator = 3;

    static const HashNumber sFreeKey = Entry::sFreeKey;
    static const HashNumber sRemovedKey = Entry::sRemovedKey;
    static const HashNumber sCollisionBit = Entry::sCollisionBit;

    void setTableSizeLog2(unsigned sizeLog2)
    {
        hashShift = sHashBits - sizeLog2;
    }

    static bool isLiveHash(HashNumber hash)
    {
        return Entry::isLiveHash(hash);
    }

    static HashNumber prepareHash(const Lookup& l)
    {
        HashNumber keyHash = ScrambleHashCode(HashPolicy::hash(l));


        if (!isLiveHash(keyHash))
            keyHash -= (sRemovedKey + 1);
        return keyHash & ~sCollisionBit;
    }

    enum FailureBehavior { DontReportFailure = false, ReportFailure = true };

    static Entry* createTable(AllocPolicy& alloc, uint32_t capacity,
                              FailureBehavior reportFailure = ReportFailure)
    {
        static_assert(sFreeKey == 0,
                      "newly-calloc'd tables have to be considered empty");
        if (reportFailure)
            return alloc.template pod_calloc<Entry>(capacity);

        return alloc.template maybe_pod_calloc<Entry>(capacity);
    }

    static Entry* maybeCreateTable(AllocPolicy& alloc, uint32_t capacity)
    {
        static_assert(sFreeKey == 0,
                      "newly-calloc'd tables have to be considered empty");
        return alloc.template maybe_pod_calloc<Entry>(capacity);
    }

    static void destroyTable(AllocPolicy& alloc, Entry* oldTable, uint32_t capacity)
    {
        Entry* end = oldTable + capacity;
        for (Entry* e = oldTable; e < end; ++e)
            e->destroyIfLive();
        alloc.free_(oldTable);
    }

  public:
    explicit HashTable(AllocPolicy ap)
      : AllocPolicy(ap)
      , gen(0)
      , hashShift(sHashBits)
      , table(nullptr)
      , entryCount(0)
      , removedCount(0)

      , mutationCount(0)
      , mEntered(false)

    {}

    __attribute__ ((warn_unused_result)) bool init(uint32_t length)
    {
        do { } while (0);




        if ((__builtin_expect(!!(length > sMaxInit), 0))) {
            this->reportAllocOverflow();
            return false;
        }

        static_assert((sMaxInit * sAlphaDenominator) / sAlphaDenominator == sMaxInit,
                      "multiplication in numerator below could overflow");
        static_assert(sMaxInit * sAlphaDenominator <= (4294967295U) - sMaxAlphaNumerator,
                      "numerator calculation below could potentially overflow");




        uint32_t newCapacity =
            (length * sAlphaDenominator + sMaxAlphaNumerator - 1) / sMaxAlphaNumerator;
        if (newCapacity < sMinCapacity)
            newCapacity = sMinCapacity;


        uint32_t roundUp = sMinCapacity, roundUpLog2 = sMinCapacityLog2;
        while (roundUp < newCapacity) {
            roundUp <<= 1;
            ++roundUpLog2;
        }

        newCapacity = roundUp;
        do { } while (0);
        do { } while (0);

        table = createTable(*this, newCapacity);
        if (!table)
            return false;

        setTableSizeLog2(roundUpLog2);
        memset(&stats, 0, sizeof(stats));
        return true;
    }

    bool initialized() const
    {
        return !!table;
    }

    ~HashTable()
    {
        if (table)
            destroyTable(*this, table, capacity());
    }

  private:
    HashNumber hash1(HashNumber hash0) const
    {
        return hash0 >> hashShift;
    }

    struct DoubleHash
    {
        HashNumber h2;
        HashNumber sizeMask;
    };

    DoubleHash hash2(HashNumber curKeyHash) const
    {
        unsigned sizeLog2 = sHashBits - hashShift;
        DoubleHash dh = {
            ((curKeyHash << sizeLog2) >> hashShift) | 1,
            (HashNumber(1) << sizeLog2) - 1
        };
        return dh;
    }

    static HashNumber applyDoubleHash(HashNumber h1, const DoubleHash& dh)
    {
        return (h1 - dh.h2) & dh.sizeMask;
    }

    bool overloaded()
    {
        static_assert(sMaxCapacity <= (4294967295U) / sMaxAlphaNumerator,
                      "multiplication below could overflow");
        return entryCount + removedCount >=
               capacity() * sMaxAlphaNumerator / sAlphaDenominator;
    }


    static bool wouldBeUnderloaded(uint32_t capacity, uint32_t entryCount)
    {
        static_assert(sMaxCapacity <= (4294967295U) / sMinAlphaNumerator,
                      "multiplication below could overflow");
        return capacity > sMinCapacity &&
               entryCount <= capacity * sMinAlphaNumerator / sAlphaDenominator;
    }

    bool underloaded()
    {
        return wouldBeUnderloaded(capacity(), entryCount);
    }

    static __attribute__((always_inline)) inline bool match(Entry& e, const Lookup& l)
    {
        return HashPolicy::match(HashPolicy::getKey(e.get()), l);
    }






    __attribute__((always_inline)) inline Entry&
    lookup(const Lookup& l, HashNumber keyHash, unsigned collisionBit) const
    {
        do { } while (0);
        do { } while (0);
        do { } while (0);
        do { } while (0);
        stats.searches++;


        HashNumber h1 = hash1(keyHash);
        Entry* entry = &table[h1];


        if (entry->isFree()) {
            stats.misses++;
            return *entry;
        }


        if (entry->matchHash(keyHash) && match(*entry, l)) {
            stats.hits++;
            return *entry;
        }


        DoubleHash dh = hash2(keyHash);


        Entry* firstRemoved = nullptr;

        while (true) {
            if ((__builtin_expect(!!(entry->isRemoved()), 0))) {
                if (!firstRemoved)
                    firstRemoved = entry;
            } else {
                if (collisionBit == sCollisionBit)
                    entry->setCollision();
            }

            stats.steps++;
            h1 = applyDoubleHash(h1, dh);

            entry = &table[h1];
            if (entry->isFree()) {
                stats.misses++;
                return firstRemoved ? *firstRemoved : *entry;
            }

            if (entry->matchHash(keyHash) && match(*entry, l)) {
                stats.hits++;
                return *entry;
            }
        }
    }







    Entry& findFreeEntry(HashNumber keyHash)
    {
        do { } while (0);
        do { } while (0);
        stats.searches++;




        HashNumber h1 = hash1(keyHash);
        Entry* entry = &table[h1];


        if (!entry->isLive()) {
            stats.misses++;
            return *entry;
        }


        DoubleHash dh = hash2(keyHash);

        while (true) {
            do { } while (0);
            entry->setCollision();

            stats.steps++;
            h1 = applyDoubleHash(h1, dh);

            entry = &table[h1];
            if (!entry->isLive()) {
                stats.misses++;
                return *entry;
            }
        }
    }

    enum RebuildStatus { NotOverloaded, Rehashed, RehashFailed };

    RebuildStatus changeTableSize(int deltaLog2, FailureBehavior reportFailure = ReportFailure)
    {

        Entry* oldTable = table;
        uint32_t oldCap = capacity();
        uint32_t newLog2 = sHashBits - hashShift + deltaLog2;
        uint32_t newCapacity = ((uint32_t)1 << (newLog2));
        if ((__builtin_expect(!!(newCapacity > sMaxCapacity), 0))) {
            if (reportFailure)
                this->reportAllocOverflow();
            return RehashFailed;
        }

        Entry* newTable = createTable(*this, newCapacity, reportFailure);
        if (!newTable)
            return RehashFailed;


        setTableSizeLog2(newLog2);
        removedCount = 0;
        gen++;
        table = newTable;


        Entry* end = oldTable + oldCap;
        for (Entry* src = oldTable; src < end; ++src) {
            if (src->isLive()) {
                HashNumber hn = src->getKeyHash();
                findFreeEntry(hn).setLive(
                    hn, mozilla::Move(const_cast<typename Entry::NonConstT&>(src->get())));
                src->destroy();
            }
        }


        this->free_(oldTable);
        return Rehashed;
    }

    bool shouldCompressTable()
    {

        return removedCount >= (capacity() >> 2);
    }

    RebuildStatus checkOverloaded(FailureBehavior reportFailure = ReportFailure)
    {
        if (!overloaded())
            return NotOverloaded;

        int deltaLog2;
        if (shouldCompressTable()) {
            stats.compresses++;
            deltaLog2 = 0;
        } else {
            stats.grows++;
            deltaLog2 = 1;
        }

        return changeTableSize(deltaLog2, reportFailure);
    }


    void checkOverRemoved()
    {
        if (overloaded()) {
            if (checkOverloaded(DontReportFailure) == RehashFailed)
                rehashTableInPlace();
        }
    }

    void remove(Entry& e)
    {
        do { } while (0);
        stats.removes++;

        if (e.hasCollision()) {
            e.removeLive();
            removedCount++;
        } else {
            stats.removeFrees++;
            e.clearLive();
        }
        entryCount--;

        mutationCount++;

    }

    void checkUnderloaded()
    {
        if (underloaded()) {
            stats.shrinks++;
            (void) changeTableSize(-1, DontReportFailure);
        }
    }




    void compactIfUnderloaded()
    {
        int32_t resizeLog2 = 0;
        uint32_t newCapacity = capacity();
        while (wouldBeUnderloaded(newCapacity, entryCount)) {
            newCapacity = newCapacity >> 1;
            resizeLog2--;
        }

        if (resizeLog2 != 0)
            (void) changeTableSize(resizeLog2, DontReportFailure);
    }






    void rehashTableInPlace()
    {
        stats.rehashes++;
        removedCount = 0;
        for (size_t i = 0; i < capacity(); ++i)
            table[i].unsetCollision();

        for (size_t i = 0; i < capacity();) {
            Entry* src = &table[i];

            if (!src->isLive() || src->hasCollision()) {
                ++i;
                continue;
            }

            HashNumber keyHash = src->getKeyHash();
            HashNumber h1 = hash1(keyHash);
            DoubleHash dh = hash2(keyHash);
            Entry* tgt = &table[h1];
            while (true) {
                if (!tgt->hasCollision()) {
                    src->swap(tgt);
                    tgt->setCollision();
                    break;
                }

                h1 = applyDoubleHash(h1, dh);
                tgt = &table[h1];
            }
        }






    }






    template <typename... Args>
    void putNewInfallibleInternal(const Lookup& l, Args&&... args)
    {
        do { } while (0);

        HashNumber keyHash = prepareHash(l);
        Entry* entry = &findFreeEntry(keyHash);
        do { } while (0);

        if (entry->isRemoved()) {
            stats.addOverRemoved++;
            removedCount--;
            keyHash |= sCollisionBit;
        }

        entry->setLive(keyHash, mozilla::Forward<Args>(args)...);
        entryCount++;

        mutationCount++;

    }

  public:
    void clear()
    {
        if (mozilla::IsPod<Entry>::value) {
            memset(table, 0, sizeof(*table) * capacity());
        } else {
            uint32_t tableCapacity = capacity();
            Entry* end = table + tableCapacity;
            for (Entry* e = table; e < end; ++e)
                e->clear();
        }
        removedCount = 0;
        entryCount = 0;

        mutationCount++;

    }

    void clearAndShrink()
    {
        clear();
        compactIfUnderloaded();
    }

    void finish()
    {

        do { } while (0);

        if (!table)
            return;

        destroyTable(*this, table, capacity());
        table = nullptr;
        gen++;
        entryCount = 0;
        removedCount = 0;

        mutationCount++;

    }

    Range all() const
    {
        do { } while (0);
        return Range(*this, table, table + capacity());
    }

    bool empty() const
    {
        do { } while (0);
        return !entryCount;
    }

    uint32_t count() const
    {
        do { } while (0);
        return entryCount;
    }

    uint32_t capacity() const
    {
        do { } while (0);
        return ((uint32_t)1 << (sHashBits - hashShift));
    }

    Generation generation() const
    {
        do { } while (0);
        return Generation(gen);
    }

    size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const
    {
        return mallocSizeOf(table);
    }

    size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const
    {
        return mallocSizeOf(this) + sizeOfExcludingThis(mallocSizeOf);
    }

    __attribute__((always_inline)) inline Ptr lookup(const Lookup& l) const
    {
        mozilla::ReentrancyGuard g(*this);
        if (!HasHash<HashPolicy>(l))
            return Ptr();
        HashNumber keyHash = prepareHash(l);
        return Ptr(lookup(l, keyHash, 0), *this);
    }

    __attribute__((always_inline)) inline Ptr readonlyThreadsafeLookup(const Lookup& l) const
    {
        if (!HasHash<HashPolicy>(l))
            return Ptr();
        HashNumber keyHash = prepareHash(l);
        return Ptr(lookup(l, keyHash, 0), *this);
    }

    __attribute__((always_inline)) inline AddPtr lookupForAdd(const Lookup& l) const
    {
        mozilla::ReentrancyGuard g(*this);
        if (!EnsureHash<HashPolicy>(l))
            return AddPtr();
        HashNumber keyHash = prepareHash(l);
        Entry& entry = lookup(l, keyHash, sCollisionBit);
        AddPtr p(entry, *this, keyHash);
        return p;
    }

    template <typename... Args>
    __attribute__ ((warn_unused_result)) bool add(AddPtr& p, Args&&... args)
    {
        mozilla::ReentrancyGuard g(*this);
        do { } while (0);
        do { } while (0);
        do { } while (0);


        if (p.isValid())
            return false;



        if (p.entry_->isRemoved()) {
            if (!this->checkSimulatedOOM())
                return false;
            stats.addOverRemoved++;
            removedCount--;
            p.keyHash |= sCollisionBit;
        } else {

            RebuildStatus status = checkOverloaded();
            if (status == RehashFailed)
                return false;
            if (status == NotOverloaded && !this->checkSimulatedOOM())
                return false;
            if (status == Rehashed)
                p.entry_ = &findFreeEntry(p.keyHash);
        }

        p.entry_->setLive(p.keyHash, mozilla::Forward<Args>(args)...);
        entryCount++;

        mutationCount++;
        p.generation = generation();
        p.mutationCount = mutationCount;

        return true;
    }



    template <typename... Args>
    void putNewInfallible(const Lookup& l, Args&&... args)
    {
        do { } while (0);
        mozilla::ReentrancyGuard g(*this);
        putNewInfallibleInternal(l, mozilla::Forward<Args>(args)...);
    }



    template <typename... Args>
    __attribute__ ((warn_unused_result)) bool putNew(const Lookup& l, Args&&... args)
    {
        if (!this->checkSimulatedOOM())
            return false;

        if (!EnsureHash<HashPolicy>(l))
            return false;

        if (checkOverloaded() == RehashFailed)
            return false;

        putNewInfallible(l, mozilla::Forward<Args>(args)...);
        return true;
    }



    template <typename... Args>
    __attribute__ ((warn_unused_result)) bool relookupOrAdd(AddPtr& p, const Lookup& l, Args&&... args)
    {

        if (p.isValid())
            return false;


        p.generation = generation();
        p.mutationCount = mutationCount;

        {
            mozilla::ReentrancyGuard g(*this);
            do { } while (0);
            p.entry_ = &lookup(l, p.keyHash, sCollisionBit);
        }
        return p.found() || add(p, mozilla::Forward<Args>(args)...);
    }

    void remove(Ptr p)
    {
        do { } while (0);
        mozilla::ReentrancyGuard g(*this);
        do { } while (0);
        remove(*p.entry_);
        checkUnderloaded();
    }

    void rekeyWithoutRehash(Ptr p, const Lookup& l, const Key& k)
    {
        do { } while (0);
        mozilla::ReentrancyGuard g(*this);
        do { } while (0);
        typename HashTableEntry<T>::NonConstT t(mozilla::Move(*p));
        HashPolicy::setKey(t, const_cast<Key&>(k));
        remove(*p.entry_);
        putNewInfallibleInternal(l, mozilla::Move(t));
    }

    void rekeyAndMaybeRehash(Ptr p, const Lookup& l, const Key& k)
    {
        rekeyWithoutRehash(p, l, k);
        checkOverRemoved();
    }


};

}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h" 2



class JSTracer;

namespace JS {
class CallbackTracer;
template <typename T> class Heap;
template <typename T> class TenuredHeap;


const char*
GCTraceKindToAscii(JS::TraceKind kind);

}

enum WeakMapTraceKind {




    DoNotTraceWeakMaps,





    ExpandWeakMaps,





    TraceWeakMapValues,





    TraceWeakMapKeysValues
};

class JSTracer
{
  public:

    JSRuntime* runtime() const { return runtime_; }


    WeakMapTraceKind weakMapAction() const { return weakMapAction_; }

    enum class TracerKindTag {



        Marking,





        WeakMarking,



        Tenuring,



        Callback
    };
    bool isMarkingTracer() const { return tag_ == TracerKindTag::Marking || tag_ == TracerKindTag::WeakMarking; }
    bool isWeakMarkingTracer() const { return tag_ == TracerKindTag::WeakMarking; }
    bool isTenuringTracer() const { return tag_ == TracerKindTag::Tenuring; }
    bool isCallbackTracer() const { return tag_ == TracerKindTag::Callback; }
    inline JS::CallbackTracer* asCallbackTracer();
    bool traceWeakEdges() const { return traceWeakEdges_; }




  protected:
    JSTracer(JSRuntime* rt, TracerKindTag tag,
             WeakMapTraceKind weakTraceKind = TraceWeakMapValues)
      : runtime_(rt)
      , weakMapAction_(weakTraceKind)



      , tag_(tag)
      , traceWeakEdges_(true)
    {}
# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h"
  private:
    JSRuntime* runtime_;
    WeakMapTraceKind weakMapAction_;




  protected:
    TracerKindTag tag_;
    bool traceWeakEdges_;
};

namespace JS {

class AutoTracingName;
class AutoTracingIndex;
class AutoTracingCallback;

class CallbackTracer : public JSTracer
{
  public:
    CallbackTracer(JSRuntime* rt, WeakMapTraceKind weakTraceKind = TraceWeakMapValues)
      : JSTracer(rt, JSTracer::TracerKindTag::Callback, weakTraceKind),
        contextName_(nullptr), contextIndex_(InvalidIndex), contextFunctor_(nullptr)
    {}
    CallbackTracer(JSContext* cx, WeakMapTraceKind weakTraceKind = TraceWeakMapValues);






    virtual void onObjectEdge(JSObject** objp) { onChild(JS::GCCellPtr(*objp)); }
    virtual void onStringEdge(JSString** strp) { onChild(JS::GCCellPtr(*strp)); }
    virtual void onSymbolEdge(JS::Symbol** symp) { onChild(JS::GCCellPtr(*symp)); }
    virtual void onScriptEdge(JSScript** scriptp) { onChild(JS::GCCellPtr(*scriptp)); }
    virtual void onShapeEdge(js::Shape** shapep) {
        onChild(JS::GCCellPtr(*shapep, JS::TraceKind::Shape));
    }
    virtual void onObjectGroupEdge(js::ObjectGroup** groupp) {
        onChild(JS::GCCellPtr(*groupp, JS::TraceKind::ObjectGroup));
    }
    virtual void onBaseShapeEdge(js::BaseShape** basep) {
        onChild(JS::GCCellPtr(*basep, JS::TraceKind::BaseShape));
    }
    virtual void onJitCodeEdge(js::jit::JitCode** codep) {
        onChild(JS::GCCellPtr(*codep, JS::TraceKind::JitCode));
    }
    virtual void onLazyScriptEdge(js::LazyScript** lazyp) {
        onChild(JS::GCCellPtr(*lazyp, JS::TraceKind::LazyScript));
    }
    virtual void onScopeEdge(js::Scope** scopep) {
        onChild(JS::GCCellPtr(*scopep, JS::TraceKind::Scope));
    }
    virtual void onRegExpSharedEdge(js::RegExpShared** sharedp) {
        onChild(JS::GCCellPtr(*sharedp, JS::TraceKind::RegExpShared));
    }



    virtual void onChild(const JS::GCCellPtr& thing) = 0;
# 195 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h"
    const char* contextName() const { do { } while (0); return contextName_; }




    const static size_t InvalidIndex = size_t(-1);
    size_t contextIndex() const { return contextIndex_; }






    void getTracingEdgeName(char* buffer, size_t bufferSize);






    class ContextFunctor {
      public:
        virtual void operator()(CallbackTracer* trc, char* buf, size_t bufsize) = 0;
    };
# 230 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h"
    void dispatchToOnEdge(JSObject** objp) { onObjectEdge(objp); }
    void dispatchToOnEdge(JSString** strp) { onStringEdge(strp); }
    void dispatchToOnEdge(JS::Symbol** symp) { onSymbolEdge(symp); }
    void dispatchToOnEdge(JSScript** scriptp) { onScriptEdge(scriptp); }
    void dispatchToOnEdge(js::Shape** shapep) { onShapeEdge(shapep); }
    void dispatchToOnEdge(js::ObjectGroup** groupp) { onObjectGroupEdge(groupp); }
    void dispatchToOnEdge(js::BaseShape** basep) { onBaseShapeEdge(basep); }
    void dispatchToOnEdge(js::jit::JitCode** codep) { onJitCodeEdge(codep); }
    void dispatchToOnEdge(js::LazyScript** lazyp) { onLazyScriptEdge(lazyp); }
    void dispatchToOnEdge(js::Scope** scopep) { onScopeEdge(scopep); }
    void dispatchToOnEdge(js::RegExpShared** sharedp) { onRegExpSharedEdge(sharedp); }

  protected:
    void setTraceWeakEdges(bool value) {
        traceWeakEdges_ = value;
    }

  private:
    friend class AutoTracingName;
    const char* contextName_;

    friend class AutoTracingIndex;
    size_t contextIndex_;

    friend class AutoTracingDetails;
    ContextFunctor* contextFunctor_;
};


class AutoTracingName
{
    CallbackTracer* trc_;
    const char* prior_;

  public:
    AutoTracingName(CallbackTracer* trc, const char* name) : trc_(trc), prior_(trc->contextName_) {
        do { } while (0);
        trc->contextName_ = name;
    }
    ~AutoTracingName() {
        do { } while (0);
        trc_->contextName_ = prior_;
    }
};


class AutoTracingIndex
{
    CallbackTracer* trc_;

  public:
    explicit AutoTracingIndex(JSTracer* trc, size_t initial = 0) : trc_(nullptr) {
        if (trc->isCallbackTracer()) {
            trc_ = trc->asCallbackTracer();
            do { } while (0);
            trc_->contextIndex_ = initial;
        }
    }
    ~AutoTracingIndex() {
        if (trc_) {
            do { } while (0);
            trc_->contextIndex_ = CallbackTracer::InvalidIndex;
        }
    }

    void operator++() {
        if (trc_) {
            do { } while (0);
            ++trc_->contextIndex_;
        }
    }
};



class AutoTracingDetails
{
    CallbackTracer* trc_;

  public:
    AutoTracingDetails(JSTracer* trc, CallbackTracer::ContextFunctor& func) : trc_(nullptr) {
        if (trc->isCallbackTracer()) {
            trc_ = trc->asCallbackTracer();
            do { } while (0);
            trc_->contextFunctor_ = &func;
        }
    }
    ~AutoTracingDetails() {
        if (trc_) {
            do { } while (0);
            trc_->contextFunctor_ = nullptr;
        }
    }
};

}

JS::CallbackTracer*
JSTracer::asCallbackTracer()
{
    do { } while (0);
    return static_cast<JS::CallbackTracer*>(this);
}

namespace JS {
# 350 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/TracingAPI.h"
template <typename T>
extern void
TraceEdge(JSTracer* trc, JS::Heap<T>* edgep, const char* name);

extern void
TraceEdge(JSTracer* trc, JS::TenuredHeap<JSObject*>* edgep, const char* name);







template <typename T>
extern void
UnsafeTraceRoot(JSTracer* trc, T* edgep, const char* name);

extern void
TraceChildren(JSTracer* trc, GCCellPtr thing);

using ZoneSet = js::HashSet<Zone*, js::DefaultHasher<Zone*>, js::SystemAllocPolicy>;
using CompartmentSet = js::HashSet<JSCompartment*, js::DefaultHasher<JSCompartment*>,
                                   js::SystemAllocPolicy>;






extern void
TraceIncomingCCWs(JSTracer* trc, const JS::CompartmentSet& compartments);

}

extern void
JS_GetTraceThingInfo(char* buf, size_t bufsize, JSTracer* trc,
                     void* thing, JS::TraceKind kind, bool includeDetails);

namespace js {






template <typename T>
extern void
UnsafeTraceManuallyBarrieredEdge(JSTracer* trc, T* edgep, const char* name);

namespace gc {


template <typename T>
extern bool
EdgeNeedsSweep(JS::Heap<T>* edgep);



template <typename T>
bool
IsAboutToBeFinalizedUnbarriered(T* thingp);

}
}
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h" 2
# 65 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCPolicyAPI.h"
class JSAtom;
class JSFunction;
class JSObject;
class JSScript;
class JSString;
namespace JS {
class Symbol;
}

namespace JS {



template <typename T>
struct StructGCPolicy
{
    static T initial() {
        return T();
    }

    static void trace(JSTracer* trc, T* tp, const char* name) {
        tp->trace(trc);
    }

    static void sweep(T* tp) {
        return tp->sweep();
    }

    static bool needsSweep(T* tp) {
        return tp->needsSweep();
    }
};





template <typename T> struct GCPolicy : public StructGCPolicy<T> {};


template <typename T>
struct IgnoreGCPolicy {
    static T initial() { return T(); }
    static void trace(JSTracer* trc, T* t, const char* name) {}
    static bool needsSweep(T* v) { return false; }
};
template <> struct GCPolicy<uint32_t> : public IgnoreGCPolicy<uint32_t> {};
template <> struct GCPolicy<uint64_t> : public IgnoreGCPolicy<uint64_t> {};

template <typename T>
struct GCPointerPolicy
{
    static T initial() { return nullptr; }
    static void trace(JSTracer* trc, T* vp, const char* name) {
        if (*vp)
            js::UnsafeTraceManuallyBarrieredEdge(trc, vp, name);
    }
    static bool needsSweep(T* vp) {
        if (*vp)
            return js::gc::IsAboutToBeFinalizedUnbarriered(vp);
        return false;
    }
};
template <> struct GCPolicy<JS::Symbol*> : public GCPointerPolicy<JS::Symbol*> {};
template <> struct GCPolicy<JSAtom*> : public GCPointerPolicy<JSAtom*> {};
template <> struct GCPolicy<JSFunction*> : public GCPointerPolicy<JSFunction*> {};
template <> struct GCPolicy<JSObject*> : public GCPointerPolicy<JSObject*> {};
template <> struct GCPolicy<JSScript*> : public GCPointerPolicy<JSScript*> {};
template <> struct GCPolicy<JSString*> : public GCPointerPolicy<JSString*> {};

template <typename T>
struct GCPolicy<JS::Heap<T>>
{
    static void trace(JSTracer* trc, JS::Heap<T>* thingp, const char* name) {
        TraceEdge(trc, thingp, name);
    }
    static bool needsSweep(JS::Heap<T>* thingp) {
        return js::gc::EdgeNeedsSweep(thingp);
    }
};


template <typename T, typename D>
struct GCPolicy<mozilla::UniquePtr<T, D>>
{
    static mozilla::UniquePtr<T,D> initial() { return mozilla::UniquePtr<T,D>(); }
    static void trace(JSTracer* trc, mozilla::UniquePtr<T,D>* tp, const char* name) {
        if (tp->get())
            GCPolicy<T>::trace(trc, tp->get(), name);
    }
    static bool needsSweep(mozilla::UniquePtr<T,D>* tp) {
        if (tp->get())
            return GCPolicy<T>::needsSweep(tp->get());
        return false;
    }
};

}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h" 2
# 110 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
namespace js {

template <typename T>
struct BarrierMethods {
};

template <typename Element, typename Wrapper>
class WrappedPtrOperations {};

template <typename Element, typename Wrapper>
class MutableWrappedPtrOperations : public WrappedPtrOperations<Element, Wrapper> {};

template <typename T, typename Wrapper>
class RootedBase : public MutableWrappedPtrOperations<T, Wrapper> {};

template <typename T, typename Wrapper>
class HandleBase : public WrappedPtrOperations<T, Wrapper> {};

template <typename T, typename Wrapper>
class MutableHandleBase : public MutableWrappedPtrOperations<T, Wrapper> {};

template <typename T, typename Wrapper>
class HeapBase : public MutableWrappedPtrOperations<T, Wrapper> {};


template <typename T> struct IsHeapConstructibleType { static constexpr bool value = false; };


template <> struct IsHeapConstructibleType<JS::Symbol*> { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType<JSAtom*> { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType<JSFunction*> { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType<JSObject*> { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType<JSScript*> { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType<JSString*> { static constexpr bool value = true; };
template <> struct IsHeapConstructibleType<JS::Value> { static constexpr bool value = true; }; template <> struct IsHeapConstructibleType<jsid> { static constexpr bool value = true; };


template <typename T, typename Wrapper>
class PersistentRootedBase : public MutableWrappedPtrOperations<T, Wrapper> {};

namespace gc {
struct Cell;
template<typename T>
struct PersistentRootedMarker;
}
# 182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
}

namespace JS {

template <typename T> class Rooted;
template <typename T> class PersistentRooted;


bool isGCEnabled();

void HeapObjectPostBarrier(JSObject** objp, JSObject* prev, JSObject* next);






extern void
AssertGCThingMustBeTenured(JSObject* obj);
extern void
AssertGCThingIsNotAnObjectSubclass(js::gc::Cell* cell);
# 229 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
class Heap : public js::HeapBase<T, Heap<T>>
{

    static_assert(js::IsHeapConstructibleType<T>::value,
                  "Type T must be a public GC pointer type");
  public:
    using ElementType = T;

    Heap() {
        static_assert(sizeof(T) == sizeof(Heap<T>),
                      "Heap<T> must be binary compatible with T.");
        init(GCPolicy<T>::initial());
    }
    explicit Heap(const T& p) { init(p); }







    explicit Heap(const Heap<T>& p) { init(p.ptr); }

    ~Heap() {
        post(ptr, GCPolicy<T>::initial());
    }

    operator const T&() const { return get(); } const T& operator->() const { return get(); };
    Heap<T>& operator=(const T& p) { set(p); return *this; } Heap<T>& operator=(const Heap<T>& other) { set(other.get()); return *this; };

    const T* address() const { return &ptr; }

    void exposeToActiveJS() const {
        js::BarrierMethods<T>::exposeToJS(ptr);
    }
    const T& get() const {
        exposeToActiveJS();
        return ptr;
    }
    const T& unbarrieredGet() const {
        return ptr;
    }

    T* unsafeGet() { return &ptr; }

    explicit operator bool() const {
        return bool(js::BarrierMethods<T>::asGCThingOrNull(ptr));
    }
    explicit operator bool() {
        return bool(js::BarrierMethods<T>::asGCThingOrNull(ptr));
    }

  private:
    void init(const T& newPtr) {
        ptr = newPtr;
        post(GCPolicy<T>::initial(), ptr);
    }

    void set(const T& newPtr) {
        T tmp = ptr;
        ptr = newPtr;
        post(tmp, ptr);
    }

    void post(const T& prev, const T& next) {
        js::BarrierMethods<T>::postBarrier(&ptr, prev, next);
    }

    T ptr;
};

static __attribute__((always_inline)) inline bool
ObjectIsTenured(JSObject* obj)
{
    return !js::gc::IsInsideNursery(reinterpret_cast<js::gc::Cell*>(obj));
}

static __attribute__((always_inline)) inline bool
ObjectIsTenured(const Heap<JSObject*>& obj)
{
    return ObjectIsTenured(obj.unbarrieredGet());
}

static __attribute__((always_inline)) inline bool
ObjectIsMarkedGray(JSObject* obj)
{
    auto cell = reinterpret_cast<js::gc::Cell*>(obj);
    return js::gc::detail::CellIsMarkedGrayIfKnown(cell);
}

static __attribute__((always_inline)) inline bool
ObjectIsMarkedGray(const JS::Heap<JSObject*>& obj)
{
    return ObjectIsMarkedGray(obj.unbarrieredGet());
}
# 380 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
class TenuredHeap : public js::HeapBase<T, TenuredHeap<T>>
{
  public:
    using ElementType = T;

    TenuredHeap() : bits(0) {
        static_assert(sizeof(T) == sizeof(TenuredHeap<T>),
                      "TenuredHeap<T> must be binary compatible with T.");
    }
    explicit TenuredHeap(T p) : bits(0) { setPtr(p); }
    explicit TenuredHeap(const TenuredHeap<T>& p) : bits(0) { setPtr(p.getPtr()); }

    void setPtr(T newPtr) {
        do { } while (0);
        if (newPtr)
            AssertGCThingMustBeTenured(newPtr);
        bits = (bits & flagsMask) | reinterpret_cast<uintptr_t>(newPtr);
    }

    void setFlags(uintptr_t flagsToSet) {
        do { } while (0);
        bits |= flagsToSet;
    }

    void unsetFlags(uintptr_t flagsToUnset) {
        do { } while (0);
        bits &= ~flagsToUnset;
    }

    bool hasFlag(uintptr_t flag) const {
        do { } while (0);
        return (bits & flag) != 0;
    }

    T unbarrieredGetPtr() const { return reinterpret_cast<T>(bits & ~flagsMask); }
    uintptr_t getFlags() const { return bits & flagsMask; }

    void exposeToActiveJS() const {
        js::BarrierMethods<T>::exposeToJS(unbarrieredGetPtr());
    }
    T getPtr() const {
        exposeToActiveJS();
        return unbarrieredGetPtr();
    }

    operator T() const { return getPtr(); }
    T operator->() const { return getPtr(); }

    explicit operator bool() const {
        return bool(js::BarrierMethods<T>::asGCThingOrNull(unbarrieredGetPtr()));
    }
    explicit operator bool() {
        return bool(js::BarrierMethods<T>::asGCThingOrNull(unbarrieredGetPtr()));
    }

    TenuredHeap<T>& operator=(T p) {
        setPtr(p);
        return *this;
    }

    TenuredHeap<T>& operator=(const TenuredHeap<T>& other) {
        bits = other.bits;
        return *this;
    }

  private:
    enum {
        maskBits = 3,
        flagsMask = (1 << maskBits) - 1,
    };

    uintptr_t bits;
};
# 463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
class Handle : public js::HandleBase<T, Handle<T>>
{
    friend class JS::MutableHandle<T>;

  public:
    using ElementType = T;


    template <typename S>
                 Handle(Handle<S> handle,
                        typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy = 0)
    {
        static_assert(sizeof(Handle<T>) == sizeof(T*),
                      "Handle must be binary compatible with T*.");
        ptr = reinterpret_cast<const T*>(handle.address());
    }

                 Handle(decltype(nullptr)) {
        static_assert(mozilla::IsPointer<T>::value,
                      "nullptr_t overload not valid for non-pointer types");
        static void* const ConstNullValue = nullptr;
        ptr = reinterpret_cast<const T*>(&ConstNullValue);
    }

                 Handle(MutableHandle<T> handle) {
        ptr = handle.address();
    }
# 507 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
    static constexpr Handle fromMarkedLocation(const T* p) {
        return Handle(p, DeliberatelyChoosingThisOverload,
                      ImUsingThisOnlyInFromFromMarkedLocation);
    }





    template <typename S>
    inline
                 Handle(const Rooted<S>& root,
                        typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy = 0);

    template <typename S>
    inline
                 Handle(const PersistentRooted<S>& root,
                        typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy = 0);


    template <typename S>
    inline
                 Handle(MutableHandle<S>& root,
                        typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy = 0);

    operator const T&() const { return get(); } const T& operator->() const { return get(); };
    const T* address() const { return &(*ptr); } const T& get() const { return (*ptr); };

  private:
    Handle() {}
    template <typename S> Handle<T>& operator=(S) = delete; Handle<T>& operator=(const Handle<T>&) = delete;;

    enum Disambiguator { DeliberatelyChoosingThisOverload = 42 };
    enum CallerIdentity { ImUsingThisOnlyInFromFromMarkedLocation = 17 };
    constexpr Handle(const T* p, Disambiguator, CallerIdentity) : ptr(p) {}

    const T* ptr;
};
# 554 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
class MutableHandle : public js::MutableHandleBase<T, MutableHandle<T>>
{
  public:
    using ElementType = T;

    inline MutableHandle(Rooted<T>* root);
    inline MutableHandle(PersistentRooted<T>* root);

  private:

    MutableHandle(decltype(nullptr)) = delete;

  public:
    void set(const T& v) {
        *ptr = v;
    }
# 579 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
    static MutableHandle fromMarkedLocation(T* p) {
        MutableHandle h;
        h.ptr = p;
        return h;
    }

    operator const T&() const { return get(); } const T& operator->() const { return get(); };
    const T* address() const { return &(*ptr); } const T& get() const { return (*ptr); };
    T* address() { return &(*ptr); } T& get() { return (*ptr); };

  private:
    MutableHandle() {}
    template <typename S> MutableHandle<T>& operator=(S) = delete; MutableHandle<T>& operator=(const MutableHandle<T>&) = delete;;

    T* ptr;
};

}

namespace js {

template <typename T>
struct BarrierMethods<T*>
{
    static T* initial() { return nullptr; }
    static gc::Cell* asGCThingOrNull(T* v) {
        if (!v)
            return nullptr;
        do { } while (0);
        return reinterpret_cast<gc::Cell*>(v);
    }
    static void postBarrier(T** vp, T* prev, T* next) {
        if (next)
            JS::AssertGCThingIsNotAnObjectSubclass(reinterpret_cast<js::gc::Cell*>(next));
    }
    static void exposeToJS(T* t) {
        if (t)
            js::gc::ExposeGCThingToActiveJS(JS::GCCellPtr(t));
    }
};

template <>
struct BarrierMethods<JSObject*>
{
    static JSObject* initial() { return nullptr; }
    static gc::Cell* asGCThingOrNull(JSObject* v) {
        if (!v)
            return nullptr;
        do { } while (0);
        return reinterpret_cast<gc::Cell*>(v);
    }
    static void postBarrier(JSObject** vp, JSObject* prev, JSObject* next) {
        JS::HeapObjectPostBarrier(vp, prev, next);
    }
    static void exposeToJS(JSObject* obj) {
        if (obj)
            JS::ExposeObjectToActiveJS(obj);
    }
};

template <>
struct BarrierMethods<JSFunction*>
{
    static JSFunction* initial() { return nullptr; }
    static gc::Cell* asGCThingOrNull(JSFunction* v) {
        if (!v)
            return nullptr;
        do { } while (0);
        return reinterpret_cast<gc::Cell*>(v);
    }
    static void postBarrier(JSFunction** vp, JSFunction* prev, JSFunction* next) {
        JS::HeapObjectPostBarrier(reinterpret_cast<JSObject**>(vp),
                                  reinterpret_cast<JSObject*>(prev),
                                  reinterpret_cast<JSObject*>(next));
    }
    static void exposeToJS(JSFunction* fun) {
        if (fun)
            JS::ExposeObjectToActiveJS(reinterpret_cast<JSObject*>(fun));
    }
};
# 671 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
struct MovableCellHasher
{
    using Key = T;
    using Lookup = T;

    static bool hasHash(const Lookup& l);
    static bool ensureHash(const Lookup& l);
    static HashNumber hash(const Lookup& l);
    static bool match(const Key& k, const Lookup& l);
    static void rekey(Key& k, const Key& newKey) { k = newKey; }
};

template <typename T>
struct MovableCellHasher<JS::Heap<T>>
{
    using Key = JS::Heap<T>;
    using Lookup = T;

    static bool hasHash(const Lookup& l) { return MovableCellHasher<T>::hasHash(l); }
    static bool ensureHash(const Lookup& l) { return MovableCellHasher<T>::ensureHash(l); }
    static HashNumber hash(const Lookup& l) { return MovableCellHasher<T>::hash(l); }
    static bool match(const Key& k, const Lookup& l) {
        return MovableCellHasher<T>::match(k.unbarrieredGet(), l);
    }
    static void rekey(Key& k, const Key& newKey) { k.unsafeSet(newKey); }
};

template <typename T>
struct FallibleHashMethods<MovableCellHasher<T>>
{
    template <typename Lookup> static bool hasHash(Lookup&& l) {
        return MovableCellHasher<T>::hasHash(mozilla::Forward<Lookup>(l));
    }
    template <typename Lookup> static bool ensureHash(Lookup&& l) {
        return MovableCellHasher<T>::ensureHash(mozilla::Forward<Lookup>(l));
    }
};

}

namespace js {
# 722 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
class alignas(8) DispatchWrapper
{
    static_assert(JS::MapTypeToRootKind<T>::kind == JS::RootKind::Traceable,
                  "DispatchWrapper is intended only for usage with a Traceable");

    using TraceFn = void (*)(JSTracer*, T*, const char*);
    TraceFn tracer;
    alignas(gc::CellSize) T storage;

  public:
    template <typename U>
                 DispatchWrapper(U&& initial)
      : tracer(&JS::GCPolicy<T>::trace),
        storage(mozilla::Forward<U>(initial))
    { }


    T* operator &() { return &storage; }
    const T* operator &() const { return &storage; }
    operator T&() { return storage; }
    operator const T&() const { return storage; }



    static void TraceWrapped(JSTracer* trc, T* thingp, const char* name) {
        auto wrapper = reinterpret_cast<DispatchWrapper*>(
                           uintptr_t(thingp) - __builtin_offsetof(DispatchWrapper, storage));
        wrapper->tracer(trc, &wrapper->storage, name);
    }
};

}

namespace JS {

namespace detail {
# 768 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
using MaybeWrapped = typename mozilla::Conditional<
    MapTypeToRootKind<T>::kind == JS::RootKind::Traceable,
    js::DispatchWrapper<T>,
    T>::Type;

}
# 784 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
class Rooted : public js::RootedBase<T, Rooted<T>>
{
    inline void registerWithRootLists(RootedListHeads& roots) {
        this->stack = &roots[JS::MapTypeToRootKind<T>::kind];
        this->prev = *stack;
        *stack = reinterpret_cast<Rooted<void*>*>(this);
    }

    inline RootedListHeads& rootLists(RootingContext* cx) {
        return cx->stackRoots_;
    }
    inline RootedListHeads& rootLists(JSContext* cx) {
        return rootLists(RootingContext::get(cx));
    }

  public:
    using ElementType = T;

    template <typename RootingContext>
    explicit Rooted(const RootingContext& cx)
      : ptr(GCPolicy<T>::initial())
    {
        registerWithRootLists(rootLists(cx));
    }

    template <typename RootingContext, typename S>
    Rooted(const RootingContext& cx, S&& initial)
      : ptr(mozilla::Forward<S>(initial))
    {
        registerWithRootLists(rootLists(cx));
    }

    ~Rooted() {
        do { } while (0);
        *stack = prev;
    }

    Rooted<T>* previous() { return reinterpret_cast<Rooted<T>*>(prev); }





    void set(const T& value) {
        ptr = value;
    }

    operator const T&() const { return get(); } const T& operator->() const { return get(); };
    Rooted<T>& operator=(const T& p) { set(p); return *this; } Rooted<T>& operator=(const Rooted<T>& other) { set(other.get()); return *this; };
    const T* address() const { return &(ptr); } const T& get() const { return (ptr); };
    T* address() { return &(ptr); } T& get() { return (ptr); };

  private:





    Rooted<void*>** stack;
    Rooted<void*>* prev;

    detail::MaybeWrapped<T> ptr;

    Rooted(const Rooted&) = delete;
} ;

}

namespace js {
# 865 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename Container>
class RootedBase<JSObject*, Container> : public MutableWrappedPtrOperations<JSObject*, Container>
{
  public:
    template <class U>
    JS::Handle<U*> as() const;
};
# 883 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename Container>
class HandleBase<JSObject*, Container> : public WrappedPtrOperations<JSObject*, Container>
{
  public:
    template <class U>
    JS::Handle<U*> as() const;
};


template <typename T>
class FakeRooted : public RootedBase<T, FakeRooted<T>>
{
  public:
    using ElementType = T;

    template <typename CX>
    explicit FakeRooted(CX* cx) : ptr(JS::GCPolicy<T>::initial()) {}

    template <typename CX>
    FakeRooted(CX* cx, T initial) : ptr(initial) {}

    operator const T&() const { return get(); } const T& operator->() const { return get(); };
    FakeRooted<T>& operator=(const T& p) { set(p); return *this; } FakeRooted<T>& operator=(const FakeRooted<T>& other) { set(other.get()); return *this; };
    const T* address() const { return &(ptr); } const T& get() const { return (ptr); };
    T* address() { return &(ptr); } T& get() { return (ptr); };

  private:
    T ptr;

    void set(const T& value) {
        ptr = value;
    }

    FakeRooted(const FakeRooted&) = delete;
};


template <typename T>
class FakeMutableHandle : public js::MutableHandleBase<T, FakeMutableHandle<T>>
{
  public:
    using ElementType = T;

                 FakeMutableHandle(T* t) {
        ptr = t;
    }

                 FakeMutableHandle(FakeRooted<T>* root) {
        ptr = root->address();
    }

    void set(const T& v) {
        *ptr = v;
    }

    operator const T&() const { return get(); } const T& operator->() const { return get(); };
    const T* address() const { return &(*ptr); } const T& get() const { return (*ptr); };
    T* address() { return &(*ptr); } T& get() { return (*ptr); };

  private:
    FakeMutableHandle() {}
    template <typename S> FakeMutableHandle<T>& operator=(S) = delete; FakeMutableHandle<T>& operator=(const FakeMutableHandle<T>&) = delete;;

    T* ptr;
};
# 958 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
enum AllowGC {
    NoGC = 0,
    CanGC = 1
};
template <typename T, AllowGC allowGC>
class MaybeRooted
{
};

template <typename T> class MaybeRooted<T, CanGC>
{
  public:
    typedef JS::Handle<T> HandleType;
    typedef JS::Rooted<T> RootType;
    typedef JS::MutableHandle<T> MutableHandleType;

    static inline JS::Handle<T> toHandle(HandleType v) {
        return v;
    }

    static inline JS::MutableHandle<T> toMutableHandle(MutableHandleType v) {
        return v;
    }

    template <typename T2>
    static inline JS::Handle<T2*> downcastHandle(HandleType v) {
        return v.template as<T2>();
    }
};

template <typename T> class MaybeRooted<T, NoGC>
{
  public:
    typedef const T& HandleType;
    typedef FakeRooted<T> RootType;
    typedef FakeMutableHandle<T> MutableHandleType;

    static JS::Handle<T> toHandle(HandleType v) {
        do { AnnotateMozCrashReason("MOZ_CRASH(" "Bad conversion" ")"); do { *((volatile int*) __null) = 996; ::abort(); } while (0); } while (0);
    }

    static JS::MutableHandle<T> toMutableHandle(MutableHandleType v) {
        do { AnnotateMozCrashReason("MOZ_CRASH(" "Bad conversion" ")"); do { *((volatile int*) __null) = 1000; ::abort(); } while (0); } while (0);
    }

    template <typename T2>
    static inline T2* downcastHandle(HandleType v) {
        return &v->template as<T2>();
    }
};

}

namespace JS {

template <typename T> template <typename S>
inline
Handle<T>::Handle(const Rooted<S>& root,
                  typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy)
{
    ptr = reinterpret_cast<const T*>(root.address());
}

template <typename T> template <typename S>
inline
Handle<T>::Handle(const PersistentRooted<S>& root,
                  typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy)
{
    ptr = reinterpret_cast<const T*>(root.address());
}

template <typename T> template <typename S>
inline
Handle<T>::Handle(MutableHandle<S>& root,
                  typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy)
{
    ptr = reinterpret_cast<const T*>(root.address());
}

template <typename T>
inline
MutableHandle<T>::MutableHandle(Rooted<T>* root)
{
    static_assert(sizeof(MutableHandle<T>) == sizeof(T*),
                  "MutableHandle must be binary compatible with T*.");
    ptr = root->address();
}

template <typename T>
inline
MutableHandle<T>::MutableHandle(PersistentRooted<T>* root)
{
    static_assert(sizeof(MutableHandle<T>) == sizeof(T*),
                  "MutableHandle must be binary compatible with T*.");
    ptr = root->address();
}

void
AddPersistentRoot(RootingContext* cx, RootKind kind, PersistentRooted<void*>* root);
# 1092 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template<typename T>
class PersistentRooted : public js::RootedBase<T, PersistentRooted<T>>,
                         private mozilla::LinkedListElement<PersistentRooted<T>>
{
    using ListBase = mozilla::LinkedListElement<PersistentRooted<T>>;

    friend class mozilla::LinkedList<PersistentRooted>;
    friend class mozilla::LinkedListElement<PersistentRooted>;

    void registerWithRootLists(RootingContext* cx) {
        do { } while (0);
        JS::RootKind kind = JS::MapTypeToRootKind<T>::kind;
        AddPersistentRoot(cx, kind, reinterpret_cast<JS::PersistentRooted<void*>*>(this));
    }

  public:
    using ElementType = T;

    PersistentRooted() : ptr(GCPolicy<T>::initial()) {}

    explicit PersistentRooted(RootingContext* cx)
      : ptr(GCPolicy<T>::initial())
    {
        registerWithRootLists(cx);
    }

    explicit PersistentRooted(JSContext* cx)
      : ptr(GCPolicy<T>::initial())
    {
        registerWithRootLists(RootingContext::get(cx));
    }

    template <typename U>
    PersistentRooted(RootingContext* cx, U&& initial)
      : ptr(mozilla::Forward<U>(initial))
    {
        registerWithRootLists(cx);
    }

    template <typename U>
    PersistentRooted(JSContext* cx, U&& initial)
      : ptr(mozilla::Forward<U>(initial))
    {
        registerWithRootLists(RootingContext::get(cx));
    }

    PersistentRooted(const PersistentRooted& rhs)
      : mozilla::LinkedListElement<PersistentRooted<T>>(),
        ptr(rhs.ptr)
    {
# 1150 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
        const_cast<PersistentRooted&>(rhs).setNext(this);
    }

    bool initialized() {
        return ListBase::isInList();
    }

    void init(JSContext* cx) {
        init(cx, GCPolicy<T>::initial());
    }

    template <typename U>
    void init(JSContext* cx, U&& initial) {
        ptr = mozilla::Forward<U>(initial);
        registerWithRootLists(RootingContext::get(cx));
    }

    void reset() {
        if (initialized()) {
            set(GCPolicy<T>::initial());
            ListBase::remove();
        }
    }

    operator const T&() const { return get(); } const T& operator->() const { return get(); };
    PersistentRooted<T>& operator=(const T& p) { set(p); return *this; } PersistentRooted<T>& operator=(const PersistentRooted<T>& other) { set(other.get()); return *this; };
    const T* address() const { return &(ptr); } const T& get() const { return (ptr); };




    T* address() {
        do { } while (0);
        return &ptr;
    }
    T& get() {
        do { } while (0);
        return ptr;
    }

  private:
    template <typename U>
    void set(U&& value) {
        do { } while (0);
        ptr = mozilla::Forward<U>(value);
    }

    detail::MaybeWrapped<T> ptr;
} ;

class ObjectPtr
{
    Heap<JSObject*> value;

  public:
    using ElementType = JSObject*;

    ObjectPtr() : value(nullptr) {}

    explicit ObjectPtr(JSObject* obj) : value(obj) {}


    ~ObjectPtr() { do { } while (0); }

    void finalize(JSRuntime* rt);
    void finalize(JSContext* cx);

    void init(JSObject* obj) { value = obj; }

    JSObject* get() const { return value; }
    JSObject* unbarrieredGet() const { return value.unbarrieredGet(); }

    void writeBarrierPre(JSContext* cx) {
        IncrementalPreWriteBarrier(value);
    }

    void updateWeakPointerAfterGC();

    ObjectPtr& operator=(JSObject* obj) {
        IncrementalPreWriteBarrier(value);
        value = obj;
        return *this;
    }

    void trace(JSTracer* trc, const char* name);

    JSObject& operator*() const { return *value; }
    JSObject* operator->() const { return value; }
    operator JSObject*() const { return value; }

    explicit operator bool() const { return value.unbarrieredGet(); }
    explicit operator bool() { return value.unbarrieredGet(); }
};

}

namespace js {

template <typename T, typename D, typename Container>
class WrappedPtrOperations<UniquePtr<T, D>, Container>
{
    const UniquePtr<T, D>& uniquePtr() const { return static_cast<const Container*>(this)->get(); }

  public:
    explicit operator bool() const { return !!uniquePtr(); }
};

template <typename T, typename D, typename Container>
class MutableWrappedPtrOperations<UniquePtr<T, D>, Container>
  : public WrappedPtrOperations<UniquePtr<T, D>, Container>
{
    UniquePtr<T, D>& uniquePtr() { return static_cast<Container*>(this)->get(); }

  public:
    __attribute__ ((warn_unused_result)) typename UniquePtr<T, D>::Pointer release() { return uniquePtr().release(); }
};

namespace gc {

template <typename T, typename TraceCallbacks>
void
CallTraceCallbackOnNonHeap(T* v, const TraceCallbacks& aCallbacks, const char* aName, void* aClosure)
{
    static_assert(sizeof(T) == sizeof(JS::Heap<T>), "T and Heap<T> must be compatible.");
    do { } while (0);
    mozilla::DebugOnly<Cell*> cell = BarrierMethods<T>::asGCThingOrNull(*v);
    do { } while (0);
    do { } while (0);
    JS::Heap<T>* asHeapT = reinterpret_cast<JS::Heap<T>*>(v);
    aCallbacks.Trace(asHeapT, aName, aClosure);
}

}
}



namespace mozilla {

template <typename T>
inline void
Swap(JS::Heap<T>& aX, JS::Heap<T>& aY)
{
    T tmp = aX;
    aX = aY;
    aY = tmp;
}

template <typename T>
inline void
Swap(JS::TenuredHeap<T>& aX, JS::TenuredHeap<T>& aY)
{
    T tmp = aX;
    aX = aY;
    aY = tmp;
}

}

namespace js {
namespace detail {
# 1321 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T>
struct DefineComparisonOps : mozilla::FalseType {};

template <typename T>
struct DefineComparisonOps<JS::Heap<T>> : mozilla::TrueType {
    static const T& get(const JS::Heap<T>& v) { return v.unbarrieredGet(); }
};

template <typename T>
struct DefineComparisonOps<JS::TenuredHeap<T>> : mozilla::TrueType {
    static const T get(const JS::TenuredHeap<T>& v) { return v.unbarrieredGetPtr(); }
};

template <>
struct DefineComparisonOps<JS::ObjectPtr> : mozilla::TrueType {
    static const JSObject* get(const JS::ObjectPtr& v) { return v.unbarrieredGet(); }
};

template <typename T>
struct DefineComparisonOps<JS::Rooted<T>> : mozilla::TrueType {
    static const T& get(const JS::Rooted<T>& v) { return v.get(); }
};

template <typename T>
struct DefineComparisonOps<JS::Handle<T>> : mozilla::TrueType {
    static const T& get(const JS::Handle<T>& v) { return v.get(); }
};

template <typename T>
struct DefineComparisonOps<JS::MutableHandle<T>> : mozilla::TrueType {
    static const T& get(const JS::MutableHandle<T>& v) { return v.get(); }
};

template <typename T>
struct DefineComparisonOps<JS::PersistentRooted<T>> : mozilla::TrueType {
    static const T& get(const JS::PersistentRooted<T>& v) { return v.get(); }
};

template <typename T>
struct DefineComparisonOps<js::FakeRooted<T>> : mozilla::TrueType {
    static const T& get(const js::FakeRooted<T>& v) { return v.get(); }
};

template <typename T>
struct DefineComparisonOps<js::FakeMutableHandle<T>> : mozilla::TrueType {
    static const T& get(const js::FakeMutableHandle<T>& v) { return v.get(); }
};

}
}
# 1379 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RootingAPI.h"
template <typename T, typename U>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           js::detail::DefineComparisonOps<U>::value, bool>::Type
operator==(const T& a, const U& b) {
    return js::detail::DefineComparisonOps<T>::get(a) == js::detail::DefineComparisonOps<U>::get(b);
}

template <typename T, typename U>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           js::detail::DefineComparisonOps<U>::value, bool>::Type
operator!=(const T& a, const U& b) {
    return !(a == b);
}



template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
operator==(const T& a, const typename T::ElementType& b) {
    return js::detail::DefineComparisonOps<T>::get(a) == b;
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
operator!=(const T& a, const typename T::ElementType& b) {
    return !(a == b);
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
operator==(const typename T::ElementType& a, const T& b) {
    return a == js::detail::DefineComparisonOps<T>::get(b);
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
operator!=(const typename T::ElementType& a, const T& b) {
    return !(a == b);
}




template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator==(const typename mozilla::RemovePointer<typename T::ElementType>::Type* a, const T& b) {
    return a == js::detail::DefineComparisonOps<T>::get(b);
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator!=(const typename mozilla::RemovePointer<typename T::ElementType>::Type* a, const T& b) {
    return !(a == b);
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator==(const T& a, const typename mozilla::RemovePointer<typename T::ElementType>::Type* b) {
    return js::detail::DefineComparisonOps<T>::get(a) == b;
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator!=(const T& a, const typename mozilla::RemovePointer<typename T::ElementType>::Type* b) {
    return !(a == b);
}



template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator==(std::nullptr_t a, const T& b) {
    return a == js::detail::DefineComparisonOps<T>::get(b);
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator!=(std::nullptr_t a, const T& b) {
    return !(a == b);
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator==(const T& a, std::nullptr_t b) {
    return js::detail::DefineComparisonOps<T>::get(a) == b;
}

template <typename T>
typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
                           mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
operator!=(const T& a, std::nullptr_t b) {
    return !(a == b);
}
# 8 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h" 1
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
namespace JS { class Value; }
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
enum JSValueType
{
    JSVAL_TYPE_DOUBLE = 0x00,
    JSVAL_TYPE_INT32 = 0x01,
    JSVAL_TYPE_UNDEFINED = 0x02,
    JSVAL_TYPE_NULL = 0x03,
    JSVAL_TYPE_BOOLEAN = 0x04,
    JSVAL_TYPE_MAGIC = 0x05,
    JSVAL_TYPE_STRING = 0x06,
    JSVAL_TYPE_SYMBOL = 0x07,
    JSVAL_TYPE_PRIVATE_GCTHING = 0x08,
    JSVAL_TYPE_OBJECT = 0x0c,


    JSVAL_TYPE_UNKNOWN = 0x20,
    JSVAL_TYPE_MISSING = 0x21
} __attribute__((packed));

static_assert(sizeof(JSValueType) == 1,
              "compiler typed enum support is apparently buggy");
# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
enum JSValueTag
{
    JSVAL_TAG_MAX_DOUBLE = 0x1FFF0,
    JSVAL_TAG_INT32 = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32,
    JSVAL_TAG_UNDEFINED = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_UNDEFINED,
    JSVAL_TAG_NULL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_NULL,
    JSVAL_TAG_BOOLEAN = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN,
    JSVAL_TAG_MAGIC = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_MAGIC,
    JSVAL_TAG_STRING = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_STRING,
    JSVAL_TAG_SYMBOL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_SYMBOL,
    JSVAL_TAG_PRIVATE_GCTHING = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_PRIVATE_GCTHING,
    JSVAL_TAG_OBJECT = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_OBJECT
} __attribute__((packed));

static_assert(sizeof(JSValueTag) == sizeof(uint32_t),
              "compiler typed enum support is apparently buggy");

enum JSValueShiftedTag
{
    JSVAL_SHIFTED_TAG_MAX_DOUBLE = ((((uint64_t)JSVAL_TAG_MAX_DOUBLE) << 47) | 0xFFFFFFFF),
    JSVAL_SHIFTED_TAG_INT32 = (((uint64_t)JSVAL_TAG_INT32) << 47),
    JSVAL_SHIFTED_TAG_UNDEFINED = (((uint64_t)JSVAL_TAG_UNDEFINED) << 47),
    JSVAL_SHIFTED_TAG_NULL = (((uint64_t)JSVAL_TAG_NULL) << 47),
    JSVAL_SHIFTED_TAG_BOOLEAN = (((uint64_t)JSVAL_TAG_BOOLEAN) << 47),
    JSVAL_SHIFTED_TAG_MAGIC = (((uint64_t)JSVAL_TAG_MAGIC) << 47),
    JSVAL_SHIFTED_TAG_STRING = (((uint64_t)JSVAL_TAG_STRING) << 47),
    JSVAL_SHIFTED_TAG_SYMBOL = (((uint64_t)JSVAL_TAG_SYMBOL) << 47),
    JSVAL_SHIFTED_TAG_PRIVATE_GCTHING = (((uint64_t)JSVAL_TAG_PRIVATE_GCTHING) << 47),
    JSVAL_SHIFTED_TAG_OBJECT = (((uint64_t)JSVAL_TAG_OBJECT) << 47)
} __attribute__((packed));

static_assert(sizeof(JSValueShiftedTag) == sizeof(uint64_t),
              "compiler typed enum support is apparently buggy");
# 161 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
typedef enum JSWhyMagic
{

    JS_ELEMENTS_HOLE,


    JS_NO_ITER_VALUE,


    JS_GENERATOR_CLOSING,


    JS_NO_CONSTANT,


    JS_THIS_POISON,


    JS_ARG_POISON,


    JS_SERIALIZE_NO_NODE,


    JS_LAZY_ARGUMENTS,


    JS_OPTIMIZED_ARGUMENTS,


    JS_IS_CONSTRUCTING,


    JS_BLOCK_NEEDS_CLONE,


    JS_HASH_KEY_EMPTY,


    JS_ION_ERROR,


    JS_ION_BAILOUT,


    JS_OPTIMIZED_OUT,


    JS_UNINITIALIZED_LEXICAL,


    JS_GENERIC_MAGIC,

    JS_WHY_MAGIC_COUNT
} JSWhyMagic;

namespace JS {

static inline constexpr JS::Value UndefinedValue();
static inline JS::Value PoisonedObjectValue(JSObject* obj);

namespace detail {

constexpr int CanonicalizedNaNSignBit = 0;
constexpr uint64_t CanonicalizedNaNSignificand = 0x8000000000000ULL;

constexpr uint64_t CanonicalizedNaNBits =
    mozilla::SpecificNaNBits<double,
                             detail::CanonicalizedNaNSignBit,
                             detail::CanonicalizedNaNSignificand>::value;

}







static __attribute__((always_inline)) inline double
GenericNaN()
{
  return mozilla::SpecificNaN<double>(detail::CanonicalizedNaNSignBit,
                                      detail::CanonicalizedNaNSignificand);
}





static inline double
CanonicalizeNaN(double d)
{
    if ((__builtin_expect(!!(mozilla::IsNaN(d)), 0)))
        return GenericNaN();
    return d;
}
# 293 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
class alignas(8) Value
{
  public:



    using PayloadType = uint64_t;






    Value() = default;
    Value(const Value& v) = default;





    template <typename T>
    static bool isNumberRepresentable(const T t) {
        return T(double(t)) == t;
    }



    void setNull() {
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_NULL, 0);
    }

    void setUndefined() {
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_UNDEFINED, 0);
    }

    void setInt32(int32_t i) {
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_INT32, uint32_t(i));
    }

    int32_t& getInt32Ref() {
        do { } while (0);
        return data.s.payload.i32;
    }

    void setDouble(double d) {


        data = layout(d);
        do { } while (0);
    }

    void setNaN() {
        setDouble(GenericNaN());
    }

    double& getDoubleRef() {
        do { } while (0);
        return data.asDouble;
    }

    void setString(JSString* str) {
        do { } while (0);
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_STRING, PayloadType(str));
    }

    void setSymbol(JS::Symbol* sym) {
        do { } while (0);
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_SYMBOL, PayloadType(sym));
    }

    void setObject(JSObject& obj) {
        do { } while (0);





        do { } while (0);

        setObjectNoCheck(&obj);
    }

  private:
    void setObjectNoCheck(JSObject* obj) {
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_OBJECT, PayloadType(obj));
    }

    friend inline Value PoisonedObjectValue(JSObject* obj);

  public:
    void setBoolean(bool b) {
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_BOOLEAN, uint32_t(b));
    }

    void setMagic(JSWhyMagic why) {
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_MAGIC, uint32_t(why));
    }

    void setMagicUint32(uint32_t payload) {
        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_MAGIC, payload);
    }

    bool setNumber(uint32_t ui) {
        if (ui > ((int32_t)0x7fffffff)) {
            setDouble((double)ui);
            return false;
        } else {
            setInt32((int32_t)ui);
            return true;
        }
    }

    bool setNumber(double d) {
        int32_t i;
        if (mozilla::NumberIsInt32(d, &i)) {
            setInt32(i);
            return true;
        }

        setDouble(d);
        return false;
    }

    void setObjectOrNull(JSObject* arg) {
        if (arg)
            setObject(*arg);
        else
            setNull();
    }

    void swap(Value& rhs) {
        uint64_t tmp = rhs.data.asBits;
        rhs.data.asBits = data.asBits;
        data.asBits = tmp;
    }

  private:
    JSValueTag toTag() const {



        return JSValueTag(data.asBits >> 47);

    }

  public:
# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
    const void* bitsAsPunboxPointer() const {
        return reinterpret_cast<void*>(data.asBits);
    }
# 463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
    bool isUndefined() const {



        return data.asBits == JSVAL_SHIFTED_TAG_UNDEFINED;

    }

    bool isNull() const {



        return data.asBits == JSVAL_SHIFTED_TAG_NULL;

    }

    bool isNullOrUndefined() const {
        return isNull() || isUndefined();
    }

    bool isInt32() const {
        return toTag() == JSVAL_TAG_INT32;
    }

    bool isInt32(int32_t i32) const {
        return data.asBits == bitsFromTagAndPayload(JSVAL_TAG_INT32, uint32_t(i32));
    }

    bool isDouble() const {



        return (data.asBits | mozilla::DoubleTypeTraits::kSignBit) <= JSVAL_SHIFTED_TAG_MAX_DOUBLE;

    }

    bool isNumber() const {




        return data.asBits < JSVAL_SHIFTED_TAG_UNDEFINED;

    }

    bool isString() const {
        return toTag() == JSVAL_TAG_STRING;
    }

    bool isSymbol() const {
        return toTag() == JSVAL_TAG_SYMBOL;
    }

    bool isObject() const {



        do { } while (0);
        return data.asBits >= JSVAL_SHIFTED_TAG_OBJECT;

    }

    bool isPrimitive() const {



        return data.asBits < JSVAL_SHIFTED_TAG_OBJECT;

    }

    bool isObjectOrNull() const {
        return isObject() || isNull();
    }

    bool isGCThing() const {




        return data.asBits >= JSVAL_SHIFTED_TAG_STRING;

    }

    bool isBoolean() const {
        return toTag() == JSVAL_TAG_BOOLEAN;
    }

    bool isTrue() const {
        return data.asBits == bitsFromTagAndPayload(JSVAL_TAG_BOOLEAN, uint32_t(true));
    }

    bool isFalse() const {
        return data.asBits == bitsFromTagAndPayload(JSVAL_TAG_BOOLEAN, uint32_t(false));
    }

    bool isMagic() const {
        return toTag() == JSVAL_TAG_MAGIC;
    }

    bool isMagic(JSWhyMagic why) const {
        do { } while (0);
        return isMagic();
    }

    JS::TraceKind traceKind() const {
        do { } while (0);
        static_assert((JSVAL_TAG_STRING & 0x03) == size_t(JS::TraceKind::String),
                      "Value type tags must correspond with JS::TraceKinds.");
        static_assert((JSVAL_TAG_SYMBOL & 0x03) == size_t(JS::TraceKind::Symbol),
                      "Value type tags must correspond with JS::TraceKinds.");
        static_assert((JSVAL_TAG_OBJECT & 0x03) == size_t(JS::TraceKind::Object),
                      "Value type tags must correspond with JS::TraceKinds.");
        if ((__builtin_expect(!!(isPrivateGCThing()), 0)))
            return JS::GCThingTraceKind(toGCThing());
        return JS::TraceKind(toTag() & 0x03);
    }

    JSWhyMagic whyMagic() const {
        do { } while (0);
        return data.s.payload.why;
    }

    uint32_t magicUint32() const {
        do { } while (0);
        return data.s.payload.u32;
    }



    bool operator==(const Value& rhs) const {
        return data.asBits == rhs.data.asBits;
    }

    bool operator!=(const Value& rhs) const {
        return data.asBits != rhs.data.asBits;
    }

    friend inline bool SameType(const Value& lhs, const Value& rhs);



    int32_t toInt32() const {
        do { } while (0);



        return int32_t(data.asBits);

    }

    double toDouble() const {
        do { } while (0);
        return data.asDouble;
    }

    double toNumber() const {
        do { } while (0);
        return isDouble() ? toDouble() : double(toInt32());
    }

    JSString* toString() const {
        do { } while (0);



        return reinterpret_cast<JSString*>(data.asBits & 0x00007FFFFFFFFFFFLL);

    }

    JS::Symbol* toSymbol() const {
        do { } while (0);



        return reinterpret_cast<JS::Symbol*>(data.asBits & 0x00007FFFFFFFFFFFLL);

    }

    JSObject& toObject() const {
        do { } while (0);



        return *toObjectOrNull();

    }

    JSObject* toObjectOrNull() const {
        do { } while (0);



        uint64_t ptrBits = data.asBits & 0x00007FFFFFFFFFFFLL;
        do { } while (0);
        return reinterpret_cast<JSObject*>(ptrBits);

    }

    js::gc::Cell* toGCThing() const {
        do { } while (0);



        uint64_t ptrBits = data.asBits & 0x00007FFFFFFFFFFFLL;
        do { } while (0);
        return reinterpret_cast<js::gc::Cell*>(ptrBits);

    }

    GCCellPtr toGCCellPtr() const {
        return GCCellPtr(toGCThing(), traceKind());
    }

    bool toBoolean() const {
        do { } while (0);



        return bool(data.asBits & 0x00007FFFFFFFFFFFLL);

    }

    uint32_t payloadAsRawUint32() const {
        do { } while (0);
        return data.s.payload.u32;
    }

    uint64_t asRawBits() const {
        return data.asBits;
    }

    JSValueType extractNonDoubleType() const {
        uint32_t type = toTag() & 0xF;
        do { } while (0);
        return JSValueType(type);
    }
# 709 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
    void setPrivate(void* ptr) {
        do { } while (0);




        data.asBits = uintptr_t(ptr) >> 1;

        do { } while (0);
    }

    void* toPrivate() const {
        do { } while (0);



        do { } while (0);
        return reinterpret_cast<void*>(data.asBits << 1);

    }

    void setPrivateUint32(uint32_t ui) {
        do { } while (0);
        setInt32(int32_t(ui));
    }

    uint32_t toPrivateUint32() const {
        return uint32_t(toInt32());
    }
# 748 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
    void setPrivateGCThing(js::gc::Cell* cell) {
        do { } while (0);

        do { } while (0);

        do { } while (0);


        do { } while (0);





        do { } while (0);

        data.asBits = bitsFromTagAndPayload(JSVAL_TAG_PRIVATE_GCTHING, PayloadType(cell));
    }

    bool isPrivateGCThing() const {
        return toTag() == JSVAL_TAG_PRIVATE_GCTHING;
    }

    const size_t* payloadWord() const {



        return &data.asWord;

    }

    const uintptr_t* payloadUIntPtr() const {



        return &data.asUIntPtr;

    }





  private:
# 822 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
    union layout {
        uint64_t asBits;


        struct {
            uint64_t payload47 : 47;
            JSValueTag tag : 17;
        } debugView;

        struct {
            union {
                int32_t i32;
                uint32_t u32;
                JSWhyMagic why;
            } payload;
        } s;
        double asDouble;
        void* asPtr;
        size_t asWord;
        uintptr_t asUIntPtr;

        layout() = default;
        explicit constexpr layout(uint64_t bits) : asBits(bits) {}
        explicit constexpr layout(double d) : asDouble(d) {}
    } data;
# 902 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
  private:
    explicit constexpr Value(uint64_t asBits) : data(asBits) {}
    explicit constexpr Value(double d) : data(d) {}

    void staticAssertions() {
        static_assert(sizeof(JSValueType) == 1, "JS_STATIC_ASSERT");
        static_assert(sizeof(JSValueTag) == 4, "JS_STATIC_ASSERT");
        static_assert(sizeof(JSWhyMagic) <= 4, "JS_STATIC_ASSERT");
        static_assert(sizeof(Value) == 8, "JS_STATIC_ASSERT");
    }

    friend constexpr Value JS::UndefinedValue();

  public:
    static constexpr uint64_t
    bitsFromTagAndPayload(JSValueTag tag, PayloadType payload)
    {



        return (uint64_t(uint32_t(tag)) << 47) | payload;

    }

    static constexpr Value
    fromTagAndPayload(JSValueTag tag, PayloadType payload)
    {
        return fromRawBits(bitsFromTagAndPayload(tag, payload));
    }

    static constexpr Value
    fromRawBits(uint64_t asBits) {
        return Value(asBits);
    }

    static constexpr Value
    fromInt32(int32_t i) {
        return fromTagAndPayload(JSVAL_TAG_INT32, uint32_t(i));
    }

    static constexpr Value
    fromDouble(double d) {
        return Value(d);
    }
} ;

static_assert(sizeof(Value) == 8, "Value size must leave three tag bits, be a binary power, and is ubiquitously depended upon everywhere");

inline bool
IsOptimizedPlaceholderMagicValue(const Value& v)
{
    if (v.isMagic()) {
        do { } while (0);
        return true;
    }
    return false;
}

static __attribute__((always_inline)) inline void
ExposeValueToActiveJS(const Value& v)
{
    if (v.isGCThing())
        js::gc::ExposeGCThingToActiveJS(GCCellPtr(v));
}



static inline Value
NullValue()
{
    Value v;
    v.setNull();
    return v;
}

static inline constexpr Value
UndefinedValue()
{
    return Value::fromTagAndPayload(JSVAL_TAG_UNDEFINED, 0);
}

static inline constexpr Value
Int32Value(int32_t i32)
{
    return Value::fromInt32(i32);
}

static inline Value
DoubleValue(double dbl)
{
    Value v;
    v.setDouble(dbl);
    return v;
}

static inline Value
CanonicalizedDoubleValue(double d)
{
    return (__builtin_expect(!!(mozilla::IsNaN(d)), 0))
           ? Value::fromRawBits(detail::CanonicalizedNaNBits)
           : Value::fromDouble(d);
}

static inline bool
IsCanonicalized(double d)
{
  if (mozilla::IsInfinite(d) || mozilla::IsFinite(d))
      return true;

  uint64_t bits;
  mozilla::BitwiseCast<uint64_t>(d, &bits);
  return (bits & ~mozilla::DoubleTypeTraits::kSignBit) == detail::CanonicalizedNaNBits;
}

static inline Value
DoubleNaNValue()
{
    Value v;
    v.setNaN();
    return v;
}

static inline Value
Float32Value(float f)
{
    Value v;
    v.setDouble(f);
    return v;
}

static inline Value
StringValue(JSString* str)
{
    Value v;
    v.setString(str);
    return v;
}

static inline Value
SymbolValue(JS::Symbol* sym)
{
    Value v;
    v.setSymbol(sym);
    return v;
}

static inline Value
BooleanValue(bool boo)
{
    Value v;
    v.setBoolean(boo);
    return v;
}

static inline Value
TrueValue()
{
    Value v;
    v.setBoolean(true);
    return v;
}

static inline Value
FalseValue()
{
    Value v;
    v.setBoolean(false);
    return v;
}

static inline Value
ObjectValue(JSObject& obj)
{
    Value v;
    v.setObject(obj);
    return v;
}

static inline Value
ObjectValueCrashOnTouch()
{
    Value v;
    v.setObject(*reinterpret_cast<JSObject*>(0x48));
    return v;
}

static inline Value
MagicValue(JSWhyMagic why)
{
    Value v;
    v.setMagic(why);
    return v;
}

static inline Value
MagicValueUint32(uint32_t payload)
{
    Value v;
    v.setMagicUint32(payload);
    return v;
}

static inline Value
NumberValue(float f)
{
    Value v;
    v.setNumber(f);
    return v;
}

static inline Value
NumberValue(double dbl)
{
    Value v;
    v.setNumber(dbl);
    return v;
}

static inline Value
NumberValue(int8_t i)
{
    return Int32Value(i);
}

static inline Value
NumberValue(uint8_t i)
{
    return Int32Value(i);
}

static inline Value
NumberValue(int16_t i)
{
    return Int32Value(i);
}

static inline Value
NumberValue(uint16_t i)
{
    return Int32Value(i);
}

static inline Value
NumberValue(int32_t i)
{
    return Int32Value(i);
}

static inline constexpr Value
NumberValue(uint32_t i)
{
    return i <= ((int32_t)0x7fffffff)
           ? Int32Value(int32_t(i))
           : Value::fromDouble(double(i));
}

namespace detail {

template <bool Signed>
class MakeNumberValue
{
  public:
    template<typename T>
    static inline Value create(const T t)
    {
        Value v;
        if (((int32_t)0x80000000) <= t && t <= ((int32_t)0x7fffffff))
            v.setInt32(int32_t(t));
        else
            v.setDouble(double(t));
        return v;
    }
};

template <>
class MakeNumberValue<false>
{
  public:
    template<typename T>
    static inline Value create(const T t)
    {
        Value v;
        if (t <= ((int32_t)0x7fffffff))
            v.setInt32(int32_t(t));
        else
            v.setDouble(double(t));
        return v;
    }
};

}

template <typename T>
static inline Value
NumberValue(const T t)
{
    do { } while (0);
    return detail::MakeNumberValue<std::numeric_limits<T>::is_signed>::create(t);
}

static inline Value
ObjectOrNullValue(JSObject* obj)
{
    Value v;
    v.setObjectOrNull(obj);
    return v;
}

static inline Value
PrivateValue(void* ptr)
{
    Value v;
    v.setPrivate(ptr);
    return v;
}

static inline Value
PrivateUint32Value(uint32_t ui)
{
    Value v;
    v.setPrivateUint32(ui);
    return v;
}

static inline Value
PrivateGCThingValue(js::gc::Cell* cell)
{
    Value v;
    v.setPrivateGCThing(cell);
    return v;
}

static inline Value
PoisonedObjectValue(JSObject* obj)
{
    Value v;
    v.setObjectNoCheck(obj);
    return v;
}

inline bool
SameType(const Value& lhs, const Value& rhs)
{




    return (lhs.isDouble() && rhs.isDouble()) ||
           (((lhs.data.asBits ^ rhs.data.asBits) & 0xFFFF800000000000ULL) == 0);

}

}



namespace JS {
void HeapValuePostBarrier(Value* valuep, const Value& prev, const Value& next);

template <>
struct GCPolicy<JS::Value>
{
    static Value initial() { return UndefinedValue(); }
    static void trace(JSTracer* trc, Value* v, const char* name) {
        js::UnsafeTraceManuallyBarrieredEdge(trc, v, name);
    }
    static bool isTenured(const Value& thing) {
        return !thing.isGCThing() || !IsInsideNursery(thing.toGCThing());
    }
};

}

namespace js {

template <>
struct BarrierMethods<JS::Value>
{
    static gc::Cell* asGCThingOrNull(const JS::Value& v) {
        return v.isGCThing() ? v.toGCThing() : nullptr;
    }
    static void postBarrier(JS::Value* v, const JS::Value& prev, const JS::Value& next) {
        JS::HeapValuePostBarrier(v, prev, next);
    }
    static void exposeToJS(const JS::Value& v) {
        JS::ExposeValueToActiveJS(v);
    }
};

template <class Wrapper> class MutableValueOperations;







template <class Wrapper>
class WrappedPtrOperations<JS::Value, Wrapper>
{
    const JS::Value& value() const { return static_cast<const Wrapper*>(this)->get(); }

  public:
    bool isUndefined() const { return value().isUndefined(); }
    bool isNull() const { return value().isNull(); }
    bool isBoolean() const { return value().isBoolean(); }
    bool isTrue() const { return value().isTrue(); }
    bool isFalse() const { return value().isFalse(); }
    bool isNumber() const { return value().isNumber(); }
    bool isInt32() const { return value().isInt32(); }
    bool isInt32(int32_t i32) const { return value().isInt32(i32); }
    bool isDouble() const { return value().isDouble(); }
    bool isString() const { return value().isString(); }
    bool isSymbol() const { return value().isSymbol(); }
    bool isObject() const { return value().isObject(); }
    bool isMagic() const { return value().isMagic(); }
    bool isMagic(JSWhyMagic why) const { return value().isMagic(why); }
    bool isGCThing() const { return value().isGCThing(); }
    bool isPrimitive() const { return value().isPrimitive(); }

    bool isNullOrUndefined() const { return value().isNullOrUndefined(); }
    bool isObjectOrNull() const { return value().isObjectOrNull(); }

    bool toBoolean() const { return value().toBoolean(); }
    double toNumber() const { return value().toNumber(); }
    int32_t toInt32() const { return value().toInt32(); }
    double toDouble() const { return value().toDouble(); }
    JSString* toString() const { return value().toString(); }
    JS::Symbol* toSymbol() const { return value().toSymbol(); }
    JSObject& toObject() const { return value().toObject(); }
    JSObject* toObjectOrNull() const { return value().toObjectOrNull(); }
    gc::Cell* toGCThing() const { return value().toGCThing(); }
    JS::TraceKind traceKind() const { return value().traceKind(); }
    void* toPrivate() const { return value().toPrivate(); }
    uint32_t toPrivateUint32() const { return value().toPrivateUint32(); }

    uint64_t asRawBits() const { return value().asRawBits(); }
    JSValueType extractNonDoubleType() const { return value().extractNonDoubleType(); }

    JSWhyMagic whyMagic() const { return value().whyMagic(); }
    uint32_t magicUint32() const { return value().magicUint32(); }
};







template <class Wrapper>
class MutableWrappedPtrOperations<JS::Value, Wrapper> : public WrappedPtrOperations<JS::Value, Wrapper>
{
    JS::Value& value() { return static_cast<Wrapper*>(this)->get(); }

  public:
    void setNull() { value().setNull(); }
    void setUndefined() { value().setUndefined(); }
    void setInt32(int32_t i) { value().setInt32(i); }
    void setDouble(double d) { value().setDouble(d); }
    void setNaN() { setDouble(JS::GenericNaN()); }
    void setBoolean(bool b) { value().setBoolean(b); }
    void setMagic(JSWhyMagic why) { value().setMagic(why); }
    bool setNumber(uint32_t ui) { return value().setNumber(ui); }
    bool setNumber(double d) { return value().setNumber(d); }
    void setString(JSString* str) { this->value().setString(str); }
    void setSymbol(JS::Symbol* sym) { this->value().setSymbol(sym); }
    void setObject(JSObject& obj) { this->value().setObject(obj); }
    void setObjectOrNull(JSObject* arg) { this->value().setObjectOrNull(arg); }
    void setPrivate(void* ptr) { this->value().setPrivate(ptr); }
    void setPrivateUint32(uint32_t ui) { this->value().setPrivateUint32(ui); }
    void setPrivateGCThing(js::gc::Cell* cell) { this->value().setPrivateGCThing(cell); }
};





template <typename Wrapper>
class HeapBase<JS::Value, Wrapper> : public WrappedPtrOperations<JS::Value, Wrapper>
{
    void setBarriered(const JS::Value& v) {
        *static_cast<JS::Heap<JS::Value>*>(this) = v;
    }

  public:
    void setNull() { setBarriered(JS::NullValue()); }
    void setUndefined() { setBarriered(JS::UndefinedValue()); }
    void setInt32(int32_t i) { setBarriered(JS::Int32Value(i)); }
    void setDouble(double d) { setBarriered(JS::DoubleValue(d)); }
    void setNaN() { setDouble(JS::GenericNaN()); }
    void setBoolean(bool b) { setBarriered(JS::BooleanValue(b)); }
    void setMagic(JSWhyMagic why) { setBarriered(JS::MagicValue(why)); }
    void setString(JSString* str) { setBarriered(JS::StringValue(str)); }
    void setSymbol(JS::Symbol* sym) { setBarriered(JS::SymbolValue(sym)); }
    void setObject(JSObject& obj) { setBarriered(JS::ObjectValue(obj)); }
    void setPrivateGCThing(js::gc::Cell* cell) { setBarriered(JS::PrivateGCThingValue(cell)); }

    bool setNumber(uint32_t ui) {
        if (ui > ((int32_t)0x7fffffff)) {
            setDouble((double)ui);
            return false;
        } else {
            setInt32((int32_t)ui);
            return true;
        }
    }

    bool setNumber(double d) {
        int32_t i;
        if (mozilla::NumberIsInt32(d, &i)) {
            setInt32(i);
            return true;
        }

        setDouble(d);
        return false;
    }

    void setObjectOrNull(JSObject* arg) {
        if (arg)
            setObject(*arg);
        else
            setNull();
    }
};





template <typename F, typename... Args>
auto
DispatchTyped(F f, const JS::Value& val, Args&&... args)
  -> decltype(f(static_cast<JSObject*>(nullptr), mozilla::Forward<Args>(args)...))
{
    if (val.isString())
        return f(val.toString(), mozilla::Forward<Args>(args)...);
    if (val.isObject())
        return f(&val.toObject(), mozilla::Forward<Args>(args)...);
    if (val.isSymbol())
        return f(val.toSymbol(), mozilla::Forward<Args>(args)...);
    if ((__builtin_expect(!!(val.isPrivateGCThing()), 0)))
        return DispatchTyped(f, val.toGCCellPtr(), mozilla::Forward<Args>(args)...);
    do { } while (0);
    return F::defaultValue(val);
}

template <class S> struct VoidDefaultAdaptor { static void defaultValue(const S&) {} };
template <class S> struct IdentityDefaultAdaptor { static S defaultValue(const S& v) {return v;} };
template <class S, bool v> struct BoolDefaultAdaptor { static bool defaultValue(const S&) { return v; } };

}
# 1478 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Value.h"
namespace JS {

extern const HandleValue NullHandleValue;
extern const HandleValue UndefinedHandleValue;
extern const HandleValue TrueHandleValue;
extern const HandleValue FalseHandleValue;

}
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringGlue.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringGlue.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringIterator.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringIterator.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCharTraits.h" 1
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCharTraits.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOMCID.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h" 2
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
class nsAString;
class nsACString;

class nsISupports;
class nsIModule;
class nsIComponentManager;
class nsIComponentRegistrar;
class nsIServiceManager;
class nsIFile;
class nsILocalFile;
class nsIDirectoryServiceProvider;
class nsIMemory;
class nsIDebug2;


namespace mozilla {
struct Module;
}
# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult
NS_InitXPCOM2(nsIServiceManager** aResult,
              nsIFile* aBinDirectory,
              nsIDirectoryServiceProvider* aAppFileLocationProvider);





extern "C" nsresult
NS_InitMinimalXPCOM();
# 95 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult NS_ShutdownXPCOM(nsIServiceManager* aServMgr);
# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult NS_GetServiceManager(nsIServiceManager** aResult);
# 116 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult NS_GetComponentManager(nsIComponentManager** aResult);
# 127 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult NS_GetComponentRegistrar(nsIComponentRegistrar** aResult);
# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult NS_GetMemoryManager(nsIMemory** aResult);
# 162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult NS_NewLocalFile(const nsAString& aPath,
                                    bool aFollowLinks,
                                    nsIFile** aResult);

extern "C" nsresult NS_NewNativeLocalFile(const nsACString& aPath,
                                          bool aFollowLinks,
                                          nsIFile** aResult);




class NS_ConvertUTF16toUTF8;
nsresult NS_NewNativeLocalFile(const NS_ConvertUTF16toUTF8& aPath,
                               bool aFollowLinks,
                               nsIFile** aResult) = delete;
# 232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
enum
{
  NS_DEBUG_WARNING = 0,
  NS_DEBUG_ASSERTION = 1,
  NS_DEBUG_BREAK = 2,
  NS_DEBUG_ABORT = 3
};
# 255 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" void NS_DebugBreak(uint32_t aSeverity,
                              const char* aStr, const char* aExpr,
                              const char* aFile, int32_t aLine);
# 275 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" void NS_LogInit();

extern "C" void NS_LogTerm();







class ScopedLogging
{
public:
    ScopedLogging()
    {
        NS_LogInit();
    }

    ~ScopedLogging()
    {
        NS_LogTerm();
    }
};
# 310 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" void NS_LogCtor(void* aPtr, const char* aTypeName,
                           uint32_t aInstanceSize);

extern "C" void NS_LogDtor(void* aPtr, const char* aTypeName,
                           uint32_t aInstanceSize);
# 326 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" void NS_LogAddRef(void* aPtr, nsrefcnt aNewRefCnt,
                             const char* aTypeName, uint32_t aInstanceSize);

extern "C" void NS_LogRelease(void* aPtr, nsrefcnt aNewRefCnt,
                              const char* aTypeName);
# 342 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" void NS_LogCOMPtrAddRef(void* aCOMPtr, nsISupports* aObject);

extern "C" void NS_LogCOMPtrRelease(void* aCOMPtr, nsISupports* aObject);
# 354 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
class nsCycleCollectionParticipant;
class nsCycleCollectingAutoRefCnt;

extern "C" void NS_CycleCollectorSuspect3(void* aPtr,
                                          nsCycleCollectionParticipant* aCp,
                                          nsCycleCollectingAutoRefCnt* aRefCnt,
                                          bool* aShouldDelete);
# 439 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXPCOM.h"
extern "C" nsresult NS_GetDebug(nsIDebug2** aResult);
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h" 2
# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h"
void NS_ABORT_OOM(size_t aSize);
# 390 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h"
extern "C" {
# 402 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h"
void printf_stderr(const char* aFmt, ...) __attribute__ ((format (printf, 1, 2)));




void vprintf_stderr(const char* aFmt, va_list aArgs);
# 424 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDebug.h"
void fprintf_stderr(FILE* aFile, const char* aFmt, ...) __attribute__ ((format (printf, 2, 3)));


}
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCharTraits.h" 2
# 86 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCharTraits.h"
template <class CharT>
struct nsCharTraits
{
};

template <>
struct nsCharTraits<char16_t>
{
  typedef char16_t char_type;
  typedef uint16_t unsigned_char_type;
  typedef char incompatible_char_type;

  static char_type* const sEmptyBuffer;

  static void
  assign(char_type& aLhs, char_type aRhs)
  {
    aLhs = aRhs;
  }



  typedef int int_type;

  static char_type
  to_char_type(int_type aChar)
  {
    return char_type(aChar);
  }

  static int_type
  to_int_type(char_type aChar)
  {
    return int_type(static_cast<unsigned_char_type>(aChar));
  }

  static bool
  eq_int_type(int_type aLhs, int_type aRhs)
  {
    return aLhs == aRhs;
  }




  static bool
  eq(char_type aLhs, char_type aRhs)
  {
    return aLhs == aRhs;
  }

  static bool
  lt(char_type aLhs, char_type aRhs)
  {
    return aLhs < aRhs;
  }




  static char_type*
  move(char_type* aStr1, const char_type* aStr2, size_t aN)
  {
    return static_cast<char_type*>(memmove(aStr1, aStr2,
                                           aN * sizeof(char_type)));
  }

  static char_type*
  copy(char_type* aStr1, const char_type* aStr2, size_t aN)
  {
    return static_cast<char_type*>(memcpy(aStr1, aStr2,
                                          aN * sizeof(char_type)));
  }

  static char_type*
  copyASCII(char_type* aStr1, const char* aStr2, size_t aN)
  {
    for (char_type* s = aStr1; aN--; ++s, ++aStr2) {
      do { } while(0);
      *s = static_cast<char_type>(*aStr2);
    }
    return aStr1;
  }

  static char_type*
  assign(char_type* aStr, size_t aN, char_type aChar)
  {
    char_type* result = aStr;
    while (aN--) {
      assign(*aStr++, aChar);
    }
    return result;
  }

  static int
  compare(const char_type* aStr1, const char_type* aStr2, size_t aN)
  {
    for (; aN--; ++aStr1, ++aStr2) {
      if (!eq(*aStr1, *aStr2)) {
        return to_int_type(*aStr1) - to_int_type(*aStr2);
      }
    }

    return 0;
  }

  static int
  compareASCII(const char_type* aStr1, const char* aStr2, size_t aN)
  {
    for (; aN--; ++aStr1, ++aStr2) {
      do { } while(0);
      if (!eq_int_type(to_int_type(*aStr1),
                       to_int_type(static_cast<char_type>(*aStr2)))) {
        return to_int_type(*aStr1) -
               to_int_type(static_cast<char_type>(*aStr2));
      }
    }

    return 0;
  }




  static int
  compareASCIINullTerminated(const char_type* aStr1, size_t aN,
                             const char* aStr2)
  {
    for (; aN--; ++aStr1, ++aStr2) {
      if (!*aStr2) {
        return 1;
      }
      do { } while(0);
      if (!eq_int_type(to_int_type(*aStr1),
                       to_int_type(static_cast<char_type>(*aStr2)))) {
        return to_int_type(*aStr1) -
               to_int_type(static_cast<char_type>(*aStr2));
      }
    }

    if (*aStr2) {
      return -1;
    }

    return 0;
  }





  static char_type
  ASCIIToLower(char_type aChar)
  {
    if (aChar >= 'A' && aChar <= 'Z') {
      return char_type(aChar + ('a' - 'A'));
    }

    return aChar;
  }

  static int
  compareLowerCaseToASCII(const char_type* aStr1, const char* aStr2, size_t aN)
  {
    for (; aN--; ++aStr1, ++aStr2) {
      do { } while(0);
      do { } while(0);

      char_type lower_s1 = ASCIIToLower(*aStr1);
      if (lower_s1 != static_cast<char_type>(*aStr2)) {
        return to_int_type(lower_s1) -
               to_int_type(static_cast<char_type>(*aStr2));
      }
    }

    return 0;
  }




  static int
  compareLowerCaseToASCIINullTerminated(const char_type* aStr1,
                                        size_t aN, const char* aStr2)
  {
    for (; aN--; ++aStr1, ++aStr2) {
      if (!*aStr2) {
        return 1;
      }
      do { } while(0);
      do { } while(0);

      char_type lower_s1 = ASCIIToLower(*aStr1);
      if (lower_s1 != static_cast<char_type>(*aStr2)) {
        return to_int_type(lower_s1) -
               to_int_type(static_cast<char_type>(*aStr2));
      }
    }

    if (*aStr2) {
      return -1;
    }

    return 0;
  }

  static size_t
  length(const char_type* aStr)
  {
    size_t result = 0;
    while (!eq(*aStr++, char_type(0))) {
      ++result;
    }
    return result;
  }

  static const char_type*
  find(const char_type* aStr, size_t aN, char_type aChar)
  {
    while (aN--) {
      if (eq(*aStr, aChar)) {
        return aStr;
      }
      ++aStr;
    }

    return 0;
  }
};

template <>
struct nsCharTraits<char>
{
  typedef char char_type;
  typedef unsigned char unsigned_char_type;
  typedef char16_t incompatible_char_type;

  static char_type* const sEmptyBuffer;

  static void
  assign(char_type& aLhs, char_type aRhs)
  {
    aLhs = aRhs;
  }




  typedef int int_type;

  static char_type
  to_char_type(int_type aChar)
  {
    return char_type(aChar);
  }

  static int_type
  to_int_type(char_type aChar)
  {
    return int_type(static_cast<unsigned_char_type>(aChar));
  }

  static bool
  eq_int_type(int_type aLhs, int_type aRhs)
  {
    return aLhs == aRhs;
  }




  static bool eq(char_type aLhs, char_type aRhs)
  {
    return aLhs == aRhs;
  }

  static bool
  lt(char_type aLhs, char_type aRhs)
  {
    return aLhs < aRhs;
  }




  static char_type*
  move(char_type* aStr1, const char_type* aStr2, size_t aN)
  {
    return static_cast<char_type*>(memmove(aStr1, aStr2,
                                           aN * sizeof(char_type)));
  }

  static char_type*
  copy(char_type* aStr1, const char_type* aStr2, size_t aN)
  {
    return static_cast<char_type*>(memcpy(aStr1, aStr2,
                                          aN * sizeof(char_type)));
  }

  static char_type*
  copyASCII(char_type* aStr1, const char* aStr2, size_t aN)
  {
    return copy(aStr1, aStr2, aN);
  }

  static char_type*
  assign(char_type* aStr, size_t aN, char_type aChar)
  {
    return static_cast<char_type*>(memset(aStr, to_int_type(aChar), aN));
  }

  static int
  compare(const char_type* aStr1, const char_type* aStr2, size_t aN)
  {
    return memcmp(aStr1, aStr2, aN);
  }

  static int
  compareASCII(const char_type* aStr1, const char* aStr2, size_t aN)
  {





    return compare(aStr1, aStr2, aN);
  }




  static int
  compareASCIINullTerminated(const char_type* aStr1, size_t aN,
                             const char* aStr2)
  {


    for (; aN--; ++aStr1, ++aStr2) {
      if (!*aStr2) {
        return 1;
      }
      do { } while(0);
      if (*aStr1 != *aStr2) {
        return to_int_type(*aStr1) - to_int_type(*aStr2);
      }
    }

    if (*aStr2) {
      return -1;
    }

    return 0;
  }




  static char_type
  ASCIIToLower(char_type aChar)
  {
    if (aChar >= 'A' && aChar <= 'Z') {
      return char_type(aChar + ('a' - 'A'));
    }

    return aChar;
  }

  static int
  compareLowerCaseToASCII(const char_type* aStr1, const char* aStr2, size_t aN)
  {
    for (; aN--; ++aStr1, ++aStr2) {
      do { } while(0);
      do { } while(0);

      char_type lower_s1 = ASCIIToLower(*aStr1);
      if (lower_s1 != *aStr2) {
        return to_int_type(lower_s1) - to_int_type(*aStr2);
      }
    }
    return 0;
  }




  static int
  compareLowerCaseToASCIINullTerminated(const char_type* aStr1, size_t aN,
                                        const char* aStr2)
  {
    for (; aN--; ++aStr1, ++aStr2) {
      if (!*aStr2) {
        return 1;
      }
      do { } while(0);
      do { } while(0);

      char_type lower_s1 = ASCIIToLower(*aStr1);
      if (lower_s1 != *aStr2) {
        return to_int_type(lower_s1) - to_int_type(*aStr2);
      }
    }

    if (*aStr2) {
      return -1;
    }

    return 0;
  }

  static size_t
  length(const char_type* aStr)
  {
    return strlen(aStr);
  }

  static const char_type*
  find(const char_type* aStr, size_t aN, char_type aChar)
  {
    return reinterpret_cast<const char_type*>(memchr(aStr, to_int_type(aChar),
                                                     aN));
  }
};

template <class InputIterator>
struct nsCharSourceTraits
{
  typedef typename InputIterator::difference_type difference_type;

  static uint32_t
  readable_distance(const InputIterator& aFirst, const InputIterator& aLast)
  {

    return uint32_t(aLast.get() - aFirst.get());
  }

  static const typename InputIterator::value_type*
  read(const InputIterator& aIter)
  {
    return aIter.get();
  }

  static void
  advance(InputIterator& aStr, difference_type aN)
  {
    aStr.advance(aN);
  }
};

template <class CharT>
struct nsCharSourceTraits<CharT*>
{
  typedef ptrdiff_t difference_type;

  static uint32_t
  readable_distance(CharT* aStr)
  {
    return uint32_t(nsCharTraits<CharT>::length(aStr));

  }

  static uint32_t
  readable_distance(CharT* aFirst, CharT* aLast)
  {
    return uint32_t(aLast - aFirst);
  }

  static const CharT*
  read(CharT* aStr)
  {
    return aStr;
  }

  static void
  advance(CharT*& aStr, difference_type aN)
  {
    aStr += aN;
  }
};

template <class OutputIterator>
struct nsCharSinkTraits
{
  static void
  write(OutputIterator& aIter, const typename OutputIterator::value_type* aStr,
        uint32_t aN)
  {
    aIter.write(aStr, aN);
  }
};

template <class CharT>
struct nsCharSinkTraits<CharT*>
{
  static void
  write(CharT*& aIter, const CharT* aStr, uint32_t aN)
  {
    nsCharTraits<CharT>::move(aIter, aStr, aN);
    aIter += aN;
  }
};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringIterator.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAlgorithm.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAlgorithm.h"
template <class T>
inline T
NS_ROUNDUP(const T& aA, const T& aB)
{
  return ((aA + (aB - 1)) / aB) * aB;
}




template <class T>
inline const T&
XPCOM_MIN(const T& aA, const T& aB)
{
  return aB < aA ? aB : aA;
}


template <class T>
inline const T&
XPCOM_MAX(const T& aA, const T& aB)
{
  return aA > aB ? aA : aB;
}

namespace mozilla {

template <class T>
inline const T&
clamped(const T& aA, const T& aMin, const T& aMax)
{
  do { } while (0);

  return XPCOM_MIN(XPCOM_MAX(aA, aMin), aMax);
}

}

template <class InputIterator, class T>
inline uint32_t
NS_COUNT(InputIterator& aFirst, const InputIterator& aLast, const T& aValue)
{
  uint32_t result = 0;
  for (; aFirst != aLast; ++aFirst)
    if (*aFirst == aValue) {
      ++result;
    }
  return result;
}

template <class InputIterator, class OutputIterator>
inline OutputIterator&
copy_string(const InputIterator& aFirst, const InputIterator& aLast,
            OutputIterator& aResult)
{
  typedef nsCharSourceTraits<InputIterator> source_traits;
  typedef nsCharSinkTraits<OutputIterator> sink_traits;

  sink_traits::write(aResult, source_traits::read(aFirst),
                     source_traits::readable_distance(aFirst, aLast));
  return aResult;
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringIterator.h" 2






template <class CharT>
class nsReadingIterator
{
public:
  typedef nsReadingIterator<CharT> self_type;
  typedef ptrdiff_t difference_type;
  typedef size_t size_type;
  typedef CharT value_type;
  typedef const CharT* pointer;
  typedef const CharT& reference;

private:
  friend class mozilla::detail::nsStringRepr;
  friend class mozilla::detail::nsCStringRepr;






  const CharT* mStart;
  const CharT* mEnd;
  const CharT* mPosition;

public:
  nsReadingIterator()
  {
  }



  pointer get() const
  {
    return mPosition;
  }

  CharT operator*() const
  {
    return *get();
  }

  self_type& operator++()
  {
    ++mPosition;
    return *this;
  }

  self_type operator++(int)
  {
    self_type result(*this);
    ++mPosition;
    return result;
  }

  self_type& operator--()
  {
    --mPosition;
    return *this;
  }

  self_type operator--(int)
  {
    self_type result(*this);
    --mPosition;
    return result;
  }

  self_type& advance(difference_type aN)
  {
    if (aN > 0) {
      difference_type step = XPCOM_MIN(aN, mEnd - mPosition);

      do { } while(0);


      mPosition += step;
    } else if (aN < 0) {
      difference_type step = XPCOM_MAX(aN, -(mPosition - mStart));

      do { } while(0);


      mPosition += step;
    }
    return *this;
  }






  size_type operator-(const self_type& aOther) const
  {
    do { } while (0);
    return mPosition - aOther.mPosition;
  }
};





template <class CharT>
class nsWritingIterator
{
public:
  typedef nsWritingIterator<CharT> self_type;
  typedef ptrdiff_t difference_type;
  typedef size_t size_type;
  typedef CharT value_type;
  typedef CharT* pointer;
  typedef CharT& reference;

private:
  friend class nsAString;
  friend class nsACString;






  CharT* mStart;
  CharT* mEnd;
  CharT* mPosition;

public:
  nsWritingIterator()
  {
  }



  pointer get() const
  {
    return mPosition;
  }

  reference operator*() const
  {
    return *get();
  }

  self_type& operator++()
  {
    ++mPosition;
    return *this;
  }

  self_type operator++(int)
  {
    self_type result(*this);
    ++mPosition;
    return result;
  }

  self_type& operator--()
  {
    --mPosition;
    return *this;
  }

  self_type operator--(int)
  {
    self_type result(*this);
    --mPosition;
    return result;
  }

  self_type& advance(difference_type aN)
  {
    if (aN > 0) {
      difference_type step = XPCOM_MIN(aN, mEnd - mPosition);

      do { } while(0);


      mPosition += step;
    } else if (aN < 0) {
      difference_type step = XPCOM_MAX(aN, -(mPosition - mStart));

      do { } while(0);


      mPosition += step;
    }
    return *this;
  }






  size_type operator-(const self_type& aOther) const
  {
    do { } while (0);
    return mPosition - aOther.mPosition;
  }
};

template <class CharT>
struct nsCharSinkTraits<nsWritingIterator<CharT>>
{
  static void
  write(nsWritingIterator<CharT>& aIter, const CharT* aStr, uint32_t aN)
  {
    nsCharTraits<CharT>::move(aIter.get(), aStr, aN);
    aIter.advance(aN);
  }
};

template <class CharT>
inline bool
operator==(const nsReadingIterator<CharT>& aLhs,
           const nsReadingIterator<CharT>& aRhs)
{
  return aLhs.get() == aRhs.get();
}

template <class CharT>
inline bool
operator!=(const nsReadingIterator<CharT>& aLhs,
           const nsReadingIterator<CharT>& aRhs)
{
  return aLhs.get() != aRhs.get();
}






template <class CharT>
inline bool
operator==(const nsWritingIterator<CharT>& aLhs,
           const nsWritingIterator<CharT>& aRhs)
{
  return aLhs.get() == aRhs.get();
}

template <class CharT>
inline bool
operator!=(const nsWritingIterator<CharT>& aLhs,
           const nsWritingIterator<CharT>& aRhs)
{
  return aLhs.get() != aRhs.get();
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2







# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerPrintfMacros.h" 1
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerPrintfMacros.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/inttypes.h" 1 3
# 30 "/usr/local/bin/../lib/clang/3.9.1/include/inttypes.h" 3
# 1 "/usr/include/inttypes.h" 1 3 4
# 266 "/usr/include/inttypes.h" 3 4
extern "C" {




typedef struct
  {
    long int quot;
    long int rem;
  } imaxdiv_t;
# 290 "/usr/include/inttypes.h" 3 4
extern intmax_t imaxabs (intmax_t __n) throw () __attribute__ ((__const__));


extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom)
      throw () __attribute__ ((__const__));


extern intmax_t strtoimax (const char *__restrict __nptr,
      char **__restrict __endptr, int __base) throw ();


extern uintmax_t strtoumax (const char *__restrict __nptr,
       char ** __restrict __endptr, int __base) throw ();


extern intmax_t wcstoimax (const wchar_t *__restrict __nptr,
      wchar_t **__restrict __endptr, int __base)
     throw ();


extern uintmax_t wcstoumax (const wchar_t *__restrict __nptr,
       wchar_t ** __restrict __endptr, int __base)
     throw ();
# 432 "/usr/include/inttypes.h" 3 4
}
# 31 "/usr/local/bin/../lib/clang/3.9.1/include/inttypes.h" 2 3
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IntegerPrintfMacros.h" 2
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 1
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 3
# 43 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _Tp, std::size_t _Nm>
    struct __array_traits
    {
      typedef _Tp _Type[_Nm];

      static constexpr _Tp&
      _S_ref(const _Type& __t, std::size_t __n) noexcept
      { return const_cast<_Tp&>(__t[__n]); }

      static constexpr _Tp*
      _S_ptr(const _Type& __t) noexcept
      { return const_cast<_Tp*>(__t); }
    };

 template<typename _Tp>
   struct __array_traits<_Tp, 0>
   {
     struct _Type { };

     static constexpr _Tp&
     _S_ref(const _Type&, std::size_t) noexcept
     { return *static_cast<_Tp*>(nullptr); }

     static constexpr _Tp*
     _S_ptr(const _Type&) noexcept
     { return nullptr; }
   };
# 89 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/array" 3
  template<typename _Tp, std::size_t _Nm>
    struct array
    {
      typedef _Tp value_type;
      typedef value_type* pointer;
      typedef const value_type* const_pointer;
      typedef value_type& reference;
      typedef const value_type& const_reference;
      typedef value_type* iterator;
      typedef const value_type* const_iterator;
      typedef std::size_t size_type;
      typedef std::ptrdiff_t difference_type;
      typedef std::reverse_iterator<iterator> reverse_iterator;
      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;


      typedef std::__array_traits<_Tp, _Nm> _AT_Type;
      typename _AT_Type::_Type _M_elems;




      void
      fill(const value_type& __u)
      { std::fill_n(begin(), size(), __u); }

      void
      swap(array& __other)
      noexcept(__is_nothrow_swappable<_Tp>::value)
      { std::swap_ranges(begin(), end(), __other.begin()); }


      iterator
      begin() noexcept
      { return iterator(data()); }

      const_iterator
      begin() const noexcept
      { return const_iterator(data()); }

      iterator
      end() noexcept
      { return iterator(data() + _Nm); }

      const_iterator
      end() const noexcept
      { return const_iterator(data() + _Nm); }

      reverse_iterator
      rbegin() noexcept
      { return reverse_iterator(end()); }

      const_reverse_iterator
      rbegin() const noexcept
      { return const_reverse_iterator(end()); }

      reverse_iterator
      rend() noexcept
      { return reverse_iterator(begin()); }

      const_reverse_iterator
      rend() const noexcept
      { return const_reverse_iterator(begin()); }

      const_iterator
      cbegin() const noexcept
      { return const_iterator(data()); }

      const_iterator
      cend() const noexcept
      { return const_iterator(data() + _Nm); }

      const_reverse_iterator
      crbegin() const noexcept
      { return const_reverse_iterator(end()); }

      const_reverse_iterator
      crend() const noexcept
      { return const_reverse_iterator(begin()); }


      constexpr size_type
      size() const noexcept { return _Nm; }

      constexpr size_type
      max_size() const noexcept { return _Nm; }

      constexpr bool
      empty() const noexcept { return size() == 0; }


      reference
      operator[](size_type __n) noexcept
      { return _AT_Type::_S_ref(_M_elems, __n); }

      constexpr const_reference
      operator[](size_type __n) const noexcept
      { return _AT_Type::_S_ref(_M_elems, __n); }

      reference
      at(size_type __n)
      {
 if (__n >= _Nm)
   std::__throw_out_of_range_fmt(("array::at: __n (which is %zu) " ">= _Nm (which is %zu)"),

     __n, _Nm);
 return _AT_Type::_S_ref(_M_elems, __n);
      }

      constexpr const_reference
      at(size_type __n) const
      {


 return __n < _Nm ? _AT_Type::_S_ref(_M_elems, __n)
   : (std::__throw_out_of_range_fmt(("array::at: __n (which is %zu) " ">= _Nm (which is %zu)"),

        __n, _Nm),
      _AT_Type::_S_ref(_M_elems, 0));
      }

      reference
      front() noexcept
      { return *begin(); }

      constexpr const_reference
      front() const noexcept
      { return _AT_Type::_S_ref(_M_elems, 0); }

      reference
      back() noexcept
      { return _Nm ? *(end() - 1) : *end(); }

      constexpr const_reference
      back() const noexcept
      {
 return _Nm ? _AT_Type::_S_ref(_M_elems, _Nm - 1)
             : _AT_Type::_S_ref(_M_elems, 0);
      }

      pointer
      data() noexcept
      { return _AT_Type::_S_ptr(_M_elems); }

      const_pointer
      data() const noexcept
      { return _AT_Type::_S_ptr(_M_elems); }
    };


  template<typename _Tp, std::size_t _Nm>
    inline bool
    operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    { return std::equal(__one.begin(), __one.end(), __two.begin()); }

  template<typename _Tp, std::size_t _Nm>
    inline bool
    operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    { return !(__one == __two); }

  template<typename _Tp, std::size_t _Nm>
    inline bool
    operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b)
    {
      return std::lexicographical_compare(__a.begin(), __a.end(),
       __b.begin(), __b.end());
    }

  template<typename _Tp, std::size_t _Nm>
    inline bool
    operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    { return __two < __one; }

  template<typename _Tp, std::size_t _Nm>
    inline bool
    operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    { return !(__one > __two); }

  template<typename _Tp, std::size_t _Nm>
    inline bool
    operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    { return !(__one < __two); }


  template<typename _Tp, std::size_t _Nm>
    inline void
    swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)
    noexcept(noexcept(__one.swap(__two)))
    { __one.swap(__two); }

  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
    constexpr _Tp&
    get(array<_Tp, _Nm>& __arr) noexcept
    {
      static_assert(_Int < _Nm, "index is out of bounds");
      return std::__array_traits<_Tp, _Nm>::
 _S_ref(__arr._M_elems, _Int);
    }

  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
    constexpr _Tp&&
    get(array<_Tp, _Nm>&& __arr) noexcept
    {
      static_assert(_Int < _Nm, "index is out of bounds");
      return std::move(std::get<_Int>(__arr));
    }

  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
    constexpr const _Tp&
    get(const array<_Tp, _Nm>& __arr) noexcept
    {
      static_assert(_Int < _Nm, "index is out of bounds");
      return std::__array_traits<_Tp, _Nm>::
 _S_ref(__arr._M_elems, _Int);
    }


}

namespace std __attribute__ ((__visibility__ ("default")))
{





  template<typename _Tp>
    class tuple_size;


  template<typename _Tp, std::size_t _Nm>
    struct tuple_size<std::array<_Tp, _Nm>>
    : public integral_constant<std::size_t, _Nm> { };


  template<std::size_t _Int, typename _Tp>
    class tuple_element;


  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
    struct tuple_element<_Int, std::array<_Tp, _Nm>>
    {
      static_assert(_Int < _Nm, "index is out of bounds");
      typedef _Tp type;
    };

  template<typename _Tp, std::size_t _Nm>
    struct __is_tuple_like_impl<std::array<_Tp, _Nm>> : true_type
    { };


}
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cstring" 3
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 3






# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3




namespace std __attribute__ ((__visibility__ ("default")))
{
# 57 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
  template<typename _CharT, typename _Traits>
    class basic_istream : virtual public basic_ios<_CharT, _Traits>
    {
    public:

      typedef _CharT char_type;
      typedef typename _Traits::int_type int_type;
      typedef typename _Traits::pos_type pos_type;
      typedef typename _Traits::off_type off_type;
      typedef _Traits traits_type;


      typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
      typedef basic_ios<_CharT, _Traits> __ios_type;
      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
        __num_get_type;
      typedef ctype<_CharT> __ctype_type;

    protected:





      streamsize _M_gcount;

    public:







      explicit
      basic_istream(__streambuf_type* __sb)
      : _M_gcount(streamsize(0))
      { this->init(__sb); }






      virtual
      ~basic_istream()
      { _M_gcount = streamsize(0); }


      class sentry;
      friend class sentry;
# 119 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      operator>>(__istream_type& (*__pf)(__istream_type&))
      { return __pf(*this); }

      __istream_type&
      operator>>(__ios_type& (*__pf)(__ios_type&))
      {
 __pf(*this);
 return *this;
      }

      __istream_type&
      operator>>(ios_base& (*__pf)(ios_base&))
      {
 __pf(*this);
 return *this;
      }
# 167 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      operator>>(bool& __n)
      { return _M_extract(__n); }

      __istream_type&
      operator>>(short& __n);

      __istream_type&
      operator>>(unsigned short& __n)
      { return _M_extract(__n); }

      __istream_type&
      operator>>(int& __n);

      __istream_type&
      operator>>(unsigned int& __n)
      { return _M_extract(__n); }

      __istream_type&
      operator>>(long& __n)
      { return _M_extract(__n); }

      __istream_type&
      operator>>(unsigned long& __n)
      { return _M_extract(__n); }


      __istream_type&
      operator>>(long long& __n)
      { return _M_extract(__n); }

      __istream_type&
      operator>>(unsigned long long& __n)
      { return _M_extract(__n); }
# 213 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      operator>>(float& __f)
      { return _M_extract(__f); }

      __istream_type&
      operator>>(double& __f)
      { return _M_extract(__f); }

      __istream_type&
      operator>>(long double& __f)
      { return _M_extract(__f); }
# 234 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      operator>>(void*& __p)
      { return _M_extract(__p); }
# 258 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      operator>>(__streambuf_type* __sb);
# 268 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      streamsize
      gcount() const
      { return _M_gcount; }
# 301 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      int_type
      get();
# 315 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      get(char_type& __c);
# 342 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      get(char_type* __s, streamsize __n, char_type __delim);
# 353 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      get(char_type* __s, streamsize __n)
      { return this->get(__s, __n, this->widen('\n')); }
# 376 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      get(__streambuf_type& __sb, char_type __delim);
# 386 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      get(__streambuf_type& __sb)
      { return this->get(__sb, this->widen('\n')); }
# 415 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      getline(char_type* __s, streamsize __n, char_type __delim);
# 426 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      getline(char_type* __s, streamsize __n)
      { return this->getline(__s, __n, this->widen('\n')); }
# 450 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      ignore(streamsize __n, int_type __delim);

      __istream_type&
      ignore(streamsize __n);

      __istream_type&
      ignore();
# 467 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      int_type
      peek();
# 485 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      read(char_type* __s, streamsize __n);
# 504 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      streamsize
      readsome(char_type* __s, streamsize __n);
# 521 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      putback(char_type __c);
# 537 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      unget();
# 555 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      int
      sync();
# 570 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      pos_type
      tellg();
# 585 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      seekg(pos_type);
# 601 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      __istream_type&
      seekg(off_type, ios_base::seekdir);


    protected:
      basic_istream()
      : _M_gcount(streamsize(0))
      { this->init(0); }


      basic_istream(const basic_istream&) = delete;

      basic_istream(basic_istream&& __rhs)
      : __ios_type(), _M_gcount(__rhs._M_gcount)
      {
 __ios_type::move(__rhs);
 __rhs._M_gcount = 0;
      }



      basic_istream& operator=(const basic_istream&) = delete;

      basic_istream&
      operator=(basic_istream&& __rhs)
      {
 swap(__rhs);
 return *this;
      }

      void
      swap(basic_istream& __rhs)
      {
 __ios_type::swap(__rhs);
 std::swap(_M_gcount, __rhs._M_gcount);
      }


      template<typename _ValueT>
 __istream_type&
 _M_extract(_ValueT& __v);
    };


  template<>
    basic_istream<char>&
    basic_istream<char>::
    getline(char_type* __s, streamsize __n, char_type __delim);

  template<>
    basic_istream<char>&
    basic_istream<char>::
    ignore(streamsize __n);

  template<>
    basic_istream<char>&
    basic_istream<char>::
    ignore(streamsize __n, int_type __delim);


  template<>
    basic_istream<wchar_t>&
    basic_istream<wchar_t>::
    getline(char_type* __s, streamsize __n, char_type __delim);

  template<>
    basic_istream<wchar_t>&
    basic_istream<wchar_t>::
    ignore(streamsize __n);

  template<>
    basic_istream<wchar_t>&
    basic_istream<wchar_t>::
    ignore(streamsize __n, int_type __delim);
# 685 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
  template<typename _CharT, typename _Traits>
    class basic_istream<_CharT, _Traits>::sentry
    {

      bool _M_ok;

    public:

      typedef _Traits traits_type;
      typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef typename __istream_type::__ctype_type __ctype_type;
      typedef typename _Traits::int_type __int_type;
# 721 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      explicit
      sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
# 732 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
      explicit

      operator bool() const
      { return _M_ok; }
    };
# 750 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c);

  template<class _Traits>
    inline basic_istream<char, _Traits>&
    operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c)
    { return (__in >> reinterpret_cast<char&>(__c)); }

  template<class _Traits>
    inline basic_istream<char, _Traits>&
    operator>>(basic_istream<char, _Traits>& __in, signed char& __c)
    { return (__in >> reinterpret_cast<char&>(__c)); }
# 792 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s);


  template<>
    basic_istream<char>&
    operator>>(basic_istream<char>& __in, char* __s);

  template<class _Traits>
    inline basic_istream<char, _Traits>&
    operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s)
    { return (__in >> reinterpret_cast<char*>(__s)); }

  template<class _Traits>
    inline basic_istream<char, _Traits>&
    operator>>(basic_istream<char, _Traits>& __in, signed char* __s)
    { return (__in >> reinterpret_cast<char*>(__s)); }
# 823 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
  template<typename _CharT, typename _Traits>
    class basic_iostream
    : public basic_istream<_CharT, _Traits>,
      public basic_ostream<_CharT, _Traits>
    {
    public:



      typedef _CharT char_type;
      typedef typename _Traits::int_type int_type;
      typedef typename _Traits::pos_type pos_type;
      typedef typename _Traits::off_type off_type;
      typedef _Traits traits_type;


      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef basic_ostream<_CharT, _Traits> __ostream_type;







      explicit
      basic_iostream(basic_streambuf<_CharT, _Traits>* __sb)
      : __istream_type(__sb), __ostream_type(__sb) { }




      virtual
      ~basic_iostream() { }

    protected:
      basic_iostream()
      : __istream_type(), __ostream_type() { }


      basic_iostream(const basic_iostream&) = delete;

      basic_iostream(basic_iostream&& __rhs)
      : __istream_type(std::move(__rhs)), __ostream_type(*this)
      { }



      basic_iostream& operator=(const basic_iostream&) = delete;

      basic_iostream&
      operator=(basic_iostream&& __rhs)
      {
 swap(__rhs);
 return *this;
      }

      void
      swap(basic_iostream& __rhs)
      { __istream_type::swap(__rhs); }

    };
# 906 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    ws(basic_istream<_CharT, _Traits>& __is);
# 922 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 3
  template<typename _CharT, typename _Traits, typename _Tp>
    inline basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
    {
      __is >> __x;
      return __is;
    }



}


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/istream.tcc" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/istream.tcc" 3



namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>::sentry::
    sentry(basic_istream<_CharT, _Traits>& __in, bool __noskip) : _M_ok(false)
    {
      ios_base::iostate __err = ios_base::goodbit;
      if (__in.good())
 {
   if (__in.tie())
     __in.tie()->flush();
   if (!__noskip && bool(__in.flags() & ios_base::skipws))
     {
       const __int_type __eof = traits_type::eof();
       __streambuf_type* __sb = __in.rdbuf();
       __int_type __c = __sb->sgetc();

       const __ctype_type& __ct = __check_facet(__in._M_ctype);
       while (!traits_type::eq_int_type(__c, __eof)
       && __ct.is(ctype_base::space,
    traits_type::to_char_type(__c)))
  __c = __sb->snextc();




       if (traits_type::eq_int_type(__c, __eof))
  __err |= ios_base::eofbit;
     }
 }

      if (__in.good() && __err == ios_base::goodbit)
 _M_ok = true;
      else
 {
   __err |= ios_base::failbit;
   __in.setstate(__err);
 }
    }

  template<typename _CharT, typename _Traits>
    template<typename _ValueT>
      basic_istream<_CharT, _Traits>&
      basic_istream<_CharT, _Traits>::
      _M_extract(_ValueT& __v)
      {
 sentry __cerb(*this, false);
 if (__cerb)
   {
     ios_base::iostate __err = ios_base::goodbit;
     try
       {
  const __num_get_type& __ng = __check_facet(this->_M_num_get);
  __ng.get(*this, 0, *this, __err, __v);
       }
     catch(__cxxabiv1::__forced_unwind&)
       {
  this->_M_setstate(ios_base::badbit);
  throw;
       }
     catch(...)
       { this->_M_setstate(ios_base::badbit); }
     if (__err)
       this->setstate(__err);
   }
 return *this;
      }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    operator>>(short& __n)
    {


      sentry __cerb(*this, false);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       long __l;
       const __num_get_type& __ng = __check_facet(this->_M_num_get);
       __ng.get(*this, 0, *this, __err, __l);



       if (__l < __gnu_cxx::__numeric_traits<short>::__min)
  {
    __err |= ios_base::failbit;
    __n = __gnu_cxx::__numeric_traits<short>::__min;
  }
       else if (__l > __gnu_cxx::__numeric_traits<short>::__max)
  {
    __err |= ios_base::failbit;
    __n = __gnu_cxx::__numeric_traits<short>::__max;
  }
       else
  __n = short(__l);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    operator>>(int& __n)
    {


      sentry __cerb(*this, false);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       long __l;
       const __num_get_type& __ng = __check_facet(this->_M_num_get);
       __ng.get(*this, 0, *this, __err, __l);



       if (__l < __gnu_cxx::__numeric_traits<int>::__min)
  {
    __err |= ios_base::failbit;
    __n = __gnu_cxx::__numeric_traits<int>::__min;
  }
       else if (__l > __gnu_cxx::__numeric_traits<int>::__max)
  {
    __err |= ios_base::failbit;
    __n = __gnu_cxx::__numeric_traits<int>::__max;
  }
       else
  __n = int(__l);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    operator>>(__streambuf_type* __sbout)
    {
      ios_base::iostate __err = ios_base::goodbit;
      sentry __cerb(*this, false);
      if (__cerb && __sbout)
 {
   try
     {
       bool __ineof;
       if (!__copy_streambufs_eof(this->rdbuf(), __sbout, __ineof))
  __err |= ios_base::failbit;
       if (__ineof)
  __err |= ios_base::eofbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::failbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::failbit); }
 }
      else if (!__sbout)
 __err |= ios_base::failbit;
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    typename basic_istream<_CharT, _Traits>::int_type
    basic_istream<_CharT, _Traits>::
    get(void)
    {
      const int_type __eof = traits_type::eof();
      int_type __c = __eof;
      _M_gcount = 0;
      ios_base::iostate __err = ios_base::goodbit;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   try
     {
       __c = this->rdbuf()->sbumpc();

       if (!traits_type::eq_int_type(__c, __eof))
  _M_gcount = 1;
       else
  __err |= ios_base::eofbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
 }
      if (!_M_gcount)
 __err |= ios_base::failbit;
      if (__err)
 this->setstate(__err);
      return __c;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    get(char_type& __c)
    {
      _M_gcount = 0;
      ios_base::iostate __err = ios_base::goodbit;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   try
     {
       const int_type __cb = this->rdbuf()->sbumpc();

       if (!traits_type::eq_int_type(__cb, traits_type::eof()))
  {
    _M_gcount = 1;
    __c = traits_type::to_char_type(__cb);
  }
       else
  __err |= ios_base::eofbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
 }
      if (!_M_gcount)
 __err |= ios_base::failbit;
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    get(char_type* __s, streamsize __n, char_type __delim)
    {
      _M_gcount = 0;
      ios_base::iostate __err = ios_base::goodbit;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   try
     {
       const int_type __idelim = traits_type::to_int_type(__delim);
       const int_type __eof = traits_type::eof();
       __streambuf_type* __sb = this->rdbuf();
       int_type __c = __sb->sgetc();

       while (_M_gcount + 1 < __n
       && !traits_type::eq_int_type(__c, __eof)
       && !traits_type::eq_int_type(__c, __idelim))
  {
    *__s++ = traits_type::to_char_type(__c);
    ++_M_gcount;
    __c = __sb->snextc();
  }
       if (traits_type::eq_int_type(__c, __eof))
  __err |= ios_base::eofbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
 }


      if (__n > 0)
 *__s = char_type();
      if (!_M_gcount)
 __err |= ios_base::failbit;
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    get(__streambuf_type& __sb, char_type __delim)
    {
      _M_gcount = 0;
      ios_base::iostate __err = ios_base::goodbit;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   try
     {
       const int_type __idelim = traits_type::to_int_type(__delim);
       const int_type __eof = traits_type::eof();
       __streambuf_type* __this_sb = this->rdbuf();
       int_type __c = __this_sb->sgetc();
       char_type __c2 = traits_type::to_char_type(__c);

       while (!traits_type::eq_int_type(__c, __eof)
       && !traits_type::eq_int_type(__c, __idelim)
       && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
  {
    ++_M_gcount;
    __c = __this_sb->snextc();
    __c2 = traits_type::to_char_type(__c);
  }
       if (traits_type::eq_int_type(__c, __eof))
  __err |= ios_base::eofbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
 }
      if (!_M_gcount)
 __err |= ios_base::failbit;
      if (__err)
 this->setstate(__err);
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    getline(char_type* __s, streamsize __n, char_type __delim)
    {
      _M_gcount = 0;
      ios_base::iostate __err = ios_base::goodbit;
      sentry __cerb(*this, true);
      if (__cerb)
        {
          try
            {
              const int_type __idelim = traits_type::to_int_type(__delim);
              const int_type __eof = traits_type::eof();
              __streambuf_type* __sb = this->rdbuf();
              int_type __c = __sb->sgetc();

              while (_M_gcount + 1 < __n
                     && !traits_type::eq_int_type(__c, __eof)
                     && !traits_type::eq_int_type(__c, __idelim))
                {
                  *__s++ = traits_type::to_char_type(__c);
                  __c = __sb->snextc();
                  ++_M_gcount;
                }
              if (traits_type::eq_int_type(__c, __eof))
                __err |= ios_base::eofbit;
              else
                {
                  if (traits_type::eq_int_type(__c, __idelim))
                    {
                      __sb->sbumpc();
                      ++_M_gcount;
                    }
                  else
                    __err |= ios_base::failbit;
                }
            }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
          catch(...)
            { this->_M_setstate(ios_base::badbit); }
        }


      if (__n > 0)
 *__s = char_type();
      if (!_M_gcount)
        __err |= ios_base::failbit;
      if (__err)
        this->setstate(__err);
      return *this;
    }




  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    ignore(void)
    {
      _M_gcount = 0;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       const int_type __eof = traits_type::eof();
       __streambuf_type* __sb = this->rdbuf();

       if (traits_type::eq_int_type(__sb->sbumpc(), __eof))
  __err |= ios_base::eofbit;
       else
  _M_gcount = 1;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    ignore(streamsize __n)
    {
      _M_gcount = 0;
      sentry __cerb(*this, true);
      if (__cerb && __n > 0)
        {
          ios_base::iostate __err = ios_base::goodbit;
          try
            {
              const int_type __eof = traits_type::eof();
              __streambuf_type* __sb = this->rdbuf();
              int_type __c = __sb->sgetc();
# 513 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/istream.tcc" 3
       bool __large_ignore = false;
       while (true)
  {
    while (_M_gcount < __n
    && !traits_type::eq_int_type(__c, __eof))
      {
        ++_M_gcount;
        __c = __sb->snextc();
      }
    if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
        && !traits_type::eq_int_type(__c, __eof))
      {
        _M_gcount =
   __gnu_cxx::__numeric_traits<streamsize>::__min;
        __large_ignore = true;
      }
    else
      break;
  }

       if (__large_ignore)
  _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;

       if (traits_type::eq_int_type(__c, __eof))
                __err |= ios_base::eofbit;
            }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
          catch(...)
            { this->_M_setstate(ios_base::badbit); }
          if (__err)
            this->setstate(__err);
        }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    ignore(streamsize __n, int_type __delim)
    {
      _M_gcount = 0;
      sentry __cerb(*this, true);
      if (__cerb && __n > 0)
        {
          ios_base::iostate __err = ios_base::goodbit;
          try
            {
              const int_type __eof = traits_type::eof();
              __streambuf_type* __sb = this->rdbuf();
              int_type __c = __sb->sgetc();


       bool __large_ignore = false;
       while (true)
  {
    while (_M_gcount < __n
    && !traits_type::eq_int_type(__c, __eof)
    && !traits_type::eq_int_type(__c, __delim))
      {
        ++_M_gcount;
        __c = __sb->snextc();
      }
    if (__n == __gnu_cxx::__numeric_traits<streamsize>::__max
        && !traits_type::eq_int_type(__c, __eof)
        && !traits_type::eq_int_type(__c, __delim))
      {
        _M_gcount =
   __gnu_cxx::__numeric_traits<streamsize>::__min;
        __large_ignore = true;
      }
    else
      break;
  }

       if (__large_ignore)
  _M_gcount = __gnu_cxx::__numeric_traits<streamsize>::__max;

              if (traits_type::eq_int_type(__c, __eof))
                __err |= ios_base::eofbit;
       else if (traits_type::eq_int_type(__c, __delim))
  {
    if (_M_gcount
        < __gnu_cxx::__numeric_traits<streamsize>::__max)
      ++_M_gcount;
    __sb->sbumpc();
  }
            }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
          catch(...)
            { this->_M_setstate(ios_base::badbit); }
          if (__err)
            this->setstate(__err);
        }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    typename basic_istream<_CharT, _Traits>::int_type
    basic_istream<_CharT, _Traits>::
    peek(void)
    {
      int_type __c = traits_type::eof();
      _M_gcount = 0;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       __c = this->rdbuf()->sgetc();
       if (traits_type::eq_int_type(__c, traits_type::eof()))
  __err |= ios_base::eofbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return __c;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    read(char_type* __s, streamsize __n)
    {
      _M_gcount = 0;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       _M_gcount = this->rdbuf()->sgetn(__s, __n);
       if (_M_gcount != __n)
  __err |= (ios_base::eofbit | ios_base::failbit);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    streamsize
    basic_istream<_CharT, _Traits>::
    readsome(char_type* __s, streamsize __n)
    {
      _M_gcount = 0;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {

       const streamsize __num = this->rdbuf()->in_avail();
       if (__num > 0)
  _M_gcount = this->rdbuf()->sgetn(__s, std::min(__num, __n));
       else if (__num == -1)
  __err |= ios_base::eofbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return _M_gcount;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    putback(char_type __c)
    {


      _M_gcount = 0;

      this->clear(this->rdstate() & ~ios_base::eofbit);
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       const int_type __eof = traits_type::eof();
       __streambuf_type* __sb = this->rdbuf();
       if (!__sb
    || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
  __err |= ios_base::badbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    unget(void)
    {


      _M_gcount = 0;

      this->clear(this->rdstate() & ~ios_base::eofbit);
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       const int_type __eof = traits_type::eof();
       __streambuf_type* __sb = this->rdbuf();
       if (!__sb
    || traits_type::eq_int_type(__sb->sungetc(), __eof))
  __err |= ios_base::badbit;
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    int
    basic_istream<_CharT, _Traits>::
    sync(void)
    {


      int __ret = -1;
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       __streambuf_type* __sb = this->rdbuf();
       if (__sb)
  {
    if (__sb->pubsync() == -1)
      __err |= ios_base::badbit;
    else
      __ret = 0;
  }
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return __ret;
    }

  template<typename _CharT, typename _Traits>
    typename basic_istream<_CharT, _Traits>::pos_type
    basic_istream<_CharT, _Traits>::
    tellg(void)
    {


      pos_type __ret = pos_type(-1);
      sentry __cerb(*this, true);
      if (__cerb)
 {
   try
     {
       if (!this->fail())
  __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
        ios_base::in);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
 }
      return __ret;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    seekg(pos_type __pos)
    {



      this->clear(this->rdstate() & ~ios_base::eofbit);
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       if (!this->fail())
  {

    const pos_type __p = this->rdbuf()->pubseekpos(__pos,
         ios_base::in);


    if (__p == pos_type(off_type(-1)))
      __err |= ios_base::failbit;
  }
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    basic_istream<_CharT, _Traits>::
    seekg(off_type __off, ios_base::seekdir __dir)
    {



      this->clear(this->rdstate() & ~ios_base::eofbit);
      sentry __cerb(*this, true);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       if (!this->fail())
  {

    const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
         ios_base::in);


    if (__p == pos_type(off_type(-1)))
      __err |= ios_base::failbit;
  }
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       this->_M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { this->_M_setstate(ios_base::badbit); }
   if (__err)
     this->setstate(__err);
 }
      return *this;
    }


  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
    {
      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef typename __istream_type::int_type __int_type;

      typename __istream_type::sentry __cerb(__in, false);
      if (__cerb)
 {
   ios_base::iostate __err = ios_base::goodbit;
   try
     {
       const __int_type __cb = __in.rdbuf()->sbumpc();
       if (!_Traits::eq_int_type(__cb, _Traits::eof()))
  __c = _Traits::to_char_type(__cb);
       else
  __err |= (ios_base::eofbit | ios_base::failbit);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       __in._M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { __in._M_setstate(ios_base::badbit); }
   if (__err)
     __in.setstate(__err);
 }
      return __in;
    }

  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
    {
      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
      typedef typename _Traits::int_type int_type;
      typedef _CharT char_type;
      typedef ctype<_CharT> __ctype_type;

      streamsize __extracted = 0;
      ios_base::iostate __err = ios_base::goodbit;
      typename __istream_type::sentry __cerb(__in, false);
      if (__cerb)
 {
   try
     {

       streamsize __num = __in.width();
       if (__num <= 0)
  __num = __gnu_cxx::__numeric_traits<streamsize>::__max;

       const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());

       const int_type __eof = _Traits::eof();
       __streambuf_type* __sb = __in.rdbuf();
       int_type __c = __sb->sgetc();

       while (__extracted < __num - 1
       && !_Traits::eq_int_type(__c, __eof)
       && !__ct.is(ctype_base::space,
     _Traits::to_char_type(__c)))
  {
    *__s++ = _Traits::to_char_type(__c);
    ++__extracted;
    __c = __sb->snextc();
  }
       if (_Traits::eq_int_type(__c, __eof))
  __err |= ios_base::eofbit;



       *__s = char_type();
       __in.width(0);
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       __in._M_setstate(ios_base::badbit);
       throw;
     }
   catch(...)
     { __in._M_setstate(ios_base::badbit); }
 }
      if (!__extracted)
 __err |= ios_base::failbit;
      if (__err)
 __in.setstate(__err);
      return __in;
    }


  template<typename _CharT, typename _Traits>
    basic_istream<_CharT, _Traits>&
    ws(basic_istream<_CharT, _Traits>& __in)
    {
      typedef basic_istream<_CharT, _Traits> __istream_type;
      typedef basic_streambuf<_CharT, _Traits> __streambuf_type;
      typedef typename __istream_type::int_type __int_type;
      typedef ctype<_CharT> __ctype_type;

      const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
      const __int_type __eof = _Traits::eof();
      __streambuf_type* __sb = __in.rdbuf();
      __int_type __c = __sb->sgetc();

      while (!_Traits::eq_int_type(__c, __eof)
      && __ct.is(ctype_base::space, _Traits::to_char_type(__c)))
 __c = __sb->snextc();

       if (_Traits::eq_int_type(__c, __eof))
  __in.setstate(ios_base::eofbit);
      return __in;
    }




  extern template class basic_istream<char>;
  extern template istream& ws(istream&);
  extern template istream& operator>>(istream&, char&);
  extern template istream& operator>>(istream&, char*);
  extern template istream& operator>>(istream&, unsigned char&);
  extern template istream& operator>>(istream&, signed char&);
  extern template istream& operator>>(istream&, unsigned char*);
  extern template istream& operator>>(istream&, signed char*);

  extern template istream& istream::_M_extract(unsigned short&);
  extern template istream& istream::_M_extract(unsigned int&);
  extern template istream& istream::_M_extract(long&);
  extern template istream& istream::_M_extract(unsigned long&);
  extern template istream& istream::_M_extract(bool&);

  extern template istream& istream::_M_extract(long long&);
  extern template istream& istream::_M_extract(unsigned long long&);

  extern template istream& istream::_M_extract(float&);
  extern template istream& istream::_M_extract(double&);
  extern template istream& istream::_M_extract(long double&);
  extern template istream& istream::_M_extract(void*&);

  extern template class basic_iostream<char>;


  extern template class basic_istream<wchar_t>;
  extern template wistream& ws(wistream&);
  extern template wistream& operator>>(wistream&, wchar_t&);
  extern template wistream& operator>>(wistream&, wchar_t*);

  extern template wistream& wistream::_M_extract(unsigned short&);
  extern template wistream& wistream::_M_extract(unsigned int&);
  extern template wistream& wistream::_M_extract(long&);
  extern template wistream& wistream::_M_extract(unsigned long&);
  extern template wistream& wistream::_M_extract(bool&);

  extern template wistream& wistream::_M_extract(long long&);
  extern template wistream& wistream::_M_extract(unsigned long long&);

  extern template wistream& wistream::_M_extract(float&);
  extern template wistream& wistream::_M_extract(double&);
  extern template wistream& wistream::_M_extract(long double&);
  extern template wistream& wistream::_M_extract(void*&);

  extern template class basic_iostream<wchar_t>;




}
# 935 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/istream" 2 3
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 1 3
# 34 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3



namespace std __attribute__ ((__visibility__ ("default")))
{
# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3
  template<typename _Tp, typename _CharT = char,
           typename _Traits = char_traits<_CharT>, typename _Dist = ptrdiff_t>
    class istream_iterator
    : public iterator<input_iterator_tag, _Tp, _Dist, const _Tp*, const _Tp&>
    {
    public:
      typedef _CharT char_type;
      typedef _Traits traits_type;
      typedef basic_istream<_CharT, _Traits> istream_type;

    private:
      istream_type* _M_stream;
      _Tp _M_value;
      bool _M_ok;

    public:

      constexpr istream_iterator()
      : _M_stream(0), _M_value(), _M_ok(false) {}


      istream_iterator(istream_type& __s)
      : _M_stream(&__s)
      { _M_read(); }

      istream_iterator(const istream_iterator& __obj)
      : _M_stream(__obj._M_stream), _M_value(__obj._M_value),
        _M_ok(__obj._M_ok)
      { }

      const _Tp&
      operator*() const
      {


                        ;
 return _M_value;
      }

      const _Tp*
      operator->() const { return &(operator*()); }

      istream_iterator&
      operator++()
      {


                        ;
 _M_read();
 return *this;
      }

      istream_iterator
      operator++(int)
      {


                        ;
 istream_iterator __tmp = *this;
 _M_read();
 return __tmp;
      }

      bool
      _M_equal(const istream_iterator& __x) const
      { return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream); }

    private:
      void
      _M_read()
      {
 _M_ok = (_M_stream && *_M_stream) ? true : false;
 if (_M_ok)
   {
     *_M_stream >> _M_value;
     _M_ok = *_M_stream ? true : false;
   }
      }
    };


  template<typename _Tp, typename _CharT, typename _Traits, typename _Dist>
    inline bool
    operator==(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x,
        const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y)
    { return __x._M_equal(__y); }


  template <class _Tp, class _CharT, class _Traits, class _Dist>
    inline bool
    operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x,
        const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y)
    { return !__x._M_equal(__y); }
# 152 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3
  template<typename _Tp, typename _CharT = char,
           typename _Traits = char_traits<_CharT> >
    class ostream_iterator
    : public iterator<output_iterator_tag, void, void, void, void>
    {
    public:


      typedef _CharT char_type;
      typedef _Traits traits_type;
      typedef basic_ostream<_CharT, _Traits> ostream_type;


    private:
      ostream_type* _M_stream;
      const _CharT* _M_string;

    public:

      ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {}
# 183 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stream_iterator.h" 3
      ostream_iterator(ostream_type& __s, const _CharT* __c)
      : _M_stream(&__s), _M_string(__c) { }


      ostream_iterator(const ostream_iterator& __obj)
      : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { }



      ostream_iterator&
      operator=(const _Tp& __value)
      {


                        ;
 *_M_stream << __value;
 if (_M_string) *_M_stream << _M_string;
 return *this;
      }

      ostream_iterator&
      operator*()
      { return *this; }

      ostream_iterator&
      operator++()
      { return *this; }

      ostream_iterator&
      operator++(int)
      { return *this; }
    };




}
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/iterator" 2 3
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h" 2
# 63 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h"
namespace mozilla {




template<class T, class U>
inline constexpr T
narrow_cast(U&& u)
{
  return static_cast<T>(mozilla::Forward<U>(u));
}
# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h"
constexpr const size_t dynamic_extent = mozilla::MaxValue<size_t>::value;

template<class ElementType, size_t Extent = dynamic_extent>
class Span;


namespace span_details {

inline size_t strlen16(const char16_t* aZeroTerminated) {
  size_t len = 0;
  while (*(aZeroTerminated++)) {
    len++;
  }
  return len;
}


template<class T>
using remove_cv_t = typename mozilla::RemoveCV<T>::Type;
template<class T>
using remove_const_t = typename mozilla::RemoveConst<T>::Type;
template<bool B, class T, class F>
using conditional_t = typename mozilla::Conditional<B, T, F>::Type;
template<class T>
using add_pointer_t = typename mozilla::AddPointer<T>::Type;
template<bool B, class T = void>
using enable_if_t = typename mozilla::EnableIf<B, T>::Type;

template<class T>
struct is_span_oracle : mozilla::FalseType
{
};

template<class ElementType, size_t Extent>
struct is_span_oracle<mozilla::Span<ElementType, Extent>> : mozilla::TrueType
{
};

template<class T>
struct is_span : public is_span_oracle<remove_cv_t<T>>
{
};

template<class T>
struct is_std_array_oracle : mozilla::FalseType
{
};

template<class ElementType, size_t Extent>
struct is_std_array_oracle<std::array<ElementType, Extent>> : mozilla::TrueType
{
};

template<class T>
struct is_std_array : public is_std_array_oracle<remove_cv_t<T>>
{
};

template<size_t From, size_t To>
struct is_allowed_extent_conversion
  : public mozilla::IntegralConstant<bool,
                                  From == To ||
                                    From == mozilla::dynamic_extent ||
                                    To == mozilla::dynamic_extent>
{
};

template<class From, class To>
struct is_allowed_element_type_conversion
  : public mozilla::IntegralConstant<bool, mozilla::IsConvertible<From (*)[], To (*)[]>::value>
{
};

template<class Span, bool IsConst>
class span_iterator
{
  using element_type_ = typename Span::element_type;

public:
  using iterator_category = std::random_access_iterator_tag;
  using value_type = remove_const_t<element_type_>;
  using difference_type = typename Span::index_type;

  using reference = conditional_t<IsConst, const element_type_, element_type_>&;
  using pointer = add_pointer_t<reference>;

  constexpr span_iterator() : span_iterator(nullptr, 0) {}

                               span_iterator(const Span* span,
                                             typename Span::index_type index)
    : span_(span)
    , index_(index)
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(span == nullptr || (index_ >= 0 && index <= span_->Length()))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span == nullptr || (index_ >= 0 && index <= span_->Length())))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span == nullptr || (index_ >= 0 && index <= span_->Length())" ")"); do { *((volatile int*) __null) = 176; ::abort(); } while (0); } } while (0);

  }

  friend class span_iterator<Span, true>;
  constexpr span_iterator(const span_iterator<Span, false>& other)
    : span_iterator(other.span_, other.index_)
  {
  }

                                          span_iterator<Span, IsConst>&
  operator=(const span_iterator<Span, IsConst>&) = default;

                         reference operator*() const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(span_)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_" ")"); do { *((volatile int*) __null) = 190; ::abort(); } while (0); } } while (0);
    return (*span_)[index_];
  }

                         pointer operator->() const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(span_)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_" ")"); do { *((volatile int*) __null) = 196; ::abort(); } while (0); } } while (0);
    return &((*span_)[index_]);
  }

                               span_iterator& operator++()
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(span_ && index_ >= 0 && index_ < span_->Length())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ && index_ >= 0 && index_ < span_->Length()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ && index_ >= 0 && index_ < span_->Length()" ")"); do { *((volatile int*) __null) = 202; ::abort(); } while (0); } } while (0);
    ++index_;
    return *this;
  }

                               span_iterator operator++(int)
  {
    auto ret = *this;
    ++(*this);
    return ret;
  }

                               span_iterator& operator--()
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(span_ && index_ > 0 && index_ <= span_->Length())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ && index_ > 0 && index_ <= span_->Length()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ && index_ > 0 && index_ <= span_->Length()" ")"); do { *((volatile int*) __null) = 216; ::abort(); } while (0); } } while (0);
    --index_;
    return *this;
  }

                               span_iterator operator--(int)
  {
    auto ret = *this;
    --(*this);
    return ret;
  }

                                     span_iterator
  operator+(difference_type n) const
  {
    auto ret = *this;
    return ret += n;
  }

                         span_iterator& operator+=(difference_type n)
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(span_ && (index_ + n) >= 0 && (index_ + n) <= span_->Length())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ && (index_ + n) >= 0 && (index_ + n) <= span_->Length()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ && (index_ + n) >= 0 && (index_ + n) <= span_->Length()" ")"); do { *((volatile int*) __null) = 238; ::abort(); } while (0); } } while (0);

    index_ += n;
    return *this;
  }

                                     span_iterator
  operator-(difference_type n) const
  {
    auto ret = *this;
    return ret -= n;
  }

                               span_iterator& operator-=(difference_type n)

  {
    return *this += -n;
  }

                         difference_type
  operator-(const span_iterator& rhs) const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(span_ == rhs.span_)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(span_ == rhs.span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "span_ == rhs.span_" ")"); do { *((volatile int*) __null) = 259; ::abort(); } while (0); } } while (0);
    return index_ - rhs.index_;
  }

  constexpr reference operator[](difference_type n) const
  {
    return *(*this + n);
  }

  constexpr friend bool operator==(const span_iterator& lhs,
                                   const span_iterator& rhs)
  {
    return lhs.span_ == rhs.span_ && lhs.index_ == rhs.index_;
  }

  constexpr friend bool operator!=(const span_iterator& lhs,
                                   const span_iterator& rhs)
  {
    return !(lhs == rhs);
  }

                         friend bool operator<(const span_iterator& lhs,
                                               const span_iterator& rhs)
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(lhs.span_ == rhs.span_)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(lhs.span_ == rhs.span_))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "lhs.span_ == rhs.span_" ")"); do { *((volatile int*) __null) = 283; ::abort(); } while (0); } } while (0);
    return lhs.index_ < rhs.index_;
  }

  constexpr friend bool operator<=(const span_iterator& lhs,
                                   const span_iterator& rhs)
  {
    return !(rhs < lhs);
  }

  constexpr friend bool operator>(const span_iterator& lhs,
                                  const span_iterator& rhs)
  {
    return rhs < lhs;
  }

  constexpr friend bool operator>=(const span_iterator& lhs,
                                   const span_iterator& rhs)
  {
    return !(rhs > lhs);
  }

  void swap(span_iterator& rhs)
  {
    std::swap(index_, rhs.index_);
    std::swap(span_, rhs.span_);
  }

protected:
  const Span* span_;
  size_t index_;
};

template<class Span, bool IsConst>
inline constexpr span_iterator<Span, IsConst>
operator+(typename span_iterator<Span, IsConst>::difference_type n,
          const span_iterator<Span, IsConst>& rhs)
{
  return rhs + n;
}

template<size_t Ext>
class extent_type
{
public:
  using index_type = size_t;

  static_assert(Ext >= 0, "A fixed-size Span must be >= 0 in size.");

  constexpr extent_type() {}

  template<index_type Other>
                                            extent_type(extent_type<Other> ext)
  {
    static_assert(
      Other == Ext || Other == dynamic_extent,
      "Mismatch between fixed-size extent and size of initializing data.");
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(ext.size() == Ext)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(ext.size() == Ext))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "ext.size() == Ext" ")"); do { *((volatile int*) __null) = 340; ::abort(); } while (0); } } while (0);
  }

                                            extent_type(index_type length)
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(length == Ext)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(length == Ext))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "length == Ext" ")"); do { *((volatile int*) __null) = 345; ::abort(); } while (0); } } while (0);
  }

  constexpr index_type size() const { return Ext; }
};

template<>
class extent_type<dynamic_extent>
{
public:
  using index_type = size_t;

  template<index_type Other>
  explicit constexpr extent_type(extent_type<Other> ext)
    : size_(ext.size())
  {
  }

  explicit constexpr extent_type(index_type length)
    : size_(length)
  {
  }

  constexpr index_type size() const { return size_; }

private:
  index_type size_;
};
}
# 436 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Span.h"
template<class ElementType, size_t Extent>
class Span
{
public:

  using element_type = ElementType;
  using index_type = size_t;
  using pointer = element_type*;
  using reference = element_type&;

  using iterator =
    span_details::span_iterator<Span<ElementType, Extent>, false>;
  using const_iterator =
    span_details::span_iterator<Span<ElementType, Extent>, true>;
  using reverse_iterator = std::reverse_iterator<iterator>;
  using const_reverse_iterator = std::reverse_iterator<const_iterator>;

  constexpr static const index_type extent = Extent;







  template<
    bool Dependent = false,
    class = span_details::enable_if_t<
      (Dependent || Extent == 0 || Extent == mozilla::MaxValue<size_t>::value)>>
  constexpr Span()
    : storage_(nullptr, span_details::extent_type<0>())
  {
  }




  constexpr Span(std::nullptr_t) : Span() {}




  constexpr Span(pointer aPtr, index_type aLength)
    : storage_(aPtr, aLength)
  {
  }




  constexpr Span(pointer aStartPtr, pointer aEndPtr)
    : storage_(aStartPtr, std::distance(aStartPtr, aEndPtr))
  {
  }




  template<size_t N>
  constexpr Span(element_type (&aArr)[N])
    : storage_(&aArr[0], span_details::extent_type<N>())
  {
  }




  template<size_t N,
           class ArrayElementType = span_details::remove_const_t<element_type>>
  constexpr Span(std::array<ArrayElementType, N>& aArr)
    : storage_(&aArr[0], span_details::extent_type<N>())
  {
  }




  template<size_t N>
  constexpr Span(
    const std::array<span_details::remove_const_t<element_type>, N>& aArr)
    : storage_(&aArr[0], span_details::extent_type<N>())
  {
  }




  template<size_t N,
           class ArrayElementType = span_details::remove_const_t<element_type>>
  constexpr Span(mozilla::Array<ArrayElementType, N>& aArr)
    : storage_(&aArr[0], span_details::extent_type<N>())
  {
  }




  template<size_t N>
  constexpr Span(
    const mozilla::Array<span_details::remove_const_t<element_type>, N>& aArr)
    : storage_(&aArr[0], span_details::extent_type<N>())
  {
  }




  template<class ArrayElementType = std::add_pointer<element_type>>
  constexpr Span(const mozilla::UniquePtr<ArrayElementType>& aPtr,
                 index_type aLength)
    : storage_(aPtr.get(), aLength)
  {
  }






  template<
    class Container,
    class = span_details::enable_if_t<
      !span_details::is_span<Container>::value &&
      !span_details::is_std_array<Container>::value &&
      mozilla::IsConvertible<typename Container::pointer, pointer>::value &&
      mozilla::IsConvertible<typename Container::pointer,
                          decltype(mozilla::DeclVal<Container>().data())>::value>>
  constexpr Span(Container& cont)
    : Span(cont.data(), ReleaseAssertedCast<index_type>(cont.size()))
  {
  }




  template<
    class Container,
    class = span_details::enable_if_t<
      mozilla::IsConst<element_type>::value &&
      !span_details::is_span<Container>::value &&
      mozilla::IsConvertible<typename Container::pointer, pointer>::value &&
      mozilla::IsConvertible<typename Container::pointer,
                          decltype(mozilla::DeclVal<Container>().data())>::value>>
  constexpr Span(const Container& cont)
    : Span(cont.data(), ReleaseAssertedCast<index_type>(cont.size()))
  {
  }




  constexpr Span(const Span& other) = default;




  constexpr Span(Span&& other) = default;




  template<
    class OtherElementType,
    size_t OtherExtent,
    class = span_details::enable_if_t<
      span_details::is_allowed_extent_conversion<OtherExtent, Extent>::value &&
      span_details::is_allowed_element_type_conversion<OtherElementType,
                                                       element_type>::value>>
  constexpr Span(const Span<OtherElementType, OtherExtent>& other)
    : storage_(other.data(),
               span_details::extent_type<OtherExtent>(other.size()))
  {
  }




  template<
    class OtherElementType,
    size_t OtherExtent,
    class = span_details::enable_if_t<
      span_details::is_allowed_extent_conversion<OtherExtent, Extent>::value &&
      span_details::is_allowed_element_type_conversion<OtherElementType,
                                                       element_type>::value>>
  constexpr Span(Span<OtherElementType, OtherExtent>&& other)
    : storage_(other.data(),
               span_details::extent_type<OtherExtent>(other.size()))
  {
  }

  ~Span() = default;
                                          Span& operator=(const Span& other)
    = default;

                                          Span& operator=(Span&& other)
    = default;





  template<size_t Count>
                         Span<element_type, Count> First() const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(Count <= size())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(Count <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "Count <= size()" ")"); do { *((volatile int*) __null) = 640; ::abort(); } while (0); } } while (0);
    return { data(), Count };
  }




  template<size_t Count>
                         Span<element_type, Count> Last() const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(Count <= size())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(Count <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "Count <= size()" ")"); do { *((volatile int*) __null) = 650; ::abort(); } while (0); } } while (0);
    return { data() + (size() - Count), Count };
  }




  template<size_t Offset, size_t Count = dynamic_extent>
                         Span<element_type, Count> Subspan() const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(Offset <= size() && (Count == dynamic_extent || (Offset + Count <= size())))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(Offset <= size() && (Count == dynamic_extent || (Offset + Count <= size()))))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "Offset <= size() && (Count == dynamic_extent || (Offset + Count <= size()))" ")"); do { *((volatile int*) __null) = 661; ::abort(); } while (0); } } while (0);

    return { data() + Offset,
             Count == dynamic_extent ? size() - Offset : Count };
  }




                         Span<element_type, dynamic_extent> First(
    index_type aCount) const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(aCount <= size())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aCount <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aCount <= size()" ")"); do { *((volatile int*) __null) = 672; ::abort(); } while (0); } } while (0);
    return { data(), aCount };
  }




                         Span<element_type, dynamic_extent> Last(
    index_type aCount) const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(aCount <= size())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aCount <= size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aCount <= size()" ")"); do { *((volatile int*) __null) = 682; ::abort(); } while (0); } } while (0);
    return { data() + (size() - aCount), aCount };
  }




                         Span<element_type, dynamic_extent> Subspan(
    index_type aStart,
    index_type aLength = dynamic_extent) const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(aStart <= size() && (aLength == dynamic_extent || (aStart + aLength <= size())))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aStart <= size() && (aLength == dynamic_extent || (aStart + aLength <= size()))))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aStart <= size() && (aLength == dynamic_extent || (aStart + aLength <= size()))" ")"); do { *((volatile int*) __null) = 695; ::abort(); } while (0); } } while (0);


    return { data() + aStart,
             aLength == dynamic_extent ? size() - aStart : aLength };
  }




                         Span<element_type, dynamic_extent> From(
    index_type aStart) const
  {
    return Subspan(aStart);
  }




                         Span<element_type, dynamic_extent> To(
    index_type aEnd) const
  {
    return Subspan(0, aEnd);
  }





                         Span<element_type, dynamic_extent> FromTo(
    index_type aStart,
    index_type aEnd) const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(aStart <= aEnd)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aStart <= aEnd))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aStart <= aEnd" ")"); do { *((volatile int*) __null) = 726; ::abort(); } while (0); } } while (0);
    return Subspan(aStart, aEnd - aStart);
  }





  constexpr index_type Length() const { return size(); }




  constexpr index_type size() const { return storage_.size(); }




  constexpr index_type LengthBytes() const { return size_bytes(); }




  constexpr index_type size_bytes() const
  {
    return size() * narrow_cast<index_type>(sizeof(element_type));
  }




  constexpr bool IsEmpty() const { return empty(); }





  constexpr bool empty() const { return size() == 0; }


                         reference operator[](index_type idx) const
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(idx < storage_.size())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(idx < storage_.size()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "idx < storage_.size()" ")"); do { *((volatile int*) __null) = 768; ::abort(); } while (0); } } while (0);
    return data()[idx];
  }




  constexpr reference at(index_type idx) const { return this->operator[](idx); }

  constexpr reference operator()(index_type idx) const
  {
    return this->operator[](idx);
  }




  constexpr pointer Elements() const { return data(); }




  constexpr pointer data() const { return storage_.data(); }


  iterator begin() const { return { this, 0 }; }
  iterator end() const { return { this, Length() }; }

  const_iterator cbegin() const { return { this, 0 }; }
  const_iterator cend() const { return { this, Length() }; }

  reverse_iterator rbegin() const
  {
    return reverse_iterator{ end() };
  }
  reverse_iterator rend() const
  {
    return reverse_iterator{ begin() };
  }

  const_reverse_iterator crbegin() const
  {
    return const_reverse_iterator{ cend() };
  }
  const_reverse_iterator crend() const
  {
    return const_reverse_iterator{ cbegin() };
  }

private:



  template<class ExtentType>
  class storage_type : public ExtentType
  {
  public:
    template<class OtherExtentType>
                                 storage_type(pointer elements,
                                              OtherExtentType ext)
      : ExtentType(ext)
      , data_(elements)
    {
      do { static_assert(mozilla::detail::AssertionConditionType<decltype((!elements && ExtentType::size() == 0) || (elements && ExtentType::size() != mozilla::MaxValue<size_t>::value))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!((!elements && ExtentType::size() == 0) || (elements && ExtentType::size() != mozilla::MaxValue<size_t>::value)))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "(!elements && ExtentType::size() == 0) || (elements && ExtentType::size() != mozilla::MaxValue<size_t>::value)" ")"); do { *((volatile int*) __null) = 833; ::abort(); } while (0); } } while (0);


    }

    constexpr pointer data() const { return data_; }

  private:
    pointer data_;
  };

  storage_type<span_details::extent_type<Extent>> storage_;
};


template<class ElementType, size_t FirstExtent, size_t SecondExtent>
inline constexpr bool
operator==(const Span<ElementType, FirstExtent>& l,
           const Span<ElementType, SecondExtent>& r)
{
  return (l.size() == r.size()) && std::equal(l.begin(), l.end(), r.begin());
}

template<class ElementType, size_t Extent>
inline constexpr bool
operator!=(const Span<ElementType, Extent>& l,
           const Span<ElementType, Extent>& r)
{
  return !(l == r);
}

template<class ElementType, size_t Extent>
inline constexpr bool
operator<(const Span<ElementType, Extent>& l,
          const Span<ElementType, Extent>& r)
{
  return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end());
}

template<class ElementType, size_t Extent>
inline constexpr bool
operator<=(const Span<ElementType, Extent>& l,
           const Span<ElementType, Extent>& r)
{
  return !(l > r);
}

template<class ElementType, size_t Extent>
inline constexpr bool
operator>(const Span<ElementType, Extent>& l,
          const Span<ElementType, Extent>& r)
{
  return r < l;
}

template<class ElementType, size_t Extent>
inline constexpr bool
operator>=(const Span<ElementType, Extent>& l,
           const Span<ElementType, Extent>& r)
{
  return !(l < r);
}

namespace span_details {






template<class ElementType, size_t Extent>
struct calculate_byte_size
  : mozilla::IntegralConstant<size_t,
                           static_cast<size_t>(sizeof(ElementType) *
                                               static_cast<size_t>(Extent))>
{
};

template<class ElementType>
struct calculate_byte_size<ElementType, dynamic_extent>
  : mozilla::IntegralConstant<size_t, dynamic_extent>
{
};
}





template<class ElementType, size_t Extent>
Span<const uint8_t,
     span_details::calculate_byte_size<ElementType, Extent>::value>
AsBytes(Span<ElementType, Extent> s)
{
  return { reinterpret_cast<const uint8_t*>(s.data()), s.size_bytes() };
}




template<class ElementType,
         size_t Extent,
         class = span_details::enable_if_t<!mozilla::IsConst<ElementType>::value>>
Span<uint8_t, span_details::calculate_byte_size<ElementType, Extent>::value>
AsWritableBytes(Span<ElementType, Extent> s)
{
  return { reinterpret_cast<uint8_t*>(s.data()), s.size_bytes() };
}







template<class ElementType>
Span<ElementType>
MakeSpan(ElementType* aPtr, typename Span<ElementType>::index_type aLength)
{
  return Span<ElementType>(aPtr, aLength);
}




template<class ElementType>
Span<ElementType>
MakeSpan(ElementType* aStartPtr, ElementType* aEndPtr)
{
  return Span<ElementType>(aStartPtr, aEndPtr);
}




template<class ElementType, size_t N>
Span<ElementType> MakeSpan(ElementType (&aArr)[N])
{
  return Span<ElementType>(aArr);
}




template<class ElementType, size_t N>
Span<ElementType>
MakeSpan(mozilla::Array<ElementType, N>& aArr)
{
  return aArr;
}




template<class ElementType, size_t N>
Span<const ElementType>
MakeSpan(const mozilla::Array<ElementType, N>& arr)
{
  return arr;
}




template<class Container>
Span<typename Container::value_type>
MakeSpan(Container& cont)
{
  return Span<typename Container::value_type>(cont);
}




template<class Container>
Span<const typename Container::value_type>
MakeSpan(const Container& cont)
{
  return Span<const typename Container::value_type>(cont);
}




template<class Ptr>
Span<typename Ptr::element_type>
MakeSpan(Ptr& aPtr, size_t aLength)
{
  return Span<typename Ptr::element_type>(aPtr, aLength);
}




inline Span<const char>
MakeStringSpan(const char* aZeroTerminated)
{
  return Span<const char>(aZeroTerminated, std::strlen(aZeroTerminated));
}




inline Span<const char16_t>
MakeStringSpan(const char16_t* aZeroTerminated)
{
  return Span<const char16_t>(aZeroTerminated, span_details::strlen16(aZeroTerminated));
}

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" 2








class nsStringComparator
{
public:
  typedef char16_t char_type;

  nsStringComparator()
  {
  }

  virtual int operator()(const char_type*, const char_type*,
                         uint32_t, uint32_t) const = 0;
};





class nsDefaultStringComparator
  : public nsStringComparator
{
public:
  typedef char16_t char_type;

  nsDefaultStringComparator()
  {
  }

  virtual int operator()(const char_type*, const char_type*,
                         uint32_t, uint32_t) const override;
};

class nsSubstringSplitter;

namespace mozilla {
namespace detail {
# 75 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
class nsStringRepr
{
public:
  typedef mozilla::fallible_t fallible_t;

  typedef char16_t char_type;

  typedef nsCharTraits<char_type> char_traits;
  typedef char_traits::incompatible_char_type incompatible_char_type;

  typedef nsStringRepr self_type;
  typedef self_type base_string_type;

  typedef nsAString substring_type;
  typedef nsSubstringTuple substring_tuple_type;
  typedef nsString string_type;

  typedef nsReadingIterator<char_type> const_iterator;
  typedef nsWritingIterator<char_type> iterator;

  typedef nsStringComparator comparator_type;

  typedef char_type* char_iterator;
  typedef const char_type* const_char_iterator;

  typedef uint32_t index_type;
  typedef uint32_t size_type;





  const_char_iterator BeginReading() const
  {
    return mData;
  }
  const_char_iterator EndReading() const
  {
    return mData + mLength;
  }





  const_iterator& BeginReading(const_iterator& aIter) const
  {
    aIter.mStart = mData;
    aIter.mEnd = mData + mLength;
    aIter.mPosition = aIter.mStart;
    return aIter;
  }

  const_iterator& EndReading(const_iterator& aIter) const
  {
    aIter.mStart = mData;
    aIter.mEnd = mData + mLength;
    aIter.mPosition = aIter.mEnd;
    return aIter;
  }

  const_char_iterator& BeginReading(const_char_iterator& aIter) const
  {
    return aIter = mData;
  }

  const_char_iterator& EndReading(const_char_iterator& aIter) const
  {
    return aIter = mData + mLength;
  }
# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  const char_type* Data() const

  {
    return mData;
  }

  size_type Length() const
  {
    return mLength;
  }

  uint32_t Flags() const
  {
    return mFlags;
  }

  bool IsEmpty() const
  {
    return mLength == 0;
  }

  bool IsLiteral() const
  {
    return (mFlags & F_LITERAL) != 0;
  }

  bool IsVoid() const
  {
    return (mFlags & F_VOIDED) != 0;
  }

  bool IsTerminated() const
  {
    return (mFlags & F_TERMINATED) != 0;
  }

  char_type CharAt(index_type aIndex) const
  {
    do { } while(0);
    return mData[aIndex];
  }

  char_type operator[](index_type aIndex) const
  {
    return CharAt(aIndex);
  }

  char_type First() const;

  char_type Last() const;

  size_type CountChar(char_type) const;
  int32_t FindChar(char_type, index_type aOffset = 0) const;

  inline bool Contains(char_type aChar) const
  {
    return FindChar(aChar) != -1;
  }





  bool Equals(const self_type&) const;
  bool Equals(const self_type&, const comparator_type&) const;

  bool Equals(const substring_tuple_type& aTuple) const;
  bool Equals(const substring_tuple_type& aTuple,
                          const comparator_type& aComp) const;

  bool Equals(const char_type* aData) const;
  bool Equals(const char_type* aData,
                          const comparator_type& aComp) const;
# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  bool EqualsASCII(const char* aData, size_type aLen) const;





  bool EqualsASCII(const char* aData) const;







  template<int N>
  inline bool EqualsLiteral(const char (&aStr)[N]) const
  {
    return EqualsASCII(aStr, N - 1);
  }







  bool LowerCaseEqualsASCII(const char* aData,
                                        size_type aLen) const;
  bool LowerCaseEqualsASCII(const char* aData) const;






  template<int N>
  inline bool LowerCaseEqualsLiteral(const char (&aStr)[N]) const
  {
    return LowerCaseEqualsASCII(aStr, N - 1);
  }




  bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const
  {
# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
    return (aStart < (mData + mLength) && aEnd > mData);
  }

protected:
  nsStringRepr() = delete;

  constexpr
  nsStringRepr(char_type* aData, size_type aLength, uint32_t aFlags)
    : mData(aData)
    , mLength(aLength)
    , mFlags(aFlags)
  {
  }

  char_type* mData;
  size_type mLength;
  uint32_t mFlags;

public:






  enum
  {
    F_NONE = 0,


    F_TERMINATED = 1 << 0,
    F_VOIDED = 1 << 1,
    F_SHARED = 1 << 2,
    F_OWNED = 1 << 3,
    F_FIXED = 1 << 4,
    F_LITERAL = 1 << 5,


    F_CLASS_FIXED = 1 << 16
  };
# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
};

}
}
# 389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
class nsAString : public mozilla::detail::nsStringRepr
{
public:
  typedef nsAString self_type;


  ~nsAString()
  {
    Finalize();
  }





  char_iterator BeginWriting()
  {
    if (!EnsureMutable()) {
      AllocFailed(mLength);
    }

    return mData;
  }

  char_iterator BeginWriting(const fallible_t&)
  {
    return EnsureMutable() ? mData : char_iterator(0);
  }

  char_iterator EndWriting()
  {
    if (!EnsureMutable()) {
      AllocFailed(mLength);
    }

    return mData + mLength;
  }

  char_iterator EndWriting(const fallible_t&)
  {
    return EnsureMutable() ? (mData + mLength) : char_iterator(0);
  }

  char_iterator& BeginWriting(char_iterator& aIter)
  {
    return aIter = BeginWriting();
  }

  char_iterator& BeginWriting(char_iterator& aIter, const fallible_t& aFallible)
  {
    return aIter = BeginWriting(aFallible);
  }

  char_iterator& EndWriting(char_iterator& aIter)
  {
    return aIter = EndWriting();
  }

  char_iterator& EndWriting(char_iterator& aIter, const fallible_t& aFallible)
  {
    return aIter = EndWriting(aFallible);
  }





  iterator& BeginWriting(iterator& aIter)
  {
    char_type* data = BeginWriting();
    aIter.mStart = data;
    aIter.mEnd = data + mLength;
    aIter.mPosition = aIter.mStart;
    return aIter;
  }

  iterator& EndWriting(iterator& aIter)
  {
    char_type* data = BeginWriting();
    aIter.mStart = data;
    aIter.mEnd = data + mLength;
    aIter.mPosition = aIter.mEnd;
    return aIter;
  }





  void Assign(char_type aChar);
  __attribute__ ((warn_unused_result)) bool Assign(char_type aChar, const fallible_t&);

  void Assign(const char_type* aData);
  __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData,
                                       const fallible_t&);

  void Assign(const char_type* aData, size_type aLength);
  __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData,
                                       size_type aLength, const fallible_t&);

  void Assign(const self_type&);
  __attribute__ ((warn_unused_result)) bool Assign(const self_type&, const fallible_t&);

  void Assign(const substring_tuple_type&);
  __attribute__ ((warn_unused_result)) bool Assign(const substring_tuple_type&,
                                       const fallible_t&);
# 515 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void AssignASCII(const char* aData, size_type aLength);
  __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData,
                                            size_type aLength,
                                            const fallible_t&);

  void AssignASCII(const char* aData)
  {
    AssignASCII(aData, mozilla::AssertedCast<size_type, size_t>(strlen(aData)));
  }
  __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData,
                                            const fallible_t& aFallible)
  {
    return AssignASCII(aData,
                       mozilla::AssertedCast<size_type, size_t>(strlen(aData)),
                       aFallible);
  }







  template<int N>
  void AssignLiteral(const char_type (&aStr)[N])
  {
    AssignLiteral(aStr, N - 1);
  }

  template<int N>
  void AssignLiteral(const char (&aStr)[N])
  {
    AssignASCII(aStr, N - 1);
  }


  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }







  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }

  void Adopt(char_type* aData, size_type aLength = size_type(-1));






  void Replace(index_type aCutStart, size_type aCutLength,
                           char_type aChar);
  __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart,
                                        size_type aCutLength,
                                        char_type aChar,
                                        const fallible_t&);
  void Replace(index_type aCutStart, size_type aCutLength,
                           const char_type* aData,
                           size_type aLength = size_type(-1));
  __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart,
                                        size_type aCutLength,
                                        const char_type* aData,
                                        size_type aLength,
                                        const fallible_t&);
  void Replace(index_type aCutStart, size_type aCutLength,
               const self_type& aStr)
  {
    Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length());
  }
  __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart,
                            size_type aCutLength,
                            const self_type& aStr,
                            const fallible_t& aFallible)
  {
    return Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length(),
                   aFallible);
  }
  void Replace(index_type aCutStart, size_type aCutLength,
                           const substring_tuple_type& aTuple);

  void ReplaceASCII(index_type aCutStart, size_type aCutLength,
                                const char* aData,
                                size_type aLength = size_type(-1));

  __attribute__ ((warn_unused_result)) bool ReplaceASCII(index_type aCutStart, size_type aCutLength,
                                             const char* aData,
                                             size_type aLength,
                                             const fallible_t&);




  template<int N>
  void ReplaceLiteral(index_type aCutStart, size_type aCutLength,
                      const char_type (&aStr)[N])
  {
    ReplaceLiteral(aCutStart, aCutLength, aStr, N - 1);
  }

  void Append(char_type aChar)
  {
    Replace(mLength, 0, aChar);
  }
  __attribute__ ((warn_unused_result)) bool Append(char_type aChar, const fallible_t& aFallible)
  {
    return Replace(mLength, 0, aChar, aFallible);
  }
  void Append(const char_type* aData, size_type aLength = size_type(-1))
  {
    Replace(mLength, 0, aData, aLength);
  }
  __attribute__ ((warn_unused_result)) bool Append(const char_type* aData, size_type aLength,
                           const fallible_t& aFallible)
  {
    return Replace(mLength, 0, aData, aLength, aFallible);
  }
# 660 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void Append(const self_type& aStr)
  {
    Replace(mLength, 0, aStr);
  }
  __attribute__ ((warn_unused_result)) bool Append(const self_type& aStr, const fallible_t& aFallible)
  {
    return Replace(mLength, 0, aStr, aFallible);
  }
  void Append(const substring_tuple_type& aTuple)
  {
    Replace(mLength, 0, aTuple);
  }

  void AppendASCII(const char* aData, size_type aLength = size_type(-1))
  {
    ReplaceASCII(mLength, 0, aData, aLength);
  }

  __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, const fallible_t& aFallible)
  {
    return ReplaceASCII(mLength, 0, aData, size_type(-1), aFallible);
  }

  __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, size_type aLength, const fallible_t& aFallible)
  {
    return ReplaceASCII(mLength, 0, aData, aLength, aFallible);
  }







  void AppendPrintf(const char* aFormat, ...) __attribute__ ((format (printf, 2, 3)));
  void AppendPrintf(const char* aFormat, va_list aAp);
  void AppendInt(int32_t aInteger)
  {
    AppendPrintf("%" "d", aInteger);
  }
  void AppendInt(int32_t aInteger, int aRadix)
  {
    if (aRadix == 10) {
      AppendPrintf("%" "d", aInteger);
    } else {
      AppendPrintf(aRadix == 8 ? "%" "o" : "%" "x",
                   static_cast<uint32_t>(aInteger));
    }
  }
  void AppendInt(uint32_t aInteger)
  {
    AppendPrintf("%" "u", aInteger);
  }
  void AppendInt(uint32_t aInteger, int aRadix)
  {
    AppendPrintf(aRadix == 10 ? "%" "u" : aRadix == 8 ? "%" "o" : "%" "x",
                 aInteger);
  }
  void AppendInt(int64_t aInteger)
  {
    AppendPrintf("%" "l" "d", aInteger);
  }
  void AppendInt(int64_t aInteger, int aRadix)
  {
    if (aRadix == 10) {
      AppendPrintf("%" "l" "d", aInteger);
    } else {
      AppendPrintf(aRadix == 8 ? "%" "l" "o" : "%" "l" "x",
                   static_cast<uint64_t>(aInteger));
    }
  }
  void AppendInt(uint64_t aInteger)
  {
    AppendPrintf("%" "l" "u", aInteger);
  }
  void AppendInt(uint64_t aInteger, int aRadix)
  {
    AppendPrintf(aRadix == 10 ? "%" "l" "u" : aRadix == 8 ? "%" "l" "o" : "%" "l" "x",
                 aInteger);
  }




  void AppendFloat(float aFloat);
  void AppendFloat(double aFloat);
public:




  template<int N>
  void AppendLiteral(const char_type (&aStr)[N])
  {
    ReplaceLiteral(mLength, 0, aStr, N - 1);
  }

  template<int N>
  void AppendLiteral(const char (&aStr)[N])
  {
    AppendASCII(aStr, N - 1);
  }

  template<int N>
  __attribute__ ((warn_unused_result)) bool AppendLiteral(const char (&aStr)[N], const fallible_t& aFallible)
  {
    return AppendASCII(aStr, N - 1, aFallible);
  }


  self_type& operator+=(char_type aChar)
  {
    Append(aChar);
    return *this;
  }
  self_type& operator+=(const char_type* aData)
  {
    Append(aData);
    return *this;
  }







  self_type& operator+=(const self_type& aStr)
  {
    Append(aStr);
    return *this;
  }
  self_type& operator+=(const substring_tuple_type& aTuple)
  {
    Append(aTuple);
    return *this;
  }

  void Insert(char_type aChar, index_type aPos)
  {
    Replace(aPos, 0, aChar);
  }
  void Insert(const char_type* aData, index_type aPos,
              size_type aLength = size_type(-1))
  {
    Replace(aPos, 0, aData, aLength);
  }







  void Insert(const self_type& aStr, index_type aPos)
  {
    Replace(aPos, 0, aStr);
  }
  void Insert(const substring_tuple_type& aTuple, index_type aPos)
  {
    Replace(aPos, 0, aTuple);
  }




  template<int N>
  void InsertLiteral(const char_type (&aStr)[N], index_type aPos)
  {
    ReplaceLiteral(aPos, 0, aStr, N - 1);
  }

  void Cut(index_type aCutStart, size_type aCutLength)
  {
    Replace(aCutStart, aCutLength, char_traits::sEmptyBuffer, 0);
  }

  nsSubstringSplitter Split(const char_type aChar) const;
# 850 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void SetCapacity(size_type aNewCapacity);
  __attribute__ ((warn_unused_result)) bool SetCapacity(size_type aNewCapacity,
                                            const fallible_t&);

  void SetLength(size_type aNewLength);
  __attribute__ ((warn_unused_result)) bool SetLength(size_type aNewLength,
                                          const fallible_t&);

  void Truncate(size_type aNewLength = 0)
  {
    do { } while(0);
    SetLength(aNewLength);
  }
# 876 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  inline size_type GetData(const char_type** aData) const
  {
    *aData = mData;
    return mLength;
  }
# 892 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  size_type GetMutableData(char_type** aData, size_type aNewLen = size_type(-1))
  {
    if (!EnsureMutable(aNewLen)) {
      AllocFailed(aNewLen == size_type(-1) ? mLength : aNewLen);
    }

    *aData = mData;
    return mLength;
  }

  size_type GetMutableData(char_type** aData, size_type aNewLen, const fallible_t&)
  {
    if (!EnsureMutable(aNewLen)) {
      *aData = nullptr;
      return 0;
    }

    *aData = mData;
    return mLength;
  }
# 931 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  operator mozilla::Span<char_type>()
  {
    return mozilla::MakeSpan(BeginWriting(), Length());
  }

  operator mozilla::Span<const char_type>() const
  {
    return mozilla::MakeSpan(BeginReading(), Length());
  }

  void Append(mozilla::Span<const char_type> aSpan)
  {
    auto len = aSpan.Length();
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(len <= mozilla::MaxValue<size_type>::value)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(len <= mozilla::MaxValue<size_type>::value))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "len <= mozilla::MaxValue<size_type>::value" ")"); do { *((volatile int*) __null) = 944; ::abort(); } while (0); } } while (0);
    Append(aSpan.Elements(), len);
  }

  __attribute__ ((warn_unused_result)) bool Append(mozilla::Span<const char_type> aSpan,
                           const fallible_t& aFallible)
  {
    auto len = aSpan.Length();
    if (len > mozilla::MaxValue<size_type>::value) {
      return false;
    }
    return Append(aSpan.Elements(), len, aFallible);
  }
# 995 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void SetIsVoid(bool);
# 1005 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void StripChar(char_type aChar, int32_t aOffset = 0);
# 1015 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void StripChars(const char_type* aChars, uint32_t aOffset = 0);





  void ForgetSharedBuffer()
  {
    if (mFlags & nsSubstring::F_SHARED) {
      mData = char_traits::sEmptyBuffer;
      mLength = 0;
      mFlags = F_TERMINATED;
    }
  }

public:





               nsAString(const substring_tuple_type& aTuple)
    : nsStringRepr(nullptr, 0, F_NONE)
  {
    Assign(aTuple);
  }

  size_t SizeOfExcludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf)
  const;
  size_t SizeOfIncludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf)
  const;







  size_t SizeOfExcludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf)
  const;
  size_t SizeOfIncludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf)
  const;

  template<class T>
  void NS_ABORT_OOM(T)
  {
    struct never {};
    static_assert(mozilla::IsSame<T, never>::value,
      "In string classes, use AllocFailed to account for sizeof(char_type). "
      "Use the global ::NS_ABORT_OOM if you really have a count of bytes.");
  }

  __attribute__((always_inline)) inline void AllocFailed(size_t aLength)
  {
    ::NS_ABORT_OOM(aLength * sizeof(char_type));
  }

protected:


  nsAString()
    : nsStringRepr(char_traits::sEmptyBuffer, 0, F_TERMINATED)
  {
  }



  nsAString(const self_type& aStr)
    : nsStringRepr(aStr.mData, aStr.mLength,
                          aStr.mFlags & (F_TERMINATED | F_VOIDED))
  {
  }
# 1097 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  nsAString(char_type* aData, size_type aLength, uint32_t aFlags)
    : nsStringRepr(aData, aLength, aFlags)
  {
  }







  void Finalize();
# 1128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  bool MutatePrep(size_type aCapacity,
                              char_type** aOldData, uint32_t* aOldFlags);
# 1151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  __attribute__ ((warn_unused_result)) bool ReplacePrep(index_type aCutStart,
                                size_type aCutLength,
                                size_type aNewLength);

  __attribute__ ((warn_unused_result)) bool ReplacePrepInternal(
    index_type aCutStart,
    size_type aCutLength,
    size_type aNewFragLength,
    size_type aNewTotalLength);
# 1168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  size_type Capacity() const;





  __attribute__ ((warn_unused_result)) bool EnsureMutable(
    size_type aNewLen = size_type(-1));




  static __attribute__ ((warn_unused_result)) bool CheckCapacity(size_type aCapacity) {
    if (aCapacity > kMaxCapacity) {


      do { } while(0);
      return false;
    }

    return true;
  }




  void SetDataFlags(uint32_t aDataFlags)
  {
    do { } while(0);
    mFlags = aDataFlags | (mFlags & 0xFFFF0000);
  }

  void ReplaceLiteral(index_type aCutStart, size_type aCutLength,
                                  const char_type* aData, size_type aLength);

  static const size_type kMaxCapacity;
public:



  void AssignLiteral(const char_type* aData, size_type aLength);
};

static_assert(sizeof(nsAString) ==
              sizeof(mozilla::detail::nsStringRepr),
              "Don't add new data fields to nsTSubstring_CharT. "
              "Add to nsTStringRepr_CharT instead.");

int
Compare(const nsAString::base_string_type& aLhs,
        const nsAString::base_string_type& aRhs,
        const nsStringComparator& = nsDefaultStringComparator());


inline bool
operator!=(const nsAString::base_string_type& aLhs,
           const nsAString::base_string_type& aRhs)
{
  return !aLhs.Equals(aRhs);
}

inline bool
operator!=(const nsAString::base_string_type& aLhs,
           const nsAString::char_type* aRhs)
{
  return !aLhs.Equals(aRhs);
}

inline bool
operator<(const nsAString::base_string_type& aLhs,
          const nsAString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) < 0;
}

inline bool
operator<=(const nsAString::base_string_type& aLhs,
           const nsAString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) <= 0;
}

inline bool
operator==(const nsAString::base_string_type& aLhs,
           const nsAString::base_string_type& aRhs)
{
  return aLhs.Equals(aRhs);
}

inline bool
operator==(const nsAString::base_string_type& aLhs,
           const nsAString::char_type* aRhs)
{
  return aLhs.Equals(aRhs);
}


inline bool
operator>=(const nsAString::base_string_type& aLhs,
           const nsAString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) >= 0;
}

inline bool
operator>(const nsAString::base_string_type& aLhs,
          const nsAString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) > 0;
}



class nsSubstringSplitter
{
  typedef nsAString::size_type size_type;
  typedef nsAString::char_type char_type;

  class nsTSubstringSplit_Iter
  {
  public:
    nsTSubstringSplit_Iter(const nsSubstringSplitter& aObj,
                           size_type aPos)
      : mObj(aObj)
      , mPos(aPos)
    {
    }

    bool operator!=(const nsTSubstringSplit_Iter& other) const
    {
      return mPos != other.mPos;
    }

    const nsDependentSubstring& operator*() const;

    const nsTSubstringSplit_Iter& operator++()
    {
      ++mPos;
      return *this;
    }

  private:
    const nsSubstringSplitter& mObj;
    size_type mPos;
  };

private:
  const nsAString* const mStr;
  mozilla::UniquePtr<nsDependentSubstring[]> mArray;
  size_type mArraySize;
  const char_type mDelim;

public:
  nsSubstringSplitter(const nsAString* aStr, char_type aDelim);

  nsTSubstringSplit_Iter begin() const
  {
    return nsTSubstringSplit_Iter(*this, 0);
  }

  nsTSubstringSplit_Iter end() const
  {
    return nsTSubstringSplit_Iter(*this, mArraySize);
  }

  const nsDependentSubstring& Get(const size_type index) const
  {
    do { } while (0);
    return mArray[index];
  }
};




namespace mozilla {

inline Span<char16_t>
MakeSpan(nsAString& aString)
{
  return aString;
}

inline Span<const char16_t>
MakeSpan(const nsAString& aString)
{
  return aString;
}

}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
class nsCStringComparator
{
public:
  typedef char char_type;

  nsCStringComparator()
  {
  }

  virtual int operator()(const char_type*, const char_type*,
                         uint32_t, uint32_t) const = 0;
};





class nsDefaultCStringComparator
  : public nsCStringComparator
{
public:
  typedef char char_type;

  nsDefaultCStringComparator()
  {
  }

  virtual int operator()(const char_type*, const char_type*,
                         uint32_t, uint32_t) const override;
};

class nsCSubstringSplitter;

namespace mozilla {
namespace detail {
# 75 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
class nsCStringRepr
{
public:
  typedef mozilla::fallible_t fallible_t;

  typedef char char_type;

  typedef nsCharTraits<char_type> char_traits;
  typedef char_traits::incompatible_char_type incompatible_char_type;

  typedef nsCStringRepr self_type;
  typedef self_type base_string_type;

  typedef nsACString substring_type;
  typedef nsCSubstringTuple substring_tuple_type;
  typedef nsCString string_type;

  typedef nsReadingIterator<char_type> const_iterator;
  typedef nsWritingIterator<char_type> iterator;

  typedef nsCStringComparator comparator_type;

  typedef char_type* char_iterator;
  typedef const char_type* const_char_iterator;

  typedef uint32_t index_type;
  typedef uint32_t size_type;





  const_char_iterator BeginReading() const
  {
    return mData;
  }
  const_char_iterator EndReading() const
  {
    return mData + mLength;
  }





  const_iterator& BeginReading(const_iterator& aIter) const
  {
    aIter.mStart = mData;
    aIter.mEnd = mData + mLength;
    aIter.mPosition = aIter.mStart;
    return aIter;
  }

  const_iterator& EndReading(const_iterator& aIter) const
  {
    aIter.mStart = mData;
    aIter.mEnd = mData + mLength;
    aIter.mPosition = aIter.mEnd;
    return aIter;
  }

  const_char_iterator& BeginReading(const_char_iterator& aIter) const
  {
    return aIter = mData;
  }

  const_char_iterator& EndReading(const_char_iterator& aIter) const
  {
    return aIter = mData + mLength;
  }
# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  const char_type* Data() const

  {
    return mData;
  }

  size_type Length() const
  {
    return mLength;
  }

  uint32_t Flags() const
  {
    return mFlags;
  }

  bool IsEmpty() const
  {
    return mLength == 0;
  }

  bool IsLiteral() const
  {
    return (mFlags & F_LITERAL) != 0;
  }

  bool IsVoid() const
  {
    return (mFlags & F_VOIDED) != 0;
  }

  bool IsTerminated() const
  {
    return (mFlags & F_TERMINATED) != 0;
  }

  char_type CharAt(index_type aIndex) const
  {
    do { } while(0);
    return mData[aIndex];
  }

  char_type operator[](index_type aIndex) const
  {
    return CharAt(aIndex);
  }

  char_type First() const;

  char_type Last() const;

  size_type CountChar(char_type) const;
  int32_t FindChar(char_type, index_type aOffset = 0) const;

  inline bool Contains(char_type aChar) const
  {
    return FindChar(aChar) != -1;
  }





  bool Equals(const self_type&) const;
  bool Equals(const self_type&, const comparator_type&) const;

  bool Equals(const substring_tuple_type& aTuple) const;
  bool Equals(const substring_tuple_type& aTuple,
                          const comparator_type& aComp) const;

  bool Equals(const char_type* aData) const;
  bool Equals(const char_type* aData,
                          const comparator_type& aComp) const;
# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  bool EqualsASCII(const char* aData, size_type aLen) const;





  bool EqualsASCII(const char* aData) const;







  template<int N>
  inline bool EqualsLiteral(const char (&aStr)[N]) const
  {
    return EqualsASCII(aStr, N - 1);
  }







  bool LowerCaseEqualsASCII(const char* aData,
                                        size_type aLen) const;
  bool LowerCaseEqualsASCII(const char* aData) const;






  template<int N>
  inline bool LowerCaseEqualsLiteral(const char (&aStr)[N]) const
  {
    return LowerCaseEqualsASCII(aStr, N - 1);
  }




  bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const
  {
# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
    return (aStart < (mData + mLength) && aEnd > mData);
  }

protected:
  nsCStringRepr() = delete;

  constexpr
  nsCStringRepr(char_type* aData, size_type aLength, uint32_t aFlags)
    : mData(aData)
    , mLength(aLength)
    , mFlags(aFlags)
  {
  }

  char_type* mData;
  size_type mLength;
  uint32_t mFlags;

public:






  enum
  {
    F_NONE = 0,


    F_TERMINATED = 1 << 0,
    F_VOIDED = 1 << 1,
    F_SHARED = 1 << 2,
    F_OWNED = 1 << 3,
    F_FIXED = 1 << 4,
    F_LITERAL = 1 << 5,


    F_CLASS_FIXED = 1 << 16
  };
# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
};

}
}
# 389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
class nsACString : public mozilla::detail::nsCStringRepr
{
public:
  typedef nsACString self_type;


  ~nsACString()
  {
    Finalize();
  }





  char_iterator BeginWriting()
  {
    if (!EnsureMutable()) {
      AllocFailed(mLength);
    }

    return mData;
  }

  char_iterator BeginWriting(const fallible_t&)
  {
    return EnsureMutable() ? mData : char_iterator(0);
  }

  char_iterator EndWriting()
  {
    if (!EnsureMutable()) {
      AllocFailed(mLength);
    }

    return mData + mLength;
  }

  char_iterator EndWriting(const fallible_t&)
  {
    return EnsureMutable() ? (mData + mLength) : char_iterator(0);
  }

  char_iterator& BeginWriting(char_iterator& aIter)
  {
    return aIter = BeginWriting();
  }

  char_iterator& BeginWriting(char_iterator& aIter, const fallible_t& aFallible)
  {
    return aIter = BeginWriting(aFallible);
  }

  char_iterator& EndWriting(char_iterator& aIter)
  {
    return aIter = EndWriting();
  }

  char_iterator& EndWriting(char_iterator& aIter, const fallible_t& aFallible)
  {
    return aIter = EndWriting(aFallible);
  }





  iterator& BeginWriting(iterator& aIter)
  {
    char_type* data = BeginWriting();
    aIter.mStart = data;
    aIter.mEnd = data + mLength;
    aIter.mPosition = aIter.mStart;
    return aIter;
  }

  iterator& EndWriting(iterator& aIter)
  {
    char_type* data = BeginWriting();
    aIter.mStart = data;
    aIter.mEnd = data + mLength;
    aIter.mPosition = aIter.mEnd;
    return aIter;
  }





  void Assign(char_type aChar);
  __attribute__ ((warn_unused_result)) bool Assign(char_type aChar, const fallible_t&);

  void Assign(const char_type* aData);
  __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData,
                                       const fallible_t&);

  void Assign(const char_type* aData, size_type aLength);
  __attribute__ ((warn_unused_result)) bool Assign(const char_type* aData,
                                       size_type aLength, const fallible_t&);

  void Assign(const self_type&);
  __attribute__ ((warn_unused_result)) bool Assign(const self_type&, const fallible_t&);

  void Assign(const substring_tuple_type&);
  __attribute__ ((warn_unused_result)) bool Assign(const substring_tuple_type&,
                                       const fallible_t&);
# 515 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void AssignASCII(const char* aData, size_type aLength);
  __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData,
                                            size_type aLength,
                                            const fallible_t&);

  void AssignASCII(const char* aData)
  {
    AssignASCII(aData, mozilla::AssertedCast<size_type, size_t>(strlen(aData)));
  }
  __attribute__ ((warn_unused_result)) bool AssignASCII(const char* aData,
                                            const fallible_t& aFallible)
  {
    return AssignASCII(aData,
                       mozilla::AssertedCast<size_type, size_t>(strlen(aData)),
                       aFallible);
  }







  template<int N>
  void AssignLiteral(const char_type (&aStr)[N])
  {
    AssignLiteral(aStr, N - 1);
  }
# 551 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }







  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }

  void Adopt(char_type* aData, size_type aLength = size_type(-1));






  void Replace(index_type aCutStart, size_type aCutLength,
                           char_type aChar);
  __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart,
                                        size_type aCutLength,
                                        char_type aChar,
                                        const fallible_t&);
  void Replace(index_type aCutStart, size_type aCutLength,
                           const char_type* aData,
                           size_type aLength = size_type(-1));
  __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart,
                                        size_type aCutLength,
                                        const char_type* aData,
                                        size_type aLength,
                                        const fallible_t&);
  void Replace(index_type aCutStart, size_type aCutLength,
               const self_type& aStr)
  {
    Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length());
  }
  __attribute__ ((warn_unused_result)) bool Replace(index_type aCutStart,
                            size_type aCutLength,
                            const self_type& aStr,
                            const fallible_t& aFallible)
  {
    return Replace(aCutStart, aCutLength, aStr.Data(), aStr.Length(),
                   aFallible);
  }
  void Replace(index_type aCutStart, size_type aCutLength,
                           const substring_tuple_type& aTuple);

  void ReplaceASCII(index_type aCutStart, size_type aCutLength,
                                const char* aData,
                                size_type aLength = size_type(-1));

  __attribute__ ((warn_unused_result)) bool ReplaceASCII(index_type aCutStart, size_type aCutLength,
                                             const char* aData,
                                             size_type aLength,
                                             const fallible_t&);




  template<int N>
  void ReplaceLiteral(index_type aCutStart, size_type aCutLength,
                      const char_type (&aStr)[N])
  {
    ReplaceLiteral(aCutStart, aCutLength, aStr, N - 1);
  }

  void Append(char_type aChar)
  {
    Replace(mLength, 0, aChar);
  }
  __attribute__ ((warn_unused_result)) bool Append(char_type aChar, const fallible_t& aFallible)
  {
    return Replace(mLength, 0, aChar, aFallible);
  }
  void Append(const char_type* aData, size_type aLength = size_type(-1))
  {
    Replace(mLength, 0, aData, aLength);
  }
  __attribute__ ((warn_unused_result)) bool Append(const char_type* aData, size_type aLength,
                           const fallible_t& aFallible)
  {
    return Replace(mLength, 0, aData, aLength, aFallible);
  }
# 660 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void Append(const self_type& aStr)
  {
    Replace(mLength, 0, aStr);
  }
  __attribute__ ((warn_unused_result)) bool Append(const self_type& aStr, const fallible_t& aFallible)
  {
    return Replace(mLength, 0, aStr, aFallible);
  }
  void Append(const substring_tuple_type& aTuple)
  {
    Replace(mLength, 0, aTuple);
  }

  void AppendASCII(const char* aData, size_type aLength = size_type(-1))
  {
    ReplaceASCII(mLength, 0, aData, aLength);
  }

  __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, const fallible_t& aFallible)
  {
    return ReplaceASCII(mLength, 0, aData, size_type(-1), aFallible);
  }

  __attribute__ ((warn_unused_result)) bool AppendASCII(const char* aData, size_type aLength, const fallible_t& aFallible)
  {
    return ReplaceASCII(mLength, 0, aData, aLength, aFallible);
  }







  void AppendPrintf(const char* aFormat, ...) __attribute__ ((format (printf, 2, 3)));
  void AppendPrintf(const char* aFormat, va_list aAp);
  void AppendInt(int32_t aInteger)
  {
    AppendPrintf("%" "d", aInteger);
  }
  void AppendInt(int32_t aInteger, int aRadix)
  {
    if (aRadix == 10) {
      AppendPrintf("%" "d", aInteger);
    } else {
      AppendPrintf(aRadix == 8 ? "%" "o" : "%" "x",
                   static_cast<uint32_t>(aInteger));
    }
  }
  void AppendInt(uint32_t aInteger)
  {
    AppendPrintf("%" "u", aInteger);
  }
  void AppendInt(uint32_t aInteger, int aRadix)
  {
    AppendPrintf(aRadix == 10 ? "%" "u" : aRadix == 8 ? "%" "o" : "%" "x",
                 aInteger);
  }
  void AppendInt(int64_t aInteger)
  {
    AppendPrintf("%" "l" "d", aInteger);
  }
  void AppendInt(int64_t aInteger, int aRadix)
  {
    if (aRadix == 10) {
      AppendPrintf("%" "l" "d", aInteger);
    } else {
      AppendPrintf(aRadix == 8 ? "%" "l" "o" : "%" "l" "x",
                   static_cast<uint64_t>(aInteger));
    }
  }
  void AppendInt(uint64_t aInteger)
  {
    AppendPrintf("%" "l" "u", aInteger);
  }
  void AppendInt(uint64_t aInteger, int aRadix)
  {
    AppendPrintf(aRadix == 10 ? "%" "l" "u" : aRadix == 8 ? "%" "l" "o" : "%" "l" "x",
                 aInteger);
  }




  void AppendFloat(float aFloat);
  void AppendFloat(double aFloat);
public:




  template<int N>
  void AppendLiteral(const char_type (&aStr)[N])
  {
    ReplaceLiteral(mLength, 0, aStr, N - 1);
  }
# 770 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  self_type& operator+=(char_type aChar)
  {
    Append(aChar);
    return *this;
  }
  self_type& operator+=(const char_type* aData)
  {
    Append(aData);
    return *this;
  }







  self_type& operator+=(const self_type& aStr)
  {
    Append(aStr);
    return *this;
  }
  self_type& operator+=(const substring_tuple_type& aTuple)
  {
    Append(aTuple);
    return *this;
  }

  void Insert(char_type aChar, index_type aPos)
  {
    Replace(aPos, 0, aChar);
  }
  void Insert(const char_type* aData, index_type aPos,
              size_type aLength = size_type(-1))
  {
    Replace(aPos, 0, aData, aLength);
  }







  void Insert(const self_type& aStr, index_type aPos)
  {
    Replace(aPos, 0, aStr);
  }
  void Insert(const substring_tuple_type& aTuple, index_type aPos)
  {
    Replace(aPos, 0, aTuple);
  }




  template<int N>
  void InsertLiteral(const char_type (&aStr)[N], index_type aPos)
  {
    ReplaceLiteral(aPos, 0, aStr, N - 1);
  }

  void Cut(index_type aCutStart, size_type aCutLength)
  {
    Replace(aCutStart, aCutLength, char_traits::sEmptyBuffer, 0);
  }

  nsCSubstringSplitter Split(const char_type aChar) const;
# 850 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void SetCapacity(size_type aNewCapacity);
  __attribute__ ((warn_unused_result)) bool SetCapacity(size_type aNewCapacity,
                                            const fallible_t&);

  void SetLength(size_type aNewLength);
  __attribute__ ((warn_unused_result)) bool SetLength(size_type aNewLength,
                                          const fallible_t&);

  void Truncate(size_type aNewLength = 0)
  {
    do { } while(0);
    SetLength(aNewLength);
  }
# 876 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  inline size_type GetData(const char_type** aData) const
  {
    *aData = mData;
    return mLength;
  }
# 892 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  size_type GetMutableData(char_type** aData, size_type aNewLen = size_type(-1))
  {
    if (!EnsureMutable(aNewLen)) {
      AllocFailed(aNewLen == size_type(-1) ? mLength : aNewLen);
    }

    *aData = mData;
    return mLength;
  }

  size_type GetMutableData(char_type** aData, size_type aNewLen, const fallible_t&)
  {
    if (!EnsureMutable(aNewLen)) {
      *aData = nullptr;
      return 0;
    }

    *aData = mData;
    return mLength;
  }
# 931 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  operator mozilla::Span<char_type>()
  {
    return mozilla::MakeSpan(BeginWriting(), Length());
  }

  operator mozilla::Span<const char_type>() const
  {
    return mozilla::MakeSpan(BeginReading(), Length());
  }

  void Append(mozilla::Span<const char_type> aSpan)
  {
    auto len = aSpan.Length();
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(len <= mozilla::MaxValue<size_type>::value)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(len <= mozilla::MaxValue<size_type>::value))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "len <= mozilla::MaxValue<size_type>::value" ")"); do { *((volatile int*) __null) = 944; ::abort(); } while (0); } } while (0);
    Append(aSpan.Elements(), len);
  }

  __attribute__ ((warn_unused_result)) bool Append(mozilla::Span<const char_type> aSpan,
                           const fallible_t& aFallible)
  {
    auto len = aSpan.Length();
    if (len > mozilla::MaxValue<size_type>::value) {
      return false;
    }
    return Append(aSpan.Elements(), len, aFallible);
  }


  operator mozilla::Span<uint8_t>()
  {
    return mozilla::MakeSpan(reinterpret_cast<uint8_t*>(BeginWriting()),
                             Length());
  }

  operator mozilla::Span<const uint8_t>() const
  {
    return mozilla::MakeSpan(reinterpret_cast<const uint8_t*>(BeginReading()),
                             Length());
  }

  void Append(mozilla::Span<const uint8_t> aSpan)
  {
    auto len = aSpan.Length();
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(len <= mozilla::MaxValue<size_type>::value)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(len <= mozilla::MaxValue<size_type>::value))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "len <= mozilla::MaxValue<size_type>::value" ")"); do { *((volatile int*) __null) = 974; ::abort(); } while (0); } } while (0);
    Append(reinterpret_cast<const char*>(aSpan.Elements()), len);
  }

  __attribute__ ((warn_unused_result)) bool Append(mozilla::Span<const uint8_t> aSpan,
                           const fallible_t& aFallible)
  {
    auto len = aSpan.Length();
    if (len > mozilla::MaxValue<size_type>::value) {
      return false;
    }
    return Append(
      reinterpret_cast<const char*>(aSpan.Elements()), len, aFallible);
  }







  void SetIsVoid(bool);
# 1005 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void StripChar(char_type aChar, int32_t aOffset = 0);
# 1015 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  void StripChars(const char_type* aChars, uint32_t aOffset = 0);





  void ForgetSharedBuffer()
  {
    if (mFlags & nsSubstring::F_SHARED) {
      mData = char_traits::sEmptyBuffer;
      mLength = 0;
      mFlags = F_TERMINATED;
    }
  }

public:





               nsACString(const substring_tuple_type& aTuple)
    : nsCStringRepr(nullptr, 0, F_NONE)
  {
    Assign(aTuple);
  }

  size_t SizeOfExcludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf)
  const;
  size_t SizeOfIncludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf)
  const;







  size_t SizeOfExcludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf)
  const;
  size_t SizeOfIncludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf)
  const;

  template<class T>
  void NS_ABORT_OOM(T)
  {
    struct never {};
    static_assert(mozilla::IsSame<T, never>::value,
      "In string classes, use AllocFailed to account for sizeof(char_type). "
      "Use the global ::NS_ABORT_OOM if you really have a count of bytes.");
  }

  __attribute__((always_inline)) inline void AllocFailed(size_t aLength)
  {
    ::NS_ABORT_OOM(aLength * sizeof(char_type));
  }

protected:


  nsACString()
    : nsCStringRepr(char_traits::sEmptyBuffer, 0, F_TERMINATED)
  {
  }



  nsACString(const self_type& aStr)
    : nsCStringRepr(aStr.mData, aStr.mLength,
                          aStr.mFlags & (F_TERMINATED | F_VOIDED))
  {
  }
# 1097 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  nsACString(char_type* aData, size_type aLength, uint32_t aFlags)
    : nsCStringRepr(aData, aLength, aFlags)
  {
  }







  void Finalize();
# 1128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  bool MutatePrep(size_type aCapacity,
                              char_type** aOldData, uint32_t* aOldFlags);
# 1151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  __attribute__ ((warn_unused_result)) bool ReplacePrep(index_type aCutStart,
                                size_type aCutLength,
                                size_type aNewLength);

  __attribute__ ((warn_unused_result)) bool ReplacePrepInternal(
    index_type aCutStart,
    size_type aCutLength,
    size_type aNewFragLength,
    size_type aNewTotalLength);
# 1168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstring.h"
  size_type Capacity() const;





  __attribute__ ((warn_unused_result)) bool EnsureMutable(
    size_type aNewLen = size_type(-1));




  static __attribute__ ((warn_unused_result)) bool CheckCapacity(size_type aCapacity) {
    if (aCapacity > kMaxCapacity) {


      do { } while(0);
      return false;
    }

    return true;
  }




  void SetDataFlags(uint32_t aDataFlags)
  {
    do { } while(0);
    mFlags = aDataFlags | (mFlags & 0xFFFF0000);
  }

  void ReplaceLiteral(index_type aCutStart, size_type aCutLength,
                                  const char_type* aData, size_type aLength);

  static const size_type kMaxCapacity;
public:



  void AssignLiteral(const char_type* aData, size_type aLength);
};

static_assert(sizeof(nsACString) ==
              sizeof(mozilla::detail::nsCStringRepr),
              "Don't add new data fields to nsTSubstring_CharT. "
              "Add to nsTStringRepr_CharT instead.");

int
Compare(const nsACString::base_string_type& aLhs,
        const nsACString::base_string_type& aRhs,
        const nsCStringComparator& = nsDefaultCStringComparator());


inline bool
operator!=(const nsACString::base_string_type& aLhs,
           const nsACString::base_string_type& aRhs)
{
  return !aLhs.Equals(aRhs);
}

inline bool
operator!=(const nsACString::base_string_type& aLhs,
           const nsACString::char_type* aRhs)
{
  return !aLhs.Equals(aRhs);
}

inline bool
operator<(const nsACString::base_string_type& aLhs,
          const nsACString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) < 0;
}

inline bool
operator<=(const nsACString::base_string_type& aLhs,
           const nsACString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) <= 0;
}

inline bool
operator==(const nsACString::base_string_type& aLhs,
           const nsACString::base_string_type& aRhs)
{
  return aLhs.Equals(aRhs);
}

inline bool
operator==(const nsACString::base_string_type& aLhs,
           const nsACString::char_type* aRhs)
{
  return aLhs.Equals(aRhs);
}


inline bool
operator>=(const nsACString::base_string_type& aLhs,
           const nsACString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) >= 0;
}

inline bool
operator>(const nsACString::base_string_type& aLhs,
          const nsACString::base_string_type& aRhs)
{
  return Compare(aLhs, aRhs) > 0;
}



class nsCSubstringSplitter
{
  typedef nsACString::size_type size_type;
  typedef nsACString::char_type char_type;

  class nsTSubstringSplit_Iter
  {
  public:
    nsTSubstringSplit_Iter(const nsCSubstringSplitter& aObj,
                           size_type aPos)
      : mObj(aObj)
      , mPos(aPos)
    {
    }

    bool operator!=(const nsTSubstringSplit_Iter& other) const
    {
      return mPos != other.mPos;
    }

    const nsDependentCSubstring& operator*() const;

    const nsTSubstringSplit_Iter& operator++()
    {
      ++mPos;
      return *this;
    }

  private:
    const nsCSubstringSplitter& mObj;
    size_type mPos;
  };

private:
  const nsACString* const mStr;
  mozilla::UniquePtr<nsDependentCSubstring[]> mArray;
  size_type mArraySize;
  const char_type mDelim;

public:
  nsCSubstringSplitter(const nsACString* aStr, char_type aDelim);

  nsTSubstringSplit_Iter begin() const
  {
    return nsTSubstringSplit_Iter(*this, 0);
  }

  nsTSubstringSplit_Iter end() const
  {
    return nsTSubstringSplit_Iter(*this, mArraySize);
  }

  const nsDependentCSubstring& Get(const size_type index) const
  {
    do { } while (0);
    return mArray[index];
  }
};




namespace mozilla {

inline Span<char>
MakeSpan(nsACString& aString)
{
  return aString;
}

inline Span<const char>
MakeSpan(const nsACString& aString)
{
  return aString;
}

}
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2






class nsCaseInsensitiveCStringComparator
  : public nsCStringComparator
{
public:
  nsCaseInsensitiveCStringComparator()
  {
  }
  typedef char char_type;

  virtual int operator()(const char_type*, const char_type*,
                         uint32_t, uint32_t) const override;
};

class nsCaseInsensitiveCStringArrayComparator
{
public:
  template<class A, class B>
  bool Equals(const A& aStrA, const B& aStrB) const
  {
    return aStrA.Equals(aStrB, nsCaseInsensitiveCStringComparator());
  }
};




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h"
class nsSubstringTuple
{
public:

  typedef char16_t char_type;
  typedef nsCharTraits<char_type> char_traits;

  typedef nsSubstringTuple self_type;
  typedef mozilla::detail::nsStringRepr base_string_type;
  typedef uint32_t size_type;

public:

  nsSubstringTuple(const base_string_type* aStrA,
                          const base_string_type* aStrB)
    : mHead(nullptr)
    , mFragA(aStrA)
    , mFragB(aStrB)
  {
  }

  nsSubstringTuple(const self_type& aHead,
                          const base_string_type* aStrB)
    : mHead(&aHead)
    , mFragA(nullptr)
    , mFragB(aStrB)
  {
  }




  size_type Length() const;






  void WriteTo(char_type* aBuf, uint32_t aBufLen) const;





  bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const;

private:

  const self_type* const mHead;
  const base_string_type* const mFragA;
  const base_string_type* const mFragB;
};

inline const nsSubstringTuple
operator+(const nsSubstringTuple::base_string_type& aStrA,
          const nsSubstringTuple::base_string_type& aStrB)
{
  return nsSubstringTuple(&aStrA, &aStrB);
}

inline const nsSubstringTuple
operator+(const nsSubstringTuple& aHead,
          const nsSubstringTuple::base_string_type& aStrB)
{
  return nsSubstringTuple(aHead, &aStrB);
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTSubstringTuple.h"
class nsCSubstringTuple
{
public:

  typedef char char_type;
  typedef nsCharTraits<char_type> char_traits;

  typedef nsCSubstringTuple self_type;
  typedef mozilla::detail::nsCStringRepr base_string_type;
  typedef uint32_t size_type;

public:

  nsCSubstringTuple(const base_string_type* aStrA,
                          const base_string_type* aStrB)
    : mHead(nullptr)
    , mFragA(aStrA)
    , mFragB(aStrB)
  {
  }

  nsCSubstringTuple(const self_type& aHead,
                          const base_string_type* aStrB)
    : mHead(&aHead)
    , mFragA(nullptr)
    , mFragB(aStrB)
  {
  }




  size_type Length() const;






  void WriteTo(char_type* aBuf, uint32_t aBufLen) const;





  bool IsDependentOn(const char_type* aStart, const char_type* aEnd) const;

private:

  const self_type* const mHead;
  const base_string_type* const mFragA;
  const base_string_type* const mFragB;
};

inline const nsCSubstringTuple
operator+(const nsCSubstringTuple::base_string_type& aStrA,
          const nsCSubstringTuple::base_string_type& aStrB)
{
  return nsCSubstringTuple(&aStrA, &aStrB);
}

inline const nsCSubstringTuple
operator+(const nsCSubstringTuple& aHead,
          const nsCSubstringTuple::base_string_type& aStrB)
{
  return nsCSubstringTuple(aHead, &aStrB);
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstringTuple.h" 2
# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAString.h" 2
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSubstring.h" 2
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h"
class nsDependentSubstring : public nsAString
{
public:

  typedef nsDependentSubstring self_type;

public:

  void Rebind(const substring_type&, uint32_t aStartPos,
              uint32_t aLength = size_type(-1));

  void Rebind(const char_type* aData, size_type aLength);

  void Rebind(const char_type* aStart, const char_type* aEnd);

  nsDependentSubstring(const substring_type& aStr, uint32_t aStartPos,
                              uint32_t aLength = size_type(-1))
    : substring_type()
  {
    Rebind(aStr, aStartPos, aLength);
  }

  nsDependentSubstring(const char_type* aData, size_type aLength)
    : substring_type(const_cast<char_type*>(aData), aLength, F_NONE)
  {
  }

  nsDependentSubstring(const char_type* aStart, const char_type* aEnd);
# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h"
  nsDependentSubstring(const const_iterator& aStart,
                              const const_iterator& aEnd);


  nsDependentSubstring()
    : substring_type()
  {
  }



private:

  void operator=(const self_type&);
};

inline const nsDependentSubstring
Substring(const nsAString& aStr, uint32_t aStartPos,
          uint32_t aLength = uint32_t(-1))
{
  return nsDependentSubstring(aStr, aStartPos, aLength);
}

inline const nsDependentSubstring
Substring(const nsReadingIterator<char16_t>& aStart,
          const nsReadingIterator<char16_t>& aEnd)
{
  return nsDependentSubstring(aStart.get(), aEnd.get());
}

inline const nsDependentSubstring
Substring(const char16_t* aData, uint32_t aLength)
{
  return nsDependentSubstring(aData, aLength);
}

const nsDependentSubstring
Substring(const char16_t* aStart, const char16_t* aEnd);

inline const nsDependentSubstring
StringHead(const nsAString& aStr, uint32_t aCount)
{
  return nsDependentSubstring(aStr, 0, aCount);
}

inline const nsDependentSubstring
StringTail(const nsAString& aStr, uint32_t aCount)
{
  return nsDependentSubstring(aStr, aStr.Length() - aCount, aCount);
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h"
class nsDependentCSubstring : public nsACString
{
public:

  typedef nsDependentCSubstring self_type;

public:

  void Rebind(const substring_type&, uint32_t aStartPos,
              uint32_t aLength = size_type(-1));

  void Rebind(const char_type* aData, size_type aLength);

  void Rebind(const char_type* aStart, const char_type* aEnd);

  nsDependentCSubstring(const substring_type& aStr, uint32_t aStartPos,
                              uint32_t aLength = size_type(-1))
    : substring_type()
  {
    Rebind(aStr, aStartPos, aLength);
  }

  nsDependentCSubstring(const char_type* aData, size_type aLength)
    : substring_type(const_cast<char_type*>(aData), aLength, F_NONE)
  {
  }

  nsDependentCSubstring(const char_type* aStart, const char_type* aEnd);
# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentSubstring.h"
  nsDependentCSubstring(const const_iterator& aStart,
                              const const_iterator& aEnd);


  nsDependentCSubstring()
    : substring_type()
  {
  }



private:

  void operator=(const self_type&);
};

inline const nsDependentCSubstring
Substring(const nsACString& aStr, uint32_t aStartPos,
          uint32_t aLength = uint32_t(-1))
{
  return nsDependentCSubstring(aStr, aStartPos, aLength);
}

inline const nsDependentCSubstring
Substring(const nsReadingIterator<char>& aStart,
          const nsReadingIterator<char>& aEnd)
{
  return nsDependentCSubstring(aStart.get(), aEnd.get());
}

inline const nsDependentCSubstring
Substring(const char* aData, uint32_t aLength)
{
  return nsDependentCSubstring(aData, aLength);
}

const nsDependentCSubstring
Substring(const char* aStart, const char* aEnd);

inline const nsDependentCSubstring
StringHead(const nsACString& aStr, uint32_t aCount)
{
  return nsDependentCSubstring(aStr, 0, aCount);
}

inline const nsDependentCSubstring
StringTail(const nsACString& aStr, uint32_t aCount)
{
  return nsDependentCSubstring(aStr, aStr.Length() - aCount, aCount);
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentSubstring.h" 2
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArrayForwardDeclare.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArrayForwardDeclare.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArrayForwardDeclare.h" 2

template<class E>
class nsTArray;

template<class E>
class FallibleTArray;

template<class E, size_t N>
class AutoTArray;

template<class E>
using InfallibleTArray = nsTArray<E>;
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h" 2

inline size_t
Distance(const nsReadingIterator<char16_t>& aStart,
         const nsReadingIterator<char16_t>& aEnd)
{
  do { } while (0);
  return static_cast<size_t>(aEnd.get() - aStart.get());
}
inline size_t
Distance(const nsReadingIterator<char>& aStart,
         const nsReadingIterator<char>& aEnd)
{
  do { } while (0);
  return static_cast<size_t>(aEnd.get() - aStart.get());
}

void LossyCopyUTF16toASCII(const nsAString& aSource, nsACString& aDest);
void CopyASCIItoUTF16(const nsACString& aSource, nsAString& aDest);

void LossyCopyUTF16toASCII(const char16ptr_t aSource, nsACString& aDest);
void CopyASCIItoUTF16(const char* aSource, nsAString& aDest);

void CopyUTF16toUTF8(const nsAString& aSource, nsACString& aDest);
__attribute__ ((warn_unused_result)) bool CopyUTF16toUTF8(const nsAString& aSource, nsACString& aDest,
                                  const mozilla::fallible_t&);
void CopyUTF8toUTF16(const nsACString& aSource, nsAString& aDest);

void CopyUTF16toUTF8(const char16ptr_t aSource, nsACString& aDest);
void CopyUTF8toUTF16(const char* aSource, nsAString& aDest);

void LossyAppendUTF16toASCII(const nsAString& aSource, nsACString& aDest);
void AppendASCIItoUTF16(const nsACString& aSource, nsAString& aDest);
__attribute__ ((warn_unused_result)) bool AppendASCIItoUTF16(const nsACString& aSource,
                                     nsAString& aDest,
                                     const mozilla::fallible_t&);

void LossyAppendUTF16toASCII(const char16ptr_t aSource, nsACString& aDest);
__attribute__ ((warn_unused_result)) bool AppendASCIItoUTF16(const char* aSource,
                                     nsAString& aDest,
                                     const mozilla::fallible_t&);
void AppendASCIItoUTF16(const char* aSource, nsAString& aDest);

void AppendUTF16toUTF8(const nsAString& aSource, nsACString& aDest);
__attribute__ ((warn_unused_result)) bool AppendUTF16toUTF8(const nsAString& aSource,
                                    nsACString& aDest,
                                    const mozilla::fallible_t&);
void AppendUTF8toUTF16(const nsACString& aSource, nsAString& aDest);
__attribute__ ((warn_unused_result)) bool AppendUTF8toUTF16(const nsACString& aSource,
                                    nsAString& aDest,
                                    const mozilla::fallible_t&);

void AppendUTF16toUTF8(const char16ptr_t aSource, nsACString& aDest);
void AppendUTF8toUTF16(const char* aSource, nsAString& aDest);
# 85 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char* ToNewCString(const nsAString& aSource);
# 97 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char* ToNewCString(const nsACString& aSource);
# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char* ToNewUTF8String(const nsAString& aSource, uint32_t* aUTF8Count = nullptr);
# 129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char16_t* ToNewUnicode(const nsAString& aSource);
# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char16_t* ToNewUnicode(const nsACString& aSource);
# 153 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
uint32_t CalcUTF8ToUnicodeLength(const nsACString& aSource);
# 173 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char16_t* UTF8ToUnicodeBuffer(const nsACString& aSource,
                              char16_t* aBuffer,
                              uint32_t* aUTF16Count = nullptr);
# 192 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char16_t* UTF8ToNewUnicode(const nsACString& aSource,
                           uint32_t* aUTF16Count = nullptr);
# 207 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
char16_t* CopyUnicodeTo(const nsAString& aSource,
                        uint32_t aSrcOffset,
                        char16_t* aDest,
                        uint32_t aLength);
# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
void CopyUnicodeTo(const nsAString::const_iterator& aSrcStart,
                   const nsAString::const_iterator& aSrcEnd,
                   nsAString& aDest);
# 238 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
void AppendUnicodeTo(const nsAString::const_iterator& aSrcStart,
                     const nsAString::const_iterator& aSrcEnd,
                     nsAString& aDest);






bool IsASCII(const nsAString& aString);






bool IsASCII(const nsACString& aString);
# 287 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
bool IsUTF8(const nsACString& aString, bool aRejectNonChar = true);

bool ParseString(const nsACString& aAstring, char aDelimiter,
                 nsTArray<nsCString>& aArray);




void ToUpperCase(nsACString&);

void ToLowerCase(nsACString&);

void ToUpperCase(nsCSubstring&);

void ToLowerCase(nsCSubstring&);




void ToUpperCase(const nsACString& aSource, nsACString& aDest);

void ToLowerCase(const nsACString& aSource, nsACString& aDest);
# 320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
bool FindInReadable(const nsAString& aPattern, nsAString::const_iterator&,
                    nsAString::const_iterator&,
                    const nsStringComparator& = nsDefaultStringComparator());
bool FindInReadable(const nsACString& aPattern, nsACString::const_iterator&,
                    nsACString::const_iterator&,
                    const nsCStringComparator& = nsDefaultCStringComparator());



inline bool
FindInReadable(const nsAString& aPattern, const nsAString& aSource,
               const nsStringComparator& aCompare = nsDefaultStringComparator())
{
  nsAString::const_iterator start, end;
  aSource.BeginReading(start);
  aSource.EndReading(end);
  return FindInReadable(aPattern, start, end, aCompare);
}

inline bool
FindInReadable(const nsACString& aPattern, const nsACString& aSource,
               const nsCStringComparator& aCompare = nsDefaultCStringComparator())
{
  nsACString::const_iterator start, end;
  aSource.BeginReading(start);
  aSource.EndReading(end);
  return FindInReadable(aPattern, start, end, aCompare);
}


bool CaseInsensitiveFindInReadable(const nsACString& aPattern,
                                   nsACString::const_iterator&,
                                   nsACString::const_iterator&);







bool RFindInReadable(const nsAString& aPattern, nsAString::const_iterator&,
                     nsAString::const_iterator&,
                     const nsStringComparator& = nsDefaultStringComparator());
bool RFindInReadable(const nsACString& aPattern, nsACString::const_iterator&,
                     nsACString::const_iterator&,
                     const nsCStringComparator& = nsDefaultCStringComparator());
# 375 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
bool FindCharInReadable(char16_t aChar, nsAString::const_iterator& aSearchStart,
                        const nsAString::const_iterator& aSearchEnd);
bool FindCharInReadable(char aChar, nsACString::const_iterator& aSearchStart,
                        const nsACString::const_iterator& aSearchEnd);




uint32_t CountCharInReadable(const nsAString& aStr,
                             char16_t aChar);
uint32_t CountCharInReadable(const nsACString& aStr,
                             char aChar);

bool StringBeginsWith(const nsAString& aSource, const nsAString& aSubstring);
bool StringBeginsWith(const nsAString& aSource, const nsAString& aSubstring,
                      const nsStringComparator& aComparator);
bool StringBeginsWith(const nsACString& aSource, const nsACString& aSubstring);
bool StringBeginsWith(const nsACString& aSource, const nsACString& aSubstring,
                      const nsCStringComparator& aComparator);
bool StringEndsWith(const nsAString& aSource, const nsAString& aSubstring);
bool StringEndsWith(const nsAString& aSource, const nsAString& aSubstring,
                    const nsStringComparator& aComparator);
bool StringEndsWith(const nsACString& aSource, const nsACString& aSubstring);
bool StringEndsWith(const nsACString& aSource, const nsACString& aSubstring,
                    const nsCStringComparator& aComparator);

const nsAFlatString& EmptyString();
const nsAFlatCString& EmptyCString();

const nsAFlatString& NullString();
const nsAFlatCString& NullCString();
# 415 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsReadableUtils.h"
int32_t CompareUTF8toUTF16(const nsASingleFragmentCString& aUTF8String,
                           const nsASingleFragmentString& aUTF16String);

void AppendUCS4ToUTF16(const uint32_t aSource, nsAString& aDest);

template<class T>
inline bool
EnsureStringLength(T& aStr, uint32_t aLen)
{
  aStr.SetLength(aLen);
  return (aStr.Length() == aLen);
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsString : public nsAString
{
public:

  typedef nsString self_type;

public:





  nsString()
    : substring_type()
  {
  }

  explicit
  nsString(const char_type* aData, size_type aLength = size_type(-1))
    : substring_type()
  {
    Assign(aData, aLength);
  }
# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  nsString(const self_type& aStr)
    : substring_type()
  {
    Assign(aStr);
  }

               nsString(const substring_tuple_type& aTuple)
    : substring_type()
  {
    Assign(aTuple);
  }

  explicit
  nsString(const substring_type& aReadable)
    : substring_type()
  {
    Assign(aReadable);
  }



  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }
  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }







  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }
# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  const char_type* get() const

  {
    return mData;
  }
# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  char_type CharAt(index_type aIndex) const
  {
    do { } while(0);
    return mData[aIndex];
  }

  char_type operator[](index_type aIndex) const
  {
    return CharAt(aIndex);
  }
# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t Find(const nsCString& aString, bool aIgnoreCase = false,
               int32_t aOffset = 0, int32_t aCount = -1) const;
  int32_t Find(const char* aString, bool aIgnoreCase = false,
               int32_t aOffset = 0, int32_t aCount = -1) const;


  int32_t Find(const nsAFlatString& aString, int32_t aOffset = 0,
               int32_t aCount = -1) const;
  int32_t Find(const char16_t* aString, int32_t aOffset = 0,
               int32_t aCount = -1) const;
# 186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t RFind(const nsCString& aString, bool aIgnoreCase = false,
                int32_t aOffset = -1, int32_t aCount = -1) const;
  int32_t RFind(const char* aCString, bool aIgnoreCase = false,
                int32_t aOffset = -1, int32_t aCount = -1) const;


  int32_t RFind(const nsAFlatString& aString, int32_t aOffset = -1,
                int32_t aCount = -1) const;
  int32_t RFind(const char16_t* aString, int32_t aOffset = -1,
                int32_t aCount = -1) const;
# 210 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t RFindChar(char16_t aChar, int32_t aOffset = -1,
                    int32_t aCount = -1) const;
# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t FindCharInSet(const char* aString, int32_t aOffset = 0) const;
  int32_t FindCharInSet(const self_type& aString, int32_t aOffset = 0) const
  {
    return FindCharInSet(aString.get(), aOffset);
  }


  int32_t FindCharInSet(const char16_t* aString, int32_t aOffset = 0) const;
# 245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t RFindCharInSet(const char_type* aString, int32_t aOffset = -1) const;
  int32_t RFindCharInSet(const self_type& aString, int32_t aOffset = -1) const
  {
    return RFindCharInSet(aString.get(), aOffset);
  }
# 281 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  bool EqualsIgnoreCase(const char* aString, int32_t aCount = -1) const;
# 292 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  double ToDouble(nsresult* aErrorCode) const;







  float ToFloat(nsresult* aErrorCode) const
  {
    return (float)ToDouble(aErrorCode);
  }
# 312 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t ToInteger(nsresult* aErrorCode, uint32_t aRadix = (10)) const;







  int64_t ToInteger64(nsresult* aErrorCode, uint32_t aRadix = (10)) const;
# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  size_type Mid(self_type& aResult, uint32_t aStartPos, uint32_t aCount) const;

  size_type Left(self_type& aResult, size_type aCount) const
  {
    return Mid(aResult, 0, aCount);
  }

  size_type Right(self_type& aResult, size_type aCount) const
  {
    aCount = XPCOM_MIN(mLength, aCount);
    return Mid(aResult, mLength - aCount, aCount);
  }
# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  bool SetCharAt(char16_t aChar, uint32_t aIndex);
# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  using nsAString::StripChars;

  void StripChars(const char* aSet);
  bool StripChars(const char* aSet, const fallible_t&);





  void StripWhitespace();
  bool StripWhitespace(const fallible_t&);






  void ReplaceChar(char_type aOldChar, char_type aNewChar);
  void ReplaceChar(const char* aSet, char_type aNewChar);

  void ReplaceChar(const char16_t* aSet, char16_t aNewChar);






  void ReplaceSubstring(const self_type& aTarget, const self_type& aNewValue);
  void ReplaceSubstring(const char_type* aTarget, const char_type* aNewValue);
  __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const self_type& aTarget,
                                     const self_type& aNewValue,
                                     const fallible_t&);
  __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const char_type* aTarget,
                                     const char_type* aNewValue,
                                     const fallible_t&);
# 419 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void Trim(const char* aSet, bool aEliminateLeading = true,
            bool aEliminateTrailing = true, bool aIgnoreQuotes = false);
# 430 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void CompressWhitespace(bool aEliminateLeading = true,
                          bool aEliminateTrailing = true);






  void AssignWithConversion(const nsACString& aString);
  void AssignWithConversion(const incompatible_char_type* aData,
                            int32_t aLength = -1);
# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void Rebind(const char_type* aData, size_type aLength);




  void AssertValidDependentString()
  {
    do { } while(0);
    do { } while(0);
    do { } while(0);


  }


protected:


  nsString(char_type* aData, size_type aLength, uint32_t aFlags)
    : substring_type(aData, aLength, aFlags)
  {
  }

  struct Segment {
    uint32_t mBegin, mLength;
    Segment(uint32_t aBegin, uint32_t aLength)
      : mBegin(aBegin)
      , mLength(aLength)
    {}
  };
};


class nsFixedString : public nsString
{
public:

  typedef nsFixedString self_type;
  typedef nsFixedString fixed_string_type;

public:
# 501 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  nsFixedString(char_type* aData, size_type aStorageSize)
    : string_type(aData, uint32_t(char_traits::length(aData)),
                  F_TERMINATED | F_FIXED | F_CLASS_FIXED)
    , mFixedCapacity(aStorageSize - 1)
    , mFixedBuf(aData)
  {
  }

  nsFixedString(char_type* aData, size_type aStorageSize,
                       size_type aLength)
    : string_type(aData, aLength, F_TERMINATED | F_FIXED | F_CLASS_FIXED)
    , mFixedCapacity(aStorageSize - 1)
    , mFixedBuf(aData)
  {

    mFixedBuf[aLength] = char_type(0);
  }


  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }
  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }

protected:

  friend class nsAString;

  size_type mFixedCapacity;
  char_type* mFixedBuf;
};
# 562 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsAutoString : public nsFixedString
{
public:

  typedef nsAutoString self_type;

public:





  nsAutoString()
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
  }

  explicit
  nsAutoString(char_type aChar)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aChar);
  }

  explicit
  nsAutoString(const char_type* aData, size_type aLength = size_type(-1))
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aData, aLength);
  }
# 601 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  nsAutoString(const self_type& aStr)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aStr);
  }

  explicit
  nsAutoString(const substring_type& aStr)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aStr);
  }

               nsAutoString(const substring_tuple_type& aTuple)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aTuple);
  }


  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }







  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }

  enum
  {
    kDefaultStorageSize = 64
  };

private:

  char_type mStorage[kDefaultStorageSize];
};







template<class E> class nsTArrayElementTraits;
template<>
class nsTArrayElementTraits<nsAutoString>
{
public:
  template<class A> struct Dont_Instantiate_nsTArray_of;
  template<class A> struct Instead_Use_nsTArray_of;

  static Dont_Instantiate_nsTArray_of<nsAutoString>*
  Construct(Instead_Use_nsTArray_of<nsString>* aE)
  {
    return 0;
  }
  template<class A>
  static Dont_Instantiate_nsTArray_of<nsAutoString>*
  Construct(Instead_Use_nsTArray_of<nsString>* aE, const A& aArg)
  {
    return 0;
  }
  static Dont_Instantiate_nsTArray_of<nsAutoString>*
  Destruct(Instead_Use_nsTArray_of<nsString>* aE)
  {
    return 0;
  }
};
# 708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsXPIDLString : public nsString
{
public:

  typedef nsXPIDLString self_type;

public:

  nsXPIDLString()
    : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED)
  {
  }


  nsXPIDLString(const self_type& aStr)
    : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED)
  {
    Assign(aStr);
  }





  const char_type* get() const

  {
    return (mFlags & F_VOIDED) ? nullptr : mData;
  }



  operator const char_type*() const
  {
    return get();
  }


  char_type operator[](int32_t aIndex) const
  {
    return CharAt(index_type(aIndex));
  }


  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }
};
# 792 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsGetterCopies
{
public:
  typedef char16_t char_type;

  explicit nsGetterCopies(nsAString& aStr)
    : mString(aStr)
    , mData(nullptr)
  {
  }

  ~nsGetterCopies()
  {
    mString.Adopt(mData);
  }

  operator char_type**()
  {
    return &mData;
  }

private:
  nsAString& mString;
  char_type* mData;
};

inline nsGetterCopies
getter_Copies(nsAString& aString)
{
  return nsGetterCopies(aString);
}
# 833 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsAdoptingString : public nsXPIDLString
{
public:

  typedef nsAdoptingString self_type;

public:

  explicit nsAdoptingString()
  {
  }
  explicit nsAdoptingString(char_type* aStr,
                                   size_type aLength = size_type(-1))
  {
    Adopt(aStr, aLength);
  }





  nsAdoptingString(const self_type& aStr)
    : nsXPIDLString()
  {
    *this = aStr;
  }


  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }




  self_type& operator=(const self_type& aStr);

private:
  self_type& operator=(const char_type* aData) = delete;
  self_type& operator=(char_type* aData) = delete;
};
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsCString : public nsACString
{
public:

  typedef nsCString self_type;

public:





  nsCString()
    : substring_type()
  {
  }

  explicit
  nsCString(const char_type* aData, size_type aLength = size_type(-1))
    : substring_type()
  {
    Assign(aData, aLength);
  }
# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  nsCString(const self_type& aStr)
    : substring_type()
  {
    Assign(aStr);
  }

               nsCString(const substring_tuple_type& aTuple)
    : substring_type()
  {
    Assign(aTuple);
  }

  explicit
  nsCString(const substring_type& aReadable)
    : substring_type()
  {
    Assign(aReadable);
  }



  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }
  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }







  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }
# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  const char_type* get() const

  {
    return mData;
  }
# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  char_type CharAt(index_type aIndex) const
  {
    do { } while(0);
    return mData[aIndex];
  }

  char_type operator[](index_type aIndex) const
  {
    return CharAt(aIndex);
  }
# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t Find(const nsCString& aString, bool aIgnoreCase = false,
               int32_t aOffset = 0, int32_t aCount = -1) const;
  int32_t Find(const char* aString, bool aIgnoreCase = false,
               int32_t aOffset = 0, int32_t aCount = -1) const;
# 186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t RFind(const nsCString& aString, bool aIgnoreCase = false,
                int32_t aOffset = -1, int32_t aCount = -1) const;
  int32_t RFind(const char* aCString, bool aIgnoreCase = false,
                int32_t aOffset = -1, int32_t aCount = -1) const;
# 210 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t RFindChar(char16_t aChar, int32_t aOffset = -1,
                    int32_t aCount = -1) const;
# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t FindCharInSet(const char* aString, int32_t aOffset = 0) const;
  int32_t FindCharInSet(const self_type& aString, int32_t aOffset = 0) const
  {
    return FindCharInSet(aString.get(), aOffset);
  }
# 245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t RFindCharInSet(const char_type* aString, int32_t aOffset = -1) const;
  int32_t RFindCharInSet(const self_type& aString, int32_t aOffset = -1) const
  {
    return RFindCharInSet(aString.get(), aOffset);
  }
# 262 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t Compare(const char* aString, bool aIgnoreCase = false,
                  int32_t aCount = -1) const;
# 276 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  bool EqualsIgnoreCase(const char* aString, int32_t aCount = -1) const
  {
    return Compare(aString, true, aCount) == 0;
  }
# 292 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  double ToDouble(nsresult* aErrorCode) const;







  float ToFloat(nsresult* aErrorCode) const
  {
    return (float)ToDouble(aErrorCode);
  }
# 312 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  int32_t ToInteger(nsresult* aErrorCode, uint32_t aRadix = (10)) const;







  int64_t ToInteger64(nsresult* aErrorCode, uint32_t aRadix = (10)) const;
# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  size_type Mid(self_type& aResult, uint32_t aStartPos, uint32_t aCount) const;

  size_type Left(self_type& aResult, size_type aCount) const
  {
    return Mid(aResult, 0, aCount);
  }

  size_type Right(self_type& aResult, size_type aCount) const
  {
    aCount = XPCOM_MIN(mLength, aCount);
    return Mid(aResult, mLength - aCount, aCount);
  }
# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  bool SetCharAt(char16_t aChar, uint32_t aIndex);
# 374 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void StripChars(const char* aSet);
  bool StripChars(const char* aSet, const fallible_t&);





  void StripWhitespace();
  bool StripWhitespace(const fallible_t&);






  void ReplaceChar(char_type aOldChar, char_type aNewChar);
  void ReplaceChar(const char* aSet, char_type aNewChar);
# 399 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void ReplaceSubstring(const self_type& aTarget, const self_type& aNewValue);
  void ReplaceSubstring(const char_type* aTarget, const char_type* aNewValue);
  __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const self_type& aTarget,
                                     const self_type& aNewValue,
                                     const fallible_t&);
  __attribute__ ((warn_unused_result)) bool ReplaceSubstring(const char_type* aTarget,
                                     const char_type* aNewValue,
                                     const fallible_t&);
# 419 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void Trim(const char* aSet, bool aEliminateLeading = true,
            bool aEliminateTrailing = true, bool aIgnoreQuotes = false);
# 430 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void CompressWhitespace(bool aEliminateLeading = true,
                          bool aEliminateTrailing = true);






  void AssignWithConversion(const nsAString& aString);
  void AssignWithConversion(const incompatible_char_type* aData,
                            int32_t aLength = -1);
# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  void Rebind(const char_type* aData, size_type aLength);




  void AssertValidDependentString()
  {
    do { } while(0);
    do { } while(0);
    do { } while(0);


  }


protected:


  nsCString(char_type* aData, size_type aLength, uint32_t aFlags)
    : substring_type(aData, aLength, aFlags)
  {
  }

  struct Segment {
    uint32_t mBegin, mLength;
    Segment(uint32_t aBegin, uint32_t aLength)
      : mBegin(aBegin)
      , mLength(aLength)
    {}
  };
};


class nsFixedCString : public nsCString
{
public:

  typedef nsFixedCString self_type;
  typedef nsFixedCString fixed_string_type;

public:
# 501 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  nsFixedCString(char_type* aData, size_type aStorageSize)
    : string_type(aData, uint32_t(char_traits::length(aData)),
                  F_TERMINATED | F_FIXED | F_CLASS_FIXED)
    , mFixedCapacity(aStorageSize - 1)
    , mFixedBuf(aData)
  {
  }

  nsFixedCString(char_type* aData, size_type aStorageSize,
                       size_type aLength)
    : string_type(aData, aLength, F_TERMINATED | F_FIXED | F_CLASS_FIXED)
    , mFixedCapacity(aStorageSize - 1)
    , mFixedBuf(aData)
  {

    mFixedBuf[aLength] = char_type(0);
  }


  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }
  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }

protected:

  friend class nsACString;

  size_type mFixedCapacity;
  char_type* mFixedBuf;
};
# 562 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsAutoCString : public nsFixedCString
{
public:

  typedef nsAutoCString self_type;

public:





  nsAutoCString()
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
  }

  explicit
  nsAutoCString(char_type aChar)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aChar);
  }

  explicit
  nsAutoCString(const char_type* aData, size_type aLength = size_type(-1))
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aData, aLength);
  }
# 601 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
  nsAutoCString(const self_type& aStr)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aStr);
  }

  explicit
  nsAutoCString(const substring_type& aStr)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aStr);
  }

               nsAutoCString(const substring_tuple_type& aTuple)
    : fixed_string_type(mStorage, kDefaultStorageSize, 0)
  {
    Assign(aTuple);
  }


  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aData)
  {
    Assign(aData);
    return *this;
  }







  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }

  enum
  {
    kDefaultStorageSize = 64
  };

private:

  char_type mStorage[kDefaultStorageSize];
};







template<class E> class nsTArrayElementTraits;
template<>
class nsTArrayElementTraits<nsAutoCString>
{
public:
  template<class A> struct Dont_Instantiate_nsTArray_of;
  template<class A> struct Instead_Use_nsTArray_of;

  static Dont_Instantiate_nsTArray_of<nsAutoCString>*
  Construct(Instead_Use_nsTArray_of<nsCString>* aE)
  {
    return 0;
  }
  template<class A>
  static Dont_Instantiate_nsTArray_of<nsAutoCString>*
  Construct(Instead_Use_nsTArray_of<nsCString>* aE, const A& aArg)
  {
    return 0;
  }
  static Dont_Instantiate_nsTArray_of<nsAutoCString>*
  Destruct(Instead_Use_nsTArray_of<nsCString>* aE)
  {
    return 0;
  }
};
# 708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsXPIDLCString : public nsCString
{
public:

  typedef nsXPIDLCString self_type;

public:

  nsXPIDLCString()
    : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED)
  {
  }


  nsXPIDLCString(const self_type& aStr)
    : string_type(char_traits::sEmptyBuffer, 0, F_TERMINATED | F_VOIDED)
  {
    Assign(aStr);
  }





  const char_type* get() const

  {
    return (mFlags & F_VOIDED) ? nullptr : mData;
  }



  operator const char_type*() const
  {
    return get();
  }


  char_type operator[](int32_t aIndex) const
  {
    return CharAt(index_type(aIndex));
  }


  self_type& operator=(char_type aChar)
  {
    Assign(aChar);
    return *this;
  }
  self_type& operator=(const char_type* aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const self_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }
};
# 792 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsCGetterCopies
{
public:
  typedef char char_type;

  explicit nsCGetterCopies(nsACString& aStr)
    : mString(aStr)
    , mData(nullptr)
  {
  }

  ~nsCGetterCopies()
  {
    mString.Adopt(mData);
  }

  operator char_type**()
  {
    return &mData;
  }

private:
  nsACString& mString;
  char_type* mData;
};

inline nsCGetterCopies
getter_Copies(nsACString& aString)
{
  return nsCGetterCopies(aString);
}
# 833 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTString.h"
class nsAdoptingCString : public nsXPIDLCString
{
public:

  typedef nsAdoptingCString self_type;

public:

  explicit nsAdoptingCString()
  {
  }
  explicit nsAdoptingCString(char_type* aStr,
                                   size_type aLength = size_type(-1))
  {
    Adopt(aStr, aLength);
  }





  nsAdoptingCString(const self_type& aStr)
    : nsXPIDLCString()
  {
    *this = aStr;
  }


  self_type& operator=(const substring_type& aStr)
  {
    Assign(aStr);
    return *this;
  }
  self_type& operator=(const substring_tuple_type& aTuple)
  {
    Assign(aTuple);
    return *this;
  }




  self_type& operator=(const self_type& aStr);

private:
  self_type& operator=(const char_type* aData) = delete;
  self_type& operator=(char_type* aData) = delete;
};
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2

static_assert(sizeof(char16_t) == 2, "size of char16_t must be 2");
static_assert(sizeof(nsString::char_type) == 2,
              "size of nsString::char_type must be 2");
static_assert(nsString::char_type(-1) > nsString::char_type(0),
              "nsString::char_type must be unsigned");
static_assert(sizeof(nsCString::char_type) == 1,
              "size of nsCString::char_type must be 1");





class NS_LossyConvertUTF16toASCII : public nsAutoCString
{
public:
  explicit NS_LossyConvertUTF16toASCII(const char16ptr_t aString)
  {
    LossyAppendUTF16toASCII(aString, *this);
  }

  NS_LossyConvertUTF16toASCII(const char16ptr_t aString, uint32_t aLength)
  {
    LossyAppendUTF16toASCII(Substring(aString, aLength), *this);
  }

  explicit NS_LossyConvertUTF16toASCII(const nsAString& aString)
  {
    LossyAppendUTF16toASCII(aString, *this);
  }

private:

  NS_LossyConvertUTF16toASCII(char) = delete;
};


class NS_ConvertASCIItoUTF16 : public nsAutoString
{
public:
  explicit NS_ConvertASCIItoUTF16(const char* aCString)
  {
    AppendASCIItoUTF16(aCString, *this);
  }

  NS_ConvertASCIItoUTF16(const char* aCString, uint32_t aLength)
  {
    AppendASCIItoUTF16(Substring(aCString, aLength), *this);
  }

  explicit NS_ConvertASCIItoUTF16(const nsACString& aCString)
  {
    AppendASCIItoUTF16(aCString, *this);
  }

private:

  NS_ConvertASCIItoUTF16(char16_t) = delete;
};





class NS_ConvertUTF16toUTF8 : public nsAutoCString
{
public:
  explicit NS_ConvertUTF16toUTF8(const char16ptr_t aString)
  {
    AppendUTF16toUTF8(aString, *this);
  }

  NS_ConvertUTF16toUTF8(const char16ptr_t aString, uint32_t aLength)
  {
    AppendUTF16toUTF8(Substring(aString, aLength), *this);
  }

  explicit NS_ConvertUTF16toUTF8(const nsAString& aString)
  {
    AppendUTF16toUTF8(aString, *this);
  }

private:

  NS_ConvertUTF16toUTF8(char) = delete;
};


class NS_ConvertUTF8toUTF16 : public nsAutoString
{
public:
  explicit NS_ConvertUTF8toUTF16(const char* aCString)
  {
    AppendUTF8toUTF16(aCString, *this);
  }

  NS_ConvertUTF8toUTF16(const char* aCString, uint32_t aLength)
  {
    AppendUTF8toUTF16(Substring(aCString, aLength), *this);
  }

  explicit NS_ConvertUTF8toUTF16(const nsACString& aCString)
  {
    AppendUTF8toUTF16(aCString, *this);
  }

private:

  NS_ConvertUTF8toUTF16(char16_t) = delete;
};
# 180 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h"
inline char16_t*
wwc(char16_t* aStr)
{
  return aStr;
}

inline const char16_t*
wwc(const char16_t* aStr)
{
  return aStr;
}




typedef nsAutoString nsVoidableString;


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
class nsDependentString : public nsString
{
public:

  typedef nsDependentString self_type;

public:





  nsDependentString(const char_type* aStart, const char_type* aEnd);

  nsDependentString(const char_type* aData, uint32_t aLength)
    : string_type(const_cast<char_type*>(aData), aLength, F_TERMINATED)
  {
    AssertValidDependentString();
  }
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
  explicit
  nsDependentString(const char_type* aData)
    : string_type(const_cast<char_type*>(aData),
                  uint32_t(char_traits::length(aData)), F_TERMINATED)
  {
    AssertValidDependentString();
  }
# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
  nsDependentString(const string_type& aStr, uint32_t aStartPos)
    : string_type()
  {
    Rebind(aStr, aStartPos);
  }


  nsDependentString()
    : string_type()
  {
  }
# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
  using nsString::Rebind;
  void Rebind(const char_type* aData)
  {
    Rebind(aData, uint32_t(char_traits::length(aData)));
  }

  void Rebind(const char_type* aStart, const char_type* aEnd);
  void Rebind(const string_type&, uint32_t aStartPos);

private:


  nsDependentString(const substring_tuple_type&) = delete;
};
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
class nsDependentCString : public nsCString
{
public:

  typedef nsDependentCString self_type;

public:





  nsDependentCString(const char_type* aStart, const char_type* aEnd);

  nsDependentCString(const char_type* aData, uint32_t aLength)
    : string_type(const_cast<char_type*>(aData), aLength, F_TERMINATED)
  {
    AssertValidDependentString();
  }
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
  explicit
  nsDependentCString(const char_type* aData)
    : string_type(const_cast<char_type*>(aData),
                  uint32_t(char_traits::length(aData)), F_TERMINATED)
  {
    AssertValidDependentString();
  }
# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
  nsDependentCString(const string_type& aStr, uint32_t aStartPos)
    : string_type()
  {
    Rebind(aStr, aStartPos);
  }


  nsDependentCString()
    : string_type()
  {
  }
# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTDependentString.h"
  using nsCString::Rebind;
  void Rebind(const char_type* aData)
  {
    Rebind(aData, uint32_t(char_traits::length(aData)));
  }

  void Rebind(const char_type* aStart, const char_type* aEnd);
  void Rebind(const string_type&, uint32_t aStartPos);

private:


  nsDependentCString(const substring_tuple_type&) = delete;
};
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDependentString.h" 2
# 198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h"
class nsLiteralString : public mozilla::detail::nsStringRepr
{
public:

  typedef nsLiteralString self_type;

public:





  template<size_type N>
  explicit nsLiteralString(const char_type (&aStr)[N])
    : base_string_type(const_cast<char_type*>(aStr), N - 1, F_TERMINATED | F_LITERAL)
  {
  }






  const nsString& AsString() const
  {
    return *reinterpret_cast<const nsString*>(this);
  }

  operator const nsString&() const
  {
    return AsString();
  }
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h"
  const char_type* get() const && = delete;
  const char_type* get() const &

  {
    return mData;
  }

private:


  template<size_type N>
  nsLiteralString(char_type (&aStr)[N]) = delete;

  self_type& operator=(const self_type&) = delete;
};

static_assert(sizeof(nsLiteralString) == sizeof(nsString),
              "nsTLiteralString_CharT can masquerade as nsTString_CharT, "
              "so they must have identical layout");
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h"
class nsLiteralCString : public mozilla::detail::nsCStringRepr
{
public:

  typedef nsLiteralCString self_type;

public:





  template<size_type N>
  explicit nsLiteralCString(const char_type (&aStr)[N])
    : base_string_type(const_cast<char_type*>(aStr), N - 1, F_TERMINATED | F_LITERAL)
  {
  }






  const nsCString& AsString() const
  {
    return *reinterpret_cast<const nsCString*>(this);
  }

  operator const nsCString&() const
  {
    return AsString();
  }
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTLiteralString.h"
  const char_type* get() const && = delete;
  const char_type* get() const &

  {
    return mData;
  }

private:


  template<size_type N>
  nsLiteralCString(char_type (&aStr)[N]) = delete;

  self_type& operator=(const self_type&) = delete;
};

static_assert(sizeof(nsLiteralCString) == sizeof(nsCString),
              "nsTLiteralString_CharT can masquerade as nsTString_CharT, "
              "so they must have identical layout");
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsLiteralString.h" 2
# 199 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-unichar.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h" 1
# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h"
class nsPromiseFlatString : public nsString
{
public:

  typedef nsPromiseFlatString self_type;

private:

  void Init(const substring_type&);


  void operator=(const self_type&) = delete;


  nsPromiseFlatString() = delete;


  nsPromiseFlatString(const string_type& aStr) = delete;

public:

  explicit
  nsPromiseFlatString(const substring_type& aStr)
    : string_type()
  {
    Init(aStr);
  }

  explicit
  nsPromiseFlatString(const substring_tuple_type& aTuple)
    : string_type()
  {


    Assign(aTuple);
  }
};



template<class T>
const nsPromiseFlatString
PromiseFlatString(const T& aString)
{
  return nsPromiseFlatString(aString);
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-def-char.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h" 1
# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTPromiseFlatString.h"
class nsPromiseFlatCString : public nsCString
{
public:

  typedef nsPromiseFlatCString self_type;

private:

  void Init(const substring_type&);


  void operator=(const self_type&) = delete;


  nsPromiseFlatCString() = delete;


  nsPromiseFlatCString(const string_type& aStr) = delete;

public:

  explicit
  nsPromiseFlatCString(const substring_type& aStr)
    : string_type()
  {
    Init(aStr);
  }

  explicit
  nsPromiseFlatCString(const substring_tuple_type& aTuple)
    : string_type()
  {


    Assign(aTuple);
  }
};



template<class T>
const nsPromiseFlatCString
PromiseFlatCString(const T& aString)
{
  return nsPromiseFlatCString(aString);
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/string-template-undef.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPromiseFlatString.h" 2
# 200 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h"
class nsIMemory;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h"
class nsMemory
{
public:
  static nsresult HeapMinimize(bool aImmediate);
  static void* Clone(const void* aPtr, size_t aSize);
  static nsIMemory* GetGlobalMemoryService();
};
# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMemory.h"
namespace mozilla {
template<class T>
struct AlignmentTestStruct
{
  char c;
  T t;
};
}







enum nsAssignmentType
{
  NS_ASSIGNMENT_COPY,
  NS_ASSIGNMENT_DEPEND,
  NS_ASSIGNMENT_ADOPT
};
# 203 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plhash.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plhash.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prcpucfg.h" 1
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prcpucfg.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/md/_linux.cfg" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prcpucfg.h" 2
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" 2


# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h" 2
# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
extern "C" {
# 246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef unsigned char PRUint8;
# 260 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef signed char PRInt8;
# 285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef unsigned short PRUint16;
typedef short PRInt16;
# 310 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef unsigned int PRUint32;
typedef int PRInt32;
# 365 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef long PRInt64;
typedef unsigned long PRUint64;
# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef int PRIntn;
typedef unsigned int PRUintn;
# 421 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef double PRFloat64;






typedef size_t PRSize;







typedef PRInt32 PROffset32;
typedef PRInt64 PROffset64;







typedef ptrdiff_t PRPtrdiff;
# 456 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef unsigned long PRUptrdiff;
# 467 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef PRIntn PRBool;
# 477 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef PRUint8 PRPackedBool;





typedef enum { PR_FAILURE = -1, PR_SUCCESS = 0 } PRStatus;






typedef PRUint16 PRUnichar;
# 509 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
typedef long PRWord;
typedef unsigned long PRUword;
# 587 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtypes.h"
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plhash.h" 2

extern "C" {

typedef struct PLHashEntry PLHashEntry;
typedef struct PLHashTable PLHashTable;
typedef PRUint32 PLHashNumber;

typedef PLHashNumber ( *PLHashFunction)(const void *key);
typedef PRIntn ( *PLHashComparator)(const void *v1, const void *v2);

typedef PRIntn ( *PLHashEnumerator)(PLHashEntry *he, PRIntn i, void *arg);







typedef struct PLHashAllocOps {
    void * ( *allocTable)(void *pool, PRSize size);
    void ( *freeTable)(void *pool, void *item);
    PLHashEntry * ( *allocEntry)(void *pool, const void *key);
    void ( *freeEntry)(void *pool, PLHashEntry *he, PRUintn flag);
} PLHashAllocOps;




struct PLHashEntry {
    PLHashEntry *next;
    PLHashNumber keyHash;
    const void *key;
    void *value;
};

struct PLHashTable {
    PLHashEntry **buckets;
    PRUint32 nentries;
    PRUint32 shift;
    PLHashFunction keyHash;
    PLHashComparator keyCompare;
    PLHashComparator valueCompare;
    const PLHashAllocOps *allocOps;
    void *allocPriv;






};





extern __attribute__((visibility("default"))) PLHashTable *
PL_NewHashTable(PRUint32 numBuckets, PLHashFunction keyHash,
                PLHashComparator keyCompare, PLHashComparator valueCompare,
                const PLHashAllocOps *allocOps, void *allocPriv);

extern __attribute__((visibility("default"))) void
PL_HashTableDestroy(PLHashTable *ht);


extern __attribute__((visibility("default"))) PLHashEntry *
PL_HashTableAdd(PLHashTable *ht, const void *key, void *value);

extern __attribute__((visibility("default"))) PRBool
PL_HashTableRemove(PLHashTable *ht, const void *key);

extern __attribute__((visibility("default"))) void *
PL_HashTableLookup(PLHashTable *ht, const void *key);

extern __attribute__((visibility("default"))) void *
PL_HashTableLookupConst(PLHashTable *ht, const void *key);

extern __attribute__((visibility("default"))) PRIntn
PL_HashTableEnumerateEntries(PLHashTable *ht, PLHashEnumerator f, void *arg);


extern __attribute__((visibility("default"))) PLHashNumber
PL_HashString(const void *key);


extern __attribute__((visibility("default"))) PRIntn
PL_CompareStrings(const void *v1, const void *v2);


extern __attribute__((visibility("default"))) PRIntn
PL_CompareValues(const void *v1, const void *v2);


extern __attribute__((visibility("default"))) PLHashEntry **
PL_HashTableRawLookup(PLHashTable *ht, PLHashNumber keyHash, const void *key);

extern __attribute__((visibility("default"))) PLHashEntry **
PL_HashTableRawLookupConst(PLHashTable *ht, PLHashNumber keyHash,
                           const void *key);

extern __attribute__((visibility("default"))) PLHashEntry *
PL_HashTableRawAdd(PLHashTable *ht, PLHashEntry **hep, PLHashNumber keyHash,
                   const void *key, void *value);

extern __attribute__((visibility("default"))) void
PL_HashTableRawRemove(PLHashTable *ht, PLHashEntry **hep, PLHashEntry *he);


extern __attribute__((visibility("default"))) PRIntn
PL_HashTableDump(PLHashTable *ht, PLHashEnumerator dump, FILE *fp);

}
# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsString.h" 2
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringGlue.h" 2
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayIterator.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayIterator.h"
namespace mozilla {
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayIterator.h"
template<class Element, class ArrayType>
class ArrayIterator
{
public:
  typedef ArrayType array_type;
  typedef ArrayIterator<Element, ArrayType> iterator_type;
  typedef typename array_type::index_type index_type;
  typedef typename RemoveReference<Element>::Type value_type;
  typedef ptrdiff_t difference_type;
  typedef value_type* pointer;
  typedef value_type& reference;
  typedef std::random_access_iterator_tag iterator_category;

private:
  const array_type* mArray;
  index_type mIndex;

public:
  ArrayIterator() : mArray(nullptr), mIndex(0) {}
  ArrayIterator(const iterator_type& aOther)
    : mArray(aOther.mArray), mIndex(aOther.mIndex) {}
  ArrayIterator(const array_type& aArray, index_type aIndex)
    : mArray(&aArray), mIndex(aIndex) {}

  iterator_type& operator=(const iterator_type& aOther) {
    mArray = aOther.mArray;
    mIndex = aOther.mIndex;
    return *this;
  }

  bool operator==(const iterator_type& aRhs) const {
    return mIndex == aRhs.mIndex;
  }
  bool operator!=(const iterator_type& aRhs) const {
    return !(*this == aRhs);
  }
  bool operator<(const iterator_type& aRhs) const {
    return mIndex < aRhs.mIndex;
  }
  bool operator>(const iterator_type& aRhs) const {
    return mIndex > aRhs.mIndex;
  }
  bool operator<=(const iterator_type& aRhs) const {
    return mIndex <= aRhs.mIndex;
  }
  bool operator>=(const iterator_type& aRhs) const {
    return mIndex >= aRhs.mIndex;
  }



  value_type* operator->() const {
    return const_cast<value_type*>(&mArray->ElementAt(mIndex));
  }
  Element operator*() const {
    return const_cast<Element>(mArray->ElementAt(mIndex));
  }

  iterator_type& operator++() {
    ++mIndex;
    return *this;
  }
  iterator_type operator++(int) {
    iterator_type it = *this;
    ++*this;
    return it;
  }
  iterator_type& operator--() {
    --mIndex;
    return *this;
  }
  iterator_type operator--(int) {
    iterator_type it = *this;
    --*this;
    return it;
  }

  iterator_type& operator+=(difference_type aDiff) {
    mIndex += aDiff;
    return *this;
  }
  iterator_type& operator-=(difference_type aDiff) {
    mIndex -= aDiff;
    return *this;
  }

  iterator_type operator+(difference_type aDiff) const {
    iterator_type it = *this;
    it += aDiff;
    return it;
  }
  iterator_type operator-(difference_type aDiff) const {
    iterator_type it = *this;
    it -= aDiff;
    return it;
  }

  difference_type operator-(const iterator_type& aOther) const {
    return static_cast<difference_type>(mIndex) -
      static_cast<difference_type>(aOther.mIndex);
  }

  Element operator[](difference_type aIndex) const {
    return *this->operator+(aIndex);
  }
};

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h" 2

namespace mozilla {
# 66 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BinarySearch.h"
template<typename Container, typename Comparator>
bool
BinarySearchIf(const Container& aContainer, size_t aBegin, size_t aEnd,
               const Comparator& aCompare, size_t* aMatchOrInsertionPoint)
{
  do { } while (0);

  size_t low = aBegin;
  size_t high = aEnd;
  while (high != low) {
    size_t middle = low + (high - low) / 2;



    const int result = aCompare(aContainer[middle]);

    if (result == 0) {
      *aMatchOrInsertionPoint = middle;
      return true;
    }

    if (result < 0) {
      high = middle;
    } else {
      low = middle + 1;
    }
  }

  *aMatchOrInsertionPoint = low;
  return false;
}

namespace detail {

template<class T>
class BinarySearchDefaultComparator
{
public:
  explicit BinarySearchDefaultComparator(const T& aTarget)
    : mTarget(aTarget)
  {}

  template <class U>
  int operator()(const U& aVal) const {
    if (mTarget == aVal) {
      return 0;
    }

    if (mTarget < aVal) {
      return -1;
    }

    return 1;
  }

private:
  const T& mTarget;
};

}

template <typename Container, typename T>
bool
BinarySearch(const Container& aContainer, size_t aBegin, size_t aEnd,
             T aTarget, size_t* aMatchOrInsertionPoint)
{
  return BinarySearchIf(aContainer, aBegin, aEnd,
                        detail::BinarySearchDefaultComparator<T>(aTarget),
                        aMatchOrInsertionPoint);
}

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsrootidl.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsrootidl.h"
typedef int64_t PRTime;



class nsAString;
class nsACString;
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 2
# 129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h"
struct nsID
{





  uint32_t m0;
  uint16_t m1;
  uint16_t m2;
  uint8_t m3[8];
# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h"
  void Clear();






  inline bool Equals(const nsID& aOther) const
  {

    return
      (((uint32_t*)&m0)[0] == ((uint32_t*)&aOther.m0)[0]) &&
      (((uint32_t*)&m0)[1] == ((uint32_t*)&aOther.m0)[1]) &&
      (((uint32_t*)&m0)[2] == ((uint32_t*)&aOther.m0)[2]) &&
      (((uint32_t*)&m0)[3] == ((uint32_t*)&aOther.m0)[3]);
  }

  inline bool operator==(const nsID& aOther) const
  {
    return Equals(aOther);
  }





  bool Parse(const char* aIDStr);







  char* ToString() const;






  void ToProvidedString(char (&aDest)[39]) const;




};
# 96 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h"
class nsIDToCString
{
public:
  explicit nsIDToCString(const nsID& aID)
  {
    aID.ToProvidedString(mStringBytes);
  }

  const char *get() const
  {
    return mStringBytes;
  }

protected:
  char mStringBytes[39];
};






typedef nsID nsCID;
# 134 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsID.h"
typedef nsID nsIID;
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h" 2
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h"
class nsISupports
{
public:

  template<typename T, typename U> struct COMTypeInfo;
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h"
  virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) = 0;







  virtual MozExternalRefCountType AddRef(void) = 0;
# 76 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsBase.h"
  virtual MozExternalRefCountType Release(void) = 0;


};

template<typename T> struct nsISupports::COMTypeInfo<nsISupports, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISupports::COMTypeInfo<nsISupports, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x00000000, 0x0000, 0x0000, {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46} };
# 130 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" 1
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h"
extern "C" {





typedef PRUint32 PRIntervalTime;
# 79 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h"
extern __attribute__((visibility("default"))) PRIntervalTime PR_IntervalNow(void);
# 97 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h"
extern __attribute__((visibility("default"))) PRUint32 PR_TicksPerSecond(void);
# 116 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h"
extern __attribute__((visibility("default"))) PRIntervalTime PR_SecondsToInterval(PRUint32 seconds);
extern __attribute__((visibility("default"))) PRIntervalTime PR_MillisecondsToInterval(PRUint32 milli);
extern __attribute__((visibility("default"))) PRIntervalTime PR_MicrosecondsToInterval(PRUint32 micro);
# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prinrval.h"
extern __attribute__((visibility("default"))) PRUint32 PR_IntervalToSeconds(PRIntervalTime ticks);
extern __attribute__((visibility("default"))) PRUint32 PR_IntervalToMilliseconds(PRIntervalTime ticks);
extern __attribute__((visibility("default"))) PRUint32 PR_IntervalToMicroseconds(PRIntervalTime ticks);

}
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h" 2

extern "C" {

typedef struct PRThread PRThread;
typedef struct PRThreadStack PRThreadStack;

typedef enum PRThreadType {
    PR_USER_THREAD,
    PR_SYSTEM_THREAD
} PRThreadType;

typedef enum PRThreadScope {
    PR_LOCAL_THREAD,
    PR_GLOBAL_THREAD,
    PR_GLOBAL_BOUND_THREAD
} PRThreadScope;

typedef enum PRThreadState {
    PR_JOINABLE_THREAD,
    PR_UNJOINABLE_THREAD
} PRThreadState;

typedef enum PRThreadPriority
{
    PR_PRIORITY_FIRST = 0,
    PR_PRIORITY_LOW = 0,
    PR_PRIORITY_NORMAL = 1,
    PR_PRIORITY_HIGH = 2,
    PR_PRIORITY_URGENT = 3,
    PR_PRIORITY_LAST = 3
} PRThreadPriority;
# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
extern __attribute__((visibility("default"))) PRThread* PR_CreateThread(PRThreadType type,
                     void ( *start)(void *arg),
                     void *arg,
                     PRThreadPriority priority,
                     PRThreadScope scope,
                     PRThreadState state,
                     PRUint32 stackSize);
# 126 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
extern __attribute__((visibility("default"))) PRStatus PR_JoinThread(PRThread *thread);





extern __attribute__((visibility("default"))) PRThread* PR_GetCurrentThread(void);







extern __attribute__((visibility("default"))) PRThreadPriority PR_GetThreadPriority(const PRThread *thread);
# 152 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
extern __attribute__((visibility("default"))) void PR_SetThreadPriority(PRThread *thread, PRThreadPriority priority);





extern __attribute__((visibility("default"))) PRStatus PR_SetCurrentThreadName(const char *name);




extern __attribute__((visibility("default"))) const char * PR_GetThreadName(const PRThread *thread);
# 189 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
typedef void ( *PRThreadPrivateDTOR)(void *priv);

extern __attribute__((visibility("default"))) PRStatus PR_NewThreadPrivateIndex(
    PRUintn *newIndex, PRThreadPrivateDTOR destructor);
# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
extern __attribute__((visibility("default"))) PRStatus PR_SetThreadPrivate(PRUintn tpdIndex, void *priv);
# 216 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
extern __attribute__((visibility("default"))) void* PR_GetThreadPrivate(PRUintn tpdIndex);
# 228 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
extern __attribute__((visibility("default"))) PRStatus PR_Interrupt(PRThread *thread);





extern __attribute__((visibility("default"))) void PR_ClearInterrupt(void);




extern __attribute__((visibility("default"))) void PR_BlockInterrupt(void);




extern __attribute__((visibility("default"))) void PR_UnblockInterrupt(void);
# 253 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prthread.h"
extern __attribute__((visibility("default"))) PRStatus PR_Sleep(PRIntervalTime ticks);




extern __attribute__((visibility("default"))) PRThreadScope PR_GetThreadScope(const PRThread *thread);




extern __attribute__((visibility("default"))) PRThreadType PR_GetThreadType(const PRThread *thread);




extern __attribute__((visibility("default"))) PRThreadState PR_GetThreadState(const PRThread *thread);

}
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 2
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MacroForEach.h" 1
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h" 2







inline nsISupports*
ToSupports(nsISupports* aSupports)
{
  return aSupports;
}

inline nsISupports*
ToCanonicalSupports(nsISupports* aSupports)
{
  return nullptr;
}
# 174 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h"
class nsCycleCollectingAutoRefCnt
{
public:
  nsCycleCollectingAutoRefCnt() : mRefCntAndFlags(0) {}

  explicit nsCycleCollectingAutoRefCnt(uintptr_t aValue)
    : mRefCntAndFlags(aValue << 2)
  {
  }

  nsCycleCollectingAutoRefCnt(const nsCycleCollectingAutoRefCnt&) = delete;
  void operator=(const nsCycleCollectingAutoRefCnt&) = delete;

  __attribute__((always_inline)) inline uintptr_t incr(nsISupports* aOwner)
  {
    return incr(aOwner, nullptr);
  }

  __attribute__((always_inline)) inline uintptr_t incr(void* aOwner,
                                   nsCycleCollectionParticipant* aCp)
  {
    mRefCntAndFlags += (1 << 2);
    mRefCntAndFlags &= ~(1 << 1);


    if (!IsInPurpleBuffer()) {
      mRefCntAndFlags |= (1 << 0);

      do { } while (0);
      NS_CycleCollectorSuspect3(aOwner, aCp, this, nullptr);
    }
    return (mRefCntAndFlags >> 2);
  }

  __attribute__((always_inline)) inline void stabilizeForDeletion()
  {


    mRefCntAndFlags = (1 << 2) | (1 << 0);
  }

  __attribute__((always_inline)) inline uintptr_t decr(nsISupports* aOwner,
                                   bool* aShouldDelete = nullptr)
  {
    return decr(aOwner, nullptr, aShouldDelete);
  }

  __attribute__((always_inline)) inline uintptr_t decr(void* aOwner,
                                   nsCycleCollectionParticipant* aCp,
                                   bool* aShouldDelete = nullptr)
  {
    do { } while (0);
    if (!IsInPurpleBuffer()) {
      mRefCntAndFlags -= (1 << 2);
      mRefCntAndFlags |= ((1 << 0) | (1 << 1));
      uintptr_t retval = (mRefCntAndFlags >> 2);

      NS_CycleCollectorSuspect3(aOwner, aCp, this, aShouldDelete);
      return retval;
    }
    mRefCntAndFlags -= (1 << 2);
    mRefCntAndFlags |= ((1 << 0) | (1 << 1));
    return (mRefCntAndFlags >> 2);
  }

  __attribute__((always_inline)) inline void RemovePurple()
  {
    do { } while (0);
    mRefCntAndFlags &= ~(1 << 1);
  }

  __attribute__((always_inline)) inline void RemoveFromPurpleBuffer()
  {
    do { } while (0);
    mRefCntAndFlags &= ~((1 << 1) | (1 << 0));
  }

  __attribute__((always_inline)) inline bool IsPurple() const
  {
    return !!(mRefCntAndFlags & (1 << 1));
  }

  __attribute__((always_inline)) inline bool IsInPurpleBuffer() const
  {
    return !!(mRefCntAndFlags & (1 << 0));
  }

  __attribute__((always_inline)) inline nsrefcnt get() const
  {
    return (mRefCntAndFlags >> 2);
  }

  __attribute__((always_inline)) inline operator nsrefcnt() const
  {
    return get();
  }

private:
  uintptr_t mRefCntAndFlags;
};

class nsAutoRefCnt
{
public:
  nsAutoRefCnt() : mValue(0) {}
  explicit nsAutoRefCnt(nsrefcnt aValue) : mValue(aValue) {}

  nsAutoRefCnt(const nsAutoRefCnt&) = delete;
  void operator=(const nsAutoRefCnt&) = delete;


  nsrefcnt operator++() { return ++mValue; }
  nsrefcnt operator--() { return --mValue; }

  nsrefcnt operator=(nsrefcnt aValue) { return (mValue = aValue); }
  operator nsrefcnt() const { return mValue; }
  nsrefcnt get() const { return mValue; }

  static const bool isThreadSafe = false;
private:
  nsrefcnt operator++(int) = delete;
  nsrefcnt operator--(int) = delete;
  nsrefcnt mValue;
};

namespace mozilla {
class ThreadSafeAutoRefCnt
{
public:
  ThreadSafeAutoRefCnt() : mValue(0) {}
  explicit ThreadSafeAutoRefCnt(nsrefcnt aValue) : mValue(aValue) {}

  ThreadSafeAutoRefCnt(const ThreadSafeAutoRefCnt&) = delete;
  void operator=(const ThreadSafeAutoRefCnt&) = delete;


  __attribute__((always_inline)) inline nsrefcnt operator++()
  {
# 320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h"
    return mValue.fetch_add(1, std::memory_order_relaxed) + 1;
  }
  __attribute__((always_inline)) inline nsrefcnt operator--()
  {




    nsrefcnt result = mValue.fetch_sub(1, std::memory_order_release) - 1;
    if (result == 0) {




      result = mValue.load(std::memory_order_acquire);
    }
    return result;
  }

  __attribute__((always_inline)) inline nsrefcnt operator=(nsrefcnt aValue)
  {


    mValue.store(aValue, std::memory_order_release);
    return aValue;
  }
  __attribute__((always_inline)) inline operator nsrefcnt() const { return get(); }
  __attribute__((always_inline)) inline nsrefcnt get() const
  {


    return mValue.load(std::memory_order_acquire);
  }

  static const bool isThreadSafe = true;
private:
  nsrefcnt operator++(int) = delete;
  nsrefcnt operator--(int) = delete;
  std::atomic<nsrefcnt> mValue;
};
}
# 759 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsImpl.h"
struct QITableEntry
{
  const nsIID* iid;
  int32_t offset;
};

nsresult
NS_TableDrivenQI(void* aThis, const nsIID& aIID,
                 void** aInstancePtr, const QITableEntry* aEntries);
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h" 2
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h"
template<class T>
inline void
ns_if_addref(T aExpr)
{
  if (aExpr) {
    aExpr->AddRef();
  }
}
# 121 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsUtils.h"
template<class T, class DestinationType>
inline nsresult
CallQueryInterface(T* aSource, DestinationType** aDestination)
{


  static_assert(!mozilla::IsSame<T, DestinationType>::value ||
                mozilla::IsSame<DestinationType, nsISupports>::value,
                "don't use CallQueryInterface for compile-time-determinable casts");

  do { } while(0);
  do { } while(0);

  return aSource->QueryInterface((DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                                 reinterpret_cast<void**>(aDestination));
}

template <class SourceType, class DestinationType>
inline nsresult
CallQueryInterface(RefPtr<SourceType>& aSourcePtr, DestinationType** aDestPtr)
{
  return CallQueryInterface(aSourcePtr.get(), aDestPtr);
}
# 131 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupports.h" 2
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionTraversalCallback.h" 2

class nsCycleCollectionParticipant;

class nsCycleCollectionTraversalCallback
{
public:




  virtual void DescribeRefCountedNode(nsrefcnt aRefcount,
                                           const char* aObjName) = 0;

  virtual void DescribeGCedNode(bool aIsMarked,
                                     const char* aObjName,
                                     uint64_t aCompartmentAddress = 0) = 0;

  virtual void NoteXPCOMChild(nsISupports* aChild) = 0;
  virtual void NoteJSChild(const JS::GCCellPtr& aThing) = 0;
  virtual void NoteNativeChild(void* aChild,
                                    nsCycleCollectionParticipant* aHelper) = 0;





  virtual void NoteNextEdgeName(const char* aName) = 0;

  enum
  {




    WANT_DEBUG_INFO = (1 << 0),



    WANT_ALL_TRACES = (1 << 1)
  };
  uint32_t Flags() const { return mFlags; }
  bool WantDebugInfo() const { return (mFlags & WANT_DEBUG_INFO) != 0; }
  bool WantAllTraces() const { return (mFlags & WANT_ALL_TRACES) != 0; }
protected:
  nsCycleCollectionTraversalCallback() : mFlags(0) {}

  uint32_t mFlags;
};
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h" 2



enum
{
  CycleCollectionEdgeNameArrayFlag = 1
};


void
CycleCollectionNoteEdgeNameImpl(nsCycleCollectionTraversalCallback& aCallback,
                                const char* aName,
                                uint32_t aFlags = 0);


__attribute__((always_inline)) inline void
CycleCollectionNoteEdgeName(nsCycleCollectionTraversalCallback& aCallback,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  if ((__builtin_expect(!!(aCallback.WantDebugInfo()), 0))) {
    CycleCollectionNoteEdgeNameImpl(aCallback, aName, aFlags);
  }
}
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionNoteChild.h"
template<typename T>
nsISupports*
ToSupports(T* aPtr, typename T::cycleCollection* aDummy = 0)
{
  return T::cycleCollection::Upcast(aPtr);
}



template<typename T,
         bool IsXPCOM = mozilla::IsBaseOf<nsISupports, T>::value>
struct CycleCollectionNoteChildImpl
{
};

template<typename T>
struct CycleCollectionNoteChildImpl<T, true>
{
  static void Run(nsCycleCollectionTraversalCallback& aCallback, T* aChild)
  {
    aCallback.NoteXPCOMChild(ToSupports(aChild));
  }
};

template<typename T>
struct CycleCollectionNoteChildImpl<T, false>
{
  static void Run(nsCycleCollectionTraversalCallback& aCallback, T* aChild)
  {
    aCallback.NoteNativeChild(aChild, T::cycleCollection::GetParticipant());
  }
};




template<typename T>
inline void
CycleCollectionNoteChild(nsCycleCollectionTraversalCallback& aCallback,
                         T* aChild, const char* aName, uint32_t aFlags)
{
  CycleCollectionNoteEdgeName(aCallback, aName, aFlags);
  CycleCollectionNoteChildImpl<T>::Run(aCallback, aChild);
}

template<typename T>
inline void
CycleCollectionNoteChild(nsCycleCollectionTraversalCallback& aCallback,
                         T* aChild, const char* aName)
{
  CycleCollectionNoteChild(aCallback, aChild, aName, 0);
}
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQuickSort.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQuickSort.h"
extern "C" {
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQuickSort.h"
void NS_QuickSort(void*, unsigned int, unsigned int,
                  int (*)(const void*, const void*, void*),
                  void*);


}
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegionFwd.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegionFwd.h"
namespace mozilla {
namespace gfx {

struct UnknownUnits;

template <class units>
class IntRegionTyped;

typedef IntRegionTyped<UnknownUnits> IntRegion;

}
}

typedef mozilla::gfx::IntRegion nsIntRegion;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 1 3
# 47 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3






# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3






#pragma GCC visibility push(default)

extern "C++" {

namespace __cxxabiv1
{
  class __class_type_info;
}
# 80 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3
namespace std
{






  class type_info
  {
  public:




    virtual ~type_info();



    const char* name() const noexcept
    { return __name[0] == '*' ? __name + 1 : __name; }
# 115 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3
    bool before(const type_info& __arg) const noexcept
    { return (__name[0] == '*' && __arg.__name[0] == '*')
 ? __name < __arg.__name
 : __builtin_strcmp (__name, __arg.__name) < 0; }

    bool operator==(const type_info& __arg) const noexcept
    {
      return ((__name == __arg.__name)
       || (__name[0] != '*' &&
    __builtin_strcmp (__name, __arg.__name) == 0));
    }
# 136 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/typeinfo" 3
    bool operator!=(const type_info& __arg) const noexcept
    { return !operator==(__arg); }


    size_t hash_code() const noexcept
    {

      return _Hash_bytes(name(), __builtin_strlen(name()),
    static_cast<size_t>(0xc70f6907UL));



    }



    virtual bool __is_pointer_p() const;


    virtual bool __is_function_p() const;







    virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj,
       unsigned __outer) const;


    virtual bool __do_upcast(const __cxxabiv1::__class_type_info *__target,
        void **__obj_ptr) const;

  protected:
    const char *__name;

    explicit type_info(const char *__n): __name(__n) { }

  private:

    type_info& operator=(const type_info&);
    type_info(const type_info&);
  };







  class bad_cast : public exception
  {
  public:
    bad_cast() noexcept { }



    virtual ~bad_cast() noexcept;


    virtual const char* what() const noexcept;
  };





  class bad_typeid : public exception
  {
  public:
    bad_typeid () noexcept { }



    virtual ~bad_typeid() noexcept;


    virtual const char* what() const noexcept;
  };
}

}

#pragma GCC visibility pop
# 54 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 1 3
# 33 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 3







# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uses_allocator.h" 1 3
# 35 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/uses_allocator.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  struct __erased_type { };

  template<typename _Alloc, typename _Tp>
    using __is_erased_or_convertible
      = __or_<is_same<_Tp, __erased_type>, is_convertible<_Alloc, _Tp>>;


  struct allocator_arg_t { explicit allocator_arg_t() = default; };

  constexpr allocator_arg_t allocator_arg = allocator_arg_t();

  template<typename _Tp, typename _Alloc, typename = __void_t<>>
    struct __uses_allocator_helper
    : false_type { };

  template<typename _Tp, typename _Alloc>
    struct __uses_allocator_helper<_Tp, _Alloc,
       __void_t<typename _Tp::allocator_type>>
    : __is_erased_or_convertible<_Alloc, typename _Tp::allocator_type>::type
    { };


  template<typename _Tp, typename _Alloc>
    struct uses_allocator
    : __uses_allocator_helper<_Tp, _Alloc>::type
    { };

  struct __uses_alloc_base { };

  struct __uses_alloc0 : __uses_alloc_base
  {
    struct _Sink { void operator=(const void*) { } } _M_a;
  };

  template<typename _Alloc>
    struct __uses_alloc1 : __uses_alloc_base { const _Alloc* _M_a; };

  template<typename _Alloc>
    struct __uses_alloc2 : __uses_alloc_base { const _Alloc* _M_a; };

  template<bool, typename _Tp, typename _Alloc, typename... _Args>
    struct __uses_alloc;

  template<typename _Tp, typename _Alloc, typename... _Args>
    struct __uses_alloc<true, _Tp, _Alloc, _Args...>
    : conditional<
        is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value,
        __uses_alloc1<_Alloc>,
        __uses_alloc2<_Alloc>>::type
    {
      static_assert(__or_<
   is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>,
   is_constructible<_Tp, _Args..., _Alloc>>::value, "construction with"
   " an allocator must be possible if uses_allocator is true");
    };

  template<typename _Tp, typename _Alloc, typename... _Args>
    struct __uses_alloc<false, _Tp, _Alloc, _Args...>
    : __uses_alloc0 { };

  template<typename _Tp, typename _Alloc, typename... _Args>
    using __uses_alloc_t =
      __uses_alloc<uses_allocator<_Tp, _Alloc>::value, _Tp, _Alloc, _Args...>;

  template<typename _Tp, typename _Alloc, typename... _Args>
    inline __uses_alloc_t<_Tp, _Alloc, _Args...>
    __use_alloc(const _Alloc& __a)
    {
      __uses_alloc_t<_Tp, _Alloc, _Args...> __ret;
      __ret._M_a = std::__addressof(__a);
      return __ret;
    }


}
# 41 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 2 3

namespace std __attribute__ ((__visibility__ ("default")))
{







  template<std::size_t _Idx, typename _Head, bool _IsEmptyNotFinal>
    struct _Head_base;

  template<std::size_t _Idx, typename _Head>
    struct _Head_base<_Idx, _Head, true>
    : public _Head
    {
      constexpr _Head_base()
      : _Head() { }

      constexpr _Head_base(const _Head& __h)
      : _Head(__h) { }

      constexpr _Head_base(const _Head_base&) = default;
      constexpr _Head_base(_Head_base&&) = default;

      template<typename _UHead>
        constexpr _Head_base(_UHead&& __h)
 : _Head(std::forward<_UHead>(__h)) { }

      _Head_base(allocator_arg_t, __uses_alloc0)
      : _Head() { }

      template<typename _Alloc>
 _Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a)
 : _Head(allocator_arg, *__a._M_a) { }

      template<typename _Alloc>
 _Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a)
 : _Head(*__a._M_a) { }

      template<typename _UHead>
 _Head_base(__uses_alloc0, _UHead&& __uhead)
 : _Head(std::forward<_UHead>(__uhead)) { }

      template<typename _Alloc, typename _UHead>
 _Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead)
 : _Head(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead)) { }

      template<typename _Alloc, typename _UHead>
 _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead)
 : _Head(std::forward<_UHead>(__uhead), *__a._M_a) { }

      static constexpr _Head&
      _M_head(_Head_base& __b) noexcept { return __b; }

      static constexpr const _Head&
      _M_head(const _Head_base& __b) noexcept { return __b; }
    };

  template<std::size_t _Idx, typename _Head>
    struct _Head_base<_Idx, _Head, false>
    {
      constexpr _Head_base()
      : _M_head_impl() { }

      constexpr _Head_base(const _Head& __h)
      : _M_head_impl(__h) { }

      constexpr _Head_base(const _Head_base&) = default;
      constexpr _Head_base(_Head_base&&) = default;

      template<typename _UHead>
        constexpr _Head_base(_UHead&& __h)
 : _M_head_impl(std::forward<_UHead>(__h)) { }

      _Head_base(allocator_arg_t, __uses_alloc0)
      : _M_head_impl() { }

      template<typename _Alloc>
 _Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a)
 : _M_head_impl(allocator_arg, *__a._M_a) { }

      template<typename _Alloc>
 _Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a)
 : _M_head_impl(*__a._M_a) { }

      template<typename _UHead>
 _Head_base(__uses_alloc0, _UHead&& __uhead)
 : _M_head_impl(std::forward<_UHead>(__uhead)) { }

      template<typename _Alloc, typename _UHead>
 _Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead)
 : _M_head_impl(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead))
 { }

      template<typename _Alloc, typename _UHead>
 _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead)
 : _M_head_impl(std::forward<_UHead>(__uhead), *__a._M_a) { }

      static constexpr _Head&
      _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; }

      static constexpr const _Head&
      _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; }

      _Head _M_head_impl;
    };
# 158 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/tuple" 3
  template<std::size_t _Idx, typename... _Elements>
    struct _Tuple_impl;

  template<typename _Tp>
    struct __is_empty_non_tuple : is_empty<_Tp> { };


  template<typename _El0, typename... _El>
    struct __is_empty_non_tuple<tuple<_El0, _El...>> : false_type { };


  template<typename _Tp>
    using __empty_not_final
    = typename conditional<__is_final(_Tp), false_type,
      __is_empty_non_tuple<_Tp>>::type;






  template<std::size_t _Idx, typename _Head, typename... _Tail>
    struct _Tuple_impl<_Idx, _Head, _Tail...>
    : public _Tuple_impl<_Idx + 1, _Tail...>,
      private _Head_base<_Idx, _Head, __empty_not_final<_Head>::value>
    {
      template<std::size_t, typename...> friend class _Tuple_impl;

      typedef _Tuple_impl<_Idx + 1, _Tail...> _Inherited;
      typedef _Head_base<_Idx, _Head, __empty_not_final<_Head>::value> _Base;

      static constexpr _Head&
      _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }

      static constexpr const _Head&
      _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }

      static constexpr _Inherited&
      _M_tail(_Tuple_impl& __t) noexcept { return __t; }

      static constexpr const _Inherited&
      _M_tail(const _Tuple_impl& __t) noexcept { return __t; }

      constexpr _Tuple_impl()
      : _Inherited(), _Base() { }

      explicit
      constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail)
      : _Inherited(__tail...), _Base(__head) { }

      template<typename _UHead, typename... _UTail, typename = typename
               enable_if<sizeof...(_Tail) == sizeof...(_UTail)>::type>
        explicit
        constexpr _Tuple_impl(_UHead&& __head, _UTail&&... __tail)
 : _Inherited(std::forward<_UTail>(__tail)...),
   _Base(std::forward<_UHead>(__head)) { }

      constexpr _Tuple_impl(const _Tuple_impl&) = default;

      constexpr
      _Tuple_impl(_Tuple_impl&& __in)
      noexcept(__and_<is_nothrow_move_constructible<_Head>,
               is_nothrow_move_constructible<_Inherited>>::value)
      : _Inherited(std::move(_M_tail(__in))),
 _Base(std::forward<_Head>(_M_head(__in))) { }

      template<typename... _UElements>
        constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UElements...>& __in)
 : _Inherited(_Tuple_impl<_Idx, _UElements...>::_M_tail(__in)),
   _Base(_Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { }

      template<typename _UHead, typename... _UTails>
        constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
 : _Inherited(std::move
       (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))),
   _Base(std::forward<_UHead>
  (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { }

      template<typename _Alloc>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a)
 : _Inherited(__tag, __a),
          _Base(__tag, __use_alloc<_Head>(__a)) { }

      template<typename _Alloc>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
      const _Head& __head, const _Tail&... __tail)
 : _Inherited(__tag, __a, __tail...),
          _Base(__use_alloc<_Head, _Alloc, _Head>(__a), __head) { }

      template<typename _Alloc, typename _UHead, typename... _UTail,
               typename = typename enable_if<sizeof...(_Tail)
          == sizeof...(_UTail)>::type>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             _UHead&& __head, _UTail&&... __tail)
 : _Inherited(__tag, __a, std::forward<_UTail>(__tail)...),
          _Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
         std::forward<_UHead>(__head)) { }

      template<typename _Alloc>
        _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             const _Tuple_impl& __in)
 : _Inherited(__tag, __a, _M_tail(__in)),
          _Base(__use_alloc<_Head, _Alloc, _Head>(__a), _M_head(__in)) { }

      template<typename _Alloc>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             _Tuple_impl&& __in)
 : _Inherited(__tag, __a, std::move(_M_tail(__in))),
   _Base(__use_alloc<_Head, _Alloc, _Head>(__a),
         std::forward<_Head>(_M_head(__in))) { }

      template<typename _Alloc, typename... _UElements>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             const _Tuple_impl<_Idx, _UElements...>& __in)
 : _Inherited(__tag, __a,
       _Tuple_impl<_Idx, _UElements...>::_M_tail(__in)),
   _Base(__use_alloc<_Head, _Alloc, _Head>(__a),
  _Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { }

      template<typename _Alloc, typename _UHead, typename... _UTails>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             _Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
 : _Inherited(__tag, __a, std::move
       (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))),
   _Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
                std::forward<_UHead>
  (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { }

      _Tuple_impl&
      operator=(const _Tuple_impl& __in)
      {
 _M_head(*this) = _M_head(__in);
 _M_tail(*this) = _M_tail(__in);
 return *this;
      }

      _Tuple_impl&
      operator=(_Tuple_impl&& __in)
      noexcept(__and_<is_nothrow_move_assignable<_Head>,
               is_nothrow_move_assignable<_Inherited>>::value)
      {
 _M_head(*this) = std::forward<_Head>(_M_head(__in));
 _M_tail(*this) = std::move(_M_tail(__in));
 return *this;
      }

      template<typename... _UElements>
        _Tuple_impl&
        operator=(const _Tuple_impl<_Idx, _UElements...>& __in)
        {
   _M_head(*this) = _Tuple_impl<_Idx, _UElements...>::_M_head(__in);
   _M_tail(*this) = _Tuple_impl<_Idx, _UElements...>::_M_tail(__in);
   return *this;
 }

      template<typename _UHead, typename... _UTails>
        _Tuple_impl&
        operator=(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
        {
   _M_head(*this) = std::forward<_UHead>
     (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in));
   _M_tail(*this) = std::move
     (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in));
   return *this;
 }

    protected:
      void
      _M_swap(_Tuple_impl& __in)
      noexcept(__is_nothrow_swappable<_Head>::value
               && noexcept(_M_tail(__in)._M_swap(_M_tail(__in))))
      {
 using std::swap;
 swap(_M_head(*this), _M_head(__in));
 _Inherited::_M_swap(_M_tail(__in));
      }
    };


  template<std::size_t _Idx, typename _Head>
    struct _Tuple_impl<_Idx, _Head>
    : private _Head_base<_Idx, _Head, __empty_not_final<_Head>::value>
    {
      template<std::size_t, typename...> friend class _Tuple_impl;

      typedef _Head_base<_Idx, _Head, __empty_not_final<_Head>::value> _Base;

      static constexpr _Head&
      _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }

      static constexpr const _Head&
      _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); }

      constexpr _Tuple_impl()
      : _Base() { }

      explicit
      constexpr _Tuple_impl(const _Head& __head)
      : _Base(__head) { }

      template<typename _UHead>
        explicit
        constexpr _Tuple_impl(_UHead&& __head)
 : _Base(std::forward<_UHead>(__head)) { }

      constexpr _Tuple_impl(const _Tuple_impl&) = default;

      constexpr
      _Tuple_impl(_Tuple_impl&& __in)
      noexcept(is_nothrow_move_constructible<_Head>::value)
      : _Base(std::forward<_Head>(_M_head(__in))) { }

      template<typename _UHead>
        constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UHead>& __in)
 : _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in)) { }

      template<typename _UHead>
        constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead>&& __in)
 : _Base(std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
 { }

      template<typename _Alloc>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a)
 : _Base(__tag, __use_alloc<_Head>(__a)) { }

      template<typename _Alloc>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
      const _Head& __head)
 : _Base(__use_alloc<_Head, _Alloc, _Head>(__a), __head) { }

      template<typename _Alloc, typename _UHead>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             _UHead&& __head)
 : _Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
         std::forward<_UHead>(__head)) { }

      template<typename _Alloc>
        _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             const _Tuple_impl& __in)
 : _Base(__use_alloc<_Head, _Alloc, _Head>(__a), _M_head(__in)) { }

      template<typename _Alloc>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             _Tuple_impl&& __in)
 : _Base(__use_alloc<_Head, _Alloc, _Head>(__a),
         std::forward<_Head>(_M_head(__in))) { }

      template<typename _Alloc, typename _UHead>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             const _Tuple_impl<_Idx, _UHead>& __in)
 : _Base(__use_alloc<_Head, _Alloc, _Head>(__a),
  _Tuple_impl<_Idx, _UHead>::_M_head(__in)) { }

      template<typename _Alloc, typename _UHead>
 _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a,
             _Tuple_impl<_Idx, _UHead>&& __in)
 : _Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
                std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
 { }

      _Tuple_impl&
      operator=(const _Tuple_impl& __in)
      {
 _M_head(*this) = _M_head(__in);
 return *this;
      }

      _Tuple_impl&
      operator=(_Tuple_impl&& __in)
      noexcept(is_nothrow_move_assignable<_Head>::value)
      {
 _M_head(*this) = std::forward<_Head>(_M_head(__in));
 return *this;
      }

      template<typename _UHead>
        _Tuple_impl&
        operator=(const _Tuple_impl<_Idx, _UHead>& __in)
        {
   _M_head(*this) = _Tuple_impl<_Idx, _UHead>::_M_head(__in);
   return *this;
 }

      template<typename _UHead>
        _Tuple_impl&
        operator=(_Tuple_impl<_Idx, _UHead>&& __in)
        {
   _M_head(*this)
     = std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in));
   return *this;
 }

    protected:
      void
      _M_swap(_Tuple_impl& __in)
      noexcept(__is_nothrow_swappable<_Head>::value)
      {
 using std::swap;
 swap(_M_head(*this), _M_head(__in));
      }
    };

  template<typename... _Elements>
    class tuple;



  template<bool, typename... _Elements>
  struct _TC
  {
    template<typename... _UElements>
    static constexpr bool _ConstructibleTuple()
    {
      return __and_<is_constructible<_Elements, const _UElements&>...>::value;
    }

    template<typename... _UElements>
    static constexpr bool _ImplicitlyConvertibleTuple()
    {
      return __and_<is_convertible<const _UElements&, _Elements>...>::value;
    }

    template<typename... _UElements>
    static constexpr bool _MoveConstructibleTuple()
    {
      return __and_<is_constructible<_Elements, _UElements&&>...>::value;
    }

    template<typename... _UElements>
    static constexpr bool _ImplicitlyMoveConvertibleTuple()
    {
      return __and_<is_convertible<_UElements&&, _Elements>...>::value;
    }

    template<typename _SrcTuple>
    static constexpr bool _NonNestedTuple()
    {
      return __and_<__not_<is_same<tuple<_Elements...>,
                                   typename remove_cv<
                                     typename remove_reference<_SrcTuple>::type
                                   >::type>>,
                     __not_<is_convertible<_SrcTuple, _Elements...>>,
                     __not_<is_constructible<_Elements..., _SrcTuple>>
              >::value;
    }
    template<typename... _UElements>
    static constexpr bool _NotSameTuple()
    {
      return __not_<is_same<tuple<_Elements...>,
        typename remove_const<
          typename remove_reference<_UElements...>::type
          >::type>>::value;
    }
  };

  template<typename... _Elements>
  struct _TC<false, _Elements...>
  {
    template<typename... _UElements>
    static constexpr bool _ConstructibleTuple()
    {
      return false;
    }

    template<typename... _UElements>
    static constexpr bool _ImplicitlyConvertibleTuple()
    {
      return false;
    }

    template<typename... _UElements>
    static constexpr bool _MoveConstructibleTuple()
    {
      return false;
    }

    template<typename... _UElements>
    static constexpr bool _ImplicitlyMoveConvertibleTuple()
    {
      return false;
    }

    template<typename... _UElements>
    static constexpr bool _NonNestedTuple()
    {
      return true;
    }
    template<typename... _UElements>
    static constexpr bool _NotSameTuple()
    {
      return true;
    }
  };


  template<typename... _Elements>
    class tuple : public _Tuple_impl<0, _Elements...>
    {
      typedef _Tuple_impl<0, _Elements...> _Inherited;



      template<typename _Dummy>
      struct _TC2
      {
        static constexpr bool _DefaultConstructibleTuple()
        {
          return __and_<is_default_constructible<_Elements>...>::value;
        }
        static constexpr bool _ImplicitlyDefaultConstructibleTuple()
        {
          return __and_<__is_implicitly_default_constructible<_Elements>...>
            ::value;
        }
      };

    public:
      template<typename _Dummy = void,
               typename enable_if<_TC2<_Dummy>::
                                    _ImplicitlyDefaultConstructibleTuple(),
                                  bool>::type = true>
      constexpr tuple()
      : _Inherited() { }

      template<typename _Dummy = void,
               typename enable_if<_TC2<_Dummy>::
                                    _DefaultConstructibleTuple()
                                  &&
                                  !_TC2<_Dummy>::
                                    _ImplicitlyDefaultConstructibleTuple(),
                                  bool>::type = false>
      explicit constexpr tuple()
      : _Inherited() { }



      template<typename _Dummy> using _TCC =
        _TC<is_same<_Dummy, void>::value,
            _Elements...>;

      template<typename _Dummy = void,
               typename enable_if<
                 _TCC<_Dummy>::template
                   _ConstructibleTuple<_Elements...>()
                 && _TCC<_Dummy>::template
                   _ImplicitlyConvertibleTuple<_Elements...>()
                 && (sizeof...(_Elements) >= 1),
               bool>::type=true>
        constexpr tuple(const _Elements&... __elements)
      : _Inherited(__elements...) { }

      template<typename _Dummy = void,
               typename enable_if<
                 _TCC<_Dummy>::template
                   _ConstructibleTuple<_Elements...>()
                 && !_TCC<_Dummy>::template
                   _ImplicitlyConvertibleTuple<_Elements...>()
                 && (sizeof...(_Elements) >= 1),
               bool>::type=false>
      explicit constexpr tuple(const _Elements&... __elements)
      : _Inherited(__elements...) { }



      template<typename... _UElements> using _TMC =
                  _TC<(sizeof...(_Elements) == sizeof...(_UElements)),
                      _Elements...>;

      template<typename... _UElements, typename
        enable_if<
    _TC<sizeof...(_UElements) == 1, _Elements...>::template
      _NotSameTuple<_UElements...>()
    && _TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && _TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>()
                  && (sizeof...(_Elements) >= 1),
        bool>::type=true>
        constexpr tuple(_UElements&&... __elements)
        : _Inherited(std::forward<_UElements>(__elements)...) { }

      template<typename... _UElements, typename
        enable_if<
    _TC<sizeof...(_UElements) == 1, _Elements...>::template
      _NotSameTuple<_UElements...>()
    && _TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && !_TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>()
                  && (sizeof...(_Elements) >= 1),
        bool>::type=false>
        explicit constexpr tuple(_UElements&&... __elements)
 : _Inherited(std::forward<_UElements>(__elements)...) { }

      constexpr tuple(const tuple&) = default;

      constexpr tuple(tuple&&) = default;



      template<typename _Dummy> using _TNTC =
        _TC<is_same<_Dummy, void>::value && sizeof...(_Elements) == 1,
            _Elements...>;

      template<typename... _UElements, typename _Dummy = void, typename
        enable_if<_TMC<_UElements...>::template
                    _ConstructibleTuple<_UElements...>()
                  && _TMC<_UElements...>::template
                    _ImplicitlyConvertibleTuple<_UElements...>()
                  && _TNTC<_Dummy>::template
                    _NonNestedTuple<const tuple<_UElements...>&>(),
        bool>::type=true>
        constexpr tuple(const tuple<_UElements...>& __in)
        : _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
        { }

      template<typename... _UElements, typename _Dummy = void, typename
        enable_if<_TMC<_UElements...>::template
                    _ConstructibleTuple<_UElements...>()
                  && !_TMC<_UElements...>::template
                    _ImplicitlyConvertibleTuple<_UElements...>()
                  && _TNTC<_Dummy>::template
                    _NonNestedTuple<const tuple<_UElements...>&>(),
        bool>::type=false>
        explicit constexpr tuple(const tuple<_UElements...>& __in)
        : _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
        { }

      template<typename... _UElements, typename _Dummy = void, typename
        enable_if<_TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && _TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>()
                  && _TNTC<_Dummy>::template
                    _NonNestedTuple<tuple<_UElements...>&&>(),
        bool>::type=true>
        constexpr tuple(tuple<_UElements...>&& __in)
        : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { }

      template<typename... _UElements, typename _Dummy = void, typename
        enable_if<_TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && !_TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>()
                  && _TNTC<_Dummy>::template
                    _NonNestedTuple<tuple<_UElements...>&&>(),
        bool>::type=false>
        explicit constexpr tuple(tuple<_UElements...>&& __in)
        : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { }



      template<typename _Alloc>
 tuple(allocator_arg_t __tag, const _Alloc& __a)
 : _Inherited(__tag, __a) { }

      template<typename _Alloc, typename _Dummy = void,
               typename enable_if<
                 _TCC<_Dummy>::template
                   _ConstructibleTuple<_Elements...>()
                 && _TCC<_Dummy>::template
                   _ImplicitlyConvertibleTuple<_Elements...>(),
               bool>::type=true>
 tuple(allocator_arg_t __tag, const _Alloc& __a,
       const _Elements&... __elements)
 : _Inherited(__tag, __a, __elements...) { }

      template<typename _Alloc, typename _Dummy = void,
               typename enable_if<
                 _TCC<_Dummy>::template
                   _ConstructibleTuple<_Elements...>()
                 && !_TCC<_Dummy>::template
                   _ImplicitlyConvertibleTuple<_Elements...>(),
               bool>::type=false>
 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
                       const _Elements&... __elements)
 : _Inherited(__tag, __a, __elements...) { }

      template<typename _Alloc, typename... _UElements, typename
        enable_if<_TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && _TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>(),
        bool>::type=true>
 tuple(allocator_arg_t __tag, const _Alloc& __a,
       _UElements&&... __elements)
 : _Inherited(__tag, __a, std::forward<_UElements>(__elements)...)
        { }

      template<typename _Alloc, typename... _UElements, typename
        enable_if<_TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && !_TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>(),
        bool>::type=false>
 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
       _UElements&&... __elements)
 : _Inherited(__tag, __a, std::forward<_UElements>(__elements)...)
        { }

      template<typename _Alloc>
 tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
 : _Inherited(__tag, __a, static_cast<const _Inherited&>(__in)) { }

      template<typename _Alloc>
 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
 : _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }

      template<typename _Alloc, typename... _UElements, typename
        enable_if<_TMC<_UElements...>::template
                    _ConstructibleTuple<_UElements...>()
                  && _TMC<_UElements...>::template
                    _ImplicitlyConvertibleTuple<_UElements...>(),
        bool>::type=true>
 tuple(allocator_arg_t __tag, const _Alloc& __a,
       const tuple<_UElements...>& __in)
 : _Inherited(__tag, __a,
              static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
 { }

      template<typename _Alloc, typename... _UElements, typename
        enable_if<_TMC<_UElements...>::template
                    _ConstructibleTuple<_UElements...>()
                  && !_TMC<_UElements...>::template
                    _ImplicitlyConvertibleTuple<_UElements...>(),
        bool>::type=false>
 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
       const tuple<_UElements...>& __in)
 : _Inherited(__tag, __a,
              static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
 { }

      template<typename _Alloc, typename... _UElements, typename
        enable_if<_TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && _TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>(),
        bool>::type=true>
 tuple(allocator_arg_t __tag, const _Alloc& __a,
       tuple<_UElements...>&& __in)
 : _Inherited(__tag, __a,
              static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
 { }

      template<typename _Alloc, typename... _UElements, typename
        enable_if<_TMC<_UElements...>::template
                    _MoveConstructibleTuple<_UElements...>()
                  && !_TMC<_UElements...>::template
                    _ImplicitlyMoveConvertibleTuple<_UElements...>(),
        bool>::type=false>
 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
       tuple<_UElements...>&& __in)
 : _Inherited(__tag, __a,
              static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
 { }

      tuple&
      operator=(const tuple& __in)
      {
 static_cast<_Inherited&>(*this) = __in;
 return *this;
      }

      tuple&
      operator=(tuple&& __in)
      noexcept(is_nothrow_move_assignable<_Inherited>::value)
      {
 static_cast<_Inherited&>(*this) = std::move(__in);
 return *this;
      }

      template<typename... _UElements, typename = typename
        enable_if<sizeof...(_UElements)
    == sizeof...(_Elements)>::type>
        tuple&
        operator=(const tuple<_UElements...>& __in)
        {
   static_cast<_Inherited&>(*this) = __in;
   return *this;
 }

      template<typename... _UElements, typename = typename
        enable_if<sizeof...(_UElements)
    == sizeof...(_Elements)>::type>
        tuple&
        operator=(tuple<_UElements...>&& __in)
        {
   static_cast<_Inherited&>(*this) = std::move(__in);
   return *this;
 }

      void
      swap(tuple& __in)
      noexcept(noexcept(__in._M_swap(__in)))
      { _Inherited::_M_swap(__in); }
    };


  template<>
    class tuple<>
    {
    public:
      void swap(tuple&) noexcept { }
    };



  template<typename _T1, typename _T2>
    class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
    {
      typedef _Tuple_impl<0, _T1, _T2> _Inherited;

    public:
      template <typename _U1 = _T1,
                typename _U2 = _T2,
                typename enable_if<__and_<
                                     __is_implicitly_default_constructible<_U1>,
                                     __is_implicitly_default_constructible<_U2>>
                                   ::value, bool>::type = true>

      constexpr tuple()
      : _Inherited() { }

      template <typename _U1 = _T1,
                typename _U2 = _T2,
                typename enable_if<
                  __and_<
                    is_default_constructible<_U1>,
                    is_default_constructible<_U2>,
                    __not_<
                      __and_<__is_implicitly_default_constructible<_U1>,
                             __is_implicitly_default_constructible<_U2>>>>
                  ::value, bool>::type = false>

      explicit constexpr tuple()
      : _Inherited() { }



      template<typename _Dummy> using _TCC =
        _TC<is_same<_Dummy, void>::value, _T1, _T2>;

      template<typename _Dummy = void, typename
               enable_if<_TCC<_Dummy>::template
                           _ConstructibleTuple<_T1, _T2>()
                         && _TCC<_Dummy>::template
                           _ImplicitlyConvertibleTuple<_T1, _T2>(),
 bool>::type = true>
        constexpr tuple(const _T1& __a1, const _T2& __a2)
        : _Inherited(__a1, __a2) { }

      template<typename _Dummy = void, typename
               enable_if<_TCC<_Dummy>::template
                           _ConstructibleTuple<_T1, _T2>()
                         && !_TCC<_Dummy>::template
                           _ImplicitlyConvertibleTuple<_T1, _T2>(),
 bool>::type = false>
        explicit constexpr tuple(const _T1& __a1, const _T2& __a2)
        : _Inherited(__a1, __a2) { }



      using _TMC = _TC<true, _T1, _T2>;

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
        constexpr tuple(_U1&& __a1, _U2&& __a2)
 : _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
        explicit constexpr tuple(_U1&& __a1, _U2&& __a2)
 : _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { }

      constexpr tuple(const tuple&) = default;

      constexpr tuple(tuple&&) = default;

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
        constexpr tuple(const tuple<_U1, _U2>& __in)
 : _Inherited(static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
        explicit constexpr tuple(const tuple<_U1, _U2>& __in)
 : _Inherited(static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
        constexpr tuple(tuple<_U1, _U2>&& __in)
 : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
        explicit constexpr tuple(tuple<_U1, _U2>&& __in)
 : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
        constexpr tuple(const pair<_U1, _U2>& __in)
 : _Inherited(__in.first, __in.second) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
        explicit constexpr tuple(const pair<_U1, _U2>& __in)
 : _Inherited(__in.first, __in.second) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
        constexpr tuple(pair<_U1, _U2>&& __in)
 : _Inherited(std::forward<_U1>(__in.first),
       std::forward<_U2>(__in.second)) { }

      template<typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
        explicit constexpr tuple(pair<_U1, _U2>&& __in)
 : _Inherited(std::forward<_U1>(__in.first),
       std::forward<_U2>(__in.second)) { }



      template<typename _Alloc>
 tuple(allocator_arg_t __tag, const _Alloc& __a)
 : _Inherited(__tag, __a) { }

      template<typename _Alloc, typename _Dummy = void,
               typename enable_if<
                 _TCC<_Dummy>::template
                   _ConstructibleTuple<_T1, _T2>()
                 && _TCC<_Dummy>::template
                   _ImplicitlyConvertibleTuple<_T1, _T2>(),
               bool>::type=true>

 tuple(allocator_arg_t __tag, const _Alloc& __a,
       const _T1& __a1, const _T2& __a2)
 : _Inherited(__tag, __a, __a1, __a2) { }

      template<typename _Alloc, typename _Dummy = void,
               typename enable_if<
                 _TCC<_Dummy>::template
                   _ConstructibleTuple<_T1, _T2>()
                 && !_TCC<_Dummy>::template
                   _ImplicitlyConvertibleTuple<_T1, _T2>(),
               bool>::type=false>

 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
       const _T1& __a1, const _T2& __a2)
 : _Inherited(__tag, __a, __a1, __a2) { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
 tuple(allocator_arg_t __tag, const _Alloc& __a, _U1&& __a1, _U2&& __a2)
 : _Inherited(__tag, __a, std::forward<_U1>(__a1),
              std::forward<_U2>(__a2)) { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
                       _U1&& __a1, _U2&& __a2)
 : _Inherited(__tag, __a, std::forward<_U1>(__a1),
              std::forward<_U2>(__a2)) { }

      template<typename _Alloc>
 tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
 : _Inherited(__tag, __a, static_cast<const _Inherited&>(__in)) { }

      template<typename _Alloc>
 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
 : _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
 tuple(allocator_arg_t __tag, const _Alloc& __a,
       const tuple<_U1, _U2>& __in)
 : _Inherited(__tag, __a,
              static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
 { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
       const tuple<_U1, _U2>& __in)
 : _Inherited(__tag, __a,
              static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
 { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in)
 : _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
 { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
 explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
                       tuple<_U1, _U2>&& __in)
 : _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
 { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
        tuple(allocator_arg_t __tag, const _Alloc& __a,
       const pair<_U1, _U2>& __in)
 : _Inherited(__tag, __a, __in.first, __in.second) { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _ConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
        explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
       const pair<_U1, _U2>& __in)
 : _Inherited(__tag, __a, __in.first, __in.second) { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && _TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = true>
        tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in)
 : _Inherited(__tag, __a, std::forward<_U1>(__in.first),
       std::forward<_U2>(__in.second)) { }

      template<typename _Alloc, typename _U1, typename _U2, typename
        enable_if<_TMC::template
                    _MoveConstructibleTuple<_U1, _U2>()
                  && !_TMC::template
                    _ImplicitlyMoveConvertibleTuple<_U1, _U2>(),
 bool>::type = false>
        explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
                       pair<_U1, _U2>&& __in)
 : _Inherited(__tag, __a, std::forward<_U1>(__in.first),
       std::forward<_U2>(__in.second)) { }

      tuple&
      operator=(const tuple& __in)
      {
 static_cast<_Inherited&>(*this) = __in;
 return *this;
      }

      tuple&
      operator=(tuple&& __in)
      noexcept(is_nothrow_move_assignable<_Inherited>::value)
      {
 static_cast<_Inherited&>(*this) = std::move(__in);
 return *this;
      }

      template<typename _U1, typename _U2>
        tuple&
        operator=(const tuple<_U1, _U2>& __in)
        {
   static_cast<_Inherited&>(*this) = __in;
   return *this;
 }

      template<typename _U1, typename _U2>
        tuple&
        operator=(tuple<_U1, _U2>&& __in)
        {
   static_cast<_Inherited&>(*this) = std::move(__in);
   return *this;
 }

      template<typename _U1, typename _U2>
        tuple&
        operator=(const pair<_U1, _U2>& __in)
        {
   this->_M_head(*this) = __in.first;
   this->_M_tail(*this)._M_head(*this) = __in.second;
   return *this;
 }

      template<typename _U1, typename _U2>
        tuple&
        operator=(pair<_U1, _U2>&& __in)
        {
   this->_M_head(*this) = std::forward<_U1>(__in.first);
   this->_M_tail(*this)._M_head(*this) = std::forward<_U2>(__in.second);
   return *this;
 }

      void
      swap(tuple& __in)
      noexcept(noexcept(__in._M_swap(__in)))
      { _Inherited::_M_swap(__in); }
    };






  template<std::size_t __i, typename _Head, typename... _Tail>
    struct tuple_element<__i, tuple<_Head, _Tail...> >
    : tuple_element<__i - 1, tuple<_Tail...> > { };




  template<typename _Head, typename... _Tail>
    struct tuple_element<0, tuple<_Head, _Tail...> >
    {
      typedef _Head type;
    };


  template<typename... _Elements>
    struct tuple_size<tuple<_Elements...>>
    : public integral_constant<std::size_t, sizeof...(_Elements)> { };

  template<std::size_t __i, typename _Head, typename... _Tail>
    constexpr _Head&
    __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }

  template<std::size_t __i, typename _Head, typename... _Tail>
    constexpr const _Head&
    __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }


  template<std::size_t __i, typename... _Elements>
    constexpr __tuple_element_t<__i, tuple<_Elements...>>&
    get(tuple<_Elements...>& __t) noexcept
    { return std::__get_helper<__i>(__t); }


  template<std::size_t __i, typename... _Elements>
    constexpr const __tuple_element_t<__i, tuple<_Elements...>>&
    get(const tuple<_Elements...>& __t) noexcept
    { return std::__get_helper<__i>(__t); }


  template<std::size_t __i, typename... _Elements>
    constexpr __tuple_element_t<__i, tuple<_Elements...>>&&
    get(tuple<_Elements...>&& __t) noexcept
    {
      typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type;
      return std::forward<__element_type&&>(std::get<__i>(__t));
    }





  template<typename _Head, size_t __i, typename... _Tail>
    constexpr _Head&
    __get_helper2(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }

  template<typename _Head, size_t __i, typename... _Tail>
    constexpr const _Head&
    __get_helper2(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }


  template <typename _Tp, typename... _Types>
    constexpr _Tp&
    get(tuple<_Types...>& __t) noexcept
    { return std::__get_helper2<_Tp>(__t); }


  template <typename _Tp, typename... _Types>
    constexpr _Tp&&
    get(tuple<_Types...>&& __t) noexcept
    { return std::forward<_Tp&&>(std::__get_helper2<_Tp>(__t)); }


  template <typename _Tp, typename... _Types>
    constexpr const _Tp&
    get(const tuple<_Types...>& __t) noexcept
    { return std::__get_helper2<_Tp>(__t); }



  template<typename _Tp, typename _Up, size_t __i, size_t __size>
    struct __tuple_compare
    {
      static constexpr bool
      __eq(const _Tp& __t, const _Up& __u)
      {
 return bool(std::get<__i>(__t) == std::get<__i>(__u))
   && __tuple_compare<_Tp, _Up, __i + 1, __size>::__eq(__t, __u);
      }

      static constexpr bool
      __less(const _Tp& __t, const _Up& __u)
      {
 return bool(std::get<__i>(__t) < std::get<__i>(__u))
   || (!bool(std::get<__i>(__u) < std::get<__i>(__t))
       && __tuple_compare<_Tp, _Up, __i + 1, __size>::__less(__t, __u));
      }
    };

  template<typename _Tp, typename _Up, size_t __size>
    struct __tuple_compare<_Tp, _Up, __size, __size>
    {
      static constexpr bool
      __eq(const _Tp&, const _Up&) { return true; }

      static constexpr bool
      __less(const _Tp&, const _Up&) { return false; }
    };

  template<typename... _TElements, typename... _UElements>
    constexpr bool
    operator==(const tuple<_TElements...>& __t,
        const tuple<_UElements...>& __u)
    {
      static_assert(sizeof...(_TElements) == sizeof...(_UElements),
   "tuple objects can only be compared if they have equal sizes.");
      using __compare = __tuple_compare<tuple<_TElements...>,
     tuple<_UElements...>,
     0, sizeof...(_TElements)>;
      return __compare::__eq(__t, __u);
    }

  template<typename... _TElements, typename... _UElements>
    constexpr bool
    operator<(const tuple<_TElements...>& __t,
       const tuple<_UElements...>& __u)
    {
      static_assert(sizeof...(_TElements) == sizeof...(_UElements),
   "tuple objects can only be compared if they have equal sizes.");
      using __compare = __tuple_compare<tuple<_TElements...>,
     tuple<_UElements...>,
     0, sizeof...(_TElements)>;
      return __compare::__less(__t, __u);
    }

  template<typename... _TElements, typename... _UElements>
    constexpr bool
    operator!=(const tuple<_TElements...>& __t,
        const tuple<_UElements...>& __u)
    { return !(__t == __u); }

  template<typename... _TElements, typename... _UElements>
    constexpr bool
    operator>(const tuple<_TElements...>& __t,
       const tuple<_UElements...>& __u)
    { return __u < __t; }

  template<typename... _TElements, typename... _UElements>
    constexpr bool
    operator<=(const tuple<_TElements...>& __t,
        const tuple<_UElements...>& __u)
    { return !(__u < __t); }

  template<typename... _TElements, typename... _UElements>
    constexpr bool
    operator>=(const tuple<_TElements...>& __t,
        const tuple<_UElements...>& __u)
    { return !(__t < __u); }


  template<typename... _Elements>
    constexpr tuple<typename __decay_and_strip<_Elements>::__type...>
    make_tuple(_Elements&&... __args)
    {
      typedef tuple<typename __decay_and_strip<_Elements>::__type...>
 __result_type;
      return __result_type(std::forward<_Elements>(__args)...);
    }



  template<typename... _Elements>
    constexpr tuple<_Elements&&...>
    forward_as_tuple(_Elements&&... __args) noexcept
    { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }

  template<typename... _Tps>
    struct __is_tuple_like_impl<tuple<_Tps...>> : true_type
    { };


  template<typename _Tp>
    struct __is_tuple_like
    : public __is_tuple_like_impl<typename std::remove_cv
            <typename std::remove_reference<_Tp>::type>::type>::type
    { };

  template<size_t, typename, typename, size_t>
    struct __make_tuple_impl;

  template<size_t _Idx, typename _Tuple, typename... _Tp, size_t _Nm>
    struct __make_tuple_impl<_Idx, tuple<_Tp...>, _Tuple, _Nm>
    : __make_tuple_impl<_Idx + 1,
   tuple<_Tp..., __tuple_element_t<_Idx, _Tuple>>,
   _Tuple, _Nm>
    { };

  template<std::size_t _Nm, typename _Tuple, typename... _Tp>
    struct __make_tuple_impl<_Nm, tuple<_Tp...>, _Tuple, _Nm>
    {
      typedef tuple<_Tp...> __type;
    };

  template<typename _Tuple>
    struct __do_make_tuple
    : __make_tuple_impl<0, tuple<>, _Tuple, std::tuple_size<_Tuple>::value>
    { };


  template<typename _Tuple>
    struct __make_tuple
    : public __do_make_tuple<typename std::remove_cv
            <typename std::remove_reference<_Tuple>::type>::type>
    { };


  template<typename...>
    struct __combine_tuples;

  template<>
    struct __combine_tuples<>
    {
      typedef tuple<> __type;
    };

  template<typename... _Ts>
    struct __combine_tuples<tuple<_Ts...>>
    {
      typedef tuple<_Ts...> __type;
    };

  template<typename... _T1s, typename... _T2s, typename... _Rem>
    struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>, _Rem...>
    {
      typedef typename __combine_tuples<tuple<_T1s..., _T2s...>,
     _Rem...>::__type __type;
    };


  template<typename... _Tpls>
    struct __tuple_cat_result
    {
      typedef typename __combine_tuples
        <typename __make_tuple<_Tpls>::__type...>::__type __type;
    };



  template<typename...>
    struct __make_1st_indices;

  template<>
    struct __make_1st_indices<>
    {
      typedef std::_Index_tuple<> __type;
    };

  template<typename _Tp, typename... _Tpls>
    struct __make_1st_indices<_Tp, _Tpls...>
    {
      typedef typename std::_Build_index_tuple<std::tuple_size<
 typename std::remove_reference<_Tp>::type>::value>::__type __type;
    };




  template<typename _Ret, typename _Indices, typename... _Tpls>
    struct __tuple_concater;

  template<typename _Ret, std::size_t... _Is, typename _Tp, typename... _Tpls>
    struct __tuple_concater<_Ret, std::_Index_tuple<_Is...>, _Tp, _Tpls...>
    {
      template<typename... _Us>
        static constexpr _Ret
        _S_do(_Tp&& __tp, _Tpls&&... __tps, _Us&&... __us)
        {
   typedef typename __make_1st_indices<_Tpls...>::__type __idx;
   typedef __tuple_concater<_Ret, __idx, _Tpls...> __next;
   return __next::_S_do(std::forward<_Tpls>(__tps)...,
          std::forward<_Us>(__us)...,
          std::get<_Is>(std::forward<_Tp>(__tp))...);
 }
    };

  template<typename _Ret>
    struct __tuple_concater<_Ret, std::_Index_tuple<>>
    {
      template<typename... _Us>
 static constexpr _Ret
 _S_do(_Us&&... __us)
        {
   return _Ret(std::forward<_Us>(__us)...);
 }
    };


  template<typename... _Tpls, typename = typename
           enable_if<__and_<__is_tuple_like<_Tpls>...>::value>::type>
    constexpr auto
    tuple_cat(_Tpls&&... __tpls)
    -> typename __tuple_cat_result<_Tpls...>::__type
    {
      typedef typename __tuple_cat_result<_Tpls...>::__type __ret;
      typedef typename __make_1st_indices<_Tpls...>::__type __idx;
      typedef __tuple_concater<__ret, __idx, _Tpls...> __concater;
      return __concater::_S_do(std::forward<_Tpls>(__tpls)...);
    }




  template<typename... _Elements>
    constexpr tuple<_Elements&...>
    tie(_Elements&... __args) noexcept
    { return tuple<_Elements&...>(__args...); }


  template<typename... _Elements>
    inline void
    swap(tuple<_Elements...>& __x, tuple<_Elements...>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }



  struct _Swallow_assign
  {
    template<class _Tp>
      const _Swallow_assign&
      operator=(const _Tp&) const
      { return *this; }
  };

  const _Swallow_assign ignore{};


  template<typename... _Types, typename _Alloc>
    struct uses_allocator<tuple<_Types...>, _Alloc> : true_type { };


  template<class _T1, class _T2>
    template<typename... _Args1, typename... _Args2>
      inline
      pair<_T1, _T2>::
      pair(piecewise_construct_t,
    tuple<_Args1...> __first, tuple<_Args2...> __second)
      : pair(__first, __second,
      typename _Build_index_tuple<sizeof...(_Args1)>::__type(),
      typename _Build_index_tuple<sizeof...(_Args2)>::__type())
      { }

  template<class _T1, class _T2>
    template<typename... _Args1, std::size_t... _Indexes1,
             typename... _Args2, std::size_t... _Indexes2>
      inline
      pair<_T1, _T2>::
      pair(tuple<_Args1...>& __tuple1, tuple<_Args2...>& __tuple2,
    _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>)
      : first(std::forward<_Args1>(std::get<_Indexes1>(__tuple1))...),
        second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
      { }




}
# 56 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 2 3




namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _MemberPointer>
    class _Mem_fn;
  template<typename _Tp, typename _Class>
    _Mem_fn<_Tp _Class::*>
    mem_fn(_Tp _Class::*) noexcept;


  template<typename _Functor, typename = __void_t<>>
    struct _Maybe_get_result_type
    { };

  template<typename _Functor>
    struct _Maybe_get_result_type<_Functor,
      __void_t<typename _Functor::result_type>>
    { typedef typename _Functor::result_type result_type; };





  template<typename _Functor>
    struct _Weak_result_type_impl
    : _Maybe_get_result_type<_Functor>
    { };


  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...) volatile>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......) volatile>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...) const volatile>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......) const volatile>
    { typedef _Res result_type; };


  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(&)(_ArgTypes......)>
    { typedef _Res result_type; };


  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(*)(_ArgTypes......)>
    { typedef _Res result_type; };


  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)>
    { typedef _Res result_type; };

  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......)>
    { typedef _Res result_type; };


  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const>
    { typedef _Res result_type; };

  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) const>
    { typedef _Res result_type; };


  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile>
    { typedef _Res result_type; };

  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) volatile>
    { typedef _Res result_type; };


  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)
      const volatile>
    { typedef _Res result_type; };

  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......)
      const volatile>
    { typedef _Res result_type; };





  template<typename _Functor>
    struct _Weak_result_type
    : _Weak_result_type_impl<typename remove_cv<_Functor>::type>
    { };

  template<typename _Tp, typename _Up = typename decay<_Tp>::type>
    struct __inv_unwrap
    {
      using type = _Tp;
    };

  template<typename _Tp, typename _Up>
    struct __inv_unwrap<_Tp, reference_wrapper<_Up>>
    {
      using type = _Up&;
    };



  template<typename _Tp, typename _Up = typename __inv_unwrap<_Tp>::type>
    inline _Up&&
    __invfwd(typename remove_reference<_Tp>::type& __t) noexcept
    { return static_cast<_Up&&>(__t); }

  template<typename _Res, typename _Fn, typename... _Args>
    inline _Res
    __invoke_impl(__invoke_other, _Fn&& __f, _Args&&... __args)
    noexcept(noexcept(std::forward<_Fn>(__f)(std::forward<_Args>(__args)...)))
    { return std::forward<_Fn>(__f)(std::forward<_Args>(__args)...); }

  template<typename _Res, typename _MemFun, typename _Tp, typename... _Args>
    inline _Res
    __invoke_impl(__invoke_memfun_ref, _MemFun&& __f, _Tp&& __t,
    _Args&&... __args)
    noexcept(noexcept(
   (__invfwd<_Tp>(__t).*__f)(std::forward<_Args>(__args)...)))
    { return (__invfwd<_Tp>(__t).*__f)(std::forward<_Args>(__args)...); }

  template<typename _Res, typename _MemFun, typename _Tp, typename... _Args>
    inline _Res
    __invoke_impl(__invoke_memfun_deref, _MemFun&& __f, _Tp&& __t,
    _Args&&... __args)
    noexcept(noexcept(
   ((*std::forward<_Tp>(__t)).*__f)(std::forward<_Args>(__args)...)))
    {
      return ((*std::forward<_Tp>(__t)).*__f)(std::forward<_Args>(__args)...);
    }

  template<typename _Res, typename _MemPtr, typename _Tp>
    inline _Res
    __invoke_impl(__invoke_memobj_ref, _MemPtr&& __f, _Tp&& __t)
    noexcept(noexcept(__invfwd<_Tp>(__t).*__f))
    { return __invfwd<_Tp>(__t).*__f; }

  template<typename _Res, typename _MemPtr, typename _Tp>
    inline _Res
    __invoke_impl(__invoke_memobj_deref, _MemPtr&& __f, _Tp&& __t)
    noexcept(noexcept((*std::forward<_Tp>(__t)).*__f))
    { return (*std::forward<_Tp>(__t)).*__f; }


  template<typename _Callable, typename... _Args>
    inline typename result_of<_Callable&&(_Args&&...)>::type
    __invoke(_Callable&& __fn, _Args&&... __args)
    {
      using __result_of = result_of<_Callable&&(_Args&&...)>;
      using __type = typename __result_of::type;
      using __tag = typename __result_of::__invoke_type;
      return std::__invoke_impl<__type>(__tag{}, std::forward<_Callable>(__fn),
     std::forward<_Args>(__args)...);
    }
# 272 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<bool _Unary, bool _Binary, typename _Tp>
    struct _Reference_wrapper_base_impl;


  template<typename _Tp>
    struct _Reference_wrapper_base_impl<false, false, _Tp>
    : _Weak_result_type<_Tp>
    { };


  template<typename _Tp>
    struct _Reference_wrapper_base_impl<true, false, _Tp>
    : _Weak_result_type<_Tp>
    {
      typedef typename _Tp::argument_type argument_type;
    };


  template<typename _Tp>
    struct _Reference_wrapper_base_impl<false, true, _Tp>
    : _Weak_result_type<_Tp>
    {
      typedef typename _Tp::first_argument_type first_argument_type;
      typedef typename _Tp::second_argument_type second_argument_type;
    };


   template<typename _Tp>
    struct _Reference_wrapper_base_impl<true, true, _Tp>
    : _Weak_result_type<_Tp>
    {
      typedef typename _Tp::argument_type argument_type;
      typedef typename _Tp::first_argument_type first_argument_type;
      typedef typename _Tp::second_argument_type second_argument_type;
    };

  template<typename _Tp, typename = __void_t<>> struct __has_argument_type : false_type { }; template<typename _Tp> struct __has_argument_type<_Tp, __void_t<typename _Tp::argument_type>> : true_type { };
  template<typename _Tp, typename = __void_t<>> struct __has_first_argument_type : false_type { }; template<typename _Tp> struct __has_first_argument_type<_Tp, __void_t<typename _Tp::first_argument_type>> : true_type { };
  template<typename _Tp, typename = __void_t<>> struct __has_second_argument_type : false_type { }; template<typename _Tp> struct __has_second_argument_type<_Tp, __void_t<typename _Tp::second_argument_type>> : true_type { };







  template<typename _Tp>
    struct _Reference_wrapper_base
    : _Reference_wrapper_base_impl<
      __has_argument_type<_Tp>::value,
      __has_first_argument_type<_Tp>::value
      && __has_second_argument_type<_Tp>::value,
      _Tp>
    { };


  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res(_T1)>
    : unary_function<_T1, _Res>
    { };

  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res(_T1) const>
    : unary_function<_T1, _Res>
    { };

  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res(_T1) volatile>
    : unary_function<_T1, _Res>
    { };

  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res(_T1) const volatile>
    : unary_function<_T1, _Res>
    { };


  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res(_T1, _T2)>
    : binary_function<_T1, _T2, _Res>
    { };

  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res(_T1, _T2) const>
    : binary_function<_T1, _T2, _Res>
    { };

  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res(_T1, _T2) volatile>
    : binary_function<_T1, _T2, _Res>
    { };

  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile>
    : binary_function<_T1, _T2, _Res>
    { };


  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res(*)(_T1)>
    : unary_function<_T1, _Res>
    { };


  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res(*)(_T1, _T2)>
    : binary_function<_T1, _T2, _Res>
    { };


  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res (_T1::*)()>
    : unary_function<_T1*, _Res>
    { };


  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2)>
    : binary_function<_T1*, _T2, _Res>
    { };


  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res (_T1::*)() const>
    : unary_function<const _T1*, _Res>
    { };


  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const>
    : binary_function<const _T1*, _T2, _Res>
    { };


  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res (_T1::*)() volatile>
    : unary_function<volatile _T1*, _Res>
    { };


  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile>
    : binary_function<volatile _T1*, _T2, _Res>
    { };


  template<typename _Res, typename _T1>
    struct _Reference_wrapper_base<_Res (_T1::*)() const volatile>
    : unary_function<const volatile _T1*, _Res>
    { };


  template<typename _Res, typename _T1, typename _T2>
    struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile>
    : binary_function<const volatile _T1*, _T2, _Res>
    { };






  template<typename _Tp>
    class reference_wrapper
    : public _Reference_wrapper_base<typename remove_cv<_Tp>::type>
    {
      _Tp* _M_data;

    public:
      typedef _Tp type;

      reference_wrapper(_Tp& __indata) noexcept
      : _M_data(std::__addressof(__indata))
      { }

      reference_wrapper(_Tp&&) = delete;

      reference_wrapper(const reference_wrapper&) = default;

      reference_wrapper&
      operator=(const reference_wrapper&) = default;

      operator _Tp&() const noexcept
      { return this->get(); }

      _Tp&
      get() const noexcept
      { return *_M_data; }

      template<typename... _Args>
 typename result_of<_Tp&(_Args&&...)>::type
 operator()(_Args&&... __args) const
 {
   return std::__invoke(get(), std::forward<_Args>(__args)...);
 }
    };



  template<typename _Tp>
    inline reference_wrapper<_Tp>
    ref(_Tp& __t) noexcept
    { return reference_wrapper<_Tp>(__t); }


  template<typename _Tp>
    inline reference_wrapper<const _Tp>
    cref(const _Tp& __t) noexcept
    { return reference_wrapper<const _Tp>(__t); }

  template<typename _Tp>
    void ref(const _Tp&&) = delete;

  template<typename _Tp>
    void cref(const _Tp&&) = delete;


  template<typename _Tp>
    inline reference_wrapper<_Tp>
    ref(reference_wrapper<_Tp> __t) noexcept
    { return ref(__t.get()); }


  template<typename _Tp>
    inline reference_wrapper<const _Tp>
    cref(reference_wrapper<_Tp> __t) noexcept
    { return cref(__t.get()); }



  template<typename... _Types>
    struct _Pack : integral_constant<size_t, sizeof...(_Types)>
    { };

  template<typename _From, typename _To, bool = _From::value == _To::value>
    struct _AllConvertible : false_type
    { };

  template<typename... _From, typename... _To>
    struct _AllConvertible<_Pack<_From...>, _Pack<_To...>, true>
    : __and_<is_convertible<_From, _To>...>
    { };

  template<typename _Tp1, typename _Tp2>
    using _NotSame = __not_<is_same<typename std::decay<_Tp1>::type,
        typename std::decay<_Tp2>::type>>;






  template<typename _Res, typename... _ArgTypes>
    struct _Maybe_unary_or_binary_function { };


  template<typename _Res, typename _T1>
    struct _Maybe_unary_or_binary_function<_Res, _T1>
    : std::unary_function<_T1, _Res> { };


  template<typename _Res, typename _T1, typename _T2>
    struct _Maybe_unary_or_binary_function<_Res, _T1, _T2>
    : std::binary_function<_T1, _T2, _Res> { };

  template<typename _Signature>
    struct _Mem_fn_traits;

  template<typename _Res, typename _Class, typename... _ArgTypes>
    struct _Mem_fn_traits_base
    {
      using __result_type = _Res;
      using __maybe_type
 = _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...>;
      using __arity = integral_constant<size_t, sizeof...(_ArgTypes)>;
    };
# 569 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) > : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) > : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const > : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const > : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) volatile > : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) volatile > : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const volatile > : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const volatile > : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = true_type; };
template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) &> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) &> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const &> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const &> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) volatile &> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) volatile &> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const volatile &> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const volatile &> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = true_type; };
template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) &&> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) &&> : _Mem_fn_traits_base<_Res, _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const &&> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const &&> : _Mem_fn_traits_base<_Res, const _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) volatile &&> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) volatile &&> : _Mem_fn_traits_base<_Res, volatile _Class, _ArgTypes...> { using __vararg = true_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes...) const volatile &&> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = false_type; }; template<typename _Res, typename _Class, typename... _ArgTypes> struct _Mem_fn_traits<_Res (_Class::*)(_ArgTypes... ...) const volatile &&> : _Mem_fn_traits_base<_Res, const volatile _Class, _ArgTypes...> { using __vararg = true_type; };




  template<typename _MemFunPtr,
    bool __is_mem_fn = is_member_function_pointer<_MemFunPtr>::value>
    class _Mem_fn_base
    : public _Mem_fn_traits<_MemFunPtr>::__maybe_type
    {
      using _Traits = _Mem_fn_traits<_MemFunPtr>;

      using _Arity = typename _Traits::__arity;
      using _Varargs = typename _Traits::__vararg;

      template<typename _Func, typename... _BoundArgs>
 friend struct _Bind_check_arity;

      _MemFunPtr _M_pmf;

    public:

      using result_type = typename _Traits::__result_type;

      explicit constexpr
      _Mem_fn_base(_MemFunPtr __pmf) noexcept : _M_pmf(__pmf) { }

      template<typename... _Args>
 auto
 operator()(_Args&&... __args) const
 noexcept(noexcept(
       std::__invoke(_M_pmf, std::forward<_Args>(__args)...)))
 -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...))
 { return std::__invoke(_M_pmf, std::forward<_Args>(__args)...); }
    };


  template<typename _MemObjPtr>
    class _Mem_fn_base<_MemObjPtr, false>
    {
      using _Arity = integral_constant<size_t, 0>;
      using _Varargs = false_type;

      template<typename _Func, typename... _BoundArgs>
 friend struct _Bind_check_arity;

      _MemObjPtr _M_pm;

    public:
      explicit constexpr
      _Mem_fn_base(_MemObjPtr __pm) noexcept : _M_pm(__pm) { }

      template<typename _Tp>
 auto
 operator()(_Tp&& __obj) const
 noexcept(noexcept(std::__invoke(_M_pm, std::forward<_Tp>(__obj))))
 -> decltype(std::__invoke(_M_pm, std::forward<_Tp>(__obj)))
 { return std::__invoke(_M_pm, std::forward<_Tp>(__obj)); }
    };

  template<typename _Res, typename _Class>
    struct _Mem_fn<_Res _Class::*>
    : _Mem_fn_base<_Res _Class::*>
    {
      using _Mem_fn_base<_Res _Class::*>::_Mem_fn_base;
    };
# 645 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<typename _Tp, typename _Class>
    inline _Mem_fn<_Tp _Class::*>
    mem_fn(_Tp _Class::* __pm) noexcept
    {
      return _Mem_fn<_Tp _Class::*>(__pm);
    }
# 660 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<typename _Tp>
    struct is_bind_expression
    : public false_type { };
# 671 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<typename _Tp>
    struct is_placeholder
    : public integral_constant<int, 0>
    { };




  template<int _Num> struct _Placeholder { };







  namespace placeholders
  {





    extern const _Placeholder<1> _1;
    extern const _Placeholder<2> _2;
    extern const _Placeholder<3> _3;
    extern const _Placeholder<4> _4;
    extern const _Placeholder<5> _5;
    extern const _Placeholder<6> _6;
    extern const _Placeholder<7> _7;
    extern const _Placeholder<8> _8;
    extern const _Placeholder<9> _9;
    extern const _Placeholder<10> _10;
    extern const _Placeholder<11> _11;
    extern const _Placeholder<12> _12;
    extern const _Placeholder<13> _13;
    extern const _Placeholder<14> _14;
    extern const _Placeholder<15> _15;
    extern const _Placeholder<16> _16;
    extern const _Placeholder<17> _17;
    extern const _Placeholder<18> _18;
    extern const _Placeholder<19> _19;
    extern const _Placeholder<20> _20;
    extern const _Placeholder<21> _21;
    extern const _Placeholder<22> _22;
    extern const _Placeholder<23> _23;
    extern const _Placeholder<24> _24;
    extern const _Placeholder<25> _25;
    extern const _Placeholder<26> _26;
    extern const _Placeholder<27> _27;
    extern const _Placeholder<28> _28;
    extern const _Placeholder<29> _29;

  }
# 733 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<int _Num>
    struct is_placeholder<_Placeholder<_Num> >
    : public integral_constant<int, _Num>
    { };

  template<int _Num>
    struct is_placeholder<const _Placeholder<_Num> >
    : public integral_constant<int, _Num>
    { };



 template<std::size_t __i, typename _Tuple>
   using _Safe_tuple_element_t
     = typename enable_if<(__i < tuple_size<_Tuple>::value),
     tuple_element<__i, _Tuple>>::type::type;
# 761 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<typename _Arg,
    bool _IsBindExp = is_bind_expression<_Arg>::value,
    bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)>
    class _Mu;






  template<typename _Tp>
    class _Mu<reference_wrapper<_Tp>, false, false>
    {
    public:




      template<typename _CVRef, typename _Tuple>
 _Tp&
 operator()(_CVRef& __arg, _Tuple&) const volatile
 { return __arg.get(); }
    };







  template<typename _Arg>
    class _Mu<_Arg, true, false>
    {
    public:
      template<typename _CVArg, typename... _Args>
 auto
 operator()(_CVArg& __arg,
     tuple<_Args...>& __tuple) const volatile
 -> decltype(__arg(declval<_Args>()...))
 {

   typedef typename _Build_index_tuple<sizeof...(_Args)>::__type
     _Indexes;
   return this->__call(__arg, __tuple, _Indexes());
 }

    private:


      template<typename _CVArg, typename... _Args, std::size_t... _Indexes>
 auto
 __call(_CVArg& __arg, tuple<_Args...>& __tuple,
        const _Index_tuple<_Indexes...>&) const volatile
 -> decltype(__arg(declval<_Args>()...))
 {
   return __arg(std::forward<_Args>(std::get<_Indexes>(__tuple))...);
 }
    };






  template<typename _Arg>
    class _Mu<_Arg, false, true>
    {
    public:
      template<typename _Tuple>
 _Safe_tuple_element_t<(is_placeholder<_Arg>::value - 1), _Tuple>&&
 operator()(const volatile _Arg&, _Tuple& __tuple) const volatile
 {
   using __type
     = __tuple_element_t<(is_placeholder<_Arg>::value - 1), _Tuple>;
   return std::forward<__type>(
       ::std::get<(is_placeholder<_Arg>::value - 1)>(__tuple));
 }
    };






  template<typename _Arg>
    class _Mu<_Arg, false, false>
    {
    public:
      template<typename _CVArg, typename _Tuple>
 _CVArg&&
 operator()(_CVArg&& __arg, _Tuple&) const volatile
 { return std::forward<_CVArg>(__arg); }
    };






  template<typename _Tp>
    struct _Maybe_wrap_member_pointer
    {
      typedef _Tp type;

      static constexpr const _Tp&
      __do_wrap(const _Tp& __x)
      { return __x; }

      static constexpr _Tp&&
      __do_wrap(_Tp&& __x)
      { return static_cast<_Tp&&>(__x); }
    };






  template<typename _Tp, typename _Class>
    struct _Maybe_wrap_member_pointer<_Tp _Class::*>
    {
      typedef _Mem_fn<_Tp _Class::*> type;

      static constexpr type
      __do_wrap(_Tp _Class::* __pm)
      { return type(__pm); }
    };





  template<>
    struct _Maybe_wrap_member_pointer<void>
    {
      typedef void type;
    };


  template<std::size_t _Ind, typename... _Tp>
    inline auto
    __volget(volatile tuple<_Tp...>& __tuple)
    -> __tuple_element_t<_Ind, tuple<_Tp...>> volatile&
    { return std::get<_Ind>(const_cast<tuple<_Tp...>&>(__tuple)); }


  template<std::size_t _Ind, typename... _Tp>
    inline auto
    __volget(const volatile tuple<_Tp...>& __tuple)
    -> __tuple_element_t<_Ind, tuple<_Tp...>> const volatile&
    { return std::get<_Ind>(const_cast<const tuple<_Tp...>&>(__tuple)); }


  template<typename _Signature>
    struct _Bind;

   template<typename _Functor, typename... _Bound_args>
    class _Bind<_Functor(_Bound_args...)>
    : public _Weak_result_type<_Functor>
    {
      typedef _Bind __self_type;
      typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type
 _Bound_indexes;

      _Functor _M_f;
      tuple<_Bound_args...> _M_bound_args;


      template<typename _Result, typename... _Args, std::size_t... _Indexes>
 _Result
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>)
 {
   return _M_f(_Mu<_Bound_args>()
        (std::get<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Result, typename... _Args, std::size_t... _Indexes>
 _Result
 __call_c(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>) const
 {
   return _M_f(_Mu<_Bound_args>()
        (std::get<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Result, typename... _Args, std::size_t... _Indexes>
 _Result
 __call_v(tuple<_Args...>&& __args,
   _Index_tuple<_Indexes...>) volatile
 {
   return _M_f(_Mu<_Bound_args>()
        (__volget<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Result, typename... _Args, std::size_t... _Indexes>
 _Result
 __call_c_v(tuple<_Args...>&& __args,
     _Index_tuple<_Indexes...>) const volatile
 {
   return _M_f(_Mu<_Bound_args>()
        (__volget<_Indexes>(_M_bound_args), __args)...);
 }

     public:
      template<typename... _Args>
 explicit _Bind(const _Functor& __f, _Args&&... __args)
 : _M_f(__f), _M_bound_args(std::forward<_Args>(__args)...)
 { }

      template<typename... _Args>
 explicit _Bind(_Functor&& __f, _Args&&... __args)
 : _M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...)
 { }

      _Bind(const _Bind&) = default;

      _Bind(_Bind&& __b)
      : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args))
      { }


      template<typename... _Args, typename _Result
 = decltype( std::declval<_Functor&>()(
       _Mu<_Bound_args>()( std::declval<_Bound_args&>(),
      std::declval<tuple<_Args...>&>() )... ) )>
 _Result
 operator()(_Args&&... __args)
 {
   return this->__call<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }


      template<typename... _Args, typename _Result
 = decltype( std::declval<typename enable_if<(sizeof...(_Args) >= 0),
         typename add_const<_Functor>::type&>::type>()(
       _Mu<_Bound_args>()( std::declval<const _Bound_args&>(),
      std::declval<tuple<_Args...>&>() )... ) )>
 _Result
 operator()(_Args&&... __args) const
 {
   return this->__call_c<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }


      template<typename... _Args, typename _Result
 = decltype( std::declval<typename enable_if<(sizeof...(_Args) >= 0),
                       typename add_volatile<_Functor>::type&>::type>()(
       _Mu<_Bound_args>()( std::declval<volatile _Bound_args&>(),
      std::declval<tuple<_Args...>&>() )... ) )>
 _Result
 operator()(_Args&&... __args) volatile
 {
   return this->__call_v<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }


      template<typename... _Args, typename _Result
 = decltype( std::declval<typename enable_if<(sizeof...(_Args) >= 0),
                       typename add_cv<_Functor>::type&>::type>()(
       _Mu<_Bound_args>()( std::declval<const volatile _Bound_args&>(),
      std::declval<tuple<_Args...>&>() )... ) )>
 _Result
 operator()(_Args&&... __args) const volatile
 {
   return this->__call_c_v<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }
    };


  template<typename _Result, typename _Signature>
    struct _Bind_result;

  template<typename _Result, typename _Functor, typename... _Bound_args>
    class _Bind_result<_Result, _Functor(_Bound_args...)>
    {
      typedef _Bind_result __self_type;
      typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type
 _Bound_indexes;

      _Functor _M_f;
      tuple<_Bound_args...> _M_bound_args;


      template<typename _Res>
 struct __enable_if_void : enable_if<is_void<_Res>::value, int> { };
      template<typename _Res>
 struct __disable_if_void : enable_if<!is_void<_Res>::value, int> { };


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 _Result
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
     typename __disable_if_void<_Res>::type = 0)
 {
   return _M_f(_Mu<_Bound_args>()
        (std::get<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 void
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
     typename __enable_if_void<_Res>::type = 0)
 {
   _M_f(_Mu<_Bound_args>()
        (std::get<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 _Result
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
     typename __disable_if_void<_Res>::type = 0) const
 {
   return _M_f(_Mu<_Bound_args>()
        (std::get<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 void
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
     typename __enable_if_void<_Res>::type = 0) const
 {
   _M_f(_Mu<_Bound_args>()
        (std::get<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 _Result
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
     typename __disable_if_void<_Res>::type = 0) volatile
 {
   return _M_f(_Mu<_Bound_args>()
        (__volget<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 void
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
     typename __enable_if_void<_Res>::type = 0) volatile
 {
   _M_f(_Mu<_Bound_args>()
        (__volget<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 _Result
 __call(tuple<_Args...>&& __args, _Index_tuple<_Indexes...>,
     typename __disable_if_void<_Res>::type = 0) const volatile
 {
   return _M_f(_Mu<_Bound_args>()
        (__volget<_Indexes>(_M_bound_args), __args)...);
 }


      template<typename _Res, typename... _Args, std::size_t... _Indexes>
 void
 __call(tuple<_Args...>&& __args,
        _Index_tuple<_Indexes...>,
     typename __enable_if_void<_Res>::type = 0) const volatile
 {
   _M_f(_Mu<_Bound_args>()
        (__volget<_Indexes>(_M_bound_args), __args)...);
 }

    public:
      typedef _Result result_type;

      template<typename... _Args>
 explicit _Bind_result(const _Functor& __f, _Args&&... __args)
 : _M_f(__f), _M_bound_args(std::forward<_Args>(__args)...)
 { }

      template<typename... _Args>
 explicit _Bind_result(_Functor&& __f, _Args&&... __args)
 : _M_f(std::move(__f)), _M_bound_args(std::forward<_Args>(__args)...)
 { }

      _Bind_result(const _Bind_result&) = default;

      _Bind_result(_Bind_result&& __b)
      : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args))
      { }


      template<typename... _Args>
 result_type
 operator()(_Args&&... __args)
 {
   return this->__call<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }


      template<typename... _Args>
 result_type
 operator()(_Args&&... __args) const
 {
   return this->__call<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }


      template<typename... _Args>
 result_type
 operator()(_Args&&... __args) volatile
 {
   return this->__call<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }


      template<typename... _Args>
 result_type
 operator()(_Args&&... __args) const volatile
 {
   return this->__call<_Result>(
       std::forward_as_tuple(std::forward<_Args>(__args)...),
       _Bound_indexes());
 }
    };





  template<typename _Signature>
    struct is_bind_expression<_Bind<_Signature> >
    : public true_type { };





  template<typename _Signature>
    struct is_bind_expression<const _Bind<_Signature> >
    : public true_type { };





  template<typename _Signature>
    struct is_bind_expression<volatile _Bind<_Signature> >
    : public true_type { };





  template<typename _Signature>
    struct is_bind_expression<const volatile _Bind<_Signature>>
    : public true_type { };





  template<typename _Result, typename _Signature>
    struct is_bind_expression<_Bind_result<_Result, _Signature>>
    : public true_type { };





  template<typename _Result, typename _Signature>
    struct is_bind_expression<const _Bind_result<_Result, _Signature>>
    : public true_type { };





  template<typename _Result, typename _Signature>
    struct is_bind_expression<volatile _Bind_result<_Result, _Signature>>
    : public true_type { };





  template<typename _Result, typename _Signature>
    struct is_bind_expression<const volatile _Bind_result<_Result, _Signature>>
    : public true_type { };

  template<typename _Func, typename... _BoundArgs>
    struct _Bind_check_arity { };

  template<typename _Ret, typename... _Args, typename... _BoundArgs>
    struct _Bind_check_arity<_Ret (*)(_Args...), _BoundArgs...>
    {
      static_assert(sizeof...(_BoundArgs) == sizeof...(_Args),
                   "Wrong number of arguments for function");
    };

  template<typename _Ret, typename... _Args, typename... _BoundArgs>
    struct _Bind_check_arity<_Ret (*)(_Args......), _BoundArgs...>
    {
      static_assert(sizeof...(_BoundArgs) >= sizeof...(_Args),
                   "Wrong number of arguments for function");
    };

  template<typename _Tp, typename _Class, typename... _BoundArgs>
    struct _Bind_check_arity<_Tp _Class::*, _BoundArgs...>
    {
      using _Arity = typename _Mem_fn<_Tp _Class::*>::_Arity;
      using _Varargs = typename _Mem_fn<_Tp _Class::*>::_Varargs;
      static_assert(_Varargs::value
      ? sizeof...(_BoundArgs) >= _Arity::value + 1
      : sizeof...(_BoundArgs) == _Arity::value + 1,
      "Wrong number of arguments for pointer-to-member");
    };




  template<typename _Tp, typename _Tp2 = typename decay<_Tp>::type>
    using __is_socketlike = __or_<is_integral<_Tp2>, is_enum<_Tp2>>;

  template<bool _SocketLike, typename _Func, typename... _BoundArgs>
    struct _Bind_helper
    : _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...>
    {
      typedef _Maybe_wrap_member_pointer<typename decay<_Func>::type>
 __maybe_type;
      typedef typename __maybe_type::type __func_type;
      typedef _Bind<__func_type(typename decay<_BoundArgs>::type...)> type;
    };




  template<typename _Func, typename... _BoundArgs>
    struct _Bind_helper<true, _Func, _BoundArgs...>
    { };





  template<typename _Func, typename... _BoundArgs>
    inline typename
    _Bind_helper<__is_socketlike<_Func>::value, _Func, _BoundArgs...>::type
    bind(_Func&& __f, _BoundArgs&&... __args)
    {
      typedef _Bind_helper<false, _Func, _BoundArgs...> __helper_type;
      typedef typename __helper_type::__maybe_type __maybe_type;
      typedef typename __helper_type::type __result_type;
      return __result_type(__maybe_type::__do_wrap(std::forward<_Func>(__f)),
      std::forward<_BoundArgs>(__args)...);
    }

  template<typename _Result, typename _Func, typename... _BoundArgs>
    struct _Bindres_helper
    : _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...>
    {
      typedef _Maybe_wrap_member_pointer<typename decay<_Func>::type>
 __maybe_type;
      typedef typename __maybe_type::type __functor_type;
      typedef _Bind_result<_Result,
      __functor_type(typename decay<_BoundArgs>::type...)>
 type;
    };





  template<typename _Result, typename _Func, typename... _BoundArgs>
    inline
    typename _Bindres_helper<_Result, _Func, _BoundArgs...>::type
    bind(_Func&& __f, _BoundArgs&&... __args)
    {
      typedef _Bindres_helper<_Result, _Func, _BoundArgs...> __helper_type;
      typedef typename __helper_type::__maybe_type __maybe_type;
      typedef typename __helper_type::type __result_type;
      return __result_type(__maybe_type::__do_wrap(std::forward<_Func>(__f)),
      std::forward<_BoundArgs>(__args)...);
    }

  template<typename _Signature>
    struct _Bind_simple;

  template<typename _Callable, typename... _Args>
    struct _Bind_simple<_Callable(_Args...)>
    {
      typedef typename result_of<_Callable(_Args...)>::type result_type;

      template<typename _Tp, typename... _Up>
        explicit
        _Bind_simple(_Tp&& __f, _Up&&... __args)
        : _M_bound(std::forward<_Tp>(__f), std::forward<_Up>(__args)...)
        { }

      _Bind_simple(const _Bind_simple&) = default;
      _Bind_simple(_Bind_simple&&) = default;

      result_type
      operator()()
      {
        typedef typename _Build_index_tuple<sizeof...(_Args)>::__type _Indices;
        return _M_invoke(_Indices());
      }

    private:
      template<std::size_t... _Indices>
        typename result_of<_Callable(_Args...)>::type
        _M_invoke(_Index_tuple<_Indices...>)
        {


          return std::forward<_Callable>(std::get<0>(_M_bound))(
              std::forward<_Args>(std::get<_Indices+1>(_M_bound))...);
        }

      std::tuple<_Callable, _Args...> _M_bound;
    };

  template<typename _Func, typename... _BoundArgs>
    struct _Bind_simple_helper
    : _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...>
    {
      typedef _Maybe_wrap_member_pointer<typename decay<_Func>::type>
        __maybe_type;
      typedef typename __maybe_type::type __func_type;
      typedef _Bind_simple<__func_type(typename decay<_BoundArgs>::type...)>
        __type;
    };



  template<typename _Callable, typename... _Args>
    typename _Bind_simple_helper<_Callable, _Args...>::__type
    __bind_simple(_Callable&& __callable, _Args&&... __args)
    {
      typedef _Bind_simple_helper<_Callable, _Args...> __helper_type;
      typedef typename __helper_type::__maybe_type __maybe_type;
      typedef typename __helper_type::__type __result_type;
      return __result_type(
          __maybe_type::__do_wrap( std::forward<_Callable>(__callable)),
          std::forward<_Args>(__args)...);
    }






  class bad_function_call : public std::exception
  {
  public:
    virtual ~bad_function_call() noexcept;

    const char* what() const noexcept;
  };







  template<typename _Tp>
    struct __is_location_invariant
    : is_trivially_copyable<_Tp>::type
    { };

  class _Undefined_class;

  union _Nocopy_types
  {
    void* _M_object;
    const void* _M_const_object;
    void (*_M_function_pointer)();
    void (_Undefined_class::*_M_member_pointer)();
  };

  union [[gnu::may_alias]] _Any_data
  {
    void* _M_access() { return &_M_pod_data[0]; }
    const void* _M_access() const { return &_M_pod_data[0]; }

    template<typename _Tp>
      _Tp&
      _M_access()
      { return *static_cast<_Tp*>(_M_access()); }

    template<typename _Tp>
      const _Tp&
      _M_access() const
      { return *static_cast<const _Tp*>(_M_access()); }

    _Nocopy_types _M_unused;
    char _M_pod_data[sizeof(_Nocopy_types)];
  };

  enum _Manager_operation
  {
    __get_type_info,
    __get_functor_ptr,
    __clone_functor,
    __destroy_functor
  };



  template<typename _Tp>
    struct _Simple_type_wrapper
    {
      _Simple_type_wrapper(_Tp __value) : __value(__value) { }

      _Tp __value;
    };

  template<typename _Tp>
    struct __is_location_invariant<_Simple_type_wrapper<_Tp> >
    : __is_location_invariant<_Tp>
    { };



  template<typename _Functor>
    inline _Functor&
    __callable_functor(_Functor& __f)
    { return __f; }

  template<typename _Member, typename _Class>
    inline _Mem_fn<_Member _Class::*>
    __callable_functor(_Member _Class::* &__p)
    { return std::mem_fn(__p); }

  template<typename _Member, typename _Class>
    inline _Mem_fn<_Member _Class::*>
    __callable_functor(_Member _Class::* const &__p)
    { return std::mem_fn(__p); }

  template<typename _Member, typename _Class>
    inline _Mem_fn<_Member _Class::*>
    __callable_functor(_Member _Class::* volatile &__p)
    { return std::mem_fn(__p); }

  template<typename _Member, typename _Class>
    inline _Mem_fn<_Member _Class::*>
    __callable_functor(_Member _Class::* const volatile &__p)
    { return std::mem_fn(__p); }

  template<typename _Signature>
    class function;


  class _Function_base
  {
  public:
    static const std::size_t _M_max_size = sizeof(_Nocopy_types);
    static const std::size_t _M_max_align = __alignof__(_Nocopy_types);

    template<typename _Functor>
      class _Base_manager
      {
      protected:
 static const bool __stored_locally =
 (__is_location_invariant<_Functor>::value
  && sizeof(_Functor) <= _M_max_size
  && __alignof__(_Functor) <= _M_max_align
  && (_M_max_align % __alignof__(_Functor) == 0));

 typedef integral_constant<bool, __stored_locally> _Local_storage;


 static _Functor*
 _M_get_pointer(const _Any_data& __source)
 {
   const _Functor* __ptr =
     __stored_locally? std::__addressof(__source._M_access<_Functor>())
                                 : __source._M_access<_Functor*>();
   return const_cast<_Functor*>(__ptr);
 }



 static void
 _M_clone(_Any_data& __dest, const _Any_data& __source, true_type)
 {
   ::new (__dest._M_access()) _Functor(__source._M_access<_Functor>());
 }



 static void
 _M_clone(_Any_data& __dest, const _Any_data& __source, false_type)
 {
   __dest._M_access<_Functor*>() =
     new _Functor(*__source._M_access<_Functor*>());
 }



 static void
 _M_destroy(_Any_data& __victim, true_type)
 {
   __victim._M_access<_Functor>().~_Functor();
 }


 static void
 _M_destroy(_Any_data& __victim, false_type)
 {
   delete __victim._M_access<_Functor*>();
 }

      public:
 static bool
 _M_manager(_Any_data& __dest, const _Any_data& __source,
     _Manager_operation __op)
 {
   switch (__op)
     {

     case __get_type_info:
       __dest._M_access<const type_info*>() = &typeid(_Functor);
       break;

     case __get_functor_ptr:
       __dest._M_access<_Functor*>() = _M_get_pointer(__source);
       break;

     case __clone_functor:
       _M_clone(__dest, __source, _Local_storage());
       break;

     case __destroy_functor:
       _M_destroy(__dest, _Local_storage());
       break;
     }
   return false;
 }

 static void
 _M_init_functor(_Any_data& __functor, _Functor&& __f)
 { _M_init_functor(__functor, std::move(__f), _Local_storage()); }

 template<typename _Signature>
   static bool
   _M_not_empty_function(const function<_Signature>& __f)
   { return static_cast<bool>(__f); }

 template<typename _Tp>
   static bool
   _M_not_empty_function(_Tp* __fp)
   { return __fp != nullptr; }

 template<typename _Class, typename _Tp>
   static bool
   _M_not_empty_function(_Tp _Class::* __mp)
   { return __mp != nullptr; }

 template<typename _Tp>
   static bool
   _M_not_empty_function(const _Tp&)
   { return true; }

      private:
 static void
 _M_init_functor(_Any_data& __functor, _Functor&& __f, true_type)
 { ::new (__functor._M_access()) _Functor(std::move(__f)); }

 static void
 _M_init_functor(_Any_data& __functor, _Functor&& __f, false_type)
 { __functor._M_access<_Functor*>() = new _Functor(std::move(__f)); }
      };

    template<typename _Functor>
      class _Ref_manager : public _Base_manager<_Functor*>
      {
 typedef _Function_base::_Base_manager<_Functor*> _Base;

      public:
 static bool
 _M_manager(_Any_data& __dest, const _Any_data& __source,
     _Manager_operation __op)
 {
   switch (__op)
     {

     case __get_type_info:
       __dest._M_access<const type_info*>() = &typeid(_Functor);
       break;

     case __get_functor_ptr:
       __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source);
       return is_const<_Functor>::value;
       break;

     default:
       _Base::_M_manager(__dest, __source, __op);
     }
   return false;
 }

 static void
 _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f)
 {
   _Base::_M_init_functor(__functor, std::__addressof(__f.get()));
 }
      };

    _Function_base() : _M_manager(nullptr) { }

    ~_Function_base()
    {
      if (_M_manager)
 _M_manager(_M_functor, _M_functor, __destroy_functor);
    }


    bool _M_empty() const { return !_M_manager; }

    typedef bool (*_Manager_type)(_Any_data&, const _Any_data&,
      _Manager_operation);

    _Any_data _M_functor;
    _Manager_type _M_manager;
  };

  template<typename _Signature, typename _Functor>
    class _Function_handler;

  template<typename _Res, typename _Functor, typename... _ArgTypes>
    class _Function_handler<_Res(_ArgTypes...), _Functor>
    : public _Function_base::_Base_manager<_Functor>
    {
      typedef _Function_base::_Base_manager<_Functor> _Base;

    public:
      static _Res
      _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
      {
 return (*_Base::_M_get_pointer(__functor))(
     std::forward<_ArgTypes>(__args)...);
      }
    };

  template<typename _Functor, typename... _ArgTypes>
    class _Function_handler<void(_ArgTypes...), _Functor>
    : public _Function_base::_Base_manager<_Functor>
    {
      typedef _Function_base::_Base_manager<_Functor> _Base;

     public:
      static void
      _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
      {
 (*_Base::_M_get_pointer(__functor))(
     std::forward<_ArgTypes>(__args)...);
      }
    };

  template<typename _Res, typename _Functor, typename... _ArgTypes>
    class _Function_handler<_Res(_ArgTypes...), reference_wrapper<_Functor> >
    : public _Function_base::_Ref_manager<_Functor>
    {
      typedef _Function_base::_Ref_manager<_Functor> _Base;

     public:
      static _Res
      _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
      {
 return std::__callable_functor(**_Base::_M_get_pointer(__functor))(
       std::forward<_ArgTypes>(__args)...);
      }
    };

  template<typename _Functor, typename... _ArgTypes>
    class _Function_handler<void(_ArgTypes...), reference_wrapper<_Functor> >
    : public _Function_base::_Ref_manager<_Functor>
    {
      typedef _Function_base::_Ref_manager<_Functor> _Base;

     public:
      static void
      _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
      {
 std::__callable_functor(**_Base::_M_get_pointer(__functor))(
     std::forward<_ArgTypes>(__args)...);
      }
    };

  template<typename _Class, typename _Member, typename _Res,
    typename... _ArgTypes>
    class _Function_handler<_Res(_ArgTypes...), _Member _Class::*>
    : public _Function_handler<void(_ArgTypes...), _Member _Class::*>
    {
      typedef _Function_handler<void(_ArgTypes...), _Member _Class::*>
 _Base;

     public:
      static _Res
      _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
      {
 return std::mem_fn(_Base::_M_get_pointer(__functor)->__value)(
     std::forward<_ArgTypes>(__args)...);
      }
    };

  template<typename _Class, typename _Member, typename... _ArgTypes>
    class _Function_handler<void(_ArgTypes...), _Member _Class::*>
    : public _Function_base::_Base_manager<
   _Simple_type_wrapper< _Member _Class::* > >
    {
      typedef _Member _Class::* _Functor;
      typedef _Simple_type_wrapper<_Functor> _Wrapper;
      typedef _Function_base::_Base_manager<_Wrapper> _Base;

    public:
      static bool
      _M_manager(_Any_data& __dest, const _Any_data& __source,
   _Manager_operation __op)
      {
 switch (__op)
   {

   case __get_type_info:
     __dest._M_access<const type_info*>() = &typeid(_Functor);
     break;

   case __get_functor_ptr:
     __dest._M_access<_Functor*>() =
       &_Base::_M_get_pointer(__source)->__value;
     break;

   default:
     _Base::_M_manager(__dest, __source, __op);
   }
 return false;
      }

      static void
      _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
      {
 std::mem_fn(_Base::_M_get_pointer(__functor)->__value)(
     std::forward<_ArgTypes>(__args)...);
      }
    };

  template<typename _From, typename _To>
    using __check_func_return_type
      = __or_<is_void<_To>, is_same<_From, _To>, is_convertible<_From, _To>>;







  template<typename _Res, typename... _ArgTypes>
    class function<_Res(_ArgTypes...)>
    : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>,
      private _Function_base
    {
      typedef _Res _Signature_type(_ArgTypes...);

      template<typename _Func,
        typename _Res2 = typename result_of<_Func&(_ArgTypes...)>::type>
 struct _Callable : __check_func_return_type<_Res2, _Res> { };



      template<typename _Tp>
 struct _Callable<function, _Tp> : false_type { };

      template<typename _Cond, typename _Tp>
 using _Requires = typename enable_if<_Cond::value, _Tp>::type;

    public:
      typedef _Res result_type;







      function() noexcept
      : _Function_base() { }





      function(nullptr_t) noexcept
      : _Function_base() { }
# 1879 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      function(const function& __x);
# 1888 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      function(function&& __x) : _Function_base()
      {
 __x.swap(*this);
      }
# 1911 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      template<typename _Functor,
        typename = _Requires<__not_<is_same<_Functor, function>>, void>,
        typename = _Requires<_Callable<_Functor>, void>>
 function(_Functor);
# 1928 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      function&
      operator=(const function& __x)
      {
 function(__x).swap(*this);
 return *this;
      }
# 1946 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      function&
      operator=(function&& __x)
      {
 function(std::move(__x)).swap(*this);
 return *this;
      }
# 1960 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      function&
      operator=(nullptr_t) noexcept
      {
 if (_M_manager)
   {
     _M_manager(_M_functor, _M_functor, __destroy_functor);
     _M_manager = nullptr;
     _M_invoker = nullptr;
   }
 return *this;
      }
# 1988 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      template<typename _Functor>
 _Requires<_Callable<typename decay<_Functor>::type>, function&>
 operator=(_Functor&& __f)
 {
   function(std::forward<_Functor>(__f)).swap(*this);
   return *this;
 }


      template<typename _Functor>
 function&
 operator=(reference_wrapper<_Functor> __f) noexcept
 {
   function(__f).swap(*this);
   return *this;
 }
# 2014 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      void swap(function& __x) noexcept
      {
 std::swap(_M_functor, __x._M_functor);
 std::swap(_M_manager, __x._M_manager);
 std::swap(_M_invoker, __x._M_invoker);
      }
# 2042 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      explicit operator bool() const noexcept
      { return !_M_empty(); }
# 2055 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      _Res operator()(_ArgTypes... __args) const;
# 2068 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      const type_info& target_type() const noexcept;
# 2079 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
      template<typename _Functor> _Functor* target() noexcept;


      template<typename _Functor> const _Functor* target() const noexcept;


    private:
      using _Invoker_type = _Res (*)(const _Any_data&, _ArgTypes&&...);
      _Invoker_type _M_invoker;
  };


  template<typename _Res, typename... _ArgTypes>
    function<_Res(_ArgTypes...)>::
    function(const function& __x)
    : _Function_base()
    {
      if (static_cast<bool>(__x))
 {
   __x._M_manager(_M_functor, __x._M_functor, __clone_functor);
   _M_invoker = __x._M_invoker;
   _M_manager = __x._M_manager;
 }
    }

  template<typename _Res, typename... _ArgTypes>
    template<typename _Functor, typename, typename>
      function<_Res(_ArgTypes...)>::
      function(_Functor __f)
      : _Function_base()
      {
 typedef _Function_handler<_Signature_type, _Functor> _My_handler;

 if (_My_handler::_M_not_empty_function(__f))
   {
     _My_handler::_M_init_functor(_M_functor, std::move(__f));
     _M_invoker = &_My_handler::_M_invoke;
     _M_manager = &_My_handler::_M_manager;
   }
      }

  template<typename _Res, typename... _ArgTypes>
    _Res
    function<_Res(_ArgTypes...)>::
    operator()(_ArgTypes... __args) const
    {
      if (_M_empty())
 __throw_bad_function_call();
      return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
    }


  template<typename _Res, typename... _ArgTypes>
    const type_info&
    function<_Res(_ArgTypes...)>::
    target_type() const noexcept
    {
      if (_M_manager)
 {
   _Any_data __typeinfo_result;
   _M_manager(__typeinfo_result, _M_functor, __get_type_info);
   return *__typeinfo_result._M_access<const type_info*>();
 }
      else
 return typeid(void);
    }

  template<typename _Res, typename... _ArgTypes>
    template<typename _Functor>
      _Functor*
      function<_Res(_ArgTypes...)>::
      target() noexcept
      {
 if (typeid(_Functor) == target_type() && _M_manager)
   {
     _Any_data __ptr;
     if (_M_manager(__ptr, _M_functor, __get_functor_ptr)
  && !is_const<_Functor>::value)
       return 0;
     else
       return __ptr._M_access<_Functor*>();
   }
 else
   return 0;
      }

  template<typename _Res, typename... _ArgTypes>
    template<typename _Functor>
      const _Functor*
      function<_Res(_ArgTypes...)>::
      target() const noexcept
      {
 if (typeid(_Functor) == target_type() && _M_manager)
   {
     _Any_data __ptr;
     _M_manager(__ptr, _M_functor, __get_functor_ptr);
     return __ptr._M_access<const _Functor*>();
   }
 else
   return 0;
      }
# 2191 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<typename _Res, typename... _Args>
    inline bool
    operator==(const function<_Res(_Args...)>& __f, nullptr_t) noexcept
    { return !static_cast<bool>(__f); }


  template<typename _Res, typename... _Args>
    inline bool
    operator==(nullptr_t, const function<_Res(_Args...)>& __f) noexcept
    { return !static_cast<bool>(__f); }
# 2209 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<typename _Res, typename... _Args>
    inline bool
    operator!=(const function<_Res(_Args...)>& __f, nullptr_t) noexcept
    { return static_cast<bool>(__f); }


  template<typename _Res, typename... _Args>
    inline bool
    operator!=(nullptr_t, const function<_Res(_Args...)>& __f) noexcept
    { return static_cast<bool>(__f); }
# 2229 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/functional" 3
  template<typename _Res, typename... _Args>
    inline void
    swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y) noexcept
    { __x.swap(__y); }


}
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2



namespace JS {
template<class T>
class Heap;
}

class nsRegion;
namespace mozilla {
namespace layers {
struct TileClient;
}
}

namespace mozilla {
struct SerializedStructuredCloneBuffer;
class SourceBufferTask;
}

namespace mozilla {
namespace dom {
namespace ipc {
class StructuredCloneData;
}
}
}

namespace mozilla {
namespace dom {
class ClonedMessageData;
class MessagePortMessage;
namespace indexedDB {
struct StructuredCloneReadInfo;
class SerializedStructuredCloneReadInfo;
class ObjectStoreCursorResponse;
}
}
}

class JSStructuredCloneData;
# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
struct nsTArrayFallibleResult
{

               nsTArrayFallibleResult(bool aResult) : mResult(aResult) {}

               operator bool() { return mResult; }

private:
  bool mResult;
};

struct nsTArrayInfallibleResult
{
};






struct nsTArrayFallibleAllocatorBase
{
  typedef bool ResultType;
  typedef nsTArrayFallibleResult ResultTypeProxy;

  static ResultType Result(ResultTypeProxy aResult) { return aResult; }
  static bool Successful(ResultTypeProxy aResult) { return aResult; }
  static ResultTypeProxy SuccessResult() { return true; }
  static ResultTypeProxy FailureResult() { return false; }
  static ResultType ConvertBoolToResultType(bool aValue) { return aValue; }
};

struct nsTArrayInfallibleAllocatorBase
{
  typedef void ResultType;
  typedef nsTArrayInfallibleResult ResultTypeProxy;

  static ResultType Result(ResultTypeProxy aResult) {}
  static bool Successful(ResultTypeProxy) { return true; }
  static ResultTypeProxy SuccessResult() { return ResultTypeProxy(); }

  static ResultTypeProxy FailureResult()
  {
    do { AnnotateMozCrashReason("MOZ_CRASH(" "Infallible nsTArray should never fail" ")"); do { *((volatile int*) __null) = 180; ::abort(); } while (0); } while (0);
    return ResultTypeProxy();
  }

  static ResultType ConvertBoolToResultType(bool aValue)
  {
    if (!aValue) {
      do { AnnotateMozCrashReason("MOZ_CRASH(" "infallible nsTArray should never convert false to ResultType" ")"); do { *((volatile int*) __null) = 187; ::abort(); } while (0); } while (0);
    }
  }
};

struct nsTArrayFallibleAllocator : nsTArrayFallibleAllocatorBase
{
  static void* Malloc(size_t aSize) { return malloc(aSize); }
  static void* Realloc(void* aPtr, size_t aSize)
  {
    return realloc(aPtr, aSize);
  }

  static void Free(void* aPtr) { free(aPtr); }
  static void SizeTooBig(size_t) {}
};




struct nsTArrayInfallibleAllocator : nsTArrayInfallibleAllocatorBase
{
  static void* Malloc(size_t aSize) { return moz_xmalloc(aSize); }
  static void* Realloc(void* aPtr, size_t aSize)
  {
    return moz_xrealloc(aPtr, aSize);
  }

  static void Free(void* aPtr) { free(aPtr); }
  static void SizeTooBig(size_t aSize) { NS_ABORT_OOM(aSize); }
};
# 251 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
struct nsTArrayHeader
{
  static nsTArrayHeader sEmptyHdr;

  uint32_t mLength;
  uint32_t mCapacity : 31;
  uint32_t mIsAutoArray : 1;
};



template<class E, class Derived>
struct nsTArray_SafeElementAtHelper
{
  typedef E* elem_type;
  typedef size_t index_type;




  elem_type& SafeElementAt(index_type aIndex);
  const elem_type& SafeElementAt(index_type aIndex) const;
};

template<class E, class Derived>
struct nsTArray_SafeElementAtHelper<E*, Derived>
{
  typedef E* elem_type;

  typedef size_t index_type;

  elem_type SafeElementAt(index_type aIndex)
  {
    return static_cast<Derived*>(this)->SafeElementAt(aIndex, nullptr);
  }





  elem_type SafeElementAt(index_type aIndex) const
  {
    return static_cast<const Derived*>(this)->SafeElementAt(aIndex, nullptr);
  }
};



template<class E, class Derived>
struct nsTArray_SafeElementAtSmartPtrHelper
{
  typedef E* elem_type;
  typedef const E* const_elem_type;
  typedef size_t index_type;

  elem_type SafeElementAt(index_type aIndex)
  {
    return static_cast<Derived*>(this)->SafeElementAt(aIndex, nullptr);
  }


  elem_type SafeElementAt(index_type aIndex) const
  {
    return static_cast<const Derived*>(this)->SafeElementAt(aIndex, nullptr);
  }
};

template<class T> class nsCOMPtr;

template<class E, class Derived>
struct nsTArray_SafeElementAtHelper<nsCOMPtr<E>, Derived>
  : public nsTArray_SafeElementAtSmartPtrHelper<E, Derived>
{
};

template<class E, class Derived>
struct nsTArray_SafeElementAtHelper<RefPtr<E>, Derived>
  : public nsTArray_SafeElementAtSmartPtrHelper<E, Derived>
{
};

namespace mozilla {
template<class T> class OwningNonNull;
}

template<class E, class Derived>
struct nsTArray_SafeElementAtHelper<mozilla::OwningNonNull<E>, Derived>
{
  typedef E* elem_type;
  typedef const E* const_elem_type;
  typedef size_t index_type;

  elem_type SafeElementAt(index_type aIndex)
  {
    if (aIndex < static_cast<Derived*>(this)->Length()) {
      return static_cast<Derived*>(this)->ElementAt(aIndex);
    }
    return nullptr;
  }


  elem_type SafeElementAt(index_type aIndex) const
  {
    if (aIndex < static_cast<const Derived*>(this)->Length()) {
      return static_cast<const Derived*>(this)->ElementAt(aIndex);
    }
    return nullptr;
  }
};


extern "C" void Gecko_EnsureTArrayCapacity(void* aArray,
                                           size_t aCapacity,
                                           size_t aElementSize);
extern "C" void Gecko_ClearPODTArray(void* aArray,
                                     size_t aElementSize,
                                     size_t aElementAlign);

__attribute__((noreturn)) __attribute__ ((cold)) void
InvalidArrayIndex_CRASH(size_t aIndex, size_t aLength);






template<class Alloc, class Copy>
class nsTArray_base
{



  template<class Allocator, class Copier>
  friend class nsTArray_base;
  friend void Gecko_EnsureTArrayCapacity(void* aArray, size_t aCapacity,
                                         size_t aElemSize);
  friend void Gecko_ClearPODTArray(void* aTArray, size_t aElementSize,
                                   size_t aElementAlign);

protected:
  typedef nsTArrayHeader Header;

public:
  typedef size_t size_type;
  typedef size_t index_type;


  size_type Length() const { return mHdr->mLength; }


  bool IsEmpty() const { return Length() == 0; }




  size_type Capacity() const { return mHdr->mCapacity; }





protected:
  nsTArray_base();

  ~nsTArray_base();





  template<typename ActualAlloc>
  typename ActualAlloc::ResultTypeProxy EnsureCapacity(size_type aCapacity,
                                                       size_type aElemSize);





  void ShrinkCapacity(size_type aElemSize, size_t aElemAlign);
# 439 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  template<typename ActualAlloc>
  void ShiftData(index_type aStart, size_type aOldLen, size_type aNewLen,
                 size_type aElemSize, size_t aElemAlign);





  void IncrementLength(size_t aNum)
  {
    if (mHdr == EmptyHdr()) {
      if ((__builtin_expect(!!(aNum != 0), 0))) {

        do { AnnotateMozCrashReason("MOZ_CRASH(" ")"); do { *((volatile int*) __null) = 452; ::abort(); } while (0); } while (0);
      }
    } else {
      mHdr->mLength += aNum;
    }
  }







  template<typename ActualAlloc>
  bool InsertSlotsAt(index_type aIndex, size_type aCount,
                     size_type aElementSize, size_t aElemAlign);

  template<typename ActualAlloc, class Allocator>
  typename ActualAlloc::ResultTypeProxy
  SwapArrayElements(nsTArray_base<Allocator, Copy>& aOther,
                    size_type aElemSize,
                    size_t aElemAlign);


  class IsAutoArrayRestorer
  {
  public:
    IsAutoArrayRestorer(nsTArray_base<Alloc, Copy>& aArray, size_t aElemAlign);
    ~IsAutoArrayRestorer();

  private:
    nsTArray_base<Alloc, Copy>& mArray;
    size_t mElemAlign;
    bool mIsAuto;
  };



  template<typename ActualAlloc>
  bool EnsureNotUsingAutoArrayBuffer(size_type aElemSize);


  bool IsAutoArray() const { return mHdr->mIsAutoArray; }


  Header* GetAutoArrayBuffer(size_t aElemAlign)
  {
    do { } while (0);
    return GetAutoArrayBufferUnsafe(aElemAlign);
  }
  const Header* GetAutoArrayBuffer(size_t aElemAlign) const
  {
    do { } while (0);
    return GetAutoArrayBufferUnsafe(aElemAlign);
  }



  Header* GetAutoArrayBufferUnsafe(size_t aElemAlign)
  {
    return const_cast<Header*>(static_cast<const nsTArray_base<Alloc, Copy>*>(
      this)->GetAutoArrayBufferUnsafe(aElemAlign));
  }
  const Header* GetAutoArrayBufferUnsafe(size_t aElemAlign) const;



  bool UsesAutoArrayBuffer() const;



  Header* mHdr;

  Header* Hdr() const { return mHdr; }
  Header** PtrToHdr() { return &mHdr; }
  static Header* EmptyHdr() { return &Header::sEmptyHdr; }
};





template<class E>
class nsTArrayElementTraits
{
public:

  static inline void Construct(E* aE)
  {





    new (static_cast<void*>(aE)) E;
  }

  template<class A>
  static inline void Construct(E* aE, A&& aArg)
  {
    typedef typename mozilla::RemoveCV<E>::Type E_NoCV;
    typedef typename mozilla::RemoveCV<A>::Type A_NoCV;
    static_assert(!mozilla::IsSame<E_NoCV*, A_NoCV>::value,
                  "For safety, we disallow constructing nsTArray<E> elements "
                  "from E* pointers. See bug 960591.");
    new (static_cast<void*>(aE)) E(mozilla::Forward<A>(aArg));
  }

  static inline void Destruct(E* aE) { aE->~E(); }
};


template<class A, class B>
class nsDefaultComparator
{
public:
  bool Equals(const A& aA, const B& aB) const { return aA == aB; }
  bool LessThan(const A& aA, const B& aB) const { return aA < aB; }
};

template<bool IsPod, bool IsSameType>
struct AssignRangeAlgorithm
{
  template<class Item, class ElemType, class IndexType, class SizeType>
  static void implementation(ElemType* aElements, IndexType aStart,
                             SizeType aCount, const Item* aValues)
  {
    ElemType* iter = aElements + aStart;
    ElemType* end = iter + aCount;
    for (; iter != end; ++iter, ++aValues) {
      nsTArrayElementTraits<ElemType>::Construct(iter, *aValues);
    }
  }
};

template<>
struct AssignRangeAlgorithm<true, true>
{
  template<class Item, class ElemType, class IndexType, class SizeType>
  static void implementation(ElemType* aElements, IndexType aStart,
                             SizeType aCount, const Item* aValues)
  {
    memcpy(aElements + aStart, aValues, aCount * sizeof(ElemType));
  }
};
# 608 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
struct nsTArray_CopyWithMemutils
{
  const static bool allowRealloc = true;

  static void MoveNonOverlappingRegionWithHeader(void* aDest, const void* aSrc,
                                                 size_t aCount, size_t aElemSize)
  {
    memcpy(aDest, aSrc, sizeof(nsTArrayHeader) + aCount * aElemSize);
  }

  static void MoveOverlappingRegion(void* aDest, void* aSrc, size_t aCount,
                                    size_t aElemSize)
  {
    memmove(aDest, aSrc, aCount * aElemSize);
  }

  static void MoveNonOverlappingRegion(void* aDest, void* aSrc, size_t aCount,
                                       size_t aElemSize)
  {
    memcpy(aDest, aSrc, aCount * aElemSize);
  }
};





template<class ElemType>
struct nsTArray_CopyWithConstructors
{
  typedef nsTArrayElementTraits<ElemType> traits;

  const static bool allowRealloc = false;

  static void MoveNonOverlappingRegionWithHeader(void* aDest, void* aSrc, size_t aCount,
                                                 size_t aElemSize)
  {
    nsTArrayHeader* destHeader = static_cast<nsTArrayHeader*>(aDest);
    nsTArrayHeader* srcHeader = static_cast<nsTArrayHeader*>(aSrc);
    *destHeader = *srcHeader;
    MoveNonOverlappingRegion(static_cast<uint8_t*>(aDest) + sizeof(nsTArrayHeader),
                             static_cast<uint8_t*>(aSrc) + sizeof(nsTArrayHeader),
                             aCount, aElemSize);
  }
# 662 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  static void MoveOverlappingRegion(void* aDest, void* aSrc, size_t aCount,
                                    size_t aElemSize)
  {
    ElemType* destElem = static_cast<ElemType*>(aDest);
    ElemType* srcElem = static_cast<ElemType*>(aSrc);
    ElemType* destElemEnd = destElem + aCount;
    ElemType* srcElemEnd = srcElem + aCount;
    if (destElem == srcElem) {
      return;
    }


    if (srcElemEnd > destElem && srcElemEnd < destElemEnd) {
      while (destElemEnd != destElem) {
        --destElemEnd;
        --srcElemEnd;
        traits::Construct(destElemEnd, mozilla::Move(*srcElemEnd));
        traits::Destruct(srcElemEnd);
      }
    } else {
      MoveNonOverlappingRegion(aDest, aSrc, aCount, aElemSize);
    }
  }

  static void MoveNonOverlappingRegion(void* aDest, void* aSrc, size_t aCount,
                                       size_t aElemSize)
  {
    ElemType* destElem = static_cast<ElemType*>(aDest);
    ElemType* srcElem = static_cast<ElemType*>(aSrc);
    ElemType* destElemEnd = destElem + aCount;




    while (destElem != destElemEnd) {
      traits::Construct(destElem, mozilla::Move(*srcElem));
      traits::Destruct(srcElem);
      ++destElem;
      ++srcElem;
    }
  }
};




template<class E>
struct nsTArray_CopyChooser
{
  typedef nsTArray_CopyWithMemutils Type;
};
# 725 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
template<class E>
struct nsTArray_CopyChooser<JS::Heap<E>>
{
  typedef nsTArray_CopyWithConstructors<JS::Heap<E>> Type;
};

template<> struct nsTArray_CopyChooser<nsRegion> { typedef nsTArray_CopyWithConstructors<nsRegion> Type; };
template<> struct nsTArray_CopyChooser<nsIntRegion> { typedef nsTArray_CopyWithConstructors<nsIntRegion> Type; };
template<> struct nsTArray_CopyChooser<mozilla::layers::TileClient> { typedef nsTArray_CopyWithConstructors<mozilla::layers::TileClient> Type; };
template<> struct nsTArray_CopyChooser<mozilla::SerializedStructuredCloneBuffer> { typedef nsTArray_CopyWithConstructors<mozilla::SerializedStructuredCloneBuffer> Type; };
template<> struct nsTArray_CopyChooser<mozilla::dom::ipc::StructuredCloneData> { typedef nsTArray_CopyWithConstructors<mozilla::dom::ipc::StructuredCloneData> Type; };
template<> struct nsTArray_CopyChooser<mozilla::dom::ClonedMessageData> { typedef nsTArray_CopyWithConstructors<mozilla::dom::ClonedMessageData> Type; };
template<> struct nsTArray_CopyChooser<mozilla::dom::indexedDB::StructuredCloneReadInfo> { typedef nsTArray_CopyWithConstructors<mozilla::dom::indexedDB::StructuredCloneReadInfo> Type; };;
template<> struct nsTArray_CopyChooser<mozilla::dom::indexedDB::ObjectStoreCursorResponse> { typedef nsTArray_CopyWithConstructors<mozilla::dom::indexedDB::ObjectStoreCursorResponse> Type; };
template<> struct nsTArray_CopyChooser<mozilla::dom::indexedDB::SerializedStructuredCloneReadInfo> { typedef nsTArray_CopyWithConstructors<mozilla::dom::indexedDB::SerializedStructuredCloneReadInfo> Type; };;
template<> struct nsTArray_CopyChooser<JSStructuredCloneData> { typedef nsTArray_CopyWithConstructors<JSStructuredCloneData> Type; };
template<> struct nsTArray_CopyChooser<mozilla::dom::MessagePortMessage> { typedef nsTArray_CopyWithConstructors<mozilla::dom::MessagePortMessage> Type; };
template<> struct nsTArray_CopyChooser<mozilla::SourceBufferTask> { typedef nsTArray_CopyWithConstructors<mozilla::SourceBufferTask> Type; };

template<typename T>
struct nsTArray_CopyChooser<std::function<T>>
{
  typedef nsTArray_CopyWithConstructors<std::function<T>> Type;
};







template<class E, class Derived>
struct nsTArray_TypedBase : public nsTArray_SafeElementAtHelper<E, Derived>
{
};
# 772 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
template<class E, class Derived>
struct nsTArray_TypedBase<JS::Heap<E>, Derived>
  : public nsTArray_SafeElementAtHelper<JS::Heap<E>, Derived>
{
  operator const nsTArray<E>&()
  {
    static_assert(sizeof(E) == sizeof(JS::Heap<E>),
                  "JS::Heap<E> must be binary compatible with E.");
    Derived* self = static_cast<Derived*>(this);
    return *reinterpret_cast<nsTArray<E> *>(self);
  }

  operator const FallibleTArray<E>&()
  {
    Derived* self = static_cast<Derived*>(this);
    return *reinterpret_cast<FallibleTArray<E> *>(self);
  }
};

namespace detail {

template<class Item, class Comparator>
struct ItemComparatorEq
{
  const Item& mItem;
  const Comparator& mComp;
  ItemComparatorEq(const Item& aItem, const Comparator& aComp)
    : mItem(aItem)
    , mComp(aComp)
  {}
  template<class T>
  int operator()(const T& aElement) const {
    if (mComp.Equals(aElement, mItem)) {
      return 0;
    }

    return mComp.LessThan(aElement, mItem) ? 1 : -1;
  }
};

template<class Item, class Comparator>
struct ItemComparatorFirstElementGT
{
  const Item& mItem;
  const Comparator& mComp;
  ItemComparatorFirstElementGT(const Item& aItem, const Comparator& aComp)
    : mItem(aItem)
    , mComp(aComp)
  {}
  template<class T>
  int operator()(const T& aElement) const {
    if (mComp.LessThan(aElement, mItem) ||
        mComp.Equals(aElement, mItem)) {
      return 1;
    } else {
      return -1;
    }
  }
};

}
# 846 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
template<class E, class Alloc>
class nsTArray_Impl
  : public nsTArray_base<Alloc, typename nsTArray_CopyChooser<E>::Type>
  , public nsTArray_TypedBase<E, nsTArray_Impl<E, Alloc>>
{
private:
  typedef nsTArrayFallibleAllocator FallibleAlloc;
  typedef nsTArrayInfallibleAllocator InfallibleAlloc;

public:
  typedef typename nsTArray_CopyChooser<E>::Type copy_type;
  typedef nsTArray_base<Alloc, copy_type> base_type;
  typedef typename base_type::size_type size_type;
  typedef typename base_type::index_type index_type;
  typedef E elem_type;
  typedef nsTArray_Impl<E, Alloc> self_type;
  typedef nsTArrayElementTraits<E> elem_traits;
  typedef nsTArray_SafeElementAtHelper<E, self_type> safeelementat_helper_type;
  typedef mozilla::ArrayIterator<elem_type&, nsTArray<E>> iterator;
  typedef mozilla::ArrayIterator<const elem_type&, nsTArray<E>> const_iterator;
  typedef mozilla::ReverseIterator<iterator> reverse_iterator;
  typedef mozilla::ReverseIterator<const_iterator> const_reverse_iterator;

  using safeelementat_helper_type::SafeElementAt;
  using base_type::EmptyHdr;



  static const index_type NoIndex = index_type(-1);

  using base_type::Length;





  ~nsTArray_Impl() { Clear(); }





  nsTArray_Impl() {}


  explicit nsTArray_Impl(size_type aCapacity) { SetCapacity(aCapacity); }



  template<typename Allocator>
  explicit nsTArray_Impl(nsTArray_Impl<E, Allocator>&& aOther)
  {
    SwapElements(aOther);
  }
# 916 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  explicit nsTArray_Impl(const self_type& aOther) { AppendElements(aOther); }

  explicit nsTArray_Impl(std::initializer_list<E> aIL) { AppendElements(aIL.begin(), aIL.size()); }


  template<typename Allocator>
  operator const nsTArray_Impl<E, Allocator>&() const
  {
    return *reinterpret_cast<const nsTArray_Impl<E, Allocator>*>(this);
  }

  operator const nsTArray<E>&() const
  {
    return *reinterpret_cast<const InfallibleTArray<E>*>(this);
  }
  operator const FallibleTArray<E>&() const
  {
    return *reinterpret_cast<const FallibleTArray<E>*>(this);
  }




  self_type& operator=(const self_type& aOther)
  {
    if (this != &aOther) {
      ReplaceElementsAt(0, Length(), aOther.Elements(), aOther.Length());
    }
    return *this;
  }




  self_type& operator=(self_type&& aOther)
  {
    if (this != &aOther) {
      Clear();
      SwapElements(aOther);
    }
    return *this;
  }



  template<typename Allocator>
  bool operator==(const nsTArray_Impl<E, Allocator>& aOther) const
  {
    size_type len = Length();
    if (len != aOther.Length()) {
      return false;
    }


    for (index_type i = 0; i < len; ++i) {
      if (!(operator[](i) == aOther[i])) {
        return false;
      }
    }

    return true;
  }



  bool operator!=(const self_type& aOther) const { return !operator==(aOther); }

  template<typename Allocator>
  self_type& operator=(const nsTArray_Impl<E, Allocator>& aOther)
  {
    ReplaceElementsAt(0, Length(), aOther.Elements(), aOther.Length());
    return *this;
  }

  template<typename Allocator>
  self_type& operator=(nsTArray_Impl<E, Allocator>&& aOther)
  {
    Clear();
    SwapElements(aOther);
    return *this;
  }





  size_t ShallowSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    if (this->UsesAutoArrayBuffer() || Hdr() == EmptyHdr()) {
      return 0;
    }
    return aMallocSizeOf(this->Hdr());
  }





  size_t ShallowSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(this) + ShallowSizeOfExcludingThis(aMallocSizeOf);
  }
# 1026 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  elem_type* Elements() { return reinterpret_cast<elem_type*>(Hdr() + 1); }




  const elem_type* Elements() const
  {
    return reinterpret_cast<const elem_type*>(Hdr() + 1);
  }





  elem_type& ElementAt(index_type aIndex)
  {
    if ((__builtin_expect(!!(aIndex >= Length()), 0))) {
      InvalidArrayIndex_CRASH(aIndex, Length());
    }
    return Elements()[aIndex];
  }





  const elem_type& ElementAt(index_type aIndex) const
  {
    if ((__builtin_expect(!!(aIndex >= Length()), 0))) {
      InvalidArrayIndex_CRASH(aIndex, Length());
    }
    return Elements()[aIndex];
  }






  elem_type& SafeElementAt(index_type aIndex, elem_type& aDef)
  {
    return aIndex < Length() ? Elements()[aIndex] : aDef;
  }






  const elem_type& SafeElementAt(index_type aIndex, const elem_type& aDef) const
  {
    return aIndex < Length() ? Elements()[aIndex] : aDef;
  }


  elem_type& operator[](index_type aIndex) { return ElementAt(aIndex); }


  const elem_type& operator[](index_type aIndex) const { return ElementAt(aIndex); }


  elem_type& LastElement() { return ElementAt(Length() - 1); }


  const elem_type& LastElement() const { return ElementAt(Length() - 1); }


  elem_type& SafeLastElement(elem_type& aDef)
  {
    return SafeElementAt(Length() - 1, aDef);
  }


  const elem_type& SafeLastElement(const elem_type& aDef) const
  {
    return SafeElementAt(Length() - 1, aDef);
  }


  iterator begin() { return iterator(*this, 0); }
  const_iterator begin() const { return const_iterator(*this, 0); }
  const_iterator cbegin() const { return begin(); }
  iterator end() { return iterator(*this, Length()); }
  const_iterator end() const { return const_iterator(*this, Length()); }
  const_iterator cend() const { return end(); }


  reverse_iterator rbegin() { return reverse_iterator(end()); }
  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
  const_reverse_iterator crbegin() const { return rbegin(); }
  reverse_iterator rend() { return reverse_iterator(begin()); }
  const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
  const_reverse_iterator crend() const { return rend(); }



  operator mozilla::Span<elem_type>()
  {
    return mozilla::Span<elem_type>(Elements(), Length());
  }

  operator mozilla::Span<const elem_type>() const
  {
    return mozilla::Span<const elem_type>(Elements(), Length());
  }
# 1141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  template<class Item, class Comparator>
  bool Contains(const Item& aItem, const Comparator& aComp) const
  {
    return IndexOf(aItem, 0, aComp) != NoIndex;
  }






  template<class Item>
  bool Contains(const Item& aItem) const
  {
    return IndexOf(aItem) != NoIndex;
  }







  template<class Item, class Comparator>
  index_type IndexOf(const Item& aItem, index_type aStart,
                     const Comparator& aComp) const
  {
    const elem_type* iter = Elements() + aStart;
    const elem_type* iend = Elements() + Length();
    for (; iter != iend; ++iter) {
      if (aComp.Equals(*iter, aItem)) {
        return index_type(iter - Elements());
      }
    }
    return NoIndex;
  }







  template<class Item>
  index_type IndexOf(const Item& aItem, index_type aStart = 0) const
  {
    return IndexOf(aItem, aStart, nsDefaultComparator<elem_type, Item>());
  }
# 1197 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  template<class Item, class Comparator>
  index_type LastIndexOf(const Item& aItem, index_type aStart,
                         const Comparator& aComp) const
  {
    size_type endOffset = aStart >= Length() ? Length() : aStart + 1;
    const elem_type* iend = Elements() - 1;
    const elem_type* iter = iend + endOffset;
    for (; iter != iend; --iter) {
      if (aComp.Equals(*iter, aItem)) {
        return index_type(iter - Elements());
      }
    }
    return NoIndex;
  }
# 1219 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  template<class Item>
  index_type LastIndexOf(const Item& aItem,
                         index_type aStart = NoIndex) const
  {
    return LastIndexOf(aItem, aStart, nsDefaultComparator<elem_type, Item>());
  }
# 1233 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  template<class Item, class Comparator>
  index_type BinaryIndexOf(const Item& aItem, const Comparator& aComp) const
  {
    using mozilla::BinarySearchIf;
    typedef ::detail::ItemComparatorEq<Item, Comparator> Cmp;

    size_t index;
    bool found = BinarySearchIf(*this, 0, Length(), Cmp(aItem, aComp), &index);
    return found ? index : NoIndex;
  }






  template<class Item>
  index_type BinaryIndexOf(const Item& aItem) const
  {
    return BinaryIndexOf(aItem, nsDefaultComparator<elem_type, Item>());
  }





  template<class Allocator, typename ActualAlloc = Alloc>
  typename ActualAlloc::ResultType Assign(
      const nsTArray_Impl<E, Allocator>& aOther)
  {
    return ActualAlloc::ConvertBoolToResultType(
      !!ReplaceElementsAt<E, ActualAlloc>(0, Length(),
                                          aOther.Elements(), aOther.Length()));
  }

  template<class Allocator>
  __attribute__ ((warn_unused_result))
  bool Assign(const nsTArray_Impl<E, Allocator>& aOther,
              const mozilla::fallible_t&)
  {
    return Assign<Allocator, FallibleAlloc>(aOther);
  }

  template<class Allocator>
  void Assign(nsTArray_Impl<E, Allocator>&& aOther)
  {
    Clear();
    SwapElements(aOther);
  }






  void ClearAndRetainStorage()
  {
    if (base_type::mHdr == EmptyHdr()) {
      return;
    }

    DestructRange(0, Length());
    base_type::mHdr->mLength = 0;
  }
# 1306 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  void SetLengthAndRetainStorage(size_type aNewLen)
  {
    do { } while (0);
    size_type oldLen = Length();
    if (aNewLen > oldLen) {
      InsertElementsAt(oldLen, aNewLen - oldLen);
      return;
    }
    if (aNewLen < oldLen) {
      DestructRange(aNewLen, oldLen - aNewLen);
      base_type::mHdr->mLength = aNewLen;
    }
  }
# 1330 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* ReplaceElementsAt(index_type aStart, size_type aCount,
                               const Item* aArray, size_type aArrayLen);

public:

  template<class Item>
  __attribute__ ((warn_unused_result))
  elem_type* ReplaceElementsAt(index_type aStart, size_type aCount,
                               const Item* aArray, size_type aArrayLen,
                               const mozilla::fallible_t&)
  {
    return ReplaceElementsAt<Item, FallibleAlloc>(aStart, aCount,
                                                  aArray, aArrayLen);
  }


protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* ReplaceElementsAt(index_type aStart, size_type aCount,
                               const nsTArray<Item>& aArray)
  {
    return ReplaceElementsAt<Item, ActualAlloc>(
      aStart, aCount, aArray.Elements(), aArray.Length());
  }

  template<class Item, typename ActualAlloc = Alloc>
  elem_type* ReplaceElementsAt(index_type aStart,
                               size_type aCount,
                               mozilla::Span<const Item> aSpan)
  {
    return ReplaceElementsAt<Item, ActualAlloc>(
      aStart, aCount, aSpan.Elements(), aSpan.Length());
  }

public:

  template<class Item>
  __attribute__ ((warn_unused_result))
  elem_type* ReplaceElementsAt(index_type aStart, size_type aCount,
                               const nsTArray<Item>& aArray,
                               const mozilla::fallible_t&)
  {
    return ReplaceElementsAt<Item, FallibleAlloc>(aStart, aCount, aArray);
  }

  template<class Item>
  __attribute__ ((warn_unused_result)) elem_type* ReplaceElementsAt(index_type aStart,
                                            size_type aCount,
                                            mozilla::Span<const Item> aSpan,
                                            const mozilla::fallible_t&)
  {
    return ReplaceElementsAt<Item, FallibleAlloc>(aStart, aCount, aSpan);
  }


protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* ReplaceElementsAt(index_type aStart, size_type aCount,
                               const Item& aItem)
  {
    return ReplaceElementsAt<Item, ActualAlloc>(aStart, aCount, &aItem, 1);
  }
public:

  template<class Item>
  __attribute__ ((warn_unused_result))
  elem_type* ReplaceElementsAt(index_type aStart, size_type aCount,
                               const Item& aItem, const mozilla::fallible_t&)
  {
    return ReplaceElementsAt<Item, FallibleAlloc>(aStart, aCount, aItem);
  }


  template<class Item>
  elem_type* ReplaceElementAt(index_type aIndex, const Item& aItem)
  {
    return ReplaceElementsAt(aIndex, 1, &aItem, 1);
  }


protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* InsertElementsAt(index_type aIndex, const Item* aArray,
                              size_type aArrayLen)
  {
    return ReplaceElementsAt<Item, ActualAlloc>(aIndex, 0, aArray, aArrayLen);
  }
public:

  template<class Item>
  __attribute__ ((warn_unused_result))
  elem_type* InsertElementsAt(index_type aIndex, const Item* aArray,
                              size_type aArrayLen, const mozilla::fallible_t&)
  {
    return InsertElementsAt<Item, FallibleAlloc>(aIndex, aArray, aArrayLen);
  }


protected:
  template<class Item, class Allocator, typename ActualAlloc = Alloc>
  elem_type* InsertElementsAt(index_type aIndex,
                              const nsTArray_Impl<Item, Allocator>& aArray)
  {
    return ReplaceElementsAt<Item, ActualAlloc>(
      aIndex, 0, aArray.Elements(), aArray.Length());
  }

  template<class Item, typename ActualAlloc = Alloc>
  elem_type* InsertElementsAt(index_type aIndex,
                              mozilla::Span<const Item> aSpan)
  {
    return ReplaceElementsAt<Item, ActualAlloc>(
      aIndex, 0, aSpan.Elements(), aSpan.Length());
  }

public:

  template<class Item, class Allocator>
  __attribute__ ((warn_unused_result))
  elem_type* InsertElementsAt(index_type aIndex,
                              const nsTArray_Impl<Item, Allocator>& aArray,
                              const mozilla::fallible_t&)
  {
    return InsertElementsAt<Item, Allocator, FallibleAlloc>(aIndex, aArray);
  }

  template<class Item>
  __attribute__ ((warn_unused_result)) elem_type* InsertElementsAt(index_type aIndex,
                                           mozilla::Span<const Item> aSpan,
                                           const mozilla::fallible_t&)
  {
    return InsertElementsAt<Item, FallibleAlloc>(aIndex, aSpan);
  }




protected:
  template<typename ActualAlloc = Alloc>
  elem_type* InsertElementAt(index_type aIndex);

public:

  __attribute__ ((warn_unused_result))
  elem_type* InsertElementAt(index_type aIndex, const mozilla::fallible_t&)
  {
    return InsertElementAt<FallibleAlloc>(aIndex);
  }


protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* InsertElementAt(index_type aIndex, Item&& aItem);

public:

  template<class Item>
  __attribute__ ((warn_unused_result))
  elem_type* InsertElementAt(index_type aIndex, Item&& aItem,
                             const mozilla::fallible_t&)
  {
    return InsertElementAt<Item, FallibleAlloc>(aIndex,
                                                mozilla::Forward<Item>(aItem));
  }
# 1507 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  elem_type* ReconstructElementAt(index_type aIndex)
  {
    elem_type* elem = &ElementAt(aIndex);
    elem_traits::Destruct(elem);
    elem_traits::Construct(elem);
    return elem;
  }
# 1530 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  template<class Item, class Comparator>
  index_type IndexOfFirstElementGt(const Item& aItem,
                                   const Comparator& aComp) const
  {
    using mozilla::BinarySearchIf;
    typedef ::detail::ItemComparatorFirstElementGT<Item, Comparator> Cmp;

    size_t index;
    BinarySearchIf(*this, 0, Length(), Cmp(aItem, aComp), &index);
    return index;
  }


  template<class Item>
  index_type
  IndexOfFirstElementGt(const Item& aItem) const
  {
    return IndexOfFirstElementGt(aItem, nsDefaultComparator<elem_type, Item>());
  }




protected:
  template<class Item, class Comparator, typename ActualAlloc = Alloc>
  elem_type* InsertElementSorted(Item&& aItem, const Comparator& aComp)
  {
    index_type index = IndexOfFirstElementGt<Item, Comparator>(aItem, aComp);
    return InsertElementAt<Item, ActualAlloc>(
      index, mozilla::Forward<Item>(aItem));
  }
public:

  template<class Item, class Comparator>
  __attribute__ ((warn_unused_result))
  elem_type* InsertElementSorted(Item&& aItem, const Comparator& aComp,
                                 const mozilla::fallible_t&)
  {
    return InsertElementSorted<Item, Comparator, FallibleAlloc>(
      mozilla::Forward<Item>(aItem), aComp);
  }


protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* InsertElementSorted(Item&& aItem)
  {
    nsDefaultComparator<elem_type, Item> comp;
    return InsertElementSorted<Item, decltype(comp), ActualAlloc>(
      mozilla::Forward<Item>(aItem), comp);
  }
public:

  template<class Item>
  __attribute__ ((warn_unused_result))
  elem_type* InsertElementSorted(Item&& aItem, const mozilla::fallible_t&)
  {
    return InsertElementSorted<Item, FallibleAlloc>(
      mozilla::Forward<Item>(aItem));
  }






protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* AppendElements(const Item* aArray, size_type aArrayLen);

  template<class Item, typename ActualAlloc = Alloc>
  elem_type* AppendElements(mozilla::Span<const Item> aSpan)
  {
    return AppendElements<Item, FallibleAlloc>(aSpan.Elements(),
                                               aSpan.Length());
  }

  template<class Item, size_t Length, typename ActualAlloc = Alloc>
  elem_type* AppendElements(const mozilla::Array<Item, Length>& aArray)
  {
    return AppendElements<Item, ActualAlloc>(&aArray[0], Length);
  }

public:

  template<class Item>

  elem_type* AppendElements(const Item* aArray, size_type aArrayLen,
                            const mozilla::fallible_t&)
  {
    return AppendElements<Item, FallibleAlloc>(aArray, aArrayLen);
  }

  template<class Item>

  elem_type* AppendElements(mozilla::Span<const Item> aSpan,
                            const mozilla::fallible_t&)
  {
    return AppendElements<Item, FallibleAlloc>(aSpan.Elements(),
                                               aSpan.Length());
  }


protected:
  template<class Item, class Allocator, typename ActualAlloc = Alloc>
  elem_type* AppendElements(const nsTArray_Impl<Item, Allocator>& aArray)
  {
    return AppendElements<Item, ActualAlloc>(aArray.Elements(), aArray.Length());
  }
public:

  template<class Item, class Allocator>

  elem_type* AppendElements(const nsTArray_Impl<Item, Allocator>& aArray,
                            const mozilla::fallible_t&)
  {
    return AppendElements<Item, Allocator, FallibleAlloc>(aArray);
  }



protected:
  template<class Item, class Allocator, typename ActualAlloc = Alloc>
  elem_type* AppendElements(nsTArray_Impl<Item, Allocator>&& aArray);

public:

  template<class Item, class Allocator, typename ActualAlloc = Alloc>

  elem_type* AppendElements(nsTArray_Impl<Item, Allocator>&& aArray,
                            const mozilla::fallible_t&)
  {
    return AppendElements<Item, Allocator>(mozilla::Move(aArray));
  }


protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* AppendElement(Item&& aItem);

public:

  template<class Item>

  elem_type* AppendElement(Item&& aItem,
                           const mozilla::fallible_t&)
  {
    return AppendElement<Item, FallibleAlloc>(mozilla::Forward<Item>(aItem));
  }




protected:
  template<typename ActualAlloc = Alloc>
  elem_type* AppendElements(size_type aCount) {
    if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
          Length() + aCount, sizeof(elem_type)))) {
      return nullptr;
    }
    elem_type* elems = Elements() + Length();
    size_type i;
    for (i = 0; i < aCount; ++i) {
      elem_traits::Construct(elems + i);
    }
    this->IncrementLength(aCount);
    return elems;
  }
public:


  elem_type* AppendElements(size_type aCount,
                            const mozilla::fallible_t&)
  {
    return AppendElements<FallibleAlloc>(aCount);
  }




protected:
  template<typename ActualAlloc = Alloc>
  elem_type* AppendElement()
  {
    return AppendElements<ActualAlloc>(1);
  }
public:


  elem_type* AppendElement(const mozilla::fallible_t&)
  {
    return AppendElement<FallibleAlloc>();
  }




  void RemoveElementsAt(index_type aStart, size_type aCount);


  void RemoveElementAt(index_type aIndex) { RemoveElementsAt(aIndex, 1); }


  void Clear() { RemoveElementsAt(0, Length()); }






  template<typename Predicate>
  void RemoveElementsBy(Predicate aPredicate);






  template<class Item, class Comparator>
  bool RemoveElement(const Item& aItem, const Comparator& aComp)
  {
    index_type i = IndexOf(aItem, 0, aComp);
    if (i == NoIndex) {
      return false;
    }

    RemoveElementAt(i);
    return true;
  }



  template<class Item>
  bool RemoveElement(const Item& aItem)
  {
    return RemoveElement(aItem, nsDefaultComparator<elem_type, Item>());
  }







  template<class Item, class Comparator>
  bool RemoveElementSorted(const Item& aItem, const Comparator& aComp)
  {
    index_type index = IndexOfFirstElementGt(aItem, aComp);
    if (index > 0 && aComp.Equals(ElementAt(index - 1), aItem)) {
      RemoveElementAt(index - 1);
      return true;
    }
    return false;
  }


  template<class Item>
  bool RemoveElementSorted(const Item& aItem)
  {
    return RemoveElementSorted(aItem, nsDefaultComparator<elem_type, Item>());
  }



  template<class Allocator>
  typename Alloc::ResultType SwapElements(nsTArray_Impl<E, Allocator>& aOther)
  {
    return Alloc::Result(this->template SwapArrayElements<Alloc>(
      aOther, sizeof(elem_type), mozilla::AlignmentFinder<elem_type>::alignment));
  }
# 1811 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
protected:
  template<typename ActualAlloc = Alloc>
  typename ActualAlloc::ResultType SetCapacity(size_type aCapacity)
  {
    return ActualAlloc::Result(this->template EnsureCapacity<ActualAlloc>(
      aCapacity, sizeof(elem_type)));
  }
public:

  __attribute__ ((warn_unused_result))
  bool SetCapacity(size_type aCapacity, const mozilla::fallible_t&)
  {
    return SetCapacity<FallibleAlloc>(aCapacity);
  }
# 1834 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
protected:
  template<typename ActualAlloc = Alloc>
  typename ActualAlloc::ResultType SetLength(size_type aNewLen)
  {
    size_type oldLen = Length();
    if (aNewLen > oldLen) {
      return ActualAlloc::ConvertBoolToResultType(
        InsertElementsAt<ActualAlloc>(oldLen, aNewLen - oldLen) != nullptr);
    }

    TruncateLength(aNewLen);
    return ActualAlloc::ConvertBoolToResultType(true);
  }
public:

  __attribute__ ((warn_unused_result))
  bool SetLength(size_type aNewLen, const mozilla::fallible_t&)
  {
    return SetLength<FallibleAlloc>(aNewLen);
  }







  void TruncateLength(size_type aNewLen)
  {
    size_type oldLen = Length();
    do { } while (0);

    RemoveElementsAt(aNewLen, oldLen - aNewLen);
  }







protected:
  template<typename ActualAlloc = Alloc>
  typename ActualAlloc::ResultType EnsureLengthAtLeast(size_type aMinLen)
  {
    size_type oldLen = Length();
    if (aMinLen > oldLen) {
      return ActualAlloc::ConvertBoolToResultType(
        !!InsertElementsAt<ActualAlloc>(oldLen, aMinLen - oldLen));
    }
    return ActualAlloc::ConvertBoolToResultType(true);
  }
public:

  __attribute__ ((warn_unused_result))
  bool EnsureLengthAtLeast(size_type aMinLen, const mozilla::fallible_t&)
  {
    return EnsureLengthAtLeast<FallibleAlloc>(aMinLen);
  }






protected:
  template<typename ActualAlloc = Alloc>
  elem_type* InsertElementsAt(index_type aIndex, size_type aCount)
  {
    if (!base_type::template InsertSlotsAt<ActualAlloc>(aIndex, aCount,
                                                        sizeof(elem_type),
                                                        mozilla::AlignmentFinder<elem_type>::alignment)) {
      return nullptr;
    }


    elem_type* iter = Elements() + aIndex;
    elem_type* iend = iter + aCount;
    for (; iter != iend; ++iter) {
      elem_traits::Construct(iter);
    }

    return Elements() + aIndex;
  }
public:

  __attribute__ ((warn_unused_result))
  elem_type* InsertElementsAt(index_type aIndex, size_type aCount,
                              const mozilla::fallible_t&)
  {
    return InsertElementsAt<FallibleAlloc>(aIndex, aCount);
  }
# 1934 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
protected:
  template<class Item, typename ActualAlloc = Alloc>
  elem_type* InsertElementsAt(index_type aIndex, size_type aCount,
                              const Item& aItem);

public:

  template<class Item>
  __attribute__ ((warn_unused_result))
  elem_type* InsertElementsAt(index_type aIndex, size_type aCount,
                              const Item& aItem, const mozilla::fallible_t&)
  {
    return InsertElementsAt<Item, FallibleAlloc>(aIndex, aCount, aItem);
  }


  void Compact()
  {
    ShrinkCapacity(sizeof(elem_type), mozilla::AlignmentFinder<elem_type>::alignment);
  }
# 1962 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
  template<class Comparator>
  static int Compare(const void* aE1, const void* aE2, void* aData)
  {
    const Comparator* c = reinterpret_cast<const Comparator*>(aData);
    const elem_type* a = static_cast<const elem_type*>(aE1);
    const elem_type* b = static_cast<const elem_type*>(aE2);
    return c->LessThan(*a, *b) ? -1 : (c->Equals(*a, *b) ? 0 : 1);
  }




  template<class Comparator>
  void Sort(const Comparator& aComp)
  {
    NS_QuickSort(Elements(), Length(), sizeof(elem_type),
                 Compare<Comparator>, const_cast<Comparator*>(&aComp));
  }



  void Sort() { Sort(nsDefaultComparator<elem_type, elem_type>()); }


  void Reverse()
  {
    elem_type* elements = Elements();
    const size_type len = Length();
    for (index_type i = 0, iend = len / 2; i < iend; ++i) {
      mozilla::Swap(elements[i], elements[len - i - 1]);
    }
  }

protected:
  using base_type::Hdr;
  using base_type::ShrinkCapacity;




  void DestructRange(index_type aStart, size_type aCount)
  {
    elem_type* iter = Elements() + aStart;
    elem_type *iend = iter + aCount;
    for (; iter != iend; ++iter) {
      elem_traits::Destruct(iter);
    }
  }





  template<class Item>
  void AssignRange(index_type aStart, size_type aCount, const Item* aValues)
  {
    AssignRangeAlgorithm<mozilla::IsPod<Item>::value,
                         mozilla::IsSame<Item, elem_type>::value>
                         ::implementation(Elements(), aStart, aCount, aValues);
  }
};

template<typename E, class Alloc>
template<class Item, typename ActualAlloc>
auto
nsTArray_Impl<E, Alloc>::ReplaceElementsAt(index_type aStart, size_type aCount,
                                           const Item* aArray, size_type aArrayLen) -> elem_type*
{
  if ((__builtin_expect(!!(aStart > Length()), 0))) {
    InvalidArrayIndex_CRASH(aStart, Length());
  }


  if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
        Length() + aArrayLen - aCount, sizeof(elem_type)))) {
    return nullptr;
  }
  DestructRange(aStart, aCount);
  this->template ShiftData<ActualAlloc>(aStart, aCount, aArrayLen,
                                        sizeof(elem_type),
                                        mozilla::AlignmentFinder<elem_type>::alignment);
  AssignRange(aStart, aArrayLen, aArray);
  return Elements() + aStart;
}

template<typename E, class Alloc>
void
nsTArray_Impl<E, Alloc>::RemoveElementsAt(index_type aStart, size_type aCount)
{
  do { } while (0);
  do { } while (0);

  do { } while (0);
  DestructRange(aStart, aCount);
  this->template ShiftData<InfallibleAlloc>(aStart, aCount, 0,
                                            sizeof(elem_type),
                                            mozilla::AlignmentFinder<elem_type>::alignment);
}

template<typename E, class Alloc>
template<typename Predicate>
void
nsTArray_Impl<E, Alloc>::RemoveElementsBy(Predicate aPredicate)
{
  if (base_type::mHdr == EmptyHdr()) {
    return;
  }

  index_type j = 0;
  index_type len = Length();
  for (index_type i = 0; i < len; ++i) {
    if (aPredicate(Elements()[i])) {
      elem_traits::Destruct(Elements() + i);
    } else {
      if (j < i) {
        copy_type::MoveNonOverlappingRegion(Elements() + j, Elements() + i,
                                            1, sizeof(elem_type));
      }
      ++j;
    }
  }
  base_type::mHdr->mLength = j;
}

template<typename E, class Alloc>
template<class Item, typename ActualAlloc>
auto
nsTArray_Impl<E, Alloc>::InsertElementsAt(index_type aIndex, size_type aCount,
                                          const Item& aItem) -> elem_type*
{
  if (!base_type::template InsertSlotsAt<ActualAlloc>(aIndex, aCount,
                                                      sizeof(elem_type),
                                                      mozilla::AlignmentFinder<elem_type>::alignment)) {
    return nullptr;
  }


  elem_type* iter = Elements() + aIndex;
  elem_type* iend = iter + aCount;
  for (; iter != iend; ++iter) {
    elem_traits::Construct(iter, aItem);
  }

  return Elements() + aIndex;
}

template<typename E, class Alloc>
template<typename ActualAlloc>
auto
nsTArray_Impl<E, Alloc>::InsertElementAt(index_type aIndex) -> elem_type*
{
  if ((__builtin_expect(!!(aIndex > Length()), 0))) {
    InvalidArrayIndex_CRASH(aIndex, Length());
  }

  if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
        Length() + 1, sizeof(elem_type)))) {
    return nullptr;
  }
  this->template ShiftData<ActualAlloc>(aIndex, 0, 1, sizeof(elem_type),
                                        mozilla::AlignmentFinder<elem_type>::alignment);
  elem_type* elem = Elements() + aIndex;
  elem_traits::Construct(elem);
  return elem;
}

template<typename E, class Alloc>
template<class Item, typename ActualAlloc>
auto
nsTArray_Impl<E, Alloc>::InsertElementAt(index_type aIndex, Item&& aItem) -> elem_type*
{
  if ((__builtin_expect(!!(aIndex > Length()), 0))) {
    InvalidArrayIndex_CRASH(aIndex, Length());
  }

  if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
         Length() + 1, sizeof(elem_type)))) {
    return nullptr;
  }
  this->template ShiftData<ActualAlloc>(aIndex, 0, 1, sizeof(elem_type),
                                        mozilla::AlignmentFinder<elem_type>::alignment);
  elem_type* elem = Elements() + aIndex;
  elem_traits::Construct(elem, mozilla::Forward<Item>(aItem));
  return elem;
}

template<typename E, class Alloc>
template<class Item, typename ActualAlloc>
auto
nsTArray_Impl<E, Alloc>::AppendElements(const Item* aArray, size_type aArrayLen) -> elem_type*
{
  if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
        Length() + aArrayLen, sizeof(elem_type)))) {
    return nullptr;
  }
  index_type len = Length();
  AssignRange(len, aArrayLen, aArray);
  this->IncrementLength(aArrayLen);
  return Elements() + len;
}

template<typename E, class Alloc>
template<class Item, class Allocator, typename ActualAlloc>
auto
nsTArray_Impl<E, Alloc>::AppendElements(nsTArray_Impl<Item, Allocator>&& aArray) -> elem_type*
{
  do { } while (0);
  if (Length() == 0) {
    SwapElements<ActualAlloc>(aArray);
    return Elements();
  }

  index_type len = Length();
  index_type otherLen = aArray.Length();
  if (!Alloc::Successful(this->template EnsureCapacity<Alloc>(
        len + otherLen, sizeof(elem_type)))) {
    return nullptr;
  }
  copy_type::MoveNonOverlappingRegion(Elements() + len, aArray.Elements(), otherLen,
                                      sizeof(elem_type));
  this->IncrementLength(otherLen);
  aArray.template ShiftData<Alloc>(0, otherLen, 0, sizeof(elem_type),
                                   mozilla::AlignmentFinder<elem_type>::alignment);
  return Elements() + len;
}

template<typename E, class Alloc>
template<class Item, typename ActualAlloc>
auto
nsTArray_Impl<E, Alloc>::AppendElement(Item&& aItem) -> elem_type*
{
  if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
         Length() + 1, sizeof(elem_type)))) {
    return nullptr;
  }
  elem_type* elem = Elements() + Length();
  elem_traits::Construct(elem, mozilla::Forward<Item>(aItem));
  this->IncrementLength(1);
  return elem;
}

template<typename E, typename Alloc>
inline void
ImplCycleCollectionUnlink(nsTArray_Impl<E, Alloc>& aField)
{
  aField.Clear();
}

template<typename E, typename Alloc>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsTArray_Impl<E, Alloc>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  aFlags |= CycleCollectionEdgeNameArrayFlag;
  size_t length = aField.Length();
  for (size_t i = 0; i < length; ++i) {
    ImplCycleCollectionTraverse(aCallback, aField[i], aName, aFlags);
  }
}





template<class E>
class nsTArray : public nsTArray_Impl<E, nsTArrayInfallibleAllocator>
{
public:
  typedef nsTArray_Impl<E, nsTArrayInfallibleAllocator> base_type;
  typedef nsTArray<E> self_type;
  typedef typename base_type::size_type size_type;

  nsTArray() {}
  explicit nsTArray(size_type aCapacity) : base_type(aCapacity) {}
  explicit nsTArray(const nsTArray& aOther) : base_type(aOther) {}
               nsTArray(nsTArray&& aOther) : base_type(mozilla::Move(aOther)) {}
               nsTArray(std::initializer_list<E> aIL) : base_type(aIL) {}

  template<class Allocator>
  explicit nsTArray(const nsTArray_Impl<E, Allocator>& aOther)
    : base_type(aOther)
  {
  }
  template<class Allocator>
               nsTArray(nsTArray_Impl<E, Allocator>&& aOther)
    : base_type(mozilla::Move(aOther))
  {
  }

  self_type& operator=(const self_type& aOther)
  {
    base_type::operator=(aOther);
    return *this;
  }
  template<class Allocator>
  self_type& operator=(const nsTArray_Impl<E, Allocator>& aOther)
  {
    base_type::operator=(aOther);
    return *this;
  }
  self_type& operator=(self_type&& aOther)
  {
    base_type::operator=(mozilla::Move(aOther));
    return *this;
  }
  template<class Allocator>
  self_type& operator=(nsTArray_Impl<E, Allocator>&& aOther)
  {
    base_type::operator=(mozilla::Move(aOther));
    return *this;
  }

  using base_type::AppendElement;
  using base_type::AppendElements;
  using base_type::EnsureLengthAtLeast;
  using base_type::InsertElementAt;
  using base_type::InsertElementsAt;
  using base_type::InsertElementSorted;
  using base_type::ReplaceElementsAt;
  using base_type::SetCapacity;
  using base_type::SetLength;
};




template<class E>
class FallibleTArray : public nsTArray_Impl<E, nsTArrayFallibleAllocator>
{
public:
  typedef nsTArray_Impl<E, nsTArrayFallibleAllocator> base_type;
  typedef FallibleTArray<E> self_type;
  typedef typename base_type::size_type size_type;

  FallibleTArray() {}
  explicit FallibleTArray(size_type aCapacity) : base_type(aCapacity) {}
  explicit FallibleTArray(const FallibleTArray<E>& aOther) : base_type(aOther) {}
  FallibleTArray(FallibleTArray<E>&& aOther)
    : base_type(mozilla::Move(aOther))
  {
  }

  template<class Allocator>
  explicit FallibleTArray(const nsTArray_Impl<E, Allocator>& aOther)
    : base_type(aOther)
  {
  }
  template<class Allocator>
  explicit FallibleTArray(nsTArray_Impl<E, Allocator>&& aOther)
    : base_type(mozilla::Move(aOther))
  {
  }

  self_type& operator=(const self_type& aOther)
  {
    base_type::operator=(aOther);
    return *this;
  }
  template<class Allocator>
  self_type& operator=(const nsTArray_Impl<E, Allocator>& aOther)
  {
    base_type::operator=(aOther);
    return *this;
  }
  self_type& operator=(self_type&& aOther)
  {
    base_type::operator=(mozilla::Move(aOther));
    return *this;
  }
  template<class Allocator>
  self_type& operator=(nsTArray_Impl<E, Allocator>&& aOther)
  {
    base_type::operator=(mozilla::Move(aOther));
    return *this;
  }
};





template<class E, size_t N>
class AutoTArray : public nsTArray<E>
{
  static_assert(N != 0, "AutoTArray<E, 0> should be specialized");
public:
  typedef AutoTArray<E, N> self_type;
  typedef nsTArray<E> base_type;
  typedef typename base_type::Header Header;
  typedef typename base_type::elem_type elem_type;

  AutoTArray()
  {
    Init();
  }

  AutoTArray(const self_type& aOther)
  {
    Init();
    this->AppendElements(aOther);
  }

  explicit AutoTArray(const base_type& aOther)
  {
    Init();
    this->AppendElements(aOther);
  }

  explicit AutoTArray(base_type&& aOther)
  {
    Init();
    this->SwapElements(aOther);
  }

  template<typename Allocator>
  explicit AutoTArray(nsTArray_Impl<elem_type, Allocator>&& aOther)
  {
    Init();
    this->SwapElements(aOther);
  }

               AutoTArray(std::initializer_list<E> aIL)
  {
    Init();
    this->AppendElements(aIL.begin(), aIL.size());
  }

  self_type& operator=(const self_type& aOther)
  {
    base_type::operator=(aOther);
    return *this;
  }

  template<typename Allocator>
  self_type& operator=(const nsTArray_Impl<elem_type, Allocator>& aOther)
  {
    base_type::operator=(aOther);
    return *this;
  }

private:


  template<class Allocator, class Copier>
  friend class nsTArray_base;

  void Init()
  {
    static_assert(mozilla::AlignmentFinder<elem_type>::alignment <= 8,
                  "can't handle alignments greater than 8, "
                  "see nsTArray_base::UsesAutoArrayBuffer()");

    Header** phdr = base_type::PtrToHdr();
    *phdr = reinterpret_cast<Header*>(&mAutoBuf);
    (*phdr)->mLength = 0;
    (*phdr)->mCapacity = N;
    (*phdr)->mIsAutoArray = 1;

    do { } while (0);


  }





  union
  {
    char mAutoBuf[sizeof(nsTArrayHeader) + N * sizeof(elem_type)];

    mozilla::AlignedElem<(mozilla::AlignmentFinder<Header>::alignment > mozilla::AlignmentFinder<elem_type>::alignment) ?
                         mozilla::AlignmentFinder<Header>::alignment : mozilla::AlignmentFinder<elem_type>::alignment> mAlign;
  };
};
# 2454 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
template<class E>
class AutoTArray<E, 0> : public nsTArray<E>
{
};

template<class E, size_t N>
struct nsTArray_CopyChooser<AutoTArray<E, N>>
{
  typedef nsTArray_CopyWithConstructors<AutoTArray<E, N>> Type;
};


namespace mozilla {

template<class ElementType, class TArrayAlloc>
Span<ElementType>
MakeSpan(nsTArray_Impl<ElementType, TArrayAlloc>& aTArray)
{
  return aTArray;
}

template<class ElementType, class TArrayAlloc>
Span<const ElementType>
MakeSpan(const nsTArray_Impl<ElementType, TArrayAlloc>& aTArray)
{
  return aTArray;
}

}
# 2497 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h"
static_assert(sizeof(AutoTArray<uint32_t, 2>) ==
              sizeof(void*) + sizeof(nsTArrayHeader) + sizeof(uint32_t) * 2,
              "AutoTArray shouldn't contain any extra padding, "
              "see the comment");



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h"
template<class Alloc, class Copy>
nsTArray_base<Alloc, Copy>::nsTArray_base()
  : mHdr(EmptyHdr())
{
                               ;
}

template<class Alloc, class Copy>
nsTArray_base<Alloc, Copy>::~nsTArray_base()
{
  if (mHdr != EmptyHdr() && !UsesAutoArrayBuffer()) {
    Alloc::Free(mHdr);
  }
                               ;
}

template<class Alloc, class Copy>
const nsTArrayHeader*
nsTArray_base<Alloc, Copy>::GetAutoArrayBufferUnsafe(size_t aElemAlign) const
{



  const void* autoBuf =
    &reinterpret_cast<const AutoTArray<nsTArray<uint32_t>, 1>*>(this)->mAutoBuf;




  static_assert(sizeof(void*) != 4 ||
                (mozilla::AlignmentFinder<mozilla::AlignedElem<8> >::alignment == 8 &&
                 sizeof(AutoTArray<mozilla::AlignedElem<8>, 1>) ==
                   sizeof(void*) + sizeof(nsTArrayHeader) +
                   4 + sizeof(mozilla::AlignedElem<8>)),
                "auto array padding wasn't what we expected");


  do { } while (0);

  if (sizeof(void*) == 4 && aElemAlign == 8) {
    autoBuf = reinterpret_cast<const char*>(autoBuf) + 4;
  }

  return reinterpret_cast<const Header*>(autoBuf);
}

template<class Alloc, class Copy>
bool
nsTArray_base<Alloc, Copy>::UsesAutoArrayBuffer() const
{
  if (!mHdr->mIsAutoArray) {
    return false;
  }
# 94 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h"
  static_assert(sizeof(nsTArrayHeader) > 4,
                "see comment above");
# 104 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h"
  return mHdr == GetAutoArrayBuffer(4) || mHdr == GetAutoArrayBuffer(8);
}


bool IsTwiceTheRequiredBytesRepresentableAsUint32(size_t aCapacity,
                                                  size_t aElemSize);

template<class Alloc, class Copy>
template<typename ActualAlloc>
typename ActualAlloc::ResultTypeProxy
nsTArray_base<Alloc, Copy>::EnsureCapacity(size_type aCapacity,
                                           size_type aElemSize)
{

  if (aCapacity <= mHdr->mCapacity) {
    return ActualAlloc::SuccessResult();
  }






  if (!IsTwiceTheRequiredBytesRepresentableAsUint32(aCapacity, aElemSize)) {
    ActualAlloc::SizeTooBig((size_t)aCapacity * aElemSize);
    return ActualAlloc::FailureResult();
  }

  size_t reqSize = sizeof(Header) + aCapacity * aElemSize;

  if (mHdr == EmptyHdr()) {

    Header* header = static_cast<Header*>(ActualAlloc::Malloc(reqSize));
    if (!header) {
      return ActualAlloc::FailureResult();
    }
    header->mLength = 0;
    header->mCapacity = aCapacity;
    header->mIsAutoArray = 0;
    mHdr = header;

    return ActualAlloc::SuccessResult();
  }





  const size_t slowGrowthThreshold = 8 * 1024 * 1024;

  size_t bytesToAlloc;
  if (reqSize >= slowGrowthThreshold) {
    size_t currSize = sizeof(Header) + Capacity() * aElemSize;
    size_t minNewSize = currSize + (currSize >> 3);
    bytesToAlloc = reqSize > minNewSize ? reqSize : minNewSize;


    const size_t MiB = 1 << 20;
    bytesToAlloc = MiB * ((bytesToAlloc + MiB - 1) / MiB);
  } else {

    bytesToAlloc = mozilla::RoundUpPow2(reqSize);
  }

  Header* header;
  if (UsesAutoArrayBuffer() || !Copy::allowRealloc) {

    header = static_cast<Header*>(ActualAlloc::Malloc(bytesToAlloc));
    if (!header) {
      return ActualAlloc::FailureResult();
    }

    Copy::MoveNonOverlappingRegionWithHeader(header, mHdr, Length(), aElemSize);

    if (!UsesAutoArrayBuffer()) {
      ActualAlloc::Free(mHdr);
    }
  } else {

    header = static_cast<Header*>(ActualAlloc::Realloc(mHdr, bytesToAlloc));
    if (!header) {
      return ActualAlloc::FailureResult();
    }
  }


  size_t newCapacity = (bytesToAlloc - sizeof(Header)) / aElemSize;
  do { } while (0);
  header->mCapacity = newCapacity;

  mHdr = header;

  return ActualAlloc::SuccessResult();
}



template<class Alloc, class Copy>
void
nsTArray_base<Alloc, Copy>::ShrinkCapacity(size_type aElemSize,
                                           size_t aElemAlign)
{
  if (mHdr == EmptyHdr() || UsesAutoArrayBuffer()) {
    return;
  }

  if (mHdr->mLength >= mHdr->mCapacity) {
    return;
  }

  size_type length = Length();

  if (IsAutoArray() && GetAutoArrayBuffer(aElemAlign)->mCapacity >= length) {
    Header* header = GetAutoArrayBuffer(aElemAlign);


    header->mLength = length;
    Copy::MoveNonOverlappingRegion(header + 1, mHdr + 1, length, aElemSize);

    nsTArrayFallibleAllocator::Free(mHdr);
    mHdr = header;
    return;
  }

  if (length == 0) {
    do { } while (0);
    nsTArrayFallibleAllocator::Free(mHdr);
    mHdr = EmptyHdr();
    return;
  }

  size_type size = sizeof(Header) + length * aElemSize;
  void* ptr = nsTArrayFallibleAllocator::Realloc(mHdr, size);
  if (!ptr) {
    return;
  }
  mHdr = static_cast<Header*>(ptr);
  mHdr->mCapacity = length;
}

template<class Alloc, class Copy>
template<typename ActualAlloc>
void
nsTArray_base<Alloc, Copy>::ShiftData(index_type aStart,
                                      size_type aOldLen, size_type aNewLen,
                                      size_type aElemSize, size_t aElemAlign)
{
  if (aOldLen == aNewLen) {
    return;
  }


  size_type num = mHdr->mLength - (aStart + aOldLen);


  mHdr->mLength += aNewLen - aOldLen;
  if (mHdr->mLength == 0) {
    ShrinkCapacity(aElemSize, aElemAlign);
  } else {

    if (num == 0) {
      return;
    }

    aStart *= aElemSize;
    aNewLen *= aElemSize;
    aOldLen *= aElemSize;
    char* baseAddr = reinterpret_cast<char*>(mHdr + 1) + aStart;
    Copy::MoveOverlappingRegion(baseAddr + aNewLen, baseAddr + aOldLen, num, aElemSize);
  }
}

template<class Alloc, class Copy>
template<typename ActualAlloc>
bool
nsTArray_base<Alloc, Copy>::InsertSlotsAt(index_type aIndex, size_type aCount,
                                          size_type aElemSize,
                                          size_t aElemAlign)
{
  if ((__builtin_expect(!!(aIndex > Length()), 0))) {
    InvalidArrayIndex_CRASH(aIndex, Length());
  }

  size_type newLen = Length() + aCount;

  EnsureCapacity<ActualAlloc>(newLen, aElemSize);


  if (Capacity() < newLen) {
    return false;
  }



  ShiftData<ActualAlloc>(aIndex, 0, aCount, aElemSize, aElemAlign);

  return true;
}
# 311 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h"
template<class Alloc, class Copy>
nsTArray_base<Alloc, Copy>::IsAutoArrayRestorer::IsAutoArrayRestorer(
      nsTArray_base<Alloc, Copy>& aArray,
      size_t aElemAlign)
  : mArray(aArray)
  , mElemAlign(aElemAlign)
  , mIsAuto(aArray.IsAutoArray())
{
}

template<class Alloc, class Copy>
nsTArray_base<Alloc, Copy>::IsAutoArrayRestorer::~IsAutoArrayRestorer()
{

  if (mIsAuto && mArray.mHdr == mArray.EmptyHdr()) {


    mArray.mHdr = mArray.GetAutoArrayBufferUnsafe(mElemAlign);
    mArray.mHdr->mLength = 0;
  } else if (mArray.mHdr != mArray.EmptyHdr()) {
    mArray.mHdr->mIsAutoArray = mIsAuto;
  }
}

template<class Alloc, class Copy>
template<typename ActualAlloc, class Allocator>
typename ActualAlloc::ResultTypeProxy
nsTArray_base<Alloc, Copy>::SwapArrayElements(nsTArray_base<Allocator,
                                                            Copy>& aOther,
                                              size_type aElemSize,
                                              size_t aElemAlign)
{






  IsAutoArrayRestorer ourAutoRestorer(*this, aElemAlign);
  typename nsTArray_base<Allocator, Copy>::IsAutoArrayRestorer
    otherAutoRestorer(aOther, aElemAlign);




  if ((!UsesAutoArrayBuffer() || Capacity() < aOther.Length()) &&
      (!aOther.UsesAutoArrayBuffer() || aOther.Capacity() < Length())) {

    if (!EnsureNotUsingAutoArrayBuffer<ActualAlloc>(aElemSize) ||
        !aOther.template EnsureNotUsingAutoArrayBuffer<ActualAlloc>(aElemSize)) {
      return ActualAlloc::FailureResult();
    }

    Header* temp = mHdr;
    mHdr = aOther.mHdr;
    aOther.mHdr = temp;

    return ActualAlloc::SuccessResult();
  }
# 382 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray-inl.h"
  if (!ActualAlloc::Successful(EnsureCapacity<ActualAlloc>(aOther.Length(), aElemSize)) ||
      !Allocator::Successful(aOther.template EnsureCapacity<Allocator>(Length(), aElemSize))) {
    return ActualAlloc::FailureResult();
  }



  do { } while (0);


  size_type smallerLength = XPCOM_MIN(Length(), aOther.Length());
  size_type largerLength = XPCOM_MAX(Length(), aOther.Length());
  void* smallerElements;
  void* largerElements;
  if (Length() <= aOther.Length()) {
    smallerElements = Hdr() + 1;
    largerElements = aOther.Hdr() + 1;
  } else {
    smallerElements = aOther.Hdr() + 1;
    largerElements = Hdr() + 1;
  }






  AutoTArray<nsTArray_Impl<uint8_t, ActualAlloc>, 64> temp;
  if (!ActualAlloc::Successful(temp.template EnsureCapacity<ActualAlloc>(smallerLength,
                                                                         aElemSize))) {
    return ActualAlloc::FailureResult();
  }

  Copy::MoveNonOverlappingRegion(temp.Elements(), smallerElements, smallerLength, aElemSize);
  Copy::MoveNonOverlappingRegion(smallerElements, largerElements, largerLength, aElemSize);
  Copy::MoveNonOverlappingRegion(largerElements, temp.Elements(), smallerLength, aElemSize);


  do { } while (0);


  size_type tempLength = Length();



  if (mHdr != EmptyHdr()) {
    mHdr->mLength = aOther.Length();
  }
  if (aOther.mHdr != EmptyHdr()) {
    aOther.mHdr->mLength = tempLength;
  }

  return ActualAlloc::SuccessResult();
}

template<class Alloc, class Copy>
template<typename ActualAlloc>
bool
nsTArray_base<Alloc, Copy>::EnsureNotUsingAutoArrayBuffer(size_type aElemSize)
{
  if (UsesAutoArrayBuffer()) {





    if (Length() == 0) {
      mHdr = EmptyHdr();
      return true;
    }

    size_type size = sizeof(Header) + Length() * aElemSize;

    Header* header = static_cast<Header*>(ActualAlloc::Malloc(size));
    if (!header) {
      return false;
    }

    Copy::MoveNonOverlappingRegionWithHeader(header, mHdr, Length(), aElemSize);
    header->mCapacity = Length();
    mHdr = header;
  }

  return true;
}
# 2504 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTArray.h" 2
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h" 2


namespace IPC {
class Message;
template <typename> struct ParamTraits;
}
class PickleIterator;

namespace mozilla {

namespace dom {

enum ErrNum {



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Errors.msg" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Errors.msg"
MSG_INVALID_ENUM_VALUE,
MSG_MISSING_ARGUMENTS,
MSG_NOT_OBJECT,
MSG_NOT_CALLABLE,
MSG_NOT_CONSTRUCTOR,
MSG_DOES_NOT_IMPLEMENT_INTERFACE,
MSG_METHOD_THIS_DOES_NOT_IMPLEMENT_INTERFACE,
MSG_METHOD_THIS_UNWRAPPING_DENIED,
MSG_THIS_DOES_NOT_IMPLEMENT_INTERFACE,
MSG_NOT_IN_UNION,
MSG_ILLEGAL_CONSTRUCTOR,
MSG_CONSTRUCTOR_WITHOUT_NEW,
MSG_ENFORCE_RANGE_NON_FINITE,
MSG_ENFORCE_RANGE_OUT_OF_RANGE,
MSG_NOT_SEQUENCE,
MSG_NOT_DICTIONARY,
MSG_OVERLOAD_RESOLUTION_FAILED,
MSG_GLOBAL_NOT_NATIVE,
MSG_ENCODING_NOT_SUPPORTED,
MSG_DOM_ENCODING_NOT_UTF,
MSG_DOM_DECODING_FAILED,
MSG_NOT_FINITE,
MSG_INVALID_VERSION,
MSG_INVALID_BYTESTRING,

MSG_NOT_DATE,
MSG_INVALID_ADVANCE_COUNT,
MSG_DEFINEPROPERTY_ON_GSP,
MSG_INVALID_URL,
MSG_URL_HAS_CREDENTIALS,
MSG_METADATA_NOT_CONFIGURED,
MSG_INVALID_READ_SIZE,
MSG_HEADERS_IMMUTABLE,
MSG_INVALID_HEADER_NAME,
MSG_INVALID_HEADER_VALUE,
MSG_INVALID_HEADER_SEQUENCE,
MSG_PERMISSION_DENIED_TO_PASS_ARG,
MSG_MISSING_REQUIRED_DICTIONARY_MEMBER,
MSG_REQUEST_INTEGRITY_METADATA_NOT_EMPTY,
MSG_INVALID_REQUEST_METHOD,
MSG_INVALID_REQUEST_MODE,
MSG_INVALID_REFERRER_URL,
MSG_CROSS_ORIGIN_REFERRER_URL,
MSG_FETCH_BODY_CONSUMED_ERROR,
MSG_RESPONSE_INVALID_STATUSTEXT_ERROR,
MSG_FETCH_FAILED,
MSG_NO_BODY_ALLOWED_FOR_GET_AND_HEAD,
MSG_RESPONSE_NULL_STATUS_WITH_BODY,
MSG_DEFINE_NON_CONFIGURABLE_PROP_ON_WINDOW,
MSG_INVALID_ZOOMANDPAN_VALUE_ERROR,
MSG_INVALID_TRANSFORM_ANGLE_ERROR,
MSG_INVALID_RESPONSE_STATUSCODE_ERROR,
MSG_INVALID_REDIRECT_STATUSCODE_ERROR,
MSG_INVALID_URL_SCHEME,
MSG_RESPONSE_URL_IS_NULL,
MSG_RESPONSE_HAS_VARY_STAR,
MSG_BAD_FORMDATA,
MSG_NO_ACTIVE_WORKER,
MSG_NOTIFICATION_PERMISSION_DENIED,
MSG_NOTIFICATION_NO_CONSTRUCTOR_IN_SERVICEWORKER,
MSG_INVALID_SCOPE,
MSG_INVALID_KEYFRAME_OFFSETS,
MSG_IS_NOT_PROMISE,
MSG_SW_INSTALL_ERROR,
MSG_SW_SCRIPT_THREW,
MSG_TYPEDARRAY_IS_SHARED,
MSG_TYPEDARRAY_IS_DETACHED,
MSG_CACHE_ADD_FAILED_RESPONSE,
MSG_SW_UPDATE_BAD_REGISTRATION,
MSG_INVALID_DURATION_ERROR,
MSG_INVALID_EASING_ERROR,
MSG_INVALID_SPACING_MODE_ERROR,
MSG_USELESS_SETTIMEOUT,
MSG_TOKENLIST_NO_SUPPORTED_TOKENS,
MSG_CACHE_STREAM_CLOSED,
MSG_TIME_VALUE_OUT_OF_RANGE,
MSG_ONLY_IF_CACHED_WITHOUT_SAME_ORIGIN,
MSG_THRESHOLD_RANGE_ERROR,
MSG_WORKER_THREAD_SHUTTING_DOWN,
MSG_CACHE_OPEN_FAILED,
# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h" 2

  Err_Limit
};
# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
uint16_t
GetErrorArgCount(const ErrNum aErrorNumber);

namespace binding_detail {
void ThrowErrorMessage(JSContext* aCx, const unsigned aErrorNumber, ...);
}

template<typename... Ts>
inline bool
ThrowErrorMessage(JSContext* aCx, const ErrNum aErrorNumber, Ts&&... aArgs)
{
  binding_detail::ThrowErrorMessage(aCx, static_cast<const unsigned>(aErrorNumber),
                                    mozilla::Forward<Ts>(aArgs)...);
  return false;
}

struct StringArrayAppender
{
  static void Append(nsTArray<nsString>& aArgs, uint16_t aCount)
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(aCount == 0)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aCount == 0))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aCount == 0" ") (" "Must give at least as many string arguments as are required by the ErrNum." ")"); do { *((volatile int*) __null) = 87; ::abort(); } while (0); } } while (0);
  }

  template<typename... Ts>
  static void Append(nsTArray<nsString>& aArgs, uint16_t aCount, const nsAString& aFirst, Ts&&... aOtherArgs)
  {
    if (aCount == 0) {
      do { } while (0);
      return;
    }
    aArgs.AppendElement(aFirst);
    Append(aArgs, aCount - 1, Forward<Ts>(aOtherArgs)...);
  }
};

}

class ErrorResult;
class OOMReporter;

namespace binding_danger {
# 120 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
template<typename CleanupPolicy>
class TErrorResult {
public:
  TErrorResult()
    : mResult(NS_OK)




  {
  }

  ~TErrorResult() {
    AssertInOwningThread();

    if (CleanupPolicy::assertHandled) {


      AssertReportedOrSuppressed();
    }

    if (CleanupPolicy::suppress) {
      SuppressException();
    }


    AssertReportedOrSuppressed();
  }

  TErrorResult(TErrorResult&& aRHS)



    : TErrorResult()
  {
    *this = Move(aRHS);
  }
  TErrorResult& operator=(TErrorResult&& aRHS);

  explicit TErrorResult(nsresult aRv)
    : TErrorResult()
  {
    AssignErrorCode(aRv);
  }

  operator ErrorResult&();
  operator OOMReporter&();

  void Throw(nsresult rv) {
    do { } while (0);
    AssignErrorCode(rv);
  }
# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  void ThrowWithCustomCleanup(nsresult rv) {
    Throw(rv);
  }




  void CloneTo(TErrorResult& aRv) const;




  void SuppressException();




  nsresult StealNSResult() {
    nsresult rv = ErrorCode();
    SuppressException();

    if (rv == NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR ||
        rv == NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR ||
        rv == NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION ||
        rv == NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION) {

      return NS_ERROR_DOM_INVALID_STATE_ERR;
    }

    return rv;
  }
# 265 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  __attribute__ ((warn_unused_result))
  bool MaybeSetPendingException(JSContext* cx)
  {
    WouldReportJSException();
    if (!Failed()) {
      return false;
    }

    SetPendingException(cx);
    return true;
  }
# 287 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  void StealExceptionFromJSContext(JSContext* cx);

  template<dom::ErrNum errorNumber, typename... Ts>
  void ThrowTypeError(Ts&&... messageArgs)
  {
    ThrowErrorWithMessage<errorNumber>(NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR,
                                       Forward<Ts>(messageArgs)...);
  }

  template<dom::ErrNum errorNumber, typename... Ts>
  void ThrowRangeError(Ts&&... messageArgs)
  {
    ThrowErrorWithMessage<errorNumber>(NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR,
                                       Forward<Ts>(messageArgs)...);
  }

  bool IsErrorWithMessage() const
  {
    return ErrorCode() == NS_ERROR_INTERNAL_ERRORRESULT_TYPEERROR ||
           ErrorCode() == NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR;
  }
# 319 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  void ThrowJSException(JSContext* cx, JS::Handle<JS::Value> exn);
  bool IsJSException() const
  {
    return ErrorCode() == NS_ERROR_INTERNAL_ERRORRESULT_JS_EXCEPTION;
  }






  void ThrowDOMException(nsresult rv, const nsACString& message = EmptyCString());
  bool IsDOMException() const
  {
    return ErrorCode() == NS_ERROR_INTERNAL_ERRORRESULT_DOMEXCEPTION;
  }




  void NoteJSContextException(JSContext* aCx);



  bool IsJSContextException() {
    return ErrorCode() == NS_ERROR_INTERNAL_ERRORRESULT_EXCEPTION_ON_JSCONTEXT;
  }


  void ThrowUncatchableException() {
    Throw(NS_ERROR_UNCATCHABLE_EXCEPTION);
  }
  bool IsUncatchableException() const {
    return ErrorCode() == NS_ERROR_UNCATCHABLE_EXCEPTION;
  }

  void __attribute__((always_inline)) inline MightThrowJSException()
  {



  }
  void __attribute__((always_inline)) inline WouldReportJSException()
  {



  }
# 375 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  void operator=(nsresult rv) {
    AssignErrorCode(rv);
  }

  bool Failed() const {
    return ((bool)(__builtin_expect(!!(NS_FAILED_impl(mResult)), 0)));
  }

  bool ErrorCodeIs(nsresult rv) const {
    return mResult == rv;
  }


  uint32_t ErrorCodeAsInt() const {
    return static_cast<uint32_t>(ErrorCode());
  }

protected:
  nsresult ErrorCode() const {
    return mResult;
  }

private:
# 407 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  friend struct IPC::ParamTraits<TErrorResult>;
  friend struct IPC::ParamTraits<ErrorResult>;
  void SerializeMessage(IPC::Message* aMsg) const;
  bool DeserializeMessage(const IPC::Message* aMsg, PickleIterator* aIter);

  void SerializeDOMExceptionInfo(IPC::Message* aMsg) const;
  bool DeserializeDOMExceptionInfo(const IPC::Message* aMsg, PickleIterator* aIter);



  nsTArray<nsString>& CreateErrorMessageHelper(const dom::ErrNum errorNumber, nsresult errorType);

  template<dom::ErrNum errorNumber, typename... Ts>
  void ThrowErrorWithMessage(nsresult errorType, Ts&&... messageArgs)
  {





    ClearUnionData();

    nsTArray<nsString>& messageArgsArray = CreateErrorMessageHelper(errorNumber, errorType);
    uint16_t argCount = dom::GetErrorArgCount(errorNumber);
    dom::StringArrayAppender::Append(messageArgsArray, argCount,
                                     Forward<Ts>(messageArgs)...);



  }

  __attribute__((always_inline)) inline void AssertInOwningThread() const {



  }

  void AssignErrorCode(nsresult aRv) {
    do { } while (0);

    do { } while (0);

    do { } while (0);
    do { } while (0);

    do { } while (0);
    do { } while (0);

    do { } while (0);
    do { } while (0);
    do { } while (0);

    mResult = aRv;
  }

  void ClearMessage();
  void ClearDOMExceptionInfo();







  void ClearUnionData();



  void SetPendingException(JSContext* cx);


  void SetPendingExceptionWithMessage(JSContext* cx);
  void SetPendingJSException(JSContext* cx);
  void SetPendingDOMException(JSContext* cx);
  void SetPendingGenericErrorException(JSContext* cx);

  __attribute__((always_inline)) inline void AssertReportedOrSuppressed()
  {
    do { } while (0);
    do { } while (0);
    do { } while (0);
  }
# 498 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  nsresult mResult;

  struct Message;
  struct DOMExceptionInfo;






  union {
    Message* mMessage;
    JS::Value mJSException;
    DOMExceptionInfo* mDOMExceptionInfo;
  };
# 531 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
  TErrorResult(const TErrorResult&) = delete;
  void operator=(const TErrorResult&) = delete;
};

struct JustAssertCleanupPolicy {
  static const bool assertHandled = true;
  static const bool suppress = false;
};

struct AssertAndSuppressCleanupPolicy {
  static const bool assertHandled = true;
  static const bool suppress = true;
};

struct JustSuppressCleanupPolicy {
  static const bool assertHandled = false;
  static const bool suppress = true;
};

}



class ErrorResult :
    public binding_danger::TErrorResult<binding_danger::AssertAndSuppressCleanupPolicy>
{
  typedef binding_danger::TErrorResult<binding_danger::AssertAndSuppressCleanupPolicy> BaseErrorResult;

public:
  ErrorResult()
    : BaseErrorResult()
  {}

  ErrorResult(ErrorResult&& aRHS)
    : BaseErrorResult(Move(aRHS))
  {}

  explicit ErrorResult(nsresult aRv)
    : BaseErrorResult(aRv)
  {}

  void operator=(nsresult rv)
  {
    BaseErrorResult::operator=(rv);
  }

  ErrorResult& operator=(ErrorResult&& aRHS)
  {
    BaseErrorResult::operator=(Move(aRHS));
    return *this;
  }

private:


  ErrorResult(const ErrorResult&) = delete;
  void operator=(const ErrorResult&) = delete;
};

template<typename CleanupPolicy>
binding_danger::TErrorResult<CleanupPolicy>::operator ErrorResult&()
{
  return *static_cast<ErrorResult*>(
     reinterpret_cast<TErrorResult<AssertAndSuppressCleanupPolicy>*>(this));
}




class IgnoredErrorResult :
    public binding_danger::TErrorResult<binding_danger::JustSuppressCleanupPolicy>
{
};

namespace dom {
namespace binding_detail {
class FastErrorResult :
    public mozilla::binding_danger::TErrorResult<
      mozilla::binding_danger::JustAssertCleanupPolicy>
{
};
}
}
# 628 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
namespace binding_danger {
class OOMReporterInstantiator;
}

class OOMReporter : private dom::binding_detail::FastErrorResult
{
public:
  void ReportOOM()
  {
    Throw(NS_ERROR_OUT_OF_MEMORY);
  }

private:


  friend class binding_danger::OOMReporterInstantiator;


  template<typename CleanupPolicy>
  friend class binding_danger::TErrorResult;

  OOMReporter()
    : dom::binding_detail::FastErrorResult()
  {
  }
};

namespace binding_danger {
class OOMReporterInstantiator : public OOMReporter
{
public:
  OOMReporterInstantiator()
    : OOMReporter()
  {
  }




  bool MaybeSetPendingException(JSContext* cx)
  {
    return OOMReporter::MaybeSetPendingException(cx);
  }
};
}

template<typename CleanupPolicy>
binding_danger::TErrorResult<CleanupPolicy>::operator OOMReporter&()
{
  return *static_cast<OOMReporter*>(
     reinterpret_cast<TErrorResult<JustAssertCleanupPolicy>*>(this));
}
# 707 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ErrorResult.h"
}
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OwningNonNull.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OwningNonNull.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h" 1
# 111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
namespace mozilla {
template<class T> class OwningNonNull;
}

template<class T>
inline already_AddRefed<T>
dont_AddRef(T* aRawPtr)
{
  return already_AddRefed<T>(aRawPtr);
}

template<class T>
inline already_AddRefed<T>&&
dont_AddRef(already_AddRefed<T>&& aAlreadyAddRefedPtr)
{
  return mozilla::Move(aAlreadyAddRefedPtr);
}
# 146 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
class nsCOMPtr_helper
{
public:
  virtual nsresult operator()(const nsIID&, void**) const = 0;
};







class nsQueryInterface final
{
public:
  explicit
  nsQueryInterface(nsISupports* aRawPtr) : mRawPtr(aRawPtr) {}

  nsresult operator()(const nsIID& aIID, void**) const;

private:
  nsISupports* mRawPtr;
};

class nsQueryInterfaceWithError final
{
public:
  nsQueryInterfaceWithError(nsISupports* aRawPtr, nsresult* aError)
    : mRawPtr(aRawPtr)
    , mErrorPtr(aError)
  {
  }

  nsresult operator()(const nsIID& aIID, void**) const;

private:
  nsISupports* mRawPtr;
  nsresult* mErrorPtr;
};

inline nsQueryInterface
do_QueryInterface(nsISupports* aRawPtr)
{
  return nsQueryInterface(aRawPtr);
}

inline nsQueryInterfaceWithError
do_QueryInterface(nsISupports* aRawPtr, nsresult* aError)
{
  return nsQueryInterfaceWithError(aRawPtr, aError);
}

template<class T>
inline void
do_QueryInterface(already_AddRefed<T>&)
{



}

template<class T>
inline void
do_QueryInterface(already_AddRefed<T>&, nsresult*)
{



}




class nsGetServiceByCID final
{
public:
  explicit nsGetServiceByCID(const nsCID& aCID) : mCID(aCID) {}

  nsresult operator()(const nsIID&, void**) const;

private:
  const nsCID& mCID;
};

class nsGetServiceByCIDWithError final
{
public:
  nsGetServiceByCIDWithError(const nsCID& aCID, nsresult* aErrorPtr)
    : mCID(aCID)
    , mErrorPtr(aErrorPtr)
  {
  }

  nsresult operator()(const nsIID&, void**) const;

private:
  const nsCID& mCID;
  nsresult* mErrorPtr;
};

class nsGetServiceByContractID final
{
public:
  explicit nsGetServiceByContractID(const char* aContractID)
    : mContractID(aContractID)
  {
  }

  nsresult operator()(const nsIID&, void**) const;

private:
  const char* mContractID;
};

class nsGetServiceByContractIDWithError final
{
public:
  nsGetServiceByContractIDWithError(const char* aContractID, nsresult* aErrorPtr)
    : mContractID(aContractID)
    , mErrorPtr(aErrorPtr)
  {
  }

  nsresult operator()(const nsIID&, void**) const;

private:
  const char* mContractID;
  nsresult* mErrorPtr;
};
# 285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
class nsCOMPtr_base
{
public:
  explicit nsCOMPtr_base(nsISupports* aRawPtr = nullptr) : mRawPtr(aRawPtr) {}

                          ~nsCOMPtr_base()
  {
                                    ;
    if (mRawPtr) {
      (mRawPtr)->Release();
    }
  }

  void
  assign_with_AddRef(nsISupports*);
  void
  assign_from_qi(const nsQueryInterface, const nsIID&);
  void
  assign_from_qi_with_error(const nsQueryInterfaceWithError&, const nsIID&);
  void
  assign_from_gs_cid(const nsGetServiceByCID, const nsIID&);
  void
  assign_from_gs_cid_with_error(const nsGetServiceByCIDWithError&, const nsIID&);
  void
  assign_from_gs_contractid(const nsGetServiceByContractID, const nsIID&);
  void
  assign_from_gs_contractid_with_error(const nsGetServiceByContractIDWithError&,
                                       const nsIID&);
  void
  assign_from_helper(const nsCOMPtr_helper&, const nsIID&);
  void**
  begin_assignment();

protected:
  nsISupports* __attribute__((__may_alias__)) mRawPtr;

  void assign_assuming_AddRef(nsISupports* aNewPtr)
  {






    nsISupports* oldPtr = mRawPtr;
    mRawPtr = aNewPtr;
                                       ;
                                   ;
    if (oldPtr) {
      (oldPtr)->Release();
    }
  }
};




template<class T>
char (&TestForIID(decltype(&(T::template COMTypeInfo<T, void>::kIID))))[2];
template<class T>
char TestForIID(...);

template<class T>
class nsCOMPtr final

  : private nsCOMPtr_base

{
# 387 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
  void assert_validity()
  {
    static_assert(1 < sizeof(TestForIID<T>(nullptr)), "nsCOMPtr only works "
                  "for types with IIDs.  Either use RefPtr; add an IID to "
                  "your type with NS_DECLARE_STATIC_IID_ACCESSOR/"
                  "NS_DEFINE_STATIC_IID_ACCESSOR; or make the nsCOMPtr point "
                  "to a base class with an IID.");
  }

public:
  typedef T element_type;
# 426 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
  nsCOMPtr()
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
  }

               nsCOMPtr(decltype(nullptr))
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
  }

  nsCOMPtr(const nsCOMPtr<T>& aSmartPtr)
    : nsCOMPtr_base(aSmartPtr.mRawPtr)
  {
    assert_validity();
    if (mRawPtr) {
      (mRawPtr)->AddRef();
    }
                                                 ;
  }

  nsCOMPtr(nsCOMPtr<T>&& aSmartPtr)
    : nsCOMPtr_base(aSmartPtr.mRawPtr)
  {
    assert_validity();
    aSmartPtr.mRawPtr = nullptr;
                                       ;
                                  ;
  }

               nsCOMPtr(T* aRawPtr)
    : nsCOMPtr_base(aRawPtr)
  {
    assert_validity();
    if (mRawPtr) {
      (mRawPtr)->AddRef();
    }
                                       ;
                                  ;
  }

               nsCOMPtr(already_AddRefed<T>& aSmartPtr)
    : nsCOMPtr_base(aSmartPtr.take())
  {
    assert_validity();
                                       ;
                                  ;
  }


               nsCOMPtr(already_AddRefed<T>&& aSmartPtr)
    : nsCOMPtr_base(aSmartPtr.take())
  {
    assert_validity();
                                       ;
                                  ;
  }


  template<typename U>
               nsCOMPtr(already_AddRefed<U>& aSmartPtr)
    : nsCOMPtr_base(static_cast<T*>(aSmartPtr.take()))
  {
    assert_validity();

    static_assert(mozilla::IsBaseOf<T, U>::value,
                  "U is not a subclass of T");
                                                        ;
                                  ;
  }


  template<typename U>
               nsCOMPtr(already_AddRefed<U>&& aSmartPtr)
    : nsCOMPtr_base(static_cast<T*>(aSmartPtr.take()))
  {
    assert_validity();

    static_assert(mozilla::IsBaseOf<T, U>::value,
                  "U is not a subclass of T");
                                                        ;
                                  ;
  }


               nsCOMPtr(const nsQueryInterface aQI)
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
    assign_from_qi(aQI, (T::template COMTypeInfo<T, void>::kIID));
  }


               nsCOMPtr(const nsQueryInterfaceWithError& aQI)
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
    assign_from_qi_with_error(aQI, (T::template COMTypeInfo<T, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByCID aGS)
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
    assign_from_gs_cid(aGS, (T::template COMTypeInfo<T, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByCIDWithError& aGS)
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
    assign_from_gs_cid_with_error(aGS, (T::template COMTypeInfo<T, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByContractID aGS)
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
    assign_from_gs_contractid(aGS, (T::template COMTypeInfo<T, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByContractIDWithError& aGS)
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
    assign_from_gs_contractid_with_error(aGS, (T::template COMTypeInfo<T, void>::kIID));
  }



               nsCOMPtr(const nsCOMPtr_helper& aHelper)
    : nsCOMPtr_base(nullptr)
  {
    assert_validity();
                                       ;
    assign_from_helper(aHelper, (T::template COMTypeInfo<T, void>::kIID));
                                  ;
  }


  template<class U>
               nsCOMPtr(const mozilla::OwningNonNull<U>& aOther);




  nsCOMPtr<T>& operator=(const nsCOMPtr<T>& aRhs)
  {
    assign_with_AddRef(aRhs.mRawPtr);
    return *this;
  }

  nsCOMPtr<T>& operator=(T* aRhs)
  {
    assign_with_AddRef(aRhs);
                                  ;
    return *this;
  }

  nsCOMPtr<T>& operator=(decltype(nullptr))
  {
    assign_assuming_AddRef(nullptr);
    return *this;
  }


  template<typename U>
  nsCOMPtr<T>& operator=(already_AddRefed<U>& aRhs)
  {

    static_assert(mozilla::IsBaseOf<T, U>::value,
                  "U is not a subclass of T");
    assign_assuming_AddRef(static_cast<T*>(aRhs.take()));
                                  ;
    return *this;
  }


  template<typename U>
  nsCOMPtr<T>& operator=(already_AddRefed<U>&& aRhs)
  {

    static_assert(mozilla::IsBaseOf<T, U>::value,
                  "U is not a subclass of T");
    assign_assuming_AddRef(static_cast<T*>(aRhs.take()));
                                  ;
    return *this;
  }


  nsCOMPtr<T>& operator=(const nsQueryInterface aRhs)
  {
    assign_from_qi(aRhs, (T::template COMTypeInfo<T, void>::kIID));
    return *this;
  }


  nsCOMPtr<T>& operator=(const nsQueryInterfaceWithError& aRhs)
  {
    assign_from_qi_with_error(aRhs, (T::template COMTypeInfo<T, void>::kIID));
    return *this;
  }


  nsCOMPtr<T>& operator=(const nsGetServiceByCID aRhs)
  {
    assign_from_gs_cid(aRhs, (T::template COMTypeInfo<T, void>::kIID));
    return *this;
  }


  nsCOMPtr<T>& operator=(const nsGetServiceByCIDWithError& aRhs)
  {
    assign_from_gs_cid_with_error(aRhs, (T::template COMTypeInfo<T, void>::kIID));
    return *this;
  }


  nsCOMPtr<T>& operator=(const nsGetServiceByContractID aRhs)
  {
    assign_from_gs_contractid(aRhs, (T::template COMTypeInfo<T, void>::kIID));
    return *this;
  }


  nsCOMPtr<T>& operator=(const nsGetServiceByContractIDWithError& aRhs)
  {
    assign_from_gs_contractid_with_error(aRhs, (T::template COMTypeInfo<T, void>::kIID));
    return *this;
  }



  nsCOMPtr<T>& operator=(const nsCOMPtr_helper& aRhs)
  {
    assign_from_helper(aRhs, (T::template COMTypeInfo<T, void>::kIID));
                                  ;
    return *this;
  }


  template<class U>
  nsCOMPtr<T>& operator=(const mozilla::OwningNonNull<U>& aOther);


  void swap(nsCOMPtr<T>& aRhs)
  {

    nsISupports* temp = aRhs.mRawPtr;



                                        ;
                                    ;
                                    ;
                                  ;
    aRhs.mRawPtr = mRawPtr;
    mRawPtr = temp;

  }


  void swap(T*& aRhs)
  {

    nsISupports* temp = aRhs;



                                    ;
                                    ;
    aRhs = reinterpret_cast<T*>(mRawPtr);
    mRawPtr = temp;
                                  ;
  }






  already_AddRefed<T> forget()
  {
    T* temp = nullptr;
    swap(temp);
    return already_AddRefed<T>(temp);
  }




  template<typename I>
  void forget(I** aRhs)
  {
    do { } while(0);
                                    ;
    *aRhs = get();
    mRawPtr = nullptr;
  }




  T* get() const { return reinterpret_cast<T*>(mRawPtr); }







  operator T*() const & { return get(); }




  operator T*() const && = delete;


  explicit operator bool() const { return !!mRawPtr; }

  T* operator->() const
  {
    do { } while (0);

    return get();
  }


  nsCOMPtr<T>* get_address() { return this; }
  const nsCOMPtr<T>* get_address() const { return this; }

public:
  T& operator*() const
  {
    do { } while (0);

    return *get();
  }

  T** StartAssignment()
  {

    return reinterpret_cast<T**>(begin_assignment());




  }
};
# 800 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
template<>
class nsCOMPtr<nsISupports>
  : private nsCOMPtr_base
{
public:
  typedef nsISupports element_type;



  nsCOMPtr()
    : nsCOMPtr_base(nullptr)
  {
                                       ;
  }

               nsCOMPtr(decltype(nullptr))
    : nsCOMPtr_base(nullptr)
  {
                                       ;
  }

  nsCOMPtr(const nsCOMPtr<nsISupports>& aSmartPtr)
    : nsCOMPtr_base(aSmartPtr.mRawPtr)
  {
    if (mRawPtr) {
      (mRawPtr)->AddRef();
    }
                                                 ;
  }

               nsCOMPtr(nsISupports* aRawPtr)
    : nsCOMPtr_base(aRawPtr)
  {
    if (mRawPtr) {
      (mRawPtr)->AddRef();
    }
                                       ;
  }


               nsCOMPtr(already_AddRefed<nsISupports>& aSmartPtr)
    : nsCOMPtr_base(aSmartPtr.take())
  {
                                       ;
  }


               nsCOMPtr(already_AddRefed<nsISupports>&& aSmartPtr)
    : nsCOMPtr_base(aSmartPtr.take())
  {
                                       ;
  }


               nsCOMPtr(const nsQueryInterface aQI)
    : nsCOMPtr_base(nullptr)
  {
                                       ;
    assign_from_qi(aQI, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
  }


               nsCOMPtr(const nsQueryInterfaceWithError& aQI)
    : nsCOMPtr_base(nullptr)
  {
                                       ;
    assign_from_qi_with_error(aQI, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByCID aGS)
    : nsCOMPtr_base(nullptr)
  {
                                       ;
    assign_from_gs_cid(aGS, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByCIDWithError& aGS)
    : nsCOMPtr_base(nullptr)
  {
                                       ;
    assign_from_gs_cid_with_error(aGS, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByContractID aGS)
    : nsCOMPtr_base(nullptr)
  {
                                       ;
    assign_from_gs_contractid(aGS, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
  }


               nsCOMPtr(const nsGetServiceByContractIDWithError& aGS)
    : nsCOMPtr_base(nullptr)
  {
                                       ;
    assign_from_gs_contractid_with_error(aGS, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
  }



               nsCOMPtr(const nsCOMPtr_helper& aHelper)
    : nsCOMPtr_base(nullptr)
  {
                                       ;
    assign_from_helper(aHelper, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
  }




  nsCOMPtr<nsISupports>& operator=(const nsCOMPtr<nsISupports>& aRhs)
  {
    assign_with_AddRef(aRhs.mRawPtr);
    return *this;
  }

  nsCOMPtr<nsISupports>& operator=(nsISupports* aRhs)
  {
    assign_with_AddRef(aRhs);
    return *this;
  }

  nsCOMPtr<nsISupports>& operator=(decltype(nullptr))
  {
    assign_assuming_AddRef(nullptr);
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(already_AddRefed<nsISupports>& aRhs)
  {
    assign_assuming_AddRef(aRhs.take());
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(already_AddRefed<nsISupports>&& aRhs)
  {
    assign_assuming_AddRef(aRhs.take());
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(const nsQueryInterface aRhs)
  {
    assign_from_qi(aRhs, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(const nsQueryInterfaceWithError& aRhs)
  {
    assign_from_qi_with_error(aRhs, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(const nsGetServiceByCID aRhs)
  {
    assign_from_gs_cid(aRhs, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(const nsGetServiceByCIDWithError& aRhs)
  {
    assign_from_gs_cid_with_error(aRhs, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(const nsGetServiceByContractID aRhs)
  {
    assign_from_gs_contractid(aRhs, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
    return *this;
  }


  nsCOMPtr<nsISupports>& operator=(const nsGetServiceByContractIDWithError& aRhs)
  {
    assign_from_gs_contractid_with_error(aRhs, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
    return *this;
  }



  nsCOMPtr<nsISupports>& operator=(const nsCOMPtr_helper& aRhs)
  {
    assign_from_helper(aRhs, (nsISupports::COMTypeInfo<nsISupports, void>::kIID));
    return *this;
  }


  void swap(nsCOMPtr<nsISupports>& aRhs)
  {
    nsISupports* temp = aRhs.mRawPtr;
                                        ;
                                    ;
                                    ;
                                  ;
    aRhs.mRawPtr = mRawPtr;
    mRawPtr = temp;
  }


  void swap(nsISupports*& aRhs)
  {
    nsISupports* temp = aRhs;
                                    ;
                                    ;
    aRhs = mRawPtr;
    mRawPtr = temp;
  }



  already_AddRefed<nsISupports> forget()
  {
    nsISupports* temp = nullptr;
    swap(temp);
    return already_AddRefed<nsISupports>(temp);
  }




  void forget(nsISupports** aRhs)
  {
    do { } while(0);
    *aRhs = nullptr;
    swap(*aRhs);
  }






  nsISupports* get() const { return reinterpret_cast<nsISupports*>(mRawPtr); }







  operator nsISupports* () const { return get(); }

  nsISupports* operator->() const
  {
    do { } while (0);

    return get();
  }


  nsCOMPtr<nsISupports>* get_address() { return this; }
  const nsCOMPtr<nsISupports>* get_address() const { return this; }

public:

  nsISupports& operator*() const
  {
    do { } while (0);

    return *get();
  }

  nsISupports** StartAssignment()
  {

    return reinterpret_cast<nsISupports**>(begin_assignment());




  }
};

template<typename T>
inline void
ImplCycleCollectionUnlink(nsCOMPtr<T>& aField)
{
  aField = nullptr;
}

template<typename T>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsCOMPtr<T>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  CycleCollectionNoteChild(aCallback, aField.get(), aName, aFlags);
}
# 1206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
template<class T>
inline nsCOMPtr<T>*
address_of(nsCOMPtr<T>& aPtr)
{
  return aPtr.get_address();
}

template<class T>
inline const nsCOMPtr<T>*
address_of(const nsCOMPtr<T>& aPtr)
{
  return aPtr.get_address();
}
# 1235 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
template<class T>
class nsGetterAddRefs
{
public:
  explicit nsGetterAddRefs(nsCOMPtr<T>& aSmartPtr)
    : mTargetSmartPtr(aSmartPtr)
  {
  }
# 1258 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
  operator void**()
  {
    return reinterpret_cast<void**>(mTargetSmartPtr.StartAssignment());
  }

  operator T**() { return mTargetSmartPtr.StartAssignment(); }
  T*& operator*() { return *(mTargetSmartPtr.StartAssignment()); }

private:
  nsCOMPtr<T>& mTargetSmartPtr;
};


template<>
class nsGetterAddRefs<nsISupports>
{
public:
  explicit nsGetterAddRefs(nsCOMPtr<nsISupports>& aSmartPtr)
    : mTargetSmartPtr(aSmartPtr)
  {
  }
# 1288 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMPtr.h"
  operator void**()
  {
    return reinterpret_cast<void**>(mTargetSmartPtr.StartAssignment());
  }

  operator nsISupports**() { return mTargetSmartPtr.StartAssignment(); }
  nsISupports*& operator*() { return *(mTargetSmartPtr.StartAssignment()); }

private:
  nsCOMPtr<nsISupports>& mTargetSmartPtr;
};

template<class T>
inline nsGetterAddRefs<T>
getter_AddRefs(nsCOMPtr<T>& aSmartPtr)
{
  return nsGetterAddRefs<T>(aSmartPtr);
}

template<class T, class DestinationType>
inline nsresult
CallQueryInterface(T* aSource, nsGetterAddRefs<DestinationType> aDestination)
{
  return CallQueryInterface(aSource,
                            static_cast<DestinationType**>(aDestination));
}




template<class T, class U>
inline bool
operator==(const nsCOMPtr<T>& aLhs, const nsCOMPtr<U>& aRhs)
{
  return static_cast<const T*>(aLhs.get()) == static_cast<const U*>(aRhs.get());
}


template<class T, class U>
inline bool
operator!=(const nsCOMPtr<T>& aLhs, const nsCOMPtr<U>& aRhs)
{
  return static_cast<const T*>(aLhs.get()) != static_cast<const U*>(aRhs.get());
}




template<class T, class U>
inline bool
operator==(const nsCOMPtr<T>& aLhs, const U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) == aRhs;
}

template<class T, class U>
inline bool
operator==(const U* aLhs, const nsCOMPtr<T>& aRhs)
{
  return aLhs == static_cast<const T*>(aRhs.get());
}

template<class T, class U>
inline bool
operator!=(const nsCOMPtr<T>& aLhs, const U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) != aRhs;
}

template<class T, class U>
inline bool
operator!=(const U* aLhs, const nsCOMPtr<T>& aRhs)
{
  return aLhs != static_cast<const T*>(aRhs.get());
}

template<class T, class U>
inline bool
operator==(const nsCOMPtr<T>& aLhs, U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) == const_cast<const U*>(aRhs);
}

template<class T, class U>
inline bool
operator==(U* aLhs, const nsCOMPtr<T>& aRhs)
{
  return const_cast<const U*>(aLhs) == static_cast<const T*>(aRhs.get());
}

template<class T, class U>
inline bool
operator!=(const nsCOMPtr<T>& aLhs, U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) != const_cast<const U*>(aRhs);
}

template<class T, class U>
inline bool
operator!=(U* aLhs, const nsCOMPtr<T>& aRhs)
{
  return const_cast<const U*>(aLhs) != static_cast<const T*>(aRhs.get());
}





template<class T>
inline bool
operator==(const nsCOMPtr<T>& aLhs, decltype(nullptr))
{
  return aLhs.get() == nullptr;
}

template<class T>
inline bool
operator==(decltype(nullptr), const nsCOMPtr<T>& aRhs)
{
  return nullptr == aRhs.get();
}

template<class T>
inline bool
operator!=(const nsCOMPtr<T>& aLhs, decltype(nullptr))
{
  return aLhs.get() != nullptr;
}

template<class T>
inline bool
operator!=(decltype(nullptr), const nsCOMPtr<T>& aRhs)
{
  return nullptr != aRhs.get();
}




inline bool
SameCOMIdentity(nsISupports* aLhs, nsISupports* aRhs)
{
  return nsCOMPtr<nsISupports>(do_QueryInterface(aLhs)) ==
    nsCOMPtr<nsISupports>(do_QueryInterface(aRhs));
}



template<class SourceType, class DestinationType>
inline nsresult
CallQueryInterface(nsCOMPtr<SourceType>& aSourcePtr, DestinationType** aDestPtr)
{
  return CallQueryInterface(aSourcePtr.get(), aDestPtr);
}

template <class T>
RefPtr<T>::RefPtr(const nsCOMPtr_helper& aHelper)
{
  void* newRawPtr;
  if (((bool)(__builtin_expect(!!(NS_FAILED_impl(aHelper((T::template COMTypeInfo<T, void>::kIID), &newRawPtr))), 0)))) {
    newRawPtr = nullptr;
  }
  mRawPtr = static_cast<T*>(newRawPtr);
}

template <class T>
RefPtr<T>&
RefPtr<T>::operator=(const nsCOMPtr_helper& aHelper)
{
  void* newRawPtr;
  if (((bool)(__builtin_expect(!!(NS_FAILED_impl(aHelper((T::template COMTypeInfo<T, void>::kIID), &newRawPtr))), 0)))) {
    newRawPtr = nullptr;
  }
  assign_assuming_AddRef(static_cast<T*>(newRawPtr));
  return *this;
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h" 2
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h"
template <class T>
class nsAutoPtr
{
private:
  static_assert(!mozilla::IsScalar<T>::value, "If you are using "
                "nsAutoPtr to hold an array, use UniquePtr<T[]> instead");

  void**
  begin_assignment()
  {
    assign(0);
    return reinterpret_cast<void**>(&mRawPtr);
  }

  void
  assign(T* aNewPtr)
  {
    T* oldPtr = mRawPtr;

    if (aNewPtr && aNewPtr == oldPtr) {
      do { AnnotateMozCrashReason("MOZ_CRASH(" "Logic flaw in the caller" ")"); do { *((volatile int*) __null) = 41; ::abort(); } while (0); } while (0);
    }

    mRawPtr = aNewPtr;
    delete oldPtr;
  }






  class Ptr
  {
  public:
                 Ptr(T* aPtr)
      : mPtr(aPtr)
    {
    }

    operator T*() const
    {
      return mPtr;
    }

  private:
    T* mPtr;
  };

private:
  T* mRawPtr;

public:
  typedef T element_type;

  ~nsAutoPtr()
  {
    delete mRawPtr;
  }



  nsAutoPtr()
    : mRawPtr(0)

  {
  }

               nsAutoPtr(Ptr aRawPtr)
    : mRawPtr(aRawPtr)

  {
  }



  nsAutoPtr(nsAutoPtr<T>& aSmartPtr)
    : mRawPtr(aSmartPtr.forget())

  {
  }

  template <typename I>
               nsAutoPtr(nsAutoPtr<I>& aSmartPtr)
    : mRawPtr(aSmartPtr.forget())

  {
  }

  nsAutoPtr(nsAutoPtr<T>&& aSmartPtr)
    : mRawPtr(aSmartPtr.forget())

  {
  }

  template <typename I>
               nsAutoPtr(nsAutoPtr<I>&& aSmartPtr)
    : mRawPtr(aSmartPtr.forget())

  {
  }



  nsAutoPtr<T>&
  operator=(T* aRhs)

  {
    assign(aRhs);
    return *this;
  }

  nsAutoPtr<T>& operator=(nsAutoPtr<T>& aRhs)

  {
    assign(aRhs.forget());
    return *this;
  }

  template <typename I>
  nsAutoPtr<T>& operator=(nsAutoPtr<I>& aRhs)

  {
    assign(aRhs.forget());
    return *this;
  }

  nsAutoPtr<T>& operator=(nsAutoPtr<T>&& aRhs)
  {
    assign(aRhs.forget());
    return *this;
  }

  template <typename I>
  nsAutoPtr<T>& operator=(nsAutoPtr<I>&& aRhs)
  {
    assign(aRhs.forget());
    return *this;
  }



  T*
  get() const





  {
    return mRawPtr;
  }

  operator T*() const
# 184 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h"
  {
    return get();
  }

  T*
  forget()
  {
    T* temp = mRawPtr;
    mRawPtr = 0;
    return temp;
  }

  T*
  operator->() const
  {
    do { } while(0);

    return get();
  }

  template <typename R, typename... Args>
  class Proxy
  {
    typedef R (T::*member_function)(Args...);
    T* mRawPtr;
    member_function mFunction;
  public:
    Proxy(T* aRawPtr, member_function aFunction)
      : mRawPtr(aRawPtr),
        mFunction(aFunction)
    {
    }
    template<typename... ActualArgs>
    R operator()(ActualArgs&&... aArgs)
    {
      return ((*mRawPtr).*mFunction)(mozilla::Forward<ActualArgs>(aArgs)...);
    }
  };

  template <typename R, typename C, typename... Args>
  Proxy<R, Args...> operator->*(R (C::*aFptr)(Args...)) const
  {
    do { } while(0);

    return Proxy<R, Args...>(get(), aFptr);
  }

  nsAutoPtr<T>*
  get_address()


  {
    return this;
  }

  const nsAutoPtr<T>*
  get_address() const


  {
    return this;
  }

public:
  T&
  operator*() const
  {
    do { } while(0);

    return *get();
  }

  T**
  StartAssignment()
  {

    return reinterpret_cast<T**>(begin_assignment());




  }
};

template <class T>
inline nsAutoPtr<T>*
address_of(nsAutoPtr<T>& aPtr)
{
  return aPtr.get_address();
}

template <class T>
inline const nsAutoPtr<T>*
address_of(const nsAutoPtr<T>& aPtr)
{
  return aPtr.get_address();
}

template <class T>
class nsAutoPtrGetterTransfers
# 301 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAutoPtr.h"
{
public:
  explicit
  nsAutoPtrGetterTransfers(nsAutoPtr<T>& aSmartPtr)
    : mTargetSmartPtr(aSmartPtr)
  {

  }

  operator void**()
  {
    return reinterpret_cast<void**>(mTargetSmartPtr.StartAssignment());
  }

  operator T**()
  {
    return mTargetSmartPtr.StartAssignment();
  }

  T*&
  operator*()
  {
    return *(mTargetSmartPtr.StartAssignment());
  }

private:
  nsAutoPtr<T>& mTargetSmartPtr;
};

template <class T>
inline nsAutoPtrGetterTransfers<T>
getter_Transfers(nsAutoPtr<T>& aSmartPtr)




{
  return nsAutoPtrGetterTransfers<T>(aSmartPtr);
}





template <class T, class U>
inline bool
operator==(const nsAutoPtr<T>& aLhs, const nsAutoPtr<U>& aRhs)
{
  return static_cast<const T*>(aLhs.get()) == static_cast<const U*>(aRhs.get());
}


template <class T, class U>
inline bool
operator!=(const nsAutoPtr<T>& aLhs, const nsAutoPtr<U>& aRhs)
{
  return static_cast<const T*>(aLhs.get()) != static_cast<const U*>(aRhs.get());
}




template <class T, class U>
inline bool
operator==(const nsAutoPtr<T>& aLhs, const U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) == static_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator==(const U* aLhs, const nsAutoPtr<T>& aRhs)
{
  return static_cast<const U*>(aLhs) == static_cast<const T*>(aRhs.get());
}

template <class T, class U>
inline bool
operator!=(const nsAutoPtr<T>& aLhs, const U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) != static_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator!=(const U* aLhs, const nsAutoPtr<T>& aRhs)
{
  return static_cast<const U*>(aLhs) != static_cast<const T*>(aRhs.get());
}

template <class T, class U>
inline bool
operator==(const nsAutoPtr<T>& aLhs, U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) == const_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator==(U* aLhs, const nsAutoPtr<T>& aRhs)
{
  return const_cast<const U*>(aLhs) == static_cast<const T*>(aRhs.get());
}

template <class T, class U>
inline bool
operator!=(const nsAutoPtr<T>& aLhs, U* aRhs)
{
  return static_cast<const T*>(aLhs.get()) != const_cast<const U*>(aRhs);
}

template <class T, class U>
inline bool
operator!=(U* aLhs, const nsAutoPtr<T>& aRhs)
{
  return const_cast<const U*>(aLhs) != static_cast<const T*>(aRhs.get());
}





template <class T>
inline bool
operator==(const nsAutoPtr<T>& aLhs, decltype(nullptr))
{
  return aLhs.get() == nullptr;
}

template <class T>
inline bool
operator==(decltype(nullptr), const nsAutoPtr<T>& aRhs)
{
  return nullptr == aRhs.get();
}

template <class T>
inline bool
operator!=(const nsAutoPtr<T>& aLhs, decltype(nullptr))
{
  return aLhs.get() != nullptr;
}

template <class T>
inline bool
operator!=(decltype(nullptr), const nsAutoPtr<T>& aRhs)
{
  return nullptr != aRhs.get();
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OwningNonNull.h" 2


namespace mozilla {

template<class T>
class OwningNonNull
{
public:
  OwningNonNull() {}

               OwningNonNull(T& aValue)
  {
    init(&aValue);
  }

  template<class U>
               OwningNonNull(already_AddRefed<U>&& aValue)
  {
    init(aValue);
  }

  template<class U>
               OwningNonNull(const OwningNonNull<U>& aValue)
  {
    init(aValue);
  }


  operator T&() const
  {
    do { } while (0);
    do { } while (0);
    return *mPtr;
  }

  operator T*() const
  {
    do { } while (0);
    do { } while (0);
    return mPtr;
  }


  explicit operator bool() const = delete;

  T*
  operator->() const
  {
    do { } while (0);
    do { } while (0);
    return mPtr;
  }

  OwningNonNull<T>&
  operator=(T* aValue)
  {
    init(aValue);
    return *this;
  }

  OwningNonNull<T>&
  operator=(T& aValue)
  {
    init(&aValue);
    return *this;
  }

  template<class U>
  OwningNonNull<T>&
  operator=(already_AddRefed<U>&& aValue)
  {
    init(aValue);
    return *this;
  }

  template<class U>
  OwningNonNull<T>&
  operator=(const OwningNonNull<U>& aValue)
  {
    init(aValue);
    return *this;
  }


  void operator=(decltype(nullptr)) = delete;

  already_AddRefed<T> forget()
  {



    return mPtr.forget();
  }

  template<class U>
  void
  forget(U** aOther)
  {



    mPtr.forget(aOther);
  }


  T* get() const
  {
    do { } while (0);
    do { } while (0);
    return mPtr;
  }

  template<typename U>
  void swap(U& aOther)
  {
    mPtr.swap(aOther);



  }




  bool isInitialized() const
  {
    do { } while (0);
    return mPtr;
  }

protected:
  template<typename U>
  void init(U&& aValue)
  {
    mPtr = aValue;
    do { } while (0);



  }

  RefPtr<T> mPtr;



};

template <typename T>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            OwningNonNull<T>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  CycleCollectionNoteChild(aCallback, aField.get(), aName, aFlags);
}

}


template<class T> template<class U>
nsCOMPtr<T>::nsCOMPtr(const mozilla::OwningNonNull<U>& aOther)
  : nsCOMPtr(aOther.get())
{}

template<class T> template<class U>
nsCOMPtr<T>&
nsCOMPtr<T>::operator=(const mozilla::OwningNonNull<U>& aOther)
{
  return operator=(aOther.get());
}


template<class T> template<class U>
RefPtr<T>::RefPtr(const mozilla::OwningNonNull<U>& aOther)
  : RefPtr(aOther.get())
{}

template<class T> template<class U>
RefPtr<T>&
RefPtr<T>::operator=(const mozilla::OwningNonNull<U>& aOther)
{
  return operator=(aOther.get());
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h" 2



namespace JS {
template<typename T>
struct GCPolicy<mozilla::OwningNonNull<T>>
{
  typedef mozilla::OwningNonNull<T> SmartPtrType;

  static SmartPtrType initial()
  {
    return SmartPtrType();
  }

  static void trace(JSTracer* trc, SmartPtrType* tp,
                    const char* name)
  {
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedOwningNonNull.h"
    if ((*tp).isInitialized()) {
      (*tp)->Trace(trc);
    }
  }
};
}

namespace js {
template<typename T, typename Wrapper>
struct WrappedPtrOperations<mozilla::OwningNonNull<T>, Wrapper>
{
  operator T& () const
  {
    return static_cast<const Wrapper*>(this)->get();
  }
};
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedRefPtr.h" 1
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RootedRefPtr.h"
namespace JS {
template<typename T>
struct GCPolicy<RefPtr<T>>
{
  static RefPtr<T> initial() {
    return RefPtr<T>();
  }

  static void trace(JSTracer* trc, RefPtr<T>* tp, const char* name)
  {
    if (*tp) {
      (*tp)->Trace(trc);
    }
  }
};
}

namespace js {
template<typename T, typename Wrapper>
struct WrappedPtrOperations<RefPtr<T>, Wrapper>
{
  operator T*() const
  {
    return static_cast<const Wrapper*>(this)->get();
  }
};
}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
template<class T> struct already_AddRefed;
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
class nsStringBuffer
{
private:
  friend class CheckStaticAtomSizes;

  std::atomic<uint32_t> mRefCount;
  uint32_t mStorageSize;

public:
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
  static already_AddRefed<nsStringBuffer> Alloc(size_t aStorageSize);
# 61 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
  static nsStringBuffer* Realloc(nsStringBuffer* aBuf, size_t aStorageSize);




  void AddRef();





  void Release();






  static nsStringBuffer* FromData(void* aData)
  {
    return reinterpret_cast<nsStringBuffer*>(aData) - 1;
  }




  void* Data() const
  {
    return const_cast<char*>(reinterpret_cast<const char*>(this + 1));
  }






  uint32_t StorageSize() const
  {
    return mStorageSize;
  }
# 110 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
  bool IsReadonly() const
  {
# 132 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
    return mRefCount.load(std::memory_order_relaxed) > 1;
  }
# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
  static nsStringBuffer* FromString(const nsAString& aStr);
  static nsStringBuffer* FromString(const nsACString& aStr);
# 160 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
  void ToString(uint32_t aLen, nsAString& aStr, bool aMoveOwnership = false);
  void ToString(uint32_t aLen, nsACString& aStr, bool aMoveOwnership = false);




  size_t SizeOfIncludingThisIfUnshared(mozilla::MallocSizeOf aMallocSizeOf) const;
# 177 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStringBuffer.h"
  size_t SizeOfIncludingThisEvenIfShared(mozilla::MallocSizeOf aMallocSizeOf) const;
};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMString.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMString.h"
inline bool DOMStringIsNull(const nsAString& aString)
{
  return aString.IsVoid();
}

inline void SetDOMStringToNull(nsAString& aString)
{
  aString.SetIsVoid(true);
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h" 1
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h"
class nsIAtom : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult ScriptableToString(nsAString & _retval) = 0;


  virtual nsresult ToUTF8String(nsACString & _retval) = 0;


  virtual nsresult ScriptableEquals(const nsAString & aString, bool *_retval) = 0;


  virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) = 0;


  inline bool Equals(char16ptr_t aString, uint32_t aLength) const
  {
    return mLength == aLength &&
           memcmp(mString, aString, mLength * sizeof(char16_t)) == 0;
  }
  inline bool Equals(const nsAString& aString) const {
    return Equals(aString.BeginReading(), aString.Length());
  }
  inline bool IsStaticAtom() const {
    return mIsStatic;
  }
  inline char16ptr_t GetUTF16String() const {
    return mString;
  }
  inline uint32_t GetLength() const {
    return mLength;
  }
  inline void ToString(nsAString& aBuf) const {

    nsStringBuffer::FromData(mString)->ToString(mLength, aBuf);
  }
  inline nsStringBuffer* GetStringBuffer() const {

    return nsStringBuffer::FromData(mString);
  }





  inline uint32_t hash() const {
    return mHash;
  }
protected:
  uint32_t mLength:31;
  uint32_t mIsStatic:1;
  uint32_t mHash;





  char16_t* mString;
};

  template<typename T> struct nsIAtom::COMTypeInfo<nsIAtom, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIAtom::COMTypeInfo<nsIAtom, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x8b8c11d4, 0x3ed5, 0x4079, { 0x89, 0x74, 0x73, 0xc7, 0x57, 0x6c, 0xdb, 0x34 }};
# 192 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAtom.h"
extern already_AddRefed<nsIAtom> NS_Atomize(const char* aUTF8String);



extern already_AddRefed<nsIAtom> NS_Atomize(const nsACString& aUTF8String);




extern already_AddRefed<nsIAtom> NS_Atomize(const char16_t* aUTF16String);



extern already_AddRefed<nsIAtom> NS_Atomize(const nsAString& aUTF16String);



extern already_AddRefed<nsIAtom> NS_AtomizeMainThread(const nsAString& aUTF16String);




extern nsrefcnt NS_GetNumberOfAtoms(void);




extern nsIAtom* NS_GetStaticAtom(const nsAString& aUTF16String);



extern void NS_SealStaticAtomTable();
class nsAtomString : public nsString
{
public:
  explicit nsAtomString(const nsIAtom* aAtom)
  {
    aAtom->ToString(*this);
  }
};
class nsAtomCString : public nsCString
{
public:
  explicit nsAtomCString(nsIAtom* aAtom)
  {
    aAtom->ToUTF8String(*this);
  }
};
class nsDependentAtomString : public nsDependentString
{
public:
  explicit nsDependentAtomString(const nsIAtom* aAtom)
    : nsDependentString(aAtom->GetUTF16String(), aAtom->GetLength())
  {
  }
};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h" 2

namespace mozilla {
namespace dom {
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMString.h"
class DOMString {
public:
  DOMString()
    : mStringBuffer(nullptr)
    , mLength(0)
    , mIsNull(false)
    , mStringBufferOwned(false)
  {}
  ~DOMString()
  {
    do { } while (0);

    if (mStringBufferOwned) {
      do { } while (0);
      mStringBuffer->Release();
    }
  }

  operator nsString&()
  {
    return AsAString();
  }



  operator const nsString&() = delete;
  operator const nsAString&() = delete;

  nsString& AsAString()
  {
    do { } while (0);
    do { } while (0);
    if (!mString) {
      mString.emplace();
    }
    return *mString;
  }

  bool HasStringBuffer() const
  {
    do { } while (0);

    do { } while (0);
    return !mString;
  }






  nsStringBuffer* StringBuffer() const
  {
    do { } while (0);
    do { } while (0);

    do { } while (0);
    do { } while (0);

    return mStringBuffer;
  }



  uint32_t StringBufferLength() const
  {
    do { } while (0);
    return mLength;
  }



  void RelinquishBufferOwnership()
  {
    do { } while (0);
    if (mStringBufferOwned) {

      mStringBufferOwned = false;
    } else {

      mStringBuffer->AddRef();
    }
  }




  void SetStringBuffer(nsStringBuffer* aStringBuffer, uint32_t aLength)
  {
    do { } while (0);
    do { } while (0);
    do { } while (0);
    do { } while (0);
    mStringBuffer = aStringBuffer;
    mLength = aLength;
  }


  void SetEphemeralStringBuffer(nsStringBuffer* aStringBuffer, uint32_t aLength)
  {

    SetStringBuffer(aStringBuffer, aLength);
    aStringBuffer->AddRef();
    mStringBufferOwned = true;
  }

  void SetOwnedString(const nsAString& aString)
  {
    do { } while (0);
    do { } while (0);
    do { } while (0);
    nsStringBuffer* buf = nsStringBuffer::FromString(aString);
    if (buf) {
      SetStringBuffer(buf, aString.Length());
    } else if (aString.IsVoid()) {
      SetNull();
    } else if (!aString.IsEmpty()) {
      AsAString() = aString;
    }
  }

  enum NullHandling
  {
    eTreatNullAsNull,
    eTreatNullAsEmpty,
    eNullNotExpected
  };

  void SetOwnedAtom(nsIAtom* aAtom, NullHandling aNullHandling)
  {
    do { } while (0);
    do { } while (0);
    do { } while (0);
    do { } while (0);
    if (aNullHandling == eNullNotExpected || aAtom) {
      SetStringBuffer(aAtom->GetStringBuffer(), aAtom->GetLength());
    } else if (aNullHandling == eTreatNullAsNull) {
      SetNull();
    }
  }

  void SetNull()
  {
    do { } while (0);
    do { } while (0);
    mIsNull = true;
  }

  bool IsNull() const
  {
    do { } while (0);

    return mIsNull || (mString && mString->IsVoid());
  }

  void ToString(nsAString& aString)
  {
    if (IsNull()) {
      SetDOMStringToNull(aString);
    } else if (HasStringBuffer()) {
      if (StringBufferLength() == 0) {
        aString.Truncate();
      } else {


        nsStringBuffer* buf = StringBuffer();
        uint32_t len = StringBufferLength();
        auto chars = static_cast<char16_t*>(buf->Data());
        if (chars[len] == '\0') {

          buf->ToString(len, aString);
        } else {

          aString.Assign(chars, len);
        }
      }
    } else {
      aString = AsAString();
    }
  }

private:

  Maybe<nsAutoString> mString;



  nsStringBuffer* mStringBuffer;


  uint32_t mLength;
  bool mIsNull;
  bool mStringBufferOwned;
};

}
}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingDeclarations.h" 2





class nsIPrincipal;
class nsWrapperCache;

namespace mozilla {
namespace dom {



struct DictionaryBase
{
protected:
  bool ParseJSON(JSContext* aCx, const nsAString& aJSON,
                 JS::MutableHandle<JS::Value> aVal);

  bool StringifyToJSON(JSContext* aCx,
                       JS::Handle<JSObject*> aObj,
                       nsAString& aJSON) const;





  struct FastDictionaryInitializer {
  };

  bool mIsAnyMemberPresent = false;

private:


  static bool AppendJSONToString(const char16_t* aJSONData,
                                 uint32_t aDataLength, void* aString);

public:
  bool IsAnyMemberPresent() const
  {
    return mIsAnyMemberPresent;
  }
};




struct AllTypedArraysBase {
};




struct AllOwningUnionBase {
};


struct EnumEntry {
  const char* value;
  size_t length;
};

enum class CallerType : uint32_t;

class GlobalObject
{
public:
  GlobalObject(JSContext* aCx, JSObject* aObject);

  JSObject* Get() const
  {
    return mGlobalJSObject;
  }

  nsISupports* GetAsSupports() const;




  JSContext* Context() const
  {
    return mCx;
  }

  bool Failed() const
  {
    return !Get();
  }



  nsIPrincipal* GetSubjectPrincipal() const;



  dom::CallerType CallerType() const;

protected:
  JS::Rooted<JSObject*> mGlobalJSObject;
  JSContext* mCx;
  mutable nsISupports* mGlobalObject;



};


template<typename T, typename InternalType>
class Optional_base
{
public:
  Optional_base()
  {}

  explicit Optional_base(const T& aValue)
  {
    mImpl.emplace(aValue);
  }

  bool operator==(const Optional_base<T, InternalType>& aOther) const
  {
    return mImpl == aOther.mImpl;
  }

  template<typename T1, typename T2>
  explicit Optional_base(const T1& aValue1, const T2& aValue2)
  {
    mImpl.emplace(aValue1, aValue2);
  }

  bool WasPassed() const
  {
    return mImpl.isSome();
  }


  template<typename... Args>
  InternalType& Construct(Args&&... aArgs)
  {
    mImpl.emplace(Forward<Args>(aArgs)...);
    return *mImpl;
  }

  void Reset()
  {
    mImpl.reset();
  }

  const T& Value() const
  {
    return *mImpl;
  }


  InternalType& Value()
  {
    return *mImpl;
  }


  const InternalType& InternalValue() const
  {
    return *mImpl;
  }





private:

  Optional_base(const Optional_base& other) = delete;
  const Optional_base &operator=(const Optional_base &other) = delete;

protected:
  Maybe<InternalType> mImpl;
};

template<typename T>
class Optional : public Optional_base<T, T>
{
public:
  Optional() :
    Optional_base<T, T>()
  {}

  explicit Optional(const T& aValue) :
    Optional_base<T, T>(aValue)
  {}
};

template<typename T>
class Optional<JS::Handle<T> > :
  public Optional_base<JS::Handle<T>, JS::Rooted<T> >
{
public:
  Optional() :
    Optional_base<JS::Handle<T>, JS::Rooted<T> >()
  {}

  explicit Optional(JSContext* cx) :
    Optional_base<JS::Handle<T>, JS::Rooted<T> >()
  {
    this->Construct(cx);
  }

  Optional(JSContext* cx, const T& aValue) :
    Optional_base<JS::Handle<T>, JS::Rooted<T> >(cx, aValue)
  {}



  JS::Handle<T> Value() const
  {
    return *this->mImpl;
  }



  JS::Rooted<T>& Value()
  {
    return *this->mImpl;
  }
};




template<>
class Optional<JSObject*> : public Optional_base<JSObject*, JSObject*>
{
public:
  Optional() :
    Optional_base<JSObject*, JSObject*>()
  {}

  explicit Optional(JSObject* aValue) :
    Optional_base<JSObject*, JSObject*>(aValue)
  {}


  JSObject*& Construct()
  {


    return Optional_base<JSObject*, JSObject*>::Construct(
      static_cast<JSObject*>(nullptr));
  }

  template <class T1>
  JSObject*& Construct(const T1& t1)
  {
    return Optional_base<JSObject*, JSObject*>::Construct(t1);
  }
};


template<>
class Optional<JS::Value>
{
private:
  Optional() = delete;

  explicit Optional(const JS::Value& aValue) = delete;
};


template<typename U> class NonNull;
template<typename T>
class Optional<NonNull<T> > : public Optional_base<T, NonNull<T> >
{
public:



  T& Value() const
  {
    return *this->mImpl->get();
  }



  NonNull<T>& Value()
  {
    return *this->mImpl;
  }
};



template<typename T>
class Optional<OwningNonNull<T> > : public Optional_base<T, OwningNonNull<T> >
{
public:



  T& Value() const
  {
    return *this->mImpl->get();
  }



  OwningNonNull<T>& Value()
  {
    return *this->mImpl;
  }
};






namespace binding_detail {
struct FakeString;
}

template<>
class Optional<nsAString>
{
public:
  Optional() : mPassed(false) {}

  bool WasPassed() const
  {
    return mPassed;
  }

  void operator=(const nsAString* str)
  {
    do { } while (0);
    mStr = str;
    mPassed = true;
  }



  void operator=(const binding_detail::FakeString* str)
  {
    do { } while (0);
    mStr = reinterpret_cast<const nsString*>(str);
    mPassed = true;
  }

  const nsAString& Value() const
  {
    do { } while (0);
    return *mStr;
  }

private:

  Optional(const Optional& other) = delete;
  const Optional &operator=(const Optional &other) = delete;

  bool mPassed;
  const nsAString* mStr;
};

template<class T>
class NonNull
{
public:
  NonNull()



  {}


  operator T&() const {
    do { } while (0);
    do { } while (0);
    return *ptr;
  }

  operator T*() const {
    do { } while (0);
    do { } while (0);
    return ptr;
  }

  void operator=(T* t) {
    ptr = t;
    do { } while (0);



  }

  template<typename U>
  void operator=(U* t) {
    ptr = t->ToAStringPtr();
    do { } while (0);



  }

  T** Slot() {



    return &ptr;
  }

  T* Ptr() {
    do { } while (0);
    do { } while (0);
    return ptr;
  }


  T* get() const {
    do { } while (0);
    do { } while (0);
    return ptr;
  }

protected:
  T* ptr;



};





template<typename T>
class Sequence : public FallibleTArray<T>
{
public:
  Sequence() : FallibleTArray<T>()
  {}
};

inline nsWrapperCache*
GetWrapperCache(nsWrapperCache* cache)
{
  return cache;
}

inline nsWrapperCache*
GetWrapperCache(void* p)
{
  return nullptr;
}



template <template <typename> class SmartPtr, typename T>
inline nsWrapperCache*
GetWrapperCache(const SmartPtr<T>& aObject)
{
  return GetWrapperCache(aObject.get());
}

struct ParentObject {
  template<class T>
               ParentObject(T* aObject) :
    mObject(aObject),
    mWrapperCache(GetWrapperCache(aObject)),
    mUseXBLScope(false)
  {}

  template<class T, template<typename> class SmartPtr>
               ParentObject(const SmartPtr<T>& aObject) :
    mObject(aObject.get()),
    mWrapperCache(GetWrapperCache(aObject.get())),
    mUseXBLScope(false)
  {}

  ParentObject(nsISupports* aObject, nsWrapperCache* aCache) :
    mObject(aObject),
    mWrapperCache(aCache),
    mUseXBLScope(false)
  {}



  nsISupports* const mObject;
  nsWrapperCache* const mWrapperCache;
  bool mUseXBLScope;
};

namespace binding_detail {


template<typename T>
class AutoSequence : public AutoTArray<T, 16>
{
public:
  AutoSequence() : AutoTArray<T, 16>()
  {}


  operator const Sequence<T>&() const {
    return *reinterpret_cast<const Sequence<T>*>(this);
  }
};

}


enum class CallerType : uint32_t {
  System,
  NonSystem
};




class SystemCallerGuarantee {
public:
  operator CallerType() const { return CallerType::System; }
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Nullable.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Nullable.h"
class nsCycleCollectionTraversalCallback;

namespace mozilla {
namespace dom {


template <typename T>
struct Nullable
{
private:
  Maybe<T> mValue;

public:
  Nullable()
    : mValue()
  {}

               Nullable(const decltype(nullptr)&)
    : mValue()
  {}

  explicit Nullable(const T& aValue)
    : mValue()
  {
    mValue.emplace(aValue);
  }

               Nullable(T&& aValue)
    : mValue()
  {
    mValue.emplace(mozilla::Move(aValue));
  }

  Nullable(Nullable<T>&& aOther)
    : mValue(mozilla::Move(aOther.mValue))
  {}

  Nullable(const Nullable<T>& aOther)
    : mValue(aOther.mValue)
  {}

  void operator=(const Nullable<T>& aOther)
  {
    mValue = aOther.mValue;
  }

  void SetValue(const T& aArgs)
  {
    mValue.reset();
    mValue.emplace(aArgs);
  }

  void SetValue(T&& aArgs)
  {
    mValue.reset();
    mValue.emplace(mozilla::Move(aArgs));
  }




  T& SetValue() {
    if (mValue.isNothing()) {
      mValue.emplace();
    }
    return mValue.ref();
  }

  void SetNull() {
    mValue.reset();
  }

  const T& Value() const {
    return mValue.ref();
  }

  T& Value() {
    return mValue.ref();
  }

  bool IsNull() const {
    return mValue.isNothing();
  }

  bool Equals(const Nullable<T>& aOtherNullable) const
  {
    return mValue == aOtherNullable.mValue;
  }

  bool operator==(const Nullable<T>& aOtherNullable) const
  {
    return Equals(aOtherNullable);
  }

  bool operator!=(const Nullable<T>& aOtherNullable) const
  {
    return !Equals(aOtherNullable);
  }

  friend std::ostream& operator<<(std::ostream& aStream,
                                  const Nullable& aNullable) {
    return aStream << aNullable.mValue;
  }
};


template<typename T>
void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            Nullable<T>& aNullable,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  if (!aNullable.IsNull()) {
    ImplCycleCollectionTraverse(aCallback, aNullable.Value(), aName, aFlags);
  }
}

template<typename T>
void
ImplCycleCollectionUnlink(Nullable<T>& aNullable)
{
  if (!aNullable.IsNull()) {
    ImplCycleCollectionUnlink(aNullable.Value());
  }
}

}
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionTypes.h" 1



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CustomEventBinding.h" 1





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventBinding.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventBinding.h"
namespace mozilla {
namespace dom {

class Event;
struct EventAtoms;
struct EventInitAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

struct EventInit : public DictionaryBase
{
                        bool mBubbles;
                        bool mCancelable;
                        bool mComposed;

  EventInit();

  explicit inline EventInit(const FastDictionaryInitializer& )
  {

  }

  explicit inline EventInit(const EventInit& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  EventInit&
  operator=(const EventInit& aOther);

private:
  static bool
  InitIds(JSContext* cx, EventInitAtoms* atomsCache);
};

namespace binding_detail {
struct FastEventInit : public EventInit
{
  inline FastEventInit()
    : EventInit(FastDictionaryInitializer())
  {

  }
};
}


namespace EventBinding {

  typedef mozilla::dom::Event NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::Event* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 107 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JSObject*
  GetProtoObject(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 7 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CustomEventBinding.h" 2






namespace mozilla {
namespace dom {

class CustomEvent;
struct CustomEventAtoms;
struct CustomEventInitAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

struct CustomEventInit : public EventInit
{
                        JS::Value mDetail;

  CustomEventInit();

  explicit inline CustomEventInit(const FastDictionaryInitializer& )
    : EventInit(FastDictionaryInitializer()),
      mDetail(JS::UndefinedValue())
  {

  }

private:
  CustomEventInit(const CustomEventInit&) = delete;
  CustomEventInit& operator=(const CustomEventInit&) = delete;

  static bool
  InitIds(JSContext* cx, CustomEventInitAtoms* atomsCache);

public:
  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);
};

namespace binding_detail {
struct FastCustomEventInit : public CustomEventInit
{
  inline FastCustomEventInit()
    : CustomEventInit(FastDictionaryInitializer())
  {

  }
};
}


namespace CustomEventBinding {

  typedef mozilla::dom::CustomEvent NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::CustomEvent* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 98 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CustomEventBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 5 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionTypes.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMParserBinding.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMParserBinding.h"
namespace mozilla {
namespace dom {

class DOMParser;
struct DOMParserAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

enum class SupportedType : uint8_t {
  Text_html,
  Text_xml,
  Application_xml,
  Application_xhtml_xml,
  Image_svg_xml,
  EndGuard_
};

namespace SupportedTypeValues {
extern const EnumEntry strings[6];
}

bool
ToJSValue(JSContext* aCx, SupportedType aArgument, JS::MutableHandle<JS::Value> aValue);


namespace DOMParserBinding {

  typedef mozilla::dom::DOMParser NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::DOMParser* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 70 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMParserBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 6 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionTypes.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventHandlerBinding.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventHandlerBinding.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackFunction.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackFunction.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h" 1
# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h"
class nsCycleCollectionISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;
};

template<typename T> struct nsCycleCollectionISupports::COMTypeInfo<nsCycleCollectionISupports, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsCycleCollectionISupports::COMTypeInfo<nsCycleCollectionISupports, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xc61eac14, 0x5f7a, 0x4481, { 0x96, 0x5e, 0x7e, 0xaa, 0x6e, 0xff, 0xa8, 0x5f } };


namespace JS {
template<class T> class Heap;
}






struct TraceCallbacks
{
  virtual void Trace(JS::Heap<JS::Value>* aPtr, const char* aName,
                     void* aClosure) const = 0;
  virtual void Trace(JS::Heap<jsid>* aPtr, const char* aName,
                     void* aClosure) const = 0;
  virtual void Trace(JS::Heap<JSObject*>* aPtr, const char* aName,
                     void* aClosure) const = 0;
  virtual void Trace(JSObject** aPtr, const char* aName,
                     void* aClosure) const = 0;
  virtual void Trace(JS::TenuredHeap<JSObject*>* aPtr, const char* aName,
                     void* aClosure) const = 0;
  virtual void Trace(JS::Heap<JSString*>* aPtr, const char* aName,
                     void* aClosure) const = 0;
  virtual void Trace(JS::Heap<JSScript*>* aPtr, const char* aName,
                     void* aClosure) const = 0;
  virtual void Trace(JS::Heap<JSFunction*>* aPtr, const char* aName,
                     void* aClosure) const = 0;
};





struct TraceCallbackFunc : public TraceCallbacks
{
  typedef void (*Func)(JS::GCCellPtr aPtr, const char* aName, void* aClosure);

  explicit TraceCallbackFunc(Func aCb) : mCallback(aCb) {}

  virtual void Trace(JS::Heap<JS::Value>* aPtr, const char* aName,
                     void* aClosure) const override;
  virtual void Trace(JS::Heap<jsid>* aPtr, const char* aName,
                     void* aClosure) const override;
  virtual void Trace(JS::Heap<JSObject*>* aPtr, const char* aName,
                     void* aClosure) const override;
  virtual void Trace(JSObject** aPtr, const char* aName,
                     void* aClosure) const override;
  virtual void Trace(JS::TenuredHeap<JSObject*>* aPtr, const char* aName,
                     void* aClosure) const override;
  virtual void Trace(JS::Heap<JSString*>* aPtr, const char* aName,
                     void* aClosure) const override;
  virtual void Trace(JS::Heap<JSScript*>* aPtr, const char* aName,
                     void* aClosure) const override;
  virtual void Trace(JS::Heap<JSFunction*>* aPtr, const char* aName,
                     void* aClosure) const override;

private:
  Func mCallback;
};




class nsCycleCollectionParticipant
{
public:
  constexpr explicit nsCycleCollectionParticipant(bool aSkip,
                                                  bool aTraverseShouldTrace = false)
    : mMightSkip(aSkip)
    , mTraverseShouldTrace(aTraverseShouldTrace)
  {
  }

  virtual nsresult TraverseNative(void* aPtr, nsCycleCollectionTraversalCallback& aCb) = 0;

  nsresult TraverseNativeAndJS(void* aPtr,
                               nsCycleCollectionTraversalCallback& aCb)
  {
    nsresult rv = TraverseNative(aPtr, aCb);
    if (mTraverseShouldTrace) {


      TraceCallbackFunc noteJsChild(&nsCycleCollectionParticipant::NoteJSChild);
      Trace(aPtr, noteJsChild, &aCb);
    }
    return rv;
  }


  static void NoteJSChild(JS::GCCellPtr aGCThing, const char* aName,
                          void* aClosure);

  virtual void Root(void* aPtr) = 0;
  virtual void Unlink(void* aPtr) = 0;
  virtual void Unroot(void* aPtr) = 0;
  virtual const char* ClassName() = 0;

  virtual void Trace(void* aPtr, const TraceCallbacks& aCb,
                          void* aClosure) {}
# 163 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h"
  bool CanSkip(void* aPtr, bool aRemovingAllowed)
  {
    return mMightSkip ? CanSkipReal(aPtr, aRemovingAllowed) : false;
  }
# 193 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h"
  bool CanSkipInCC(void* aPtr)
  {
    return mMightSkip ? CanSkipInCCReal(aPtr) : false;
  }
# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h"
  bool CanSkipThis(void* aPtr)
  {
    return mMightSkip ? CanSkipThisReal(aPtr) : false;
  }

  virtual void DeleteCycleCollectable(void* aPtr) = 0;

protected:
  virtual bool CanSkipReal(void* aPtr, bool aRemovingAllowed)
  {
    do { } while(0);
    return false;
  }
  virtual bool CanSkipInCCReal(void* aPtr)
  {
    do { } while(0);
    return false;
  }
  virtual bool CanSkipThisReal(void* aPtr)
  {
    do { } while(0);
    return false;
  }

private:
  const bool mMightSkip;
  const bool mTraverseShouldTrace;
};

class nsScriptObjectTracer : public nsCycleCollectionParticipant
{
public:
  constexpr explicit nsScriptObjectTracer(bool aSkip)
    : nsCycleCollectionParticipant(aSkip, true)
  {
  }

  virtual void Trace(void* aPtr, const TraceCallbacks& aCb,
                          void* aClosure) override = 0;

};

class nsXPCOMCycleCollectionParticipant : public nsScriptObjectTracer
{
public:
  constexpr explicit nsXPCOMCycleCollectionParticipant(bool aSkip)
    : nsScriptObjectTracer(aSkip)
  {
  }

  template<typename T, typename U> struct COMTypeInfo;

  virtual void Root(void* aPtr) override;
  virtual void Unroot(void* aPtr) override;

  virtual void Trace(void* aPtr, const TraceCallbacks& aCb,
                          void* aClosure) override;

  static bool CheckForRightISupports(nsISupports* aSupports);
};

template<typename T> struct nsXPCOMCycleCollectionParticipant::COMTypeInfo<nsXPCOMCycleCollectionParticipant, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsXPCOMCycleCollectionParticipant::COMTypeInfo<nsXPCOMCycleCollectionParticipant, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x9674489b, 0x1f6f, 0x4550, { 0xa7, 0x30, 0xcc, 0xae, 0xdd, 0x10, 0x4c, 0xf9 } };
# 341 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCycleCollectionParticipant.h"
template<typename T,
         bool IsXPCOM = mozilla::IsBaseOf<nsISupports, T>::value>
struct DowncastCCParticipantImpl
{
};


template<typename T>
struct DowncastCCParticipantImpl<T, true>
{
  static T* Run(void* aPtr)
  {
    nsISupports* s = static_cast<nsISupports*>(aPtr);
    do { } while (0);

    T* rval = T::cycleCollection::Downcast(s);
                                        ;
    return rval;
  }
};


template<typename T>
struct DowncastCCParticipantImpl<T, false>
{
  static T* Run(void* aPtr) { return static_cast<T*>(aPtr); }
};

template<typename T>
T*
DowncastCCParticipant(void* aPtr)
{
  return DowncastCCParticipantImpl<T>::Run(aPtr);
}
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jswrapper.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jswrapper.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Range.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Range.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RangedPtr.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RangedPtr.h"
namespace mozilla {
# 42 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RangedPtr.h"
template<typename T>
class RangedPtr
{
  T* mPtr;






  void checkSanity()
  {
    do { } while (0);
    do { } while (0);
  }


  RangedPtr<T> create(T* aPtr) const
  {



    return RangedPtr<T>(aPtr, nullptr, size_t(0));

  }

  uintptr_t asUintptr() const { return reinterpret_cast<uintptr_t>(mPtr); }

public:
  RangedPtr(T* aPtr, T* aStart, T* aEnd)
    : mPtr(aPtr)



  {
    do { } while (0);
    checkSanity();
  }
  RangedPtr(T* aPtr, T* aStart, size_t aLength)
    : mPtr(aPtr)



  {
    do { } while (0);
    do { } while (0);

    checkSanity();
  }


  RangedPtr(T* aPtr, size_t aLength)
    : mPtr(aPtr)



  {
    do { } while (0);
    do { } while (0);

    checkSanity();
  }


  template<size_t N>
  explicit RangedPtr(T (&aArr)[N])
    : mPtr(aArr)



  {
    checkSanity();
  }

  T* get() const { return mPtr; }

  explicit operator bool() const { return mPtr != nullptr; }

  void checkIdenticalRange(const RangedPtr<T>& aOther) const
  {
    do { } while (0);
    do { } while (0);
  }
# 136 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RangedPtr.h"
  RangedPtr<T>& operator=(const RangedPtr<T>& aOther)
  {
    checkIdenticalRange(aOther);
    mPtr = aOther.mPtr;
    checkSanity();
    return *this;
  }

  RangedPtr<T> operator+(size_t aInc) const
  {
    do { } while (0);
    do { } while (0);
    return create(mPtr + aInc);
  }

  RangedPtr<T> operator-(size_t aDec) const
  {
    do { } while (0);
    do { } while (0);
    return create(mPtr - aDec);
  }





  template <typename U>
  RangedPtr<T>& operator=(U* aPtr)
  {
    *this = create(aPtr);
    return *this;
  }

  template <typename U>
  RangedPtr<T>& operator=(const RangedPtr<U>& aPtr)
  {
    do { } while (0);
    do { } while (0);
    mPtr = aPtr.mPtr;
    checkSanity();
    return *this;
  }

  RangedPtr<T>& operator++()
  {
    return (*this += 1);
  }

  RangedPtr<T> operator++(int)
  {
    RangedPtr<T> rcp = *this;
    ++*this;
    return rcp;
  }

  RangedPtr<T>& operator--()
  {
    return (*this -= 1);
  }

  RangedPtr<T> operator--(int)
  {
    RangedPtr<T> rcp = *this;
    --*this;
    return rcp;
  }

  RangedPtr<T>& operator+=(size_t aInc)
  {
    *this = *this + aInc;
    return *this;
  }

  RangedPtr<T>& operator-=(size_t aDec)
  {
    *this = *this - aDec;
    return *this;
  }

  T& operator[](int aIndex) const
  {
    do { } while (0);
    return *create(mPtr + aIndex);
  }

  T& operator*() const
  {
    do { } while (0);
    do { } while (0);
    return *mPtr;
  }

  T* operator->() const
  {
    do { } while (0);
    do { } while (0);
    return mPtr;
  }

  template <typename U>
  bool operator==(const RangedPtr<U>& aOther) const
  {
    return mPtr == aOther.mPtr;
  }
  template <typename U>
  bool operator!=(const RangedPtr<U>& aOther) const
  {
    return !(*this == aOther);
  }

  template<typename U>
  bool operator==(const U* u) const
  {
    return mPtr == u;
  }
  template<typename U>
  bool operator!=(const U* u) const
  {
    return !(*this == u);
  }

  template <typename U>
  bool operator<(const RangedPtr<U>& aOther) const
  {
    return mPtr < aOther.mPtr;
  }
  template <typename U>
  bool operator<=(const RangedPtr<U>& aOther) const
  {
    return mPtr <= aOther.mPtr;
  }

  template <typename U>
  bool operator>(const RangedPtr<U>& aOther) const
  {
    return mPtr > aOther.mPtr;
  }
  template <typename U>
  bool operator>=(const RangedPtr<U>& aOther) const
  {
    return mPtr >= aOther.mPtr;
  }

  size_t operator-(const RangedPtr<T>& aOther) const
  {
    do { } while (0);
    return PointerRangeSize(aOther.mPtr, mPtr);
  }

private:
  RangedPtr() = delete;
};

}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Range.h" 2



# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Range.h" 2

namespace mozilla {


template <typename T>
class Range
{
  const RangedPtr<T> mStart;
  const RangedPtr<T> mEnd;

public:
  Range() : mStart(nullptr, 0), mEnd(nullptr, 0) {}
  Range(T* aPtr, size_t aLength)
    : mStart(aPtr, aPtr, aPtr + aLength),
      mEnd(aPtr + aLength, aPtr, aPtr + aLength)
  {}
  Range(const RangedPtr<T>& aStart, const RangedPtr<T>& aEnd)
    : mStart(aStart.get(), aStart.get(), aEnd.get()),
      mEnd(aEnd.get(), aStart.get(), aEnd.get())
  {

    aStart.checkIdenticalRange(aEnd);
    do { } while (0);
  }

  template<typename U,
           class = typename EnableIf<IsConvertible<U (*)[], T (*)[]>::value,
                                     int>::Type>
               Range(const Range<U>& aOther)
    : mStart(aOther.mStart),
      mEnd(aOther.mEnd)
  {}

               Range(Span<T> aSpan)
    : Range(aSpan.Elements(), aSpan.Length())
  {
  }

  template<typename U,
           class = typename EnableIf<IsConvertible<U (*)[], T (*)[]>::value,
                                     int>::Type>
               Range(const Span<U>& aSpan)
    : Range(aSpan.Elements(), aSpan.Length())
  {
  }

  RangedPtr<T> begin() const { return mStart; }
  RangedPtr<T> end() const { return mEnd; }
  size_t length() const { return mEnd - mStart; }

  T& operator[](size_t aOffset) const { return mStart[aOffset]; }

  explicit operator bool() const { return mStart != nullptr; }

  operator Span<T>() { return Span<T>(mStart.get(), length()); }

  operator Span<const T>() const { return Span<T>(mStart.get(), length()); }
};

template<class T>
Span<T>
MakeSpan(Range<T>& aRange)
{
  return aRange;
}

template<class T>
Span<const T>
MakeSpan(const Range<T>& aRange)
{
  return aRange;
}

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Variant.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2



# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CallArgs.h" 1
# 77 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CallArgs.h"
typedef bool
(* JSNative)(JSContext* cx, unsigned argc, JS::Value* vp);

namespace JS {

extern const HandleValue UndefinedHandleValue;

namespace detail {





extern Value
ComputeThis(JSContext* cx, JS::Value* vp);


extern void
CheckIsValidConstructible(const Value& v);


class IncludeUsedRval
{
    mutable bool usedRval_;

  public:
    bool usedRval() const { return usedRval_; }
    void setUsedRval() const { usedRval_ = true; }
    void clearUsedRval() const { usedRval_ = false; }
    void assertUnusedRval() const { do { } while (0); }
};

class NoUsedRval
{
  public:
    bool usedRval() const { return false; }
    void setUsedRval() const {}
    void clearUsedRval() const {}
    void assertUnusedRval() const {}
};

template<class WantUsedRval>
class CallArgsBase
{
    static_assert(mozilla::IsSame<WantUsedRval, IncludeUsedRval>::value ||
                  mozilla::IsSame<WantUsedRval, NoUsedRval>::value,
                  "WantUsedRval can only be IncludeUsedRval or NoUsedRval");

  protected:
    Value* argv_;
    unsigned argc_;
    bool constructing_:1;


    bool ignoresReturnValue_:1;


    WantUsedRval wantUsedRval_;
    bool usedRval() const { return wantUsedRval_.usedRval(); }
    void setUsedRval() const { wantUsedRval_.setUsedRval(); }
    void clearUsedRval() const { wantUsedRval_.clearUsedRval(); }
    void assertUnusedRval() const { wantUsedRval_.assertUnusedRval(); }







  public:






    HandleValue calleev() const {
        this->assertUnusedRval();
        return HandleValue::fromMarkedLocation(&argv_[-2]);
    }





    JSObject& callee() const {
        return calleev().toObject();
    }



    bool isConstructing() const {
        if (!argv_[-1].isMagic())
            return false;


        if (!this->usedRval())
            CheckIsValidConstructible(calleev());


        return true;
    }

    bool ignoresReturnValue() const {
        return ignoresReturnValue_;
    }

    MutableHandleValue newTarget() const {
        do { } while (0);
        return MutableHandleValue::fromMarkedLocation(&this->argv_[argc_]);
    }







    HandleValue thisv() const {



        return HandleValue::fromMarkedLocation(&argv_[-1]);
    }

    Value computeThis(JSContext* cx) const {
        if (thisv().isObject())
            return thisv();

        return ComputeThis(cx, base());
    }




    unsigned length() const { return argc_; }


    MutableHandleValue operator[](unsigned i) const {
        do { } while (0);
        return MutableHandleValue::fromMarkedLocation(&this->argv_[i]);
    }





    HandleValue get(unsigned i) const {
        return i < length()
               ? HandleValue::fromMarkedLocation(&this->argv_[i])
               : UndefinedHandleValue;
    }





    bool hasDefined(unsigned i) const {
        return i < argc_ && !this->argv_[i].isUndefined();
    }
# 251 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CallArgs.h"
    MutableHandleValue rval() const {
        this->setUsedRval();
        return MutableHandleValue::fromMarkedLocation(&argv_[-2]);
    }

  public:




    void setCallee(const Value& aCalleev) const {
        this->clearUsedRval();
        argv_[-2] = aCalleev;
    }

    void setThis(const Value& aThisv) const {
        argv_[-1] = aThisv;
    }

    MutableHandleValue mutableThisv() const {
        return MutableHandleValue::fromMarkedLocation(&argv_[-1]);
    }

  public:




    Value* array() const { return argv_; }
    Value* end() const { return argv_ + argc_ + constructing_; }

  public:



    Value* base() const { return argv_ - 2; }

    Value* spAfterCall() const {
        this->setUsedRval();
        return argv_ - 1;
    }
};

}

class CallArgs : public detail::CallArgsBase<detail::IncludeUsedRval>
{
  private:
    friend CallArgs CallArgsFromVp(unsigned argc, Value* vp);
    friend CallArgs CallArgsFromSp(unsigned stackSlots, Value* sp, bool constructing,
                                   bool ignoresReturnValue);

    static CallArgs create(unsigned argc, Value* argv, bool constructing,
                           bool ignoresReturnValue = false) {
        CallArgs args;
        args.clearUsedRval();
        args.argv_ = argv;
        args.argc_ = argc;
        args.constructing_ = constructing;
        args.ignoresReturnValue_ = ignoresReturnValue;






        return args;
    }

  public:




    bool requireAtLeast(JSContext* cx, const char* fnname, unsigned required) const;

};

__attribute__((always_inline)) inline CallArgs
CallArgsFromVp(unsigned argc, Value* vp)
{
    return CallArgs::create(argc, vp + 2, vp[1].isMagic(JS_IS_CONSTRUCTING));
}




__attribute__((always_inline)) inline CallArgs
CallArgsFromSp(unsigned stackSlots, Value* sp, bool constructing = false,
               bool ignoresReturnValue = false)
{
    return CallArgs::create(stackSlots - constructing, sp - stackSlots, constructing,
                            ignoresReturnValue);
}

}
# 363 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CallArgs.h"
__attribute__((always_inline)) inline JS::Value
JS_THIS(JSContext* cx, JS::Value* vp)
{
    return vp[1].isPrimitive() ? JS::detail::ComputeThis(cx, vp) : vp[1];
}
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CharacterEncoding.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CharacterEncoding.h"
class JSFlatString;

namespace JS {







class Latin1Chars : public mozilla::Range<Latin1Char>
{
    typedef mozilla::Range<Latin1Char> Base;

  public:
    using CharT = Latin1Char;

    Latin1Chars() : Base() {}
    Latin1Chars(char* aBytes, size_t aLength) : Base(reinterpret_cast<Latin1Char*>(aBytes), aLength) {}
    Latin1Chars(const Latin1Char* aBytes, size_t aLength)
      : Base(const_cast<Latin1Char*>(aBytes), aLength)
    {}
    Latin1Chars(const char* aBytes, size_t aLength)
      : Base(reinterpret_cast<Latin1Char*>(const_cast<char*>(aBytes)), aLength)
    {}
};




class Latin1CharsZ : public mozilla::RangedPtr<Latin1Char>
{
    typedef mozilla::RangedPtr<Latin1Char> Base;

  public:
    using CharT = Latin1Char;

    Latin1CharsZ() : Base(nullptr, 0) {}

    Latin1CharsZ(char* aBytes, size_t aLength)
      : Base(reinterpret_cast<Latin1Char*>(aBytes), aLength)
    {
        do { } while (0);
    }

    Latin1CharsZ(Latin1Char* aBytes, size_t aLength)
      : Base(aBytes, aLength)
    {
        do { } while (0);
    }

    using Base::operator=;

    char* c_str() { return reinterpret_cast<char*>(get()); }
};

class UTF8Chars : public mozilla::Range<unsigned char>
{
    typedef mozilla::Range<unsigned char> Base;

  public:
    using CharT = unsigned char;

    UTF8Chars() : Base() {}
    UTF8Chars(char* aBytes, size_t aLength)
      : Base(reinterpret_cast<unsigned char*>(aBytes), aLength)
    {}
    UTF8Chars(const char* aBytes, size_t aLength)
      : Base(reinterpret_cast<unsigned char*>(const_cast<char*>(aBytes)), aLength)
    {}
};




class UTF8CharsZ : public mozilla::RangedPtr<unsigned char>
{
    typedef mozilla::RangedPtr<unsigned char> Base;

  public:
    using CharT = unsigned char;

    UTF8CharsZ() : Base(nullptr, 0) {}

    UTF8CharsZ(char* aBytes, size_t aLength)
      : Base(reinterpret_cast<unsigned char*>(aBytes), aLength)
    {
        do { } while (0);
    }

    UTF8CharsZ(unsigned char* aBytes, size_t aLength)
      : Base(aBytes, aLength)
    {
        do { } while (0);
    }

    using Base::operator=;

    char* c_str() { return reinterpret_cast<char*>(get()); }
};







class ConstUTF8CharsZ
{
    const char* data_;

  public:
    using CharT = unsigned char;

    ConstUTF8CharsZ() : data_(nullptr)
    {}

    ConstUTF8CharsZ(const char* aBytes, size_t aLength)
      : data_(aBytes)
    {
        do { } while (0);



    }

    const void* get() const { return data_; }

    const char* c_str() const { return data_; }

    explicit operator bool() const { return data_ != nullptr; }

  private:



};
# 161 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CharacterEncoding.h"
class TwoByteChars : public mozilla::Range<char16_t>
{
    typedef mozilla::Range<char16_t> Base;

  public:
    using CharT = char16_t;

    TwoByteChars() : Base() {}
    TwoByteChars(char16_t* aChars, size_t aLength) : Base(aChars, aLength) {}
    TwoByteChars(const char16_t* aChars, size_t aLength) : Base(const_cast<char16_t*>(aChars), aLength) {}
};




class TwoByteCharsZ : public mozilla::RangedPtr<char16_t>
{
    typedef mozilla::RangedPtr<char16_t> Base;

  public:
    using CharT = char16_t;

    TwoByteCharsZ() : Base(nullptr, 0) {}

    TwoByteCharsZ(char16_t* chars, size_t length)
      : Base(chars, length)
    {
        do { } while (0);
    }

    using Base::operator=;
};

typedef mozilla::RangedPtr<const char16_t> ConstCharPtr;




class ConstTwoByteChars : public mozilla::Range<const char16_t>
{
    typedef mozilla::Range<const char16_t> Base;

  public:
    using CharT = char16_t;

    ConstTwoByteChars() : Base() {}
    ConstTwoByteChars(const char16_t* aChars, size_t aLength) : Base(aChars, aLength) {}
};
# 220 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CharacterEncoding.h"
extern Latin1CharsZ
LossyTwoByteCharsToNewLatin1CharsZ(JSContext* cx,
                                   const mozilla::Range<const char16_t> tbchars);

inline Latin1CharsZ
LossyTwoByteCharsToNewLatin1CharsZ(JSContext* cx, const char16_t* begin, size_t length)
{
    const mozilla::Range<const char16_t> tbchars(begin, length);
    return JS::LossyTwoByteCharsToNewLatin1CharsZ(cx, tbchars);
}

template <typename CharT>
extern UTF8CharsZ
CharsToNewUTF8CharsZ(JSContext* maybeCx, const mozilla::Range<CharT> chars);

uint32_t
Utf8ToOneUcs4Char(const uint8_t* utf8Buffer, int utf8Length);







extern TwoByteCharsZ
UTF8CharsToNewTwoByteCharsZ(JSContext* cx, const UTF8Chars utf8, size_t* outlen);




extern TwoByteCharsZ
UTF8CharsToNewTwoByteCharsZ(JSContext* cx, const ConstUTF8CharsZ& utf8, size_t* outlen);






extern TwoByteCharsZ
LossyUTF8CharsToNewTwoByteCharsZ(JSContext* cx, const UTF8Chars utf8, size_t* outlen);

extern TwoByteCharsZ
LossyUTF8CharsToNewTwoByteCharsZ(JSContext* cx, const ConstUTF8CharsZ& utf8, size_t* outlen);





size_t
GetDeflatedUTF8StringLength(JSFlatString* s);
# 283 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CharacterEncoding.h"
void
DeflateStringToUTF8Buffer(JSFlatString* src, mozilla::RangedPtr<char> dst,
                          size_t* dstlenp = nullptr, size_t* numcharsp = nullptr);





enum class SmallestEncoding {
    ASCII,
    Latin1,
    UTF16
};






SmallestEncoding
FindSmallestEncoding(UTF8Chars utf8);







extern Latin1CharsZ
UTF8CharsToNewLatin1CharsZ(JSContext* cx, const UTF8Chars utf8, size_t* outlen);






extern Latin1CharsZ
LossyUTF8CharsToNewLatin1CharsZ(JSContext* cx, const UTF8Chars utf8, size_t* outlen);





extern bool
StringIsASCII(const char* s);

}

inline void JS_free(JS::Latin1CharsZ& ptr) { js_free((void*)ptr.get()); }
inline void JS_free(JS::UTF8CharsZ& ptr) { js_free((void*)ptr.get()); }
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Id.h" 1
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Id.h"
struct jsid
{
    size_t asBits;
    bool operator==(const jsid& rhs) const { return asBits == rhs.asBits; }
    bool operator!=(const jsid& rhs) const { return asBits != rhs.asBits; }
} ;
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Id.h"
static __attribute__((always_inline)) inline bool
JSID_IS_STRING(jsid iden)
{
    return ((iden.asBits) & 0x7) == 0;
}

static __attribute__((always_inline)) inline JSString*
JSID_TO_STRING(jsid iden)
{
    do { } while (0);
    return (JSString*)(iden.asBits);
}
# 68 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Id.h"
jsid
INTERNED_STRING_TO_JSID(JSContext* cx, JSString* str);

static __attribute__((always_inline)) inline bool
JSID_IS_INT(jsid iden)
{
    return !!((iden.asBits) & 0x1);
}

static __attribute__((always_inline)) inline int32_t
JSID_TO_INT(jsid iden)
{
    do { } while (0);
    uint32_t bits = static_cast<uint32_t>((iden.asBits)) >> 1;
    return static_cast<int32_t>(bits);
}




static __attribute__((always_inline)) inline bool
INT_FITS_IN_JSID(int32_t i)
{
    return i >= 0;
}

static __attribute__((always_inline)) inline jsid
INT_TO_JSID(int32_t i)
{
    jsid iden;
    do { } while (0);
    uint32_t bits = (static_cast<uint32_t>(i) << 1) | 0x1;
    (iden.asBits) = static_cast<size_t>(bits);
    return iden;
}

static __attribute__((always_inline)) inline bool
JSID_IS_SYMBOL(jsid iden)
{
    return ((iden.asBits) & 0x7) == 0x4 &&
           (iden.asBits) != 0x4;
}

static __attribute__((always_inline)) inline JS::Symbol*
JSID_TO_SYMBOL(jsid iden)
{
    do { } while (0);
    return (JS::Symbol*)((iden.asBits) & ~(size_t)0x7);
}

static __attribute__((always_inline)) inline jsid
SYMBOL_TO_JSID(JS::Symbol* sym)
{
    jsid iden;
    do { } while (0);
    do { } while (0);
    do { } while (0);
    (iden.asBits) = (size_t(sym) | 0x4);
    return iden;
}

static __attribute__((always_inline)) inline bool
JSID_IS_GCTHING(jsid iden)
{
    return JSID_IS_STRING(iden) || JSID_IS_SYMBOL(iden);
}

static __attribute__((always_inline)) inline JS::GCCellPtr
JSID_TO_GCTHING(jsid iden)
{
    void* thing = (void*)((iden.asBits) & ~(size_t)0x7);
    if (JSID_IS_STRING(iden))
        return JS::GCCellPtr(thing, JS::TraceKind::String);
    do { } while (0);
    return JS::GCCellPtr(thing, JS::TraceKind::Symbol);
}

static __attribute__((always_inline)) inline bool
JSID_IS_VOID(const jsid iden)
{
    do { } while (0);

    return (size_t)(iden.asBits) == 0x2;
}

static __attribute__((always_inline)) inline bool
JSID_IS_EMPTY(const jsid iden)
{
    return (size_t)(iden.asBits) == 0x4;
}

extern const jsid JSID_VOID;
extern const jsid JSID_EMPTY;

extern const JS::HandleId JSID_VOIDHANDLE;
extern const JS::HandleId JSID_EMPTYHANDLE;

namespace JS {

template <>
struct GCPolicy<jsid>
{
    static jsid initial() { return JSID_VOID; }
    static void trace(JSTracer* trc, jsid* idp, const char* name) {
        js::UnsafeTraceManuallyBarrieredEdge(trc, idp, name);
    }
};

}

namespace js {

template <>
struct BarrierMethods<jsid>
{
    static void postBarrier(jsid* idp, jsid prev, jsid next) {}
    static void exposeToJS(jsid iden) {
        if (JSID_IS_GCTHING(iden))
            js::gc::ExposeGCThingToActiveJS(JSID_TO_GCTHING(iden));
    }
};



template <typename F, typename... Args>
auto
DispatchTyped(F f, const jsid& iden, Args&&... args)
  -> decltype(f(static_cast<JSString*>(nullptr), mozilla::Forward<Args>(args)...))
{
    if (JSID_IS_STRING(iden))
        return f(JSID_TO_STRING(iden), mozilla::Forward<Args>(args)...);
    if (JSID_IS_SYMBOL(iden))
        return f(JSID_TO_SYMBOL(iden), mozilla::Forward<Args>(args)...);
    do { } while (0);
    return F::defaultValue(iden);
}



}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
struct JSAtomState;
struct JSFreeOp;
struct JSFunctionSpec;

namespace js {

struct Class;
class FreeOp;
class Shape;



extern const js::Class* const FunctionClassPtr;

}

namespace JS {

class AutoIdVector;





enum class IsArrayAnswer
{
    Array,
    NotArray,
    RevokedProxy
};
# 68 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
extern bool
IsArray(JSContext* cx, HandleObject obj, bool* isArray);
# 79 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
extern bool
IsArray(JSContext* cx, HandleObject obj, IsArrayAnswer* answer);
# 115 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
class ObjectOpResult
{
  private:
# 127 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
    uintptr_t code_;

  public:
    enum SpecialCodes : uintptr_t {
        OkCode = 0,
        Uninitialized = uintptr_t(-1)
    };

    ObjectOpResult() : code_(Uninitialized) {}


    bool ok() const {
        do { } while (0);
        return code_ == OkCode;
    }

    explicit operator bool() const { return ok(); }


    bool succeed() {
        code_ = OkCode;
        return true;
    }
# 162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
    bool fail(uint32_t msg) {
        do { } while (0);
        code_ = msg;
        return true;
    }

    bool failCantRedefineProp();
    bool failReadOnly();
    bool failGetterOnly();
    bool failCantDelete();

    bool failCantSetInterposed();
    bool failCantDefineWindowElement();
    bool failCantDeleteWindowElement();
    bool failCantDeleteWindowNamedProperty();
    bool failCantPreventExtensions();
    bool failCantSetProto();
    bool failNoNamedSetter();
    bool failNoIndexedSetter();

    uint32_t failureCode() const {
        do { } while (0);
        return uint32_t(code_);
    }
# 201 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
    bool checkStrictErrorOrWarning(JSContext* cx, HandleObject obj, HandleId id, bool strict) {
        if (ok())
            return true;
        return reportStrictErrorOrWarning(cx, obj, id, strict);
    }







    bool checkStrictErrorOrWarning(JSContext* cx, HandleObject obj, bool strict) {
        return ok() || reportStrictErrorOrWarning(cx, obj, strict);
    }


    bool reportError(JSContext* cx, HandleObject obj, HandleId id) {
        return reportStrictErrorOrWarning(cx, obj, id, true);
    }





    bool reportError(JSContext* cx, HandleObject obj) {
        return reportStrictErrorOrWarning(cx, obj, true);
    }


    bool reportStrictErrorOrWarning(JSContext* cx, HandleObject obj, HandleId id, bool strict);
    bool reportStrictErrorOrWarning(JSContext* cx, HandleObject obj, bool strict);





    bool checkStrict(JSContext* cx, HandleObject obj, HandleId id) {
        return checkStrictErrorOrWarning(cx, obj, id, true);
    }





    bool checkStrict(JSContext* cx, HandleObject obj) {
        return checkStrictErrorOrWarning(cx, obj, true);
    }
};

class PropertyResult
{
    union {
        js::Shape* shape_;
        uintptr_t bits_;
    };

    static const uintptr_t NotFound = 0;
    static const uintptr_t NonNativeProperty = 1;
    static const uintptr_t DenseOrTypedArrayElement = 1;

  public:
    PropertyResult() : bits_(NotFound) {}

    explicit PropertyResult(js::Shape* propertyShape)
      : shape_(propertyShape)
    {
        do { } while (0);
    }

    explicit operator bool() const {
        return isFound();
    }

    bool isFound() const {
        return bits_ != NotFound;
    }

    bool isNonNativeProperty() const {
        return bits_ == NonNativeProperty;
    }

    bool isDenseOrTypedArrayElement() const {
        return bits_ == DenseOrTypedArrayElement;
    }

    bool isNativeProperty() const {
        return isFound() && !isNonNativeProperty();
    }

    js::Shape* maybeShape() const {
        do { } while (0);
        return isFound() ? shape_ : nullptr;
    }

    js::Shape* shape() const {
        do { } while (0);
        return shape_;
    }

    void setNotFound() {
        bits_ = NotFound;
    }

    void setNativeProperty(js::Shape* propertyShape) {
        shape_ = propertyShape;
        do { } while (0);
    }

    void setNonNativeProperty() {
        bits_ = NonNativeProperty;
    }

    void setDenseOrTypedArrayElement() {
        bits_ = DenseOrTypedArrayElement;
    }

    void trace(JSTracer* trc);
};

}

namespace js {

template <class Wrapper>
class WrappedPtrOperations<JS::PropertyResult, Wrapper>
{
    const JS::PropertyResult& value() const { return static_cast<const Wrapper*>(this)->get(); }

  public:
    bool isFound() const { return value().isFound(); }
    explicit operator bool() const { return bool(value()); }
    js::Shape* maybeShape() const { return value().maybeShape(); }
    js::Shape* shape() const { return value().shape(); }
    bool isNativeProperty() const { return value().isNativeProperty(); }
    bool isNonNativeProperty() const { return value().isNonNativeProperty(); }
    bool isDenseOrTypedArrayElement() const { return value().isDenseOrTypedArrayElement(); }
    js::Shape* asTaggedShape() const { return value().asTaggedShape(); }
};

template <class Wrapper>
class MutableWrappedPtrOperations<JS::PropertyResult, Wrapper>
  : public WrappedPtrOperations<JS::PropertyResult, Wrapper>
{
    JS::PropertyResult& value() { return static_cast<Wrapper*>(this)->get(); }

  public:
    void setNotFound() {
        value().setNotFound();
    }
    void setNativeProperty(js::Shape* shape) {
        value().setNativeProperty(shape);
    }
    void setNonNativeProperty() {
        value().setNonNativeProperty();
    }
    void setDenseOrTypedArrayElement() {
        value().setDenseOrTypedArrayElement();
    }
};

}
# 371 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
typedef bool
(* JSGetterOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
               JS::MutableHandleValue vp);


typedef bool
(* JSAddPropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue v);
# 386 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
typedef bool
(* JSSetterOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
               JS::MutableHandleValue vp, JS::ObjectOpResult& result);
# 405 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
typedef bool
(* JSDeletePropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                       JS::ObjectOpResult& result);
# 422 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
typedef bool
(* JSNewEnumerateOp)(JSContext* cx, JS::HandleObject obj, JS::AutoIdVector& properties,
                     bool enumerableOnly);





typedef bool
(* JSEnumerateOp)(JSContext* cx, JS::HandleObject obj);






typedef JSString*
(* JSFunToStringOp)(JSContext* cx, JS::HandleObject obj, unsigned indent);
# 450 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
typedef bool
(* JSResolveOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                bool* resolvedp);
# 465 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
typedef bool
(* JSMayResolveOp)(const JSAtomState& names, jsid id, JSObject* maybeObj);






typedef void
(* JSFinalizeOp)(JSFreeOp* fop, JSObject* obj);


struct JSStringFinalizer {
    void (*finalize)(JS::Zone* zone, const JSStringFinalizer* fin, char16_t* chars);
};






typedef bool
(* JSHasInstanceOp)(JSContext* cx, JS::HandleObject obj, JS::MutableHandleValue vp,
                    bool* bp);
# 504 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
typedef void
(* JSTraceOp)(JSTracer* trc, JSObject* obj);

typedef JSObject*
(* JSWeakmapKeyDelegateOp)(JSObject* obj);

typedef void
(* JSObjectMovedOp)(JSObject* obj, const JSObject* old);



namespace js {

typedef bool
(* LookupPropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                     JS::MutableHandleObject objp, JS::MutableHandle<JS::PropertyResult> propp);
typedef bool
(* DefinePropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                     JS::Handle<JS::PropertyDescriptor> desc,
                     JS::ObjectOpResult& result);
typedef bool
(* HasPropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool* foundp);
typedef bool
(* GetPropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleValue receiver, JS::HandleId id,
                  JS::MutableHandleValue vp);
typedef bool
(* SetPropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue v,
                  JS::HandleValue receiver, JS::ObjectOpResult& result);
typedef bool
(* GetOwnPropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                     JS::MutableHandle<JS::PropertyDescriptor> desc);
typedef bool
(* DeletePropertyOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                     JS::ObjectOpResult& result);

typedef bool
(* WatchOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject callable);

typedef bool
(* UnwatchOp)(JSContext* cx, JS::HandleObject obj, JS::HandleId id);

class ElementAdder
{
  public:
    enum GetBehavior {


        CheckHasElemPreserveHoles,


        GetElement
    };

  private:

    JS::RootedObject resObj_;
    JS::Value* vp_;

    uint32_t index_;



    GetBehavior getBehavior_;

  public:
    ElementAdder(JSContext* cx, JSObject* obj, uint32_t length, GetBehavior behavior)
      : resObj_(cx, obj), vp_(nullptr), index_(0),



        getBehavior_(behavior)
    {}
    ElementAdder(JSContext* cx, JS::Value* vp, uint32_t length, GetBehavior behavior)
      : resObj_(cx), vp_(vp), index_(0),



        getBehavior_(behavior)
    {}

    GetBehavior getBehavior() const { return getBehavior_; }

    bool append(JSContext* cx, JS::HandleValue v);
    void appendHole();
};

typedef bool
(* GetElementsOp)(JSContext* cx, JS::HandleObject obj, uint32_t begin, uint32_t end,
                  ElementAdder* adder);

typedef void
(* FinalizeOp)(FreeOp* fop, JSObject* obj);
# 635 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
struct ClassOps
{

    JSAddPropertyOp addProperty;
    JSDeletePropertyOp delProperty;
    JSGetterOp getProperty;
    JSSetterOp setProperty;
    JSEnumerateOp enumerate;
    JSResolveOp resolve;
    JSMayResolveOp mayResolve;
    FinalizeOp finalize;
    JSNative call;
    JSHasInstanceOp hasInstance;
    JSNative construct;
    JSTraceOp trace;
};


typedef JSObject* (*ClassObjectCreationOp)(JSContext* cx, JSProtoKey key);


typedef bool (*FinishClassInitOp)(JSContext* cx, JS::HandleObject ctor,
                                  JS::HandleObject proto);

const size_t JSCLASS_CACHED_PROTO_WIDTH = 6;

struct ClassSpec
{
    ClassObjectCreationOp createConstructor;
    ClassObjectCreationOp createPrototype;
    const JSFunctionSpec* constructorFunctions;
    const JSPropertySpec* constructorProperties;
    const JSFunctionSpec* prototypeFunctions;
    const JSPropertySpec* prototypeProperties;
    FinishClassInitOp finishInit;
    uintptr_t flags;

    static const size_t ProtoKeyWidth = JSCLASS_CACHED_PROTO_WIDTH;

    static const uintptr_t ProtoKeyMask = (1 << ProtoKeyWidth) - 1;
    static const uintptr_t DontDefineConstructor = 1 << ProtoKeyWidth;

    bool defined() const { return !!createConstructor; }


    JSProtoKey inheritanceProtoKey() const {
        do { } while (0);
        static_assert(JSProto_Null == 0, "zeroed key must be null");


        if (!(flags & ProtoKeyMask))
            return JSProto_Object;

        return JSProtoKey(flags & ProtoKeyMask);
    }

    bool shouldDefineConstructor() const {
        do { } while (0);
        return !(flags & DontDefineConstructor);
    }
};

struct ClassExtension
{
# 710 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
    JSWeakmapKeyDelegateOp weakmapKeyDelegateOp;
# 723 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
    JSObjectMovedOp objectMovedOp;
};




struct ObjectOps
{
    LookupPropertyOp lookupProperty;
    DefinePropertyOp defineProperty;
    HasPropertyOp hasProperty;
    GetPropertyOp getProperty;
    SetPropertyOp setProperty;
    GetOwnPropertyOp getOwnPropertyDescriptor;
    DeletePropertyOp deleteProperty;
    WatchOp watch;
    UnwatchOp unwatch;
    GetElementsOp getElements;
    JSNewEnumerateOp enumerate;
    JSFunToStringOp funToString;
};



}



typedef void (*JSClassInternal)();

struct JSClassOps
{

    JSAddPropertyOp addProperty;
    JSDeletePropertyOp delProperty;
    JSGetterOp getProperty;
    JSSetterOp setProperty;
    JSEnumerateOp enumerate;
    JSResolveOp resolve;
    JSMayResolveOp mayResolve;
    JSFinalizeOp finalize;
    JSNative call;
    JSHasInstanceOp hasInstance;
    JSNative construct;
    JSTraceOp trace;
};



struct JSClass {
    const char* name; uint32_t flags; const JSClassOps* cOps; JSAddPropertyOp getAddProperty() const { return cOps ? cOps->addProperty : nullptr; } JSDeletePropertyOp getDelProperty() const { return cOps ? cOps->delProperty : nullptr; } JSGetterOp getGetProperty() const { return cOps ? cOps->getProperty : nullptr; } JSSetterOp getSetProperty() const { return cOps ? cOps->setProperty : nullptr; } JSEnumerateOp getEnumerate() const { return cOps ? cOps->enumerate : nullptr; } JSResolveOp getResolve() const { return cOps ? cOps->resolve : nullptr; } JSMayResolveOp getMayResolve() const { return cOps ? cOps->mayResolve : nullptr; } JSNative getCall() const { return cOps ? cOps->call : nullptr; } JSHasInstanceOp getHasInstance() const { return cOps ? cOps->hasInstance : nullptr; } JSNative getConstruct() const { return cOps ? cOps->construct : nullptr; } bool hasFinalize() const { return cOps && cOps->finalize; } bool hasTrace() const { return cOps && cOps->trace; } bool isTrace(JSTraceOp trace) const { return cOps && cOps->trace == trace; } void doFinalize(JSFreeOp* fop, JSObject* obj) const { do { } while (0); cOps->finalize(fop, obj); } void doTrace(JSTracer* trc, JSObject* obj) const { do { } while (0); cOps->trace(trc, obj); };

    void* reserved[3];
};


static const uint32_t JSCLASS_HAS_PRIVATE = 1 << 0;


static const uint32_t JSCLASS_DELAY_METADATA_BUILDER = 1 << 1;



static const uint32_t JSCLASS_IS_WRAPPED_NATIVE = 1 << 2;


static const uint32_t JSCLASS_PRIVATE_IS_NSISUPPORTS = 1 << 3;


static const uint32_t JSCLASS_IS_DOMJSCLASS = 1 << 4;





static const uint32_t JSCLASS_HAS_XRAYED_CONSTRUCTOR = 1 << 5;


static const uint32_t JSCLASS_EMULATES_UNDEFINED = 1 << 6;


static const uint32_t JSCLASS_USERBIT1 = 1 << 7;






static const uintptr_t JSCLASS_RESERVED_SLOTS_SHIFT = 8;

static const uint32_t JSCLASS_RESERVED_SLOTS_WIDTH = 8;

static const uint32_t JSCLASS_RESERVED_SLOTS_MASK = (((uint32_t)1 << (JSCLASS_RESERVED_SLOTS_WIDTH)) - 1);
# 826 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
static const uint32_t JSCLASS_IS_ANONYMOUS = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 0);
static const uint32_t JSCLASS_IS_GLOBAL = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 1);
static const uint32_t JSCLASS_INTERNAL_FLAG2 = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 2);
static const uint32_t JSCLASS_INTERNAL_FLAG3 = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 3);
static const uint32_t JSCLASS_IS_PROXY = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 4);
static const uint32_t JSCLASS_SKIP_NURSERY_FINALIZE = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 5);


static const uint32_t JSCLASS_USERBIT2 = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 6);
static const uint32_t JSCLASS_USERBIT3 = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 7);

static const uint32_t JSCLASS_BACKGROUND_FINALIZE = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 8);
static const uint32_t JSCLASS_FOREGROUND_FINALIZE = 1 << ((JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 9);
# 856 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
static const uint32_t JSCLASS_GLOBAL_APPLICATION_SLOTS = 5;
static const uint32_t JSCLASS_GLOBAL_SLOT_COUNT =
    JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 2 + 46;
# 869 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
static const uint32_t JSCLASS_CACHED_PROTO_SHIFT = (JSCLASS_RESERVED_SLOTS_SHIFT + JSCLASS_RESERVED_SLOTS_WIDTH) + 10;
static const uint32_t JSCLASS_CACHED_PROTO_MASK = (((uint32_t)1 << (js::JSCLASS_CACHED_PROTO_WIDTH)) - 1);
# 882 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
namespace js {

struct Class
{
    const char* name; uint32_t flags; const js::ClassOps* cOps; JSAddPropertyOp getAddProperty() const { return cOps ? cOps->addProperty : nullptr; } JSDeletePropertyOp getDelProperty() const { return cOps ? cOps->delProperty : nullptr; } JSGetterOp getGetProperty() const { return cOps ? cOps->getProperty : nullptr; } JSSetterOp getSetProperty() const { return cOps ? cOps->setProperty : nullptr; } JSEnumerateOp getEnumerate() const { return cOps ? cOps->enumerate : nullptr; } JSResolveOp getResolve() const { return cOps ? cOps->resolve : nullptr; } JSMayResolveOp getMayResolve() const { return cOps ? cOps->mayResolve : nullptr; } JSNative getCall() const { return cOps ? cOps->call : nullptr; } JSHasInstanceOp getHasInstance() const { return cOps ? cOps->hasInstance : nullptr; } JSNative getConstruct() const { return cOps ? cOps->construct : nullptr; } bool hasFinalize() const { return cOps && cOps->finalize; } bool hasTrace() const { return cOps && cOps->trace; } bool isTrace(JSTraceOp trace) const { return cOps && cOps->trace == trace; } void doFinalize(FreeOp* fop, JSObject* obj) const { do { } while (0); cOps->finalize(fop, obj); } void doTrace(JSTracer* trc, JSObject* obj) const { do { } while (0); cOps->trace(trc, obj); };
    const ClassSpec* spec;
    const ClassExtension* ext;
    const ObjectOps* oOps;
# 898 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Class.h"
    static const uint32_t NON_NATIVE = JSCLASS_INTERNAL_FLAG2;

    bool isNative() const {
        return !(flags & NON_NATIVE);
    }

    bool hasPrivate() const {
        return !!(flags & JSCLASS_HAS_PRIVATE);
    }

    bool emulatesUndefined() const {
        return flags & JSCLASS_EMULATES_UNDEFINED;
    }

    bool isJSFunction() const {
        return this == js::FunctionClassPtr;
    }

    bool nonProxyCallable() const {
        do { } while (0);
        return isJSFunction() || getCall();
    }

    bool isProxy() const {
        return flags & JSCLASS_IS_PROXY;
    }

    bool isDOMClass() const {
        return flags & JSCLASS_IS_DOMJSCLASS;
    }

    bool shouldDelayMetadataBuilder() const {
        return flags & JSCLASS_DELAY_METADATA_BUILDER;
    }

    bool isWrappedNative() const {
        return flags & JSCLASS_IS_WRAPPED_NATIVE;
    }

    static size_t offsetOfFlags() { return __builtin_offsetof(Class, flags); }

    bool specDefined() const { return spec ? spec->defined() : false; }
    JSProtoKey specInheritanceProtoKey()
                               const { return spec ? spec->inheritanceProtoKey() : JSProto_Null; }
    bool specShouldDefineConstructor()
                               const { return spec ? spec->shouldDefineConstructor() : true; }
    ClassObjectCreationOp specCreateConstructorHook()
                               const { return spec ? spec->createConstructor : nullptr; }
    ClassObjectCreationOp specCreatePrototypeHook()
                               const { return spec ? spec->createPrototype : nullptr; }
    const JSFunctionSpec* specConstructorFunctions()
                               const { return spec ? spec->constructorFunctions : nullptr; }
    const JSPropertySpec* specConstructorProperties()
                               const { return spec ? spec->constructorProperties : nullptr; }
    const JSFunctionSpec* specPrototypeFunctions()
                               const { return spec ? spec->prototypeFunctions : nullptr; }
    const JSPropertySpec* specPrototypeProperties()
                               const { return spec ? spec->prototypeProperties : nullptr; }
    FinishClassInitOp specFinishInitHook()
                               const { return spec ? spec->finishInit : nullptr; }

    JSWeakmapKeyDelegateOp extWeakmapKeyDelegateOp()
                               const { return ext ? ext->weakmapKeyDelegateOp : nullptr; }
    JSObjectMovedOp extObjectMovedOp()
                               const { return ext ? ext->objectMovedOp : nullptr; }

    LookupPropertyOp getOpsLookupProperty() const { return oOps ? oOps->lookupProperty : nullptr; }
    DefinePropertyOp getOpsDefineProperty() const { return oOps ? oOps->defineProperty : nullptr; }
    HasPropertyOp getOpsHasProperty() const { return oOps ? oOps->hasProperty : nullptr; }
    GetPropertyOp getOpsGetProperty() const { return oOps ? oOps->getProperty : nullptr; }
    SetPropertyOp getOpsSetProperty() const { return oOps ? oOps->setProperty : nullptr; }
    GetOwnPropertyOp getOpsGetOwnPropertyDescriptor()
                                            const { return oOps ? oOps->getOwnPropertyDescriptor
                                                                                     : nullptr; }
    DeletePropertyOp getOpsDeleteProperty() const { return oOps ? oOps->deleteProperty : nullptr; }
    WatchOp getOpsWatch() const { return oOps ? oOps->watch : nullptr; }
    UnwatchOp getOpsUnwatch() const { return oOps ? oOps->unwatch : nullptr; }
    GetElementsOp getOpsGetElements() const { return oOps ? oOps->getElements : nullptr; }
    JSNewEnumerateOp getOpsEnumerate() const { return oOps ? oOps->enumerate : nullptr; }
    JSFunToStringOp getOpsFunToString() const { return oOps ? oOps->funToString : nullptr; }
};

static_assert(__builtin_offsetof(JSClassOps, addProperty) == __builtin_offsetof(ClassOps, addProperty),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, delProperty) == __builtin_offsetof(ClassOps, delProperty),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, getProperty) == __builtin_offsetof(ClassOps, getProperty),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, setProperty) == __builtin_offsetof(ClassOps, setProperty),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, enumerate) == __builtin_offsetof(ClassOps, enumerate),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, resolve) == __builtin_offsetof(ClassOps, resolve),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, mayResolve) == __builtin_offsetof(ClassOps, mayResolve),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, finalize) == __builtin_offsetof(ClassOps, finalize),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, call) == __builtin_offsetof(ClassOps, call),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, construct) == __builtin_offsetof(ClassOps, construct),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, hasInstance) == __builtin_offsetof(ClassOps, hasInstance),
              "ClassOps and JSClassOps must be consistent");
static_assert(__builtin_offsetof(JSClassOps, trace) == __builtin_offsetof(ClassOps, trace),
              "ClassOps and JSClassOps must be consistent");
static_assert(sizeof(JSClassOps) == sizeof(ClassOps),
              "ClassOps and JSClassOps must be consistent");

static_assert(__builtin_offsetof(JSClass, name) == __builtin_offsetof(Class, name),
              "Class and JSClass must be consistent");
static_assert(__builtin_offsetof(JSClass, flags) == __builtin_offsetof(Class, flags),
              "Class and JSClass must be consistent");
static_assert(__builtin_offsetof(JSClass, cOps) == __builtin_offsetof(Class, cOps),
              "Class and JSClass must be consistent");
static_assert(sizeof(JSClass) == sizeof(Class),
              "Class and JSClass must be consistent");

static __attribute__((always_inline)) inline const JSClass*
Jsvalify(const Class* c)
{
    return (const JSClass*)c;
}

static __attribute__((always_inline)) inline const Class*
Valueify(const JSClass* c)
{
    return (const Class*)c;
}





enum class ESClass {
    Object,
    Array,
    Number,
    String,
    Boolean,
    RegExp,
    ArrayBuffer,
    SharedArrayBuffer,
    Date,
    Set,
    Map,
    Promise,
    MapIterator,
    SetIterator,
    Arguments,
    Error,


    Other
};


bool
Unbox(JSContext* cx, JS::HandleObject obj, JS::MutableHandleValue vp);






}
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCVector.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCVector.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Vector.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Vector.h"
namespace js {

class TempAllocPolicy;

namespace detail {

template <typename T>
struct TypeIsGCThing : mozilla::FalseType
{};






}

template <typename T,
          size_t MinInlineCapacity = 0,
          class AllocPolicy = TempAllocPolicy,

         typename = typename mozilla::EnableIf<!detail::TypeIsGCThing<T>::value>::Type
         >
using Vector = mozilla::Vector<T, MinInlineCapacity, AllocPolicy>;

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCVector.h" 2

namespace JS {
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/GCVector.h"
template <typename T,
          size_t MinInlineCapacity = 0,
          typename AllocPolicy = js::TempAllocPolicy>
class GCVector
{
    mozilla::Vector<T, MinInlineCapacity, AllocPolicy> vector;

  public:
    explicit GCVector(AllocPolicy alloc = AllocPolicy())
      : vector(alloc)
    {}

    GCVector(GCVector&& vec)
      : vector(mozilla::Move(vec.vector))
    {}

    GCVector& operator=(GCVector&& vec) {
        vector = mozilla::Move(vec.vector);
        return *this;
    }

    size_t length() const { return vector.length(); }
    bool empty() const { return vector.empty(); }
    size_t capacity() const { return vector.capacity(); }

    T* begin() { return vector.begin(); }
    const T* begin() const { return vector.begin(); }

    T* end() { return vector.end(); }
    const T* end() const { return vector.end(); }

    T& operator[](size_t i) { return vector[i]; }
    const T& operator[](size_t i) const { return vector[i]; }

    T& back() { return vector.back(); }
    const T& back() const { return vector.back(); }

    bool initCapacity(size_t cap) { return vector.initCapacity(cap); }
    __attribute__ ((warn_unused_result)) bool reserve(size_t req) { return vector.reserve(req); }
    void shrinkBy(size_t amount) { return vector.shrinkBy(amount); }
    __attribute__ ((warn_unused_result)) bool growBy(size_t amount) { return vector.growBy(amount); }
    __attribute__ ((warn_unused_result)) bool resize(size_t newLen) { return vector.resize(newLen); }

    void clear() { return vector.clear(); }
    void clearAndFree() { return vector.clearAndFree(); }

    template<typename U> bool append(U&& item) { return vector.append(mozilla::Forward<U>(item)); }

    template<typename... Args>
    __attribute__ ((warn_unused_result)) bool
    emplaceBack(Args&&... args) {
        return vector.emplaceBack(mozilla::Forward<Args>(args)...);
    }

    template<typename U>
    void infallibleAppend(U&& aU) {
        return vector.infallibleAppend(mozilla::Forward<U>(aU));
    }
    void infallibleAppendN(const T& aT, size_t aN) {
        return vector.infallibleAppendN(aT, aN);
    }
    template<typename U> void
    infallibleAppend(const U* aBegin, const U* aEnd) {
        return vector.infallibleAppend(aBegin, aEnd);
    }
    template<typename U> void infallibleAppend(const U* aBegin, size_t aLength) {
        return vector.infallibleAppend(aBegin, aLength);
    }

    template<typename U, size_t O, class BP>
    __attribute__ ((warn_unused_result)) bool appendAll(const mozilla::Vector<U, O, BP>& aU) { return vector.appendAll(aU); }
    template<typename U, size_t O, class BP>
    __attribute__ ((warn_unused_result)) bool appendAll(const GCVector<U, O, BP>& aU) {
        return vector.append(aU.begin(), aU.length());
    }

    __attribute__ ((warn_unused_result)) bool appendN(const T& val, size_t count) { return vector.appendN(val, count); }

    template<typename U>
    __attribute__ ((warn_unused_result)) bool append(const U* aBegin, const U* aEnd) {
        return vector.append(aBegin, aEnd);
    }
    template<typename U>
    __attribute__ ((warn_unused_result)) bool append(const U* aBegin, size_t aLength) {
        return vector.append(aBegin, aLength);
    }

    void popBack() { return vector.popBack(); }
    T popCopy() { return vector.popCopy(); }

    size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return vector.sizeOfExcludingThis(mallocSizeOf);
    }

    size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return vector.sizeOfIncludingThis(mallocSizeOf);
    }

    static void trace(GCVector* vec, JSTracer* trc) { vec->trace(trc); }

    void trace(JSTracer* trc) {
        for (auto& elem : vector)
            GCPolicy<T>::trace(trc, &elem, "vector element");
    }

    void sweep() {
        uint32_t src, dst = 0;
        for (src = 0; src < length(); src++) {
            if (!GCPolicy<T>::needsSweep(&vector[src])) {
                if (dst != src)
                    vector[dst] = vector[src].unbarrieredGet();
                dst++;
            }
        }

        if (dst != length())
            vector.shrinkTo(dst);
    }
};

}

namespace js {

template <typename Wrapper, typename T, size_t Capacity, typename AllocPolicy>
class WrappedPtrOperations<JS::GCVector<T, Capacity, AllocPolicy>, Wrapper>
{
    using Vec = JS::GCVector<T, Capacity, AllocPolicy>;
    const Vec& vec() const { return static_cast<const Wrapper*>(this)->get(); }

  public:
    const AllocPolicy& allocPolicy() const { return vec().allocPolicy(); }
    size_t length() const { return vec().length(); }
    bool empty() const { return vec().empty(); }
    size_t capacity() const { return vec().capacity(); }
    const T* begin() const { return vec().begin(); }
    const T* end() const { return vec().end(); }
    const T& back() const { return vec().back(); }

    JS::Handle<T> operator[](size_t aIndex) const {
        return JS::Handle<T>::fromMarkedLocation(&vec().operator[](aIndex));
    }
};

template <typename Wrapper, typename T, size_t Capacity, typename AllocPolicy>
class MutableWrappedPtrOperations<JS::GCVector<T, Capacity, AllocPolicy>, Wrapper>
  : public WrappedPtrOperations<JS::GCVector<T, Capacity, AllocPolicy>, Wrapper>
{
    using Vec = JS::GCVector<T, Capacity, AllocPolicy>;
    const Vec& vec() const { return static_cast<const Wrapper*>(this)->get(); }
    Vec& vec() { return static_cast<Wrapper*>(this)->get(); }

  public:
    const AllocPolicy& allocPolicy() const { return vec().allocPolicy(); }
    AllocPolicy& allocPolicy() { return vec().allocPolicy(); }
    const T* begin() const { return vec().begin(); }
    T* begin() { return vec().begin(); }
    const T* end() const { return vec().end(); }
    T* end() { return vec().end(); }
    const T& back() const { return vec().back(); }
    T& back() { return vec().back(); }

    JS::Handle<T> operator[](size_t aIndex) const {
        return JS::Handle<T>::fromMarkedLocation(&vec().operator[](aIndex));
    }
    JS::MutableHandle<T> operator[](size_t aIndex) {
        return JS::MutableHandle<T>::fromMarkedLocation(&vec().operator[](aIndex));
    }

    __attribute__ ((warn_unused_result)) bool initCapacity(size_t aRequest) { return vec().initCapacity(aRequest); }
    __attribute__ ((warn_unused_result)) bool reserve(size_t aRequest) { return vec().reserve(aRequest); }
    void shrinkBy(size_t aIncr) { vec().shrinkBy(aIncr); }
    __attribute__ ((warn_unused_result)) bool growBy(size_t aIncr) { return vec().growBy(aIncr); }
    __attribute__ ((warn_unused_result)) bool resize(size_t aNewLength) { return vec().resize(aNewLength); }
    __attribute__ ((warn_unused_result)) bool growByUninitialized(size_t aIncr) { return vec().growByUninitialized(aIncr); }
    void infallibleGrowByUninitialized(size_t aIncr) { vec().infallibleGrowByUninitialized(aIncr); }
    __attribute__ ((warn_unused_result)) bool resizeUninitialized(size_t aNewLength) { return vec().resizeUninitialized(aNewLength); }
    void clear() { vec().clear(); }
    void clearAndFree() { vec().clearAndFree(); }
    template<typename U>
    __attribute__ ((warn_unused_result)) bool append(U&& aU) { return vec().append(mozilla::Forward<U>(aU)); }
    template<typename... Args>
    __attribute__ ((warn_unused_result)) bool emplaceBack(Args&&... aArgs) {
        return vec().emplaceBack(mozilla::Forward<Args...>(aArgs...));
    }
    template<typename U, size_t O, class BP>
    __attribute__ ((warn_unused_result)) bool appendAll(const mozilla::Vector<U, O, BP>& aU) { return vec().appendAll(aU); }
    template<typename U, size_t O, class BP>
    __attribute__ ((warn_unused_result)) bool appendAll(const JS::GCVector<U, O, BP>& aU) { return vec().appendAll(aU); }
    __attribute__ ((warn_unused_result)) bool appendN(const T& aT, size_t aN) { return vec().appendN(aT, aN); }
    template<typename U>
    __attribute__ ((warn_unused_result)) bool append(const U* aBegin, const U* aEnd) {
        return vec().append(aBegin, aEnd);
    }
    template<typename U>
    __attribute__ ((warn_unused_result)) bool append(const U* aBegin, size_t aLength) {
        return vec().append(aBegin, aLength);
    }
    template<typename U> void infallibleAppend(U&& aU) {
        vec().infallibleAppend(mozilla::Forward<U>(aU));
    }
    void infallibleAppendN(const T& aT, size_t aN) { vec().infallibleAppendN(aT, aN); }
    template<typename U> void infallibleAppend(const U* aBegin, const U* aEnd) {
        vec().infallibleAppend(aBegin, aEnd);
    }
    template<typename U> void infallibleAppend(const U* aBegin, size_t aLength) {
        vec().infallibleAppend(aBegin, aLength);
    }
    void popBack() { vec().popBack(); }
    T popCopy() { return vec().popCopy(); }
    template<typename U> T* insert(T* aP, U&& aVal) {
        return vec().insert(aP, mozilla::Forward<U>(aVal));
    }
    void erase(T* aT) { vec().erase(aT); }
    void erase(T* aBegin, T* aEnd) { vec().erase(aBegin, aEnd); }
};

}
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Principals.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Principals.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BufferList.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BufferList.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ScopeExit.h" 1
# 86 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ScopeExit.h"
namespace mozilla {

template <typename ExitFunction>
class ScopeExit {
  ExitFunction mExitFunction;
  bool mExecuteOnDestruction;


public:
  explicit ScopeExit(ExitFunction&& cleanup
                                                    )
   : mExitFunction(cleanup)
   , mExecuteOnDestruction(true)
  {
    do { } while (0);
  }

  ScopeExit(ScopeExit&& rhs)
   : mExitFunction(mozilla::Move(rhs.mExitFunction))
   , mExecuteOnDestruction(rhs.mExecuteOnDestruction)
  {
    rhs.release();
  }

  ~ScopeExit() {
    if (mExecuteOnDestruction) {
      mExitFunction();
    }
  }

  void release() {
    mExecuteOnDestruction = false;
  }

private:
  explicit ScopeExit(const ScopeExit&) = delete;
  ScopeExit& operator=(const ScopeExit&) = delete;
  ScopeExit& operator=(ScopeExit&&) = delete;
};

template <typename ExitFunction>
ScopeExit<ExitFunction>
MakeScopeExit(ExitFunction&& exitFunction)
{
  return ScopeExit<ExitFunction>(mozilla::Move(exitFunction));
}

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BufferList.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BufferList.h"
namespace mozilla {

template<typename AllocPolicy>
class BufferList : private AllocPolicy
{


  struct Segment
  {
    char* mData;
    size_t mSize;
    size_t mCapacity;

    Segment(char* aData, size_t aSize, size_t aCapacity)
     : mData(aData),
       mSize(aSize),
       mCapacity(aCapacity)
    {
    }

    Segment(const Segment&) = delete;
    Segment& operator=(const Segment&) = delete;

    Segment(Segment&&) = default;
    Segment& operator=(Segment&&) = default;

    char* Start() const { return mData; }
    char* End() const { return mData + mSize; }
  };

  template<typename OtherAllocPolicy>
  friend class BufferList;

 public:





  static const size_t kSegmentAlignment = 8;






  BufferList(size_t aInitialSize,
             size_t aInitialCapacity,
             size_t aStandardCapacity,
             AllocPolicy aAP = AllocPolicy())
   : AllocPolicy(aAP),
     mOwning(true),
     mSegments(aAP),
     mSize(0),
     mStandardCapacity(aStandardCapacity)
  {
    do { } while (0);
    do { } while (0);

    if (aInitialCapacity) {
      AllocateSegment(aInitialSize, aInitialCapacity);
    }
  }

  BufferList(const BufferList& aOther) = delete;

  BufferList(BufferList&& aOther)
   : mOwning(aOther.mOwning),
     mSegments(Move(aOther.mSegments)),
     mSize(aOther.mSize),
     mStandardCapacity(aOther.mStandardCapacity)
  {
    aOther.mSegments.clear();
    aOther.mSize = 0;
  }

  BufferList& operator=(const BufferList& aOther) = delete;

  BufferList& operator=(BufferList&& aOther)
  {
    Clear();

    mOwning = aOther.mOwning;
    mSegments = Move(aOther.mSegments);
    mSize = aOther.mSize;
    aOther.mSegments.clear();
    aOther.mSize = 0;
    return *this;
  }

  ~BufferList() { Clear(); }


  size_t Size() const { return mSize; }

  void Clear()
  {
    if (mOwning) {
      for (Segment& segment : mSegments) {
        this->free_(segment.mData);
      }
    }
    mSegments.clear();

    mSize = 0;
  }



  class IterImpl
  {




    uintptr_t mSegment;
    char* mData;
    char* mDataEnd;

    friend class BufferList;

  public:
    explicit IterImpl(const BufferList& aBuffers)
     : mSegment(0),
       mData(nullptr),
       mDataEnd(nullptr)
    {
      if (!aBuffers.mSegments.empty()) {
        mData = aBuffers.mSegments[0].Start();
        mDataEnd = aBuffers.mSegments[0].End();
      }
    }



    char* Data() const
    {
      do { static_assert(mozilla::detail::AssertionConditionType<decltype(!Done())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(!Done()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "!Done()" ")"); do { *((volatile int*) __null) = 162; ::abort(); } while (0); } } while (0);
      return mData;
    }



    bool HasRoomFor(size_t aBytes) const
    {
      do { static_assert(mozilla::detail::AssertionConditionType<decltype(mData <= mDataEnd)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mData <= mDataEnd))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mData <= mDataEnd" ")"); do { *((volatile int*) __null) = 170; ::abort(); } while (0); } } while (0);
      return size_t(mDataEnd - mData) >= aBytes;
    }



    size_t RemainingInSegment() const
    {
      do { static_assert(mozilla::detail::AssertionConditionType<decltype(mData <= mDataEnd)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mData <= mDataEnd))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mData <= mDataEnd" ")"); do { *((volatile int*) __null) = 178; ::abort(); } while (0); } } while (0);
      return mDataEnd - mData;
    }





    void Advance(const BufferList& aBuffers, size_t aBytes)
    {
      const Segment& segment = aBuffers.mSegments[mSegment];
      do { static_assert(mozilla::detail::AssertionConditionType<decltype(segment.Start() <= mData)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(segment.Start() <= mData))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "segment.Start() <= mData" ")"); do { *((volatile int*) __null) = 189; ::abort(); } while (0); } } while (0);
      do { static_assert(mozilla::detail::AssertionConditionType<decltype(mData <= mDataEnd)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mData <= mDataEnd))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mData <= mDataEnd" ")"); do { *((volatile int*) __null) = 190; ::abort(); } while (0); } } while (0);
      do { static_assert(mozilla::detail::AssertionConditionType<decltype(mDataEnd == segment.End())>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mDataEnd == segment.End()))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mDataEnd == segment.End()" ")"); do { *((volatile int*) __null) = 191; ::abort(); } while (0); } } while (0);

      do { static_assert(mozilla::detail::AssertionConditionType<decltype(HasRoomFor(aBytes))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(HasRoomFor(aBytes)))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "HasRoomFor(aBytes)" ")"); do { *((volatile int*) __null) = 193; ::abort(); } while (0); } } while (0);
      mData += aBytes;

      if (mData == mDataEnd && mSegment + 1 < aBuffers.mSegments.length()) {
        mSegment++;
        const Segment& nextSegment = aBuffers.mSegments[mSegment];
        mData = nextSegment.Start();
        mDataEnd = nextSegment.End();
        do { static_assert(mozilla::detail::AssertionConditionType<decltype(mData < mDataEnd)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mData < mDataEnd))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mData < mDataEnd" ")"); do { *((volatile int*) __null) = 201; ::abort(); } while (0); } } while (0);
      }
    }




    bool AdvanceAcrossSegments(const BufferList& aBuffers, size_t aBytes)
    {
      size_t bytes = aBytes;
      while (bytes) {
        size_t toAdvance = std::min(bytes, RemainingInSegment());
        if (!toAdvance) {
          return false;
        }
        Advance(aBuffers, toAdvance);
        bytes -= toAdvance;
      }
      return true;
    }


    bool Done() const
    {
      return mData == mDataEnd;
    }

   private:


    size_t BytesUntil(const BufferList& aBuffers, const IterImpl& aTarget) const {
      size_t offset = 0;

      do { } while (0);

      char* data = mData;
      for (uintptr_t segment = mSegment; segment < aTarget.mSegment; segment++) {
        offset += aBuffers.mSegments[segment].End() - data;
        data = aBuffers.mSegments[segment].mData;
      }

      do { static_assert(mozilla::detail::AssertionConditionType<decltype(IsIn(aBuffers))>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(IsIn(aBuffers)))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "IsIn(aBuffers)" ")"); do { *((volatile int*) __null) = 242; ::abort(); } while (0); } } while (0);
      do { static_assert(mozilla::detail::AssertionConditionType<decltype(aTarget.mData >= data)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aTarget.mData >= data))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aTarget.mData >= data" ")"); do { *((volatile int*) __null) = 243; ::abort(); } while (0); } } while (0);

      offset += aTarget.mData - data;
      return offset;
    }

    bool IsIn(const BufferList& aBuffers) const {
      return mSegment < aBuffers.mSegments.length() &&
             mData >= aBuffers.mSegments[mSegment].mData &&
             mData < aBuffers.mSegments[mSegment].End();
    }
  };


  char* Start() { return mSegments[0].mData; }
  const char* Start() const { return mSegments[0].mData; }

  IterImpl Iter() const { return IterImpl(*this); }



  inline bool WriteBytes(const char* aData, size_t aSize);




  inline bool ReadBytes(IterImpl& aIter, char* aData, size_t aSize) const;







  template<typename BorrowingAllocPolicy>
  BufferList<BorrowingAllocPolicy> Borrow(IterImpl& aIter, size_t aSize, bool* aSuccess,
                                          BorrowingAllocPolicy aAP = BorrowingAllocPolicy()) const;







  template<typename OtherAllocPolicy>
  BufferList<OtherAllocPolicy> MoveFallible(bool* aSuccess, OtherAllocPolicy aAP = OtherAllocPolicy());
# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BufferList.h"
  BufferList Extract(IterImpl& aIter, size_t aSize, bool* aSuccess);



  size_t RangeLength(const IterImpl& start, const IterImpl& end) const {
    do { } while (0);
    return start.BytesUntil(*this, end);
  }

private:
  explicit BufferList(AllocPolicy aAP)
   : AllocPolicy(aAP),
     mOwning(false),
     mSize(0),
     mStandardCapacity(0)
  {
  }

  void* AllocateSegment(size_t aSize, size_t aCapacity)
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(mOwning)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mOwning))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mOwning" ")"); do { *((volatile int*) __null) = 318; ::abort(); } while (0); } } while (0);
    do { } while (0);

    char* data = this->template pod_malloc<char>(aCapacity);
    if (!data) {
      return nullptr;
    }
    if (!mSegments.append(Segment(data, aSize, aCapacity))) {
      this->free_(data);
      return nullptr;
    }
    mSize += aSize;
    return data;
  }

  bool mOwning;
  Vector<Segment, 1, AllocPolicy> mSegments;
  size_t mSize;
  size_t mStandardCapacity;
};

template<typename AllocPolicy>
bool
BufferList<AllocPolicy>::WriteBytes(const char* aData, size_t aSize)
{
  do { static_assert(mozilla::detail::AssertionConditionType<decltype(mOwning)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mOwning))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mOwning" ")"); do { *((volatile int*) __null) = 343; ::abort(); } while (0); } } while (0);
  do { static_assert(mozilla::detail::AssertionConditionType<decltype(mStandardCapacity)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mStandardCapacity))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mStandardCapacity" ")"); do { *((volatile int*) __null) = 344; ::abort(); } while (0); } } while (0);

  size_t copied = 0;
  size_t remaining = aSize;

  if (!mSegments.empty()) {
    Segment& lastSegment = mSegments.back();

    size_t toCopy = std::min(aSize, lastSegment.mCapacity - lastSegment.mSize);
    memcpy(lastSegment.mData + lastSegment.mSize, aData, toCopy);
    lastSegment.mSize += toCopy;
    mSize += toCopy;

    copied += toCopy;
    remaining -= toCopy;
  }

  while (remaining) {
    size_t toCopy = std::min(remaining, mStandardCapacity);

    void* data = AllocateSegment(toCopy, mStandardCapacity);
    if (!data) {
      return false;
    }
    memcpy(data, aData + copied, toCopy);

    copied += toCopy;
    remaining -= toCopy;
  }

  return true;
}

template<typename AllocPolicy>
bool
BufferList<AllocPolicy>::ReadBytes(IterImpl& aIter, char* aData, size_t aSize) const
{
  size_t copied = 0;
  size_t remaining = aSize;
  while (remaining) {
    size_t toCopy = std::min(aIter.RemainingInSegment(), remaining);
    if (!toCopy) {

      return false;
    }
    memcpy(aData + copied, aIter.Data(), toCopy);
    copied += toCopy;
    remaining -= toCopy;

    aIter.Advance(*this, toCopy);
  }

  return true;
}

template<typename AllocPolicy> template<typename BorrowingAllocPolicy>
BufferList<BorrowingAllocPolicy>
BufferList<AllocPolicy>::Borrow(IterImpl& aIter, size_t aSize, bool* aSuccess,
                                BorrowingAllocPolicy aAP) const
{
  BufferList<BorrowingAllocPolicy> result(aAP);

  size_t size = aSize;
  while (size) {
    size_t toAdvance = std::min(size, aIter.RemainingInSegment());

    if (!toAdvance || !result.mSegments.append(typename BufferList<BorrowingAllocPolicy>::Segment(aIter.mData, toAdvance, toAdvance))) {
      *aSuccess = false;
      return result;
    }
    aIter.Advance(*this, toAdvance);
    size -= toAdvance;
  }

  result.mSize = aSize;
  *aSuccess = true;
  return result;
}

template<typename AllocPolicy> template<typename OtherAllocPolicy>
BufferList<OtherAllocPolicy>
BufferList<AllocPolicy>::MoveFallible(bool* aSuccess, OtherAllocPolicy aAP)
{
  BufferList<OtherAllocPolicy> result(0, 0, mStandardCapacity, aAP);

  IterImpl iter = Iter();
  while (!iter.Done()) {
    size_t toAdvance = iter.RemainingInSegment();

    if (!toAdvance || !result.mSegments.append(typename BufferList<OtherAllocPolicy>::Segment(iter.mData, toAdvance, toAdvance))) {
      *aSuccess = false;
      result.mSegments.clear();
      return result;
    }
    iter.Advance(*this, toAdvance);
  }

  result.mSize = mSize;
  mSegments.clear();
  mSize = 0;
  *aSuccess = true;
  return result;
}

template<typename AllocPolicy>
BufferList<AllocPolicy>
BufferList<AllocPolicy>::Extract(IterImpl& aIter, size_t aSize, bool* aSuccess)
{
  do { static_assert(mozilla::detail::AssertionConditionType<decltype(aSize)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aSize))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aSize" ")"); do { *((volatile int*) __null) = 452; ::abort(); } while (0); } } while (0);
  do { static_assert(mozilla::detail::AssertionConditionType<decltype(mOwning)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mOwning))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mOwning" ")"); do { *((volatile int*) __null) = 453; ::abort(); } while (0); } } while (0);
  do { } while (0);
  do { } while (0);

  IterImpl iter = aIter;
  size_t size = aSize;
  size_t toCopy = std::min(size, aIter.RemainingInSegment());
  do { } while (0);

  BufferList result(0, toCopy, mStandardCapacity);
  BufferList error(0, 0, mStandardCapacity);


  if (!result.WriteBytes(aIter.mData, toCopy)) {
    *aSuccess = false;
    return error;
  }
  iter.Advance(*this, toCopy);
  size -= toCopy;


  auto resultGuard = MakeScopeExit([&] {
    *aSuccess = false;
    result.mSegments.erase(result.mSegments.begin()+1, result.mSegments.end());
  });

  size_t movedSize = 0;
  uintptr_t toRemoveStart = iter.mSegment;
  uintptr_t toRemoveEnd = iter.mSegment;
  while (!iter.Done() &&
         !iter.HasRoomFor(size)) {
    if (!result.mSegments.append(Segment(mSegments[iter.mSegment].mData,
                                         mSegments[iter.mSegment].mSize,
                                         mSegments[iter.mSegment].mCapacity))) {
      return error;
    }
    movedSize += iter.RemainingInSegment();
    size -= iter.RemainingInSegment();
    toRemoveEnd++;
    iter.Advance(*this, iter.RemainingInSegment());
  }

  if (size) {
    if (!iter.HasRoomFor(size) ||
        !result.WriteBytes(iter.Data(), size)) {
      return error;
    }
    iter.Advance(*this, size);
  }

  mSegments.erase(mSegments.begin() + toRemoveStart, mSegments.begin() + toRemoveEnd);
  mSize -= movedSize;
  aIter.mSegment = iter.mSegment - (toRemoveEnd - toRemoveStart);
  aIter.mData = iter.mData;
  aIter.mDataEnd = iter.mDataEnd;
  do { } while (0);
  result.mSize = aSize;

  resultGuard.release();
  *aSuccess = true;
  return result;
}

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h" 2
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
struct JSRuntime;
struct JSStructuredCloneReader;
struct JSStructuredCloneWriter;



namespace JS {

enum class StructuredCloneScope : uint32_t {
    SameProcessSameThread,
    SameProcessDifferentThread,
    DifferentProcess
};

enum TransferableOwnership {

    SCTAG_TMO_UNFILLED = 0,


    SCTAG_TMO_UNOWNED = 1,


    SCTAG_TMO_FIRST_OWNED = 2,


    SCTAG_TMO_ALLOC_DATA = 2,


    SCTAG_TMO_MAPPED_DATA = 3,






    SCTAG_TMO_CUSTOM = 4,

    SCTAG_TMO_USER_MIN
};

class CloneDataPolicy
{
    bool sharedArrayBuffer_;

  public:


    CloneDataPolicy() :
      sharedArrayBuffer_(true)
    {}
# 81 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
    CloneDataPolicy& denySharedArrayBuffer() {
        sharedArrayBuffer_ = false;
        return *this;
    }

    bool isSharedArrayBufferAllowed() const {
        return sharedArrayBuffer_;
    }
};

}
# 102 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
typedef JSObject* (*ReadStructuredCloneOp)(JSContext* cx, JSStructuredCloneReader* r,
                                           uint32_t tag, uint32_t data, void* closure);
# 117 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
typedef bool (*WriteStructuredCloneOp)(JSContext* cx, JSStructuredCloneWriter* w,
                                       JS::HandleObject obj, void* closure);






typedef void (*StructuredCloneErrorOp)(JSContext* cx, uint32_t errorid);
# 134 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
typedef bool (*ReadTransferStructuredCloneOp)(JSContext* cx, JSStructuredCloneReader* r,
                                              uint32_t tag, void* content, uint64_t extraData,
                                              void* closure,
                                              JS::MutableHandleObject returnObject);
# 154 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
typedef bool (*TransferStructuredCloneOp)(JSContext* cx,
                                          JS::Handle<JSObject*> obj,
                                          void* closure,

                                          uint32_t* tag,
                                          JS::TransferableOwnership* ownership,
                                          void** content,
                                          uint64_t* extraData);






typedef void (*FreeTransferStructuredCloneOp)(uint32_t tag, JS::TransferableOwnership ownership,
                                              void* content, uint64_t extraData, void* closure);







struct JSStructuredCloneCallbacks {
    ReadStructuredCloneOp read;
    WriteStructuredCloneOp write;
    StructuredCloneErrorOp reportError;
    ReadTransferStructuredCloneOp readTransfer;
    TransferStructuredCloneOp writeTransfer;
    FreeTransferStructuredCloneOp freeTransfer;
};

enum OwnTransferablePolicy {
    OwnsTransferablesIfAny,
    IgnoreTransferablesIfAny,
    NoTransferables
};

namespace js
{
    class SharedArrayRawBuffer;

    class SharedArrayRawBufferRefs
    {
      public:
        SharedArrayRawBufferRefs() = default;
        SharedArrayRawBufferRefs(SharedArrayRawBufferRefs&& other) = default;
        SharedArrayRawBufferRefs& operator=(SharedArrayRawBufferRefs&& other);
        ~SharedArrayRawBufferRefs();

        __attribute__ ((warn_unused_result)) bool acquire(JSContext* cx, SharedArrayRawBuffer* rawbuf);
        __attribute__ ((warn_unused_result)) bool acquireAll(JSContext* cx, const SharedArrayRawBufferRefs& that);
        void takeOwnership(SharedArrayRawBufferRefs&&);
        void releaseAll();

      private:
        js::Vector<js::SharedArrayRawBuffer*, 0, js::SystemAllocPolicy> refs_;
    };
}

class JSStructuredCloneData :
    public mozilla::BufferList<js::SystemAllocPolicy>
{
    typedef js::SystemAllocPolicy AllocPolicy;
    typedef mozilla::BufferList<js::SystemAllocPolicy> BufferList;

    static const size_t kInitialSize = 0;
    static const size_t kInitialCapacity = 4096;
    static const size_t kStandardCapacity = 4096;

    const JSStructuredCloneCallbacks* callbacks_;
    void* closure_;
    OwnTransferablePolicy ownTransferables_;
    js::SharedArrayRawBufferRefs refsHeld_;

    void setOptionalCallbacks(const JSStructuredCloneCallbacks* callbacks,
                              void* closure,
                              OwnTransferablePolicy policy) {
        callbacks_ = callbacks;
        closure_ = closure;
        ownTransferables_ = policy;
    }

    friend struct JSStructuredCloneWriter;
    friend class JSAutoStructuredCloneBuffer;

public:
    explicit JSStructuredCloneData(AllocPolicy aAP = AllocPolicy())
        : BufferList(kInitialSize, kInitialCapacity, kStandardCapacity, aAP)
        , callbacks_(nullptr)
        , closure_(nullptr)
        , ownTransferables_(OwnTransferablePolicy::NoTransferables)
    {}
                 JSStructuredCloneData(BufferList&& buffers)
        : BufferList(Move(buffers))
        , callbacks_(nullptr)
        , closure_(nullptr)
        , ownTransferables_(OwnTransferablePolicy::NoTransferables)
    {}
    JSStructuredCloneData(JSStructuredCloneData&& other) = default;
    JSStructuredCloneData& operator=(JSStructuredCloneData&& other) = default;
    ~JSStructuredCloneData();

    using BufferList::BufferList;
};


bool
JS_ReadStructuredClone(JSContext* cx, JSStructuredCloneData& data, uint32_t version,
                       JS::StructuredCloneScope scope,
                       JS::MutableHandleValue vp,
                       const JSStructuredCloneCallbacks* optionalCallbacks, void* closure);

bool
JS_WriteStructuredClone(JSContext* cx, JS::HandleValue v, JSStructuredCloneData* data,
                        JS::StructuredCloneScope scope,
                        JS::CloneDataPolicy cloneDataPolicy,
                        const JSStructuredCloneCallbacks* optionalCallbacks,
                        void* closure, JS::HandleValue transferable);

bool
JS_StructuredCloneHasTransferables(JSStructuredCloneData& data, bool* hasTransferable);

bool
JS_StructuredClone(JSContext* cx, JS::HandleValue v, JS::MutableHandleValue vp,
                   const JSStructuredCloneCallbacks* optionalCallbacks, void* closure);


class JSAutoStructuredCloneBuffer {
    const JS::StructuredCloneScope scope_;
    JSStructuredCloneData data_;
    uint32_t version_;

  public:
    JSAutoStructuredCloneBuffer(JS::StructuredCloneScope scope,
                                const JSStructuredCloneCallbacks* callbacks, void* closure)
        : scope_(scope), version_(8)
    {
        data_.setOptionalCallbacks(callbacks, closure, OwnTransferablePolicy::NoTransferables);
    }

    JSAutoStructuredCloneBuffer(JSAutoStructuredCloneBuffer&& other);
    JSAutoStructuredCloneBuffer& operator=(JSAutoStructuredCloneBuffer&& other);

    ~JSAutoStructuredCloneBuffer() { clear(); }

    JSStructuredCloneData& data() { return data_; }
    bool empty() const { return !data_.Size(); }

    void clear(const JSStructuredCloneCallbacks* optionalCallbacks=nullptr, void* closure=nullptr);


    bool copy(JSContext* cx, const JSStructuredCloneData& data,
              uint32_t version=8,
              const JSStructuredCloneCallbacks* callbacks=nullptr, void* closure=nullptr);






    void adopt(JSStructuredCloneData&& data, uint32_t version=8,
               const JSStructuredCloneCallbacks* callbacks=nullptr, void* closure=nullptr);




    void steal(JSStructuredCloneData* data, uint32_t* versionp=nullptr,
               const JSStructuredCloneCallbacks** callbacks=nullptr, void** closure=nullptr);







    void abandon() { data_.ownTransferables_ = OwnTransferablePolicy::IgnoreTransferablesIfAny; }

    bool read(JSContext* cx, JS::MutableHandleValue vp,
              const JSStructuredCloneCallbacks* optionalCallbacks=nullptr, void* closure=nullptr);

    bool write(JSContext* cx, JS::HandleValue v,
               const JSStructuredCloneCallbacks* optionalCallbacks=nullptr, void* closure=nullptr);

    bool write(JSContext* cx, JS::HandleValue v, JS::HandleValue transferable,
               JS::CloneDataPolicy cloneDataPolicy,
               const JSStructuredCloneCallbacks* optionalCallbacks=nullptr, void* closure=nullptr);

  private:

    JSAutoStructuredCloneBuffer(const JSAutoStructuredCloneBuffer& other) = delete;
    JSAutoStructuredCloneBuffer& operator=(const JSAutoStructuredCloneBuffer& other) = delete;
};
# 358 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/StructuredClone.h"
bool
JS_ReadUint32Pair(JSStructuredCloneReader* r, uint32_t* p1, uint32_t* p2);

bool
JS_ReadBytes(JSStructuredCloneReader* r, void* p, size_t len);

bool
JS_ReadTypedArray(JSStructuredCloneReader* r, JS::MutableHandleValue vp);

bool
JS_WriteUint32Pair(JSStructuredCloneWriter* w, uint32_t tag, uint32_t data);

bool
JS_WriteBytes(JSStructuredCloneWriter* w, const void* p, size_t len);

bool
JS_WriteString(JSStructuredCloneWriter* w, JS::HandleString str);

bool
JS_WriteTypedArray(JSStructuredCloneWriter* w, JS::HandleValue v);

bool
JS_ObjectNotWritten(JSStructuredCloneWriter* w, JS::HandleObject obj);

JS::StructuredCloneScope
JS_GetStructuredCloneScope(JSStructuredCloneWriter* w);
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Principals.h" 2

namespace js {
    struct PerformanceGroup;
}

struct JSPrincipals {

    mozilla::Atomic<int32_t> refcount;



    uint32_t debugToken;


    JSPrincipals() : refcount(0) {}

    void setDebugToken(uint32_t token) {

        debugToken = token;

    }





    virtual bool write(JSContext* cx, JSStructuredCloneWriter* writer) = 0;





    void dump();
};

extern void
JS_HoldPrincipals(JSPrincipals* principals);

extern void
JS_DropPrincipals(JSContext* cx, JSPrincipals* principals);




typedef bool
(* JSSubsumesOp)(JSPrincipals* first, JSPrincipals* second);





typedef bool
(* JSCSPEvalChecker)(JSContext* cx);

struct JSSecurityCallbacks {
    JSCSPEvalChecker contentSecurityPolicyAllows;
    JSSubsumesOp subsumes;
};

extern void
JS_SetSecurityCallbacks(JSContext* cx, const JSSecurityCallbacks* callbacks);

extern const JSSecurityCallbacks*
JS_GetSecurityCallbacks(JSContext* cx);
# 96 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Principals.h"
extern void
JS_SetTrustedPrincipals(JSContext* cx, JSPrincipals* prin);

typedef void
(* JSDestroyPrincipalsOp)(JSPrincipals* principals);






extern void
JS_InitDestroyPrincipalsCallback(JSContext* cx, JSDestroyPrincipalsOp destroyPrincipals);
# 121 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Principals.h"
using JSReadPrincipalsOp = bool (*)(JSContext* cx, JSStructuredCloneReader* reader,
                                    JSPrincipals** outPrincipals);





extern void
JS_InitReadPrincipalsCallback(JSContext* cx, JSReadPrincipalsOp read);
# 36 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Realm.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Realm.h"
struct JSContext;
class JSObject;

namespace JS {

extern JSObject*
GetRealmObjectPrototype(JSContext* cx);

extern JSObject*
GetRealmFunctionPrototype(JSContext* cx);

extern JSObject*
GetRealmArrayPrototype(JSContext* cx);

extern JSObject*
GetRealmErrorPrototype(JSContext* cx);

extern JSObject*
GetRealmIteratorPrototype(JSContext* cx);

}
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RefCounted.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/RefCounted.h"
namespace js {

template <typename T>
class RefCounted
{
    static const MozRefCountType DEAD = 0xffffdead;

  protected:
    RefCounted() : mRefCnt(0) {}
    ~RefCounted() { do { } while (0); }

  public:
    void AddRef() const
    {
        do { } while (0);
        ++mRefCnt;
    }

    void Release() const
    {
      do { } while (0);
      MozRefCountType cnt = --mRefCnt;
      if (0 == cnt) {



          js_delete(const_cast<T*>(static_cast<const T*>(this)));
      }
    }

  private:
    mutable MozRefCountType mRefCnt;
};

template <typename T>
class AtomicRefCounted
{
    static const MozRefCountType DEAD = 0xffffdead;

  protected:
    AtomicRefCounted() : mRefCnt(0) {}
    ~AtomicRefCounted() { do { } while (0); }

  public:
    void AddRef() const
    {
        do { } while (0);
        ++mRefCnt;
    }

    void Release() const
    {
        do { } while (0);
        MozRefCountType cnt = --mRefCnt;
        if (0 == cnt) {



            js_delete(const_cast<T*>(static_cast<const T*>(this)));
        }
    }

  private:
    mutable mozilla::Atomic<MozRefCountType> mRefCnt;
};

}
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h" 2
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
namespace JS {

class TwoByteChars;



class AutoCheckRequestDepth
{
    JSContext* cx;
  public:
    explicit AutoCheckRequestDepth(JSContext* cx);
    ~AutoCheckRequestDepth();
};
# 72 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
template <size_t N>
class AutoValueArray : public AutoGCRooter
{
    const size_t length_;
    Value elements_[N];

  public:
    explicit AutoValueArray(JSContext* cx
                                                           )
      : AutoGCRooter(cx, VALARRAY), length_(N)
    {

        mozilla::PodArrayZero(elements_);
        do { } while (0);
    }

    unsigned length() const { return length_; }
    const Value* begin() const { return elements_; }
    Value* begin() { return elements_; }

    HandleValue operator[](unsigned i) const {
        do { } while (0);
        return HandleValue::fromMarkedLocation(&elements_[i]);
    }
    MutableHandleValue operator[](unsigned i) {
        do { } while (0);
        return MutableHandleValue::fromMarkedLocation(&elements_[i]);
    }


};

template<class T>
class AutoVectorRooterBase : protected AutoGCRooter
{
    typedef js::Vector<T, 8> VectorImpl;
    VectorImpl vector;

  public:
    explicit AutoVectorRooterBase(JSContext* cx, ptrdiff_t tag
                                                             )
      : AutoGCRooter(cx, tag), vector(cx)
    {
        do { } while (0);
    }

    typedef T ElementType;
    typedef typename VectorImpl::Range Range;

    size_t length() const { return vector.length(); }
    bool empty() const { return vector.empty(); }

    __attribute__ ((warn_unused_result)) bool append(const T& v) { return vector.append(v); }
    __attribute__ ((warn_unused_result)) bool appendN(const T& v, size_t len) { return vector.appendN(v, len); }
    __attribute__ ((warn_unused_result)) bool append(const T* ptr, size_t len) { return vector.append(ptr, len); }
    __attribute__ ((warn_unused_result)) bool appendAll(const AutoVectorRooterBase<T>& other) {
        return vector.appendAll(other.vector);
    }

    __attribute__ ((warn_unused_result)) bool insert(T* p, const T& val) { return vector.insert(p, val); }


    void infallibleAppend(const T& v) { vector.infallibleAppend(v); }

    void popBack() { vector.popBack(); }
    T popCopy() { return vector.popCopy(); }

    __attribute__ ((warn_unused_result)) bool growBy(size_t inc) {
        size_t oldLength = vector.length();
        if (!vector.growByUninitialized(inc))
            return false;
        makeRangeGCSafe(oldLength);
        return true;
    }

    __attribute__ ((warn_unused_result)) bool resize(size_t newLength) {
        size_t oldLength = vector.length();
        if (newLength <= oldLength) {
            vector.shrinkBy(oldLength - newLength);
            return true;
        }
        if (!vector.growByUninitialized(newLength - oldLength))
            return false;
        makeRangeGCSafe(oldLength);
        return true;
    }

    void clear() { vector.clear(); }

    __attribute__ ((warn_unused_result)) bool reserve(size_t newLength) {
        return vector.reserve(newLength);
    }

    JS::MutableHandle<T> operator[](size_t i) {
        return JS::MutableHandle<T>::fromMarkedLocation(&vector[i]);
    }
    JS::Handle<T> operator[](size_t i) const {
        return JS::Handle<T>::fromMarkedLocation(&vector[i]);
    }

    const T* begin() const { return vector.begin(); }
    T* begin() { return vector.begin(); }

    const T* end() const { return vector.end(); }
    T* end() { return vector.end(); }

    Range all() { return vector.all(); }

    const T& back() const { return vector.back(); }

    friend void AutoGCRooter::trace(JSTracer* trc);

  private:
    void makeRangeGCSafe(size_t oldLength) {
        T* t = vector.begin() + oldLength;
        for (size_t i = oldLength; i < vector.length(); ++i, ++t)
            memset(t, 0, sizeof(T));
    }


};

template <typename T>
class AutoVectorRooter : public AutoVectorRooterBase<T>
{
  public:
    explicit AutoVectorRooter(JSContext* cx
                                                            )
        : AutoVectorRooterBase<T>(cx, this->GetTag(T()))
    {
        do { } while (0);
    }


};

class AutoValueVector : public Rooted<GCVector<Value, 8>> {
    using Vec = GCVector<Value, 8>;
    using Base = Rooted<Vec>;
  public:
    explicit AutoValueVector(JSContext* cx) : Base(cx, Vec(cx)) {}
};

class AutoIdVector : public Rooted<GCVector<jsid, 8>> {
    using Vec = GCVector<jsid, 8>;
    using Base = Rooted<Vec>;
  public:
    explicit AutoIdVector(JSContext* cx) : Base(cx, Vec(cx)) {}

    bool appendAll(const AutoIdVector& other) { return this->Base::appendAll(other.get()); }
};

class AutoObjectVector : public Rooted<GCVector<JSObject*, 8>> {
    using Vec = GCVector<JSObject*, 8>;
    using Base = Rooted<Vec>;
  public:
    explicit AutoObjectVector(JSContext* cx) : Base(cx, Vec(cx)) {}
};

using ValueVector = JS::GCVector<JS::Value>;
using IdVector = JS::GCVector<jsid>;
using ScriptVector = JS::GCVector<JSScript*>;
using StringVector = JS::GCVector<JSString*>;

template<class Key, class Value>
class AutoHashMapRooter : protected AutoGCRooter
{
  private:
    typedef js::HashMap<Key, Value> HashMapImpl;

  public:
    explicit AutoHashMapRooter(JSContext* cx, ptrdiff_t tag
                                                              )
      : AutoGCRooter(cx, tag), map(cx)
    {
        do { } while (0);
    }

    typedef Key KeyType;
    typedef Value ValueType;
    typedef typename HashMapImpl::Entry Entry;
    typedef typename HashMapImpl::Lookup Lookup;
    typedef typename HashMapImpl::Ptr Ptr;
    typedef typename HashMapImpl::AddPtr AddPtr;

    bool init(uint32_t len = 16) {
        return map.init(len);
    }
    bool initialized() const {
        return map.initialized();
    }
    Ptr lookup(const Lookup& l) const {
        return map.lookup(l);
    }
    void remove(Ptr p) {
        map.remove(p);
    }
    AddPtr lookupForAdd(const Lookup& l) const {
        return map.lookupForAdd(l);
    }

    template<typename KeyInput, typename ValueInput>
    bool add(AddPtr& p, const KeyInput& k, const ValueInput& v) {
        return map.add(p, k, v);
    }

    bool add(AddPtr& p, const Key& k) {
        return map.add(p, k);
    }

    template<typename KeyInput, typename ValueInput>
    bool relookupOrAdd(AddPtr& p, const KeyInput& k, const ValueInput& v) {
        return map.relookupOrAdd(p, k, v);
    }

    typedef typename HashMapImpl::Range Range;
    Range all() const {
        return map.all();
    }

    typedef typename HashMapImpl::Enum Enum;

    void clear() {
        map.clear();
    }

    void finish() {
        map.finish();
    }

    bool empty() const {
        return map.empty();
    }

    uint32_t count() const {
        return map.count();
    }

    size_t capacity() const {
        return map.capacity();
    }

    size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return map.sizeOfExcludingThis(mallocSizeOf);
    }
    size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return map.sizeOfIncludingThis(mallocSizeOf);
    }



    bool has(const Lookup& l) const {
        return map.has(l);
    }

    template<typename KeyInput, typename ValueInput>
    bool put(const KeyInput& k, const ValueInput& v) {
        return map.put(k, v);
    }

    template<typename KeyInput, typename ValueInput>
    bool putNew(const KeyInput& k, const ValueInput& v) {
        return map.putNew(k, v);
    }

    Ptr lookupWithDefault(const Key& k, const Value& defaultValue) {
        return map.lookupWithDefault(k, defaultValue);
    }

    void remove(const Lookup& l) {
        map.remove(l);
    }

    friend void AutoGCRooter::trace(JSTracer* trc);

  private:
    AutoHashMapRooter(const AutoHashMapRooter& hmr) = delete;
    AutoHashMapRooter& operator=(const AutoHashMapRooter& hmr) = delete;

    HashMapImpl map;


};

template<class T>
class AutoHashSetRooter : protected AutoGCRooter
{
  private:
    typedef js::HashSet<T> HashSetImpl;

  public:
    explicit AutoHashSetRooter(JSContext* cx, ptrdiff_t tag
                                                              )
      : AutoGCRooter(cx, tag), set(cx)
    {
        do { } while (0);
    }

    typedef typename HashSetImpl::Lookup Lookup;
    typedef typename HashSetImpl::Ptr Ptr;
    typedef typename HashSetImpl::AddPtr AddPtr;

    bool init(uint32_t len = 16) {
        return set.init(len);
    }
    bool initialized() const {
        return set.initialized();
    }
    Ptr lookup(const Lookup& l) const {
        return set.lookup(l);
    }
    void remove(Ptr p) {
        set.remove(p);
    }
    AddPtr lookupForAdd(const Lookup& l) const {
        return set.lookupForAdd(l);
    }

    bool add(AddPtr& p, const T& t) {
        return set.add(p, t);
    }

    bool relookupOrAdd(AddPtr& p, const Lookup& l, const T& t) {
        return set.relookupOrAdd(p, l, t);
    }

    typedef typename HashSetImpl::Range Range;
    Range all() const {
        return set.all();
    }

    typedef typename HashSetImpl::Enum Enum;

    void clear() {
        set.clear();
    }

    void finish() {
        set.finish();
    }

    bool empty() const {
        return set.empty();
    }

    uint32_t count() const {
        return set.count();
    }

    size_t capacity() const {
        return set.capacity();
    }

    size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return set.sizeOfExcludingThis(mallocSizeOf);
    }
    size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const {
        return set.sizeOfIncludingThis(mallocSizeOf);
    }



    bool has(const Lookup& l) const {
        return set.has(l);
    }

    bool put(const T& t) {
        return set.put(t);
    }

    bool putNew(const T& t) {
        return set.putNew(t);
    }

    void remove(const Lookup& l) {
        set.remove(l);
    }

    friend void AutoGCRooter::trace(JSTracer* trc);

  private:
    AutoHashSetRooter(const AutoHashSetRooter& hmr) = delete;
    AutoHashSetRooter& operator=(const AutoHashSetRooter& hmr) = delete;

    HashSetImpl set;


};




class CustomAutoRooter : private AutoGCRooter
{
  public:
    template <typename CX>
    explicit CustomAutoRooter(const CX& cx )
      : AutoGCRooter(cx, CUSTOM)
    {
        do { } while (0);
    }

    friend void AutoGCRooter::trace(JSTracer* trc);

  protected:
    virtual ~CustomAutoRooter() {}


    virtual void trace(JSTracer* trc) = 0;

  private:

};


class HandleValueArray
{
    const size_t length_;
    const Value * const elements_;

    HandleValueArray(size_t len, const Value* elements) : length_(len), elements_(elements) {}

  public:
    explicit HandleValueArray(const RootedValue& value) : length_(1), elements_(value.address()) {}

                 HandleValueArray(const AutoValueVector& values)
      : length_(values.length()), elements_(values.begin()) {}

    template <size_t N>
                 HandleValueArray(const AutoValueArray<N>& values) : length_(N), elements_(values.begin()) {}


                 HandleValueArray(const JS::CallArgs& args) : length_(args.length()), elements_(args.array()) {}


    static HandleValueArray fromMarkedLocation(size_t len, const Value* elements) {
        return HandleValueArray(len, elements);
    }

    static HandleValueArray subarray(const HandleValueArray& values, size_t startIndex, size_t len) {
        do { } while (0);
        return HandleValueArray(len, values.begin() + startIndex);
    }

    static HandleValueArray empty() {
        return HandleValueArray(0, nullptr);
    }

    size_t length() const { return length_; }
    const Value* begin() const { return elements_; }

    HandleValue operator[](size_t i) const {
        do { } while (0);
        return HandleValue::fromMarkedLocation(&elements_[i]);
    }
};

}



struct JSFreeOp {
  protected:
    JSRuntime* runtime_;

    explicit JSFreeOp(JSRuntime* rt)
      : runtime_(rt) { }

  public:
    JSRuntime* runtime() const {
        do { } while (0);
        return runtime_;
    }
};





typedef enum JSGCStatus {
    JSGC_BEGIN,
    JSGC_END
} JSGCStatus;

typedef void
(* JSGCCallback)(JSContext* cx, JSGCStatus status, void* data);

typedef void
(* JSObjectsTenuredCallback)(JSContext* cx, void* data);

typedef enum JSFinalizeStatus {





    JSFINALIZE_GROUP_START,







    JSFINALIZE_GROUP_END,




    JSFINALIZE_COLLECTION_END
} JSFinalizeStatus;

typedef void
(* JSFinalizeCallback)(JSFreeOp* fop, JSFinalizeStatus status, bool isZoneGC, void* data);

typedef void
(* JSWeakPointerZonesCallback)(JSContext* cx, void* data);

typedef void
(* JSWeakPointerCompartmentCallback)(JSContext* cx, JSCompartment* comp, void* data);

typedef bool
(* JSInterruptCallback)(JSContext* cx);

typedef JSObject*
(* JSGetIncumbentGlobalCallback)(JSContext* cx);

typedef bool
(* JSEnqueuePromiseJobCallback)(JSContext* cx, JS::HandleObject job,
                                JS::HandleObject allocationSite, JS::HandleObject incumbentGlobal,
                                void* data);

enum class PromiseRejectionHandlingState {
    Unhandled,
    Handled
};

typedef void
(* JSPromiseRejectionTrackerCallback)(JSContext* cx, JS::HandleObject promise,
                                      PromiseRejectionHandlingState state, void* data);

typedef void
(* JSProcessPromiseCallback)(JSContext* cx, JS::HandleObject promise);
# 624 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef enum JSExnType {
    JSEXN_ERR,
    JSEXN_FIRST = JSEXN_ERR,
        JSEXN_INTERNALERR,
        JSEXN_EVALERR,
        JSEXN_RANGEERR,
        JSEXN_REFERENCEERR,
        JSEXN_SYNTAXERR,
        JSEXN_TYPEERR,
        JSEXN_URIERR,
        JSEXN_DEBUGGEEWOULDRUN,
        JSEXN_WASMCOMPILEERROR,
        JSEXN_WASMLINKERROR,
        JSEXN_WASMRUNTIMEERROR,
    JSEXN_ERROR_LIMIT,
    JSEXN_WARN = JSEXN_ERROR_LIMIT,
    JSEXN_NOTE,
    JSEXN_LIMIT
} JSExnType;

struct JSErrorFormatString {

    const char* name;


    const char* format;


    uint16_t argCount;


    int16_t exnType;
};

typedef const JSErrorFormatString*
(* JSErrorCallback)(void* userRef, const unsigned errorNumber);

typedef bool
(* JSLocaleToUpperCase)(JSContext* cx, JS::HandleString src, JS::MutableHandleValue rval);

typedef bool
(* JSLocaleToLowerCase)(JSContext* cx, JS::HandleString src, JS::MutableHandleValue rval);

typedef bool
(* JSLocaleCompare)(JSContext* cx, JS::HandleString src1, JS::HandleString src2,
                    JS::MutableHandleValue rval);

typedef bool
(* JSLocaleToUnicode)(JSContext* cx, const char* src, JS::MutableHandleValue rval);
# 683 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef JSObject*
(* JSWrapObjectCallback)(JSContext* cx, JS::HandleObject existing, JS::HandleObject obj);






typedef void
(* JSPreWrapCallback)(JSContext* cx, JS::HandleObject scope, JS::HandleObject obj,
                      JS::HandleObject objectPassedToWrap,
                      JS::MutableHandleObject retObj);

struct JSWrapObjectCallbacks
{
    JSWrapObjectCallback wrap;
    JSPreWrapCallback preWrap;
};

typedef void
(* JSDestroyCompartmentCallback)(JSFreeOp* fop, JSCompartment* compartment);

typedef size_t
(* JSSizeOfIncludingThisCompartmentCallback)(mozilla::MallocSizeOf mallocSizeOf,
                                             JSCompartment* compartment);

typedef void
(* JSCompartmentNameCallback)(JSContext* cx, JSCompartment* compartment,
                              char* buf, size_t bufsize);
# 721 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
using JSExternalStringSizeofCallback =
    size_t (*)(JSString* str, mozilla::MallocSizeOf mallocSizeOf);



static __attribute__((always_inline)) inline JS::Value
JS_NumberValue(double d)
{
    int32_t i;
    d = JS::CanonicalizeNaN(d);
    if (mozilla::NumberIsInt32(d, &i))
        return JS::Int32Value(i);
    return JS::DoubleValue(d);
}



bool
JS_StringHasBeenPinned(JSContext* cx, JSString* str);

namespace JS {
# 764 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class SourceBufferHolder final
{
  public:
    enum Ownership {
      NoOwnership,
      GiveOwnership
    };

    SourceBufferHolder(const char16_t* data, size_t dataLength, Ownership ownership)
      : data_(data),
        length_(dataLength),
        ownsChars_(ownership == GiveOwnership)
    {


        static const char16_t NullChar_ = 0;
        if (!get()) {
            data_ = &NullChar_;
            length_ = 0;
            ownsChars_ = false;
        }
    }

    SourceBufferHolder(SourceBufferHolder&& other)
      : data_(other.data_),
        length_(other.length_),
        ownsChars_(other.ownsChars_)
    {
        other.data_ = nullptr;
        other.length_ = 0;
        other.ownsChars_ = false;
    }

    ~SourceBufferHolder() {
        if (ownsChars_)
            js_free(const_cast<char16_t*>(data_));
    }


    const char16_t* get() const { return data_; }


    size_t length() const { return length_; }



    bool ownsChars() const { return ownsChars_; }
# 824 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
    char16_t* take() {
        do { } while (0);
        ownsChars_ = false;
        return const_cast<char16_t*>(data_);
    }

  private:
    SourceBufferHolder(SourceBufferHolder&) = delete;
    SourceBufferHolder& operator=(SourceBufferHolder&) = delete;

    const char16_t* data_;
    size_t length_;
    bool ownsChars_;
};

}
# 851 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
static const uint8_t JSPROP_ENUMERATE = 0x01;



static const uint8_t JSPROP_READONLY = 0x02;


static const uint8_t JSPROP_PERMANENT = 0x04;



static const uint8_t JSPROP_PROPOP_ACCESSORS = 0x08;


static const uint8_t JSPROP_GETTER = 0x10;


static const uint8_t JSPROP_SETTER = 0x20;




static const uint8_t JSPROP_SHARED = 0x40;


static const uint8_t JSPROP_INTERNAL_USE_BIT = 0x80;



static const unsigned JSFUN_STUB_GSOPS = 0x200;


static const unsigned JSFUN_CONSTRUCTOR = 0x400;


static const unsigned JSFUN_FLAGS_MASK = 0x600;






static const unsigned JSPROP_REDEFINE_NONCONFIGURABLE = 0x1000;
# 907 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
static const unsigned JSPROP_RESOLVING = 0x2000;



static const unsigned JSPROP_IGNORE_ENUMERATE = 0x4000;



static const unsigned JSPROP_IGNORE_READONLY = 0x8000;



static const unsigned JSPROP_IGNORE_PERMANENT = 0x10000;



static const unsigned JSPROP_IGNORE_VALUE = 0x20000;


extern int64_t
JS_Now(void);


extern JS::Value
JS_GetNaNValue(JSContext* cx);

extern JS::Value
JS_GetNegativeInfinityValue(JSContext* cx);

extern JS::Value
JS_GetPositiveInfinityValue(JSContext* cx);

extern JS::Value
JS_GetEmptyStringValue(JSContext* cx);

extern JSString*
JS_GetEmptyString(JSContext* cx);

extern bool
JS_ValueToObject(JSContext* cx, JS::HandleValue v, JS::MutableHandleObject objp);

extern JSFunction*
JS_ValueToFunction(JSContext* cx, JS::HandleValue v);

extern JSFunction*
JS_ValueToConstructor(JSContext* cx, JS::HandleValue v);

extern JSString*
JS_ValueToSource(JSContext* cx, JS::Handle<JS::Value> v);

extern bool
JS_DoubleIsInt32(double d, int32_t* ip);

extern JSType
JS_TypeOfValue(JSContext* cx, JS::Handle<JS::Value> v);

namespace JS {

extern const char*
InformalValueTypeName(const JS::Value& v);

}

extern bool
JS_StrictlyEqual(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* equal);

extern bool
JS_LooselyEqual(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* equal);

extern bool
JS_SameValue(JSContext* cx, JS::Handle<JS::Value> v1, JS::Handle<JS::Value> v2, bool* same);


extern bool
JS_IsBuiltinEvalFunction(JSFunction* fun);


extern bool
JS_IsBuiltinFunctionConstructor(JSFunction* fun);
# 1000 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSContext*
JS_NewContext(uint32_t maxbytes,
              uint32_t maxNurseryBytes = JS::DefaultNurseryBytes,
              JSRuntime* parentRuntime = nullptr);







extern void
JS_YieldCooperativeContext(JSContext* cx);



extern void
JS_ResumeCooperativeContext(JSContext* cx);





extern JSContext*
JS_NewCooperativeContext(JSContext* siblingContext);




extern void
JS_DestroyContext(JSContext* cx);

void*
JS_GetContextPrivate(JSContext* cx);

void
JS_SetContextPrivate(JSContext* cx, void* data);

extern JSRuntime*
JS_GetParentRuntime(JSContext* cx);

extern void
JS_BeginRequest(JSContext* cx);

extern void
JS_EndRequest(JSContext* cx);

extern void
JS_SetFutexCanWait(JSContext* cx);

namespace JS {
# 1065 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef void (*BeginSingleThreadedExecutionCallback)(JSContext* cx);
typedef void (*EndSingleThreadedExecutionCallback)(JSContext* cx);

extern void
SetSingleThreadedExecutionCallbacks(JSContext* cx,
                                    BeginSingleThreadedExecutionCallback begin,
                                    EndSingleThreadedExecutionCallback end);

}

namespace js {

void
AssertHeapIsIdle();

}

class JSAutoRequest
{
  public:
    explicit JSAutoRequest(JSContext* cx
                                                          )
      : mContext(cx)
    {
        do { } while (0);
        JS_BeginRequest(mContext);
    }
    ~JSAutoRequest() {
        JS_EndRequest(mContext);
    }

  protected:
    JSContext* mContext;







};

extern JSVersion
JS_GetVersion(JSContext* cx);
# 1118 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
void
JS_SetVersionForCompartment(JSCompartment* compartment, JSVersion version);

extern const char*
JS_VersionToString(JSVersion version);

extern JSVersion
JS_StringToVersion(const char* string);

namespace JS {

class ContextOptions {
  public:
    ContextOptions()
      : baseline_(true),
        ion_(true),
        asmJS_(true),
        wasm_(false),
        wasmAlwaysBaseline_(false),
        throwOnAsmJSValidationFailure_(false),
        nativeRegExp_(true),
        unboxedArrays_(false),
        asyncStack_(true),
        throwOnDebuggeeWouldRun_(true),
        dumpStackOnDebuggeeWouldRun_(false),
        werror_(false),
        strictMode_(false),
        extraWarnings_(false),

        forEachStatement_(false)



    {
    }

    bool baseline() const { return baseline_; }
    ContextOptions& setBaseline(bool flag) {
        baseline_ = flag;
        return *this;
    }
    ContextOptions& toggleBaseline() {
        baseline_ = !baseline_;
        return *this;
    }

    bool ion() const { return ion_; }
    ContextOptions& setIon(bool flag) {
        ion_ = flag;
        return *this;
    }
    ContextOptions& toggleIon() {
        ion_ = !ion_;
        return *this;
    }

    bool asmJS() const { return asmJS_; }
    ContextOptions& setAsmJS(bool flag) {
        asmJS_ = flag;
        return *this;
    }
    ContextOptions& toggleAsmJS() {
        asmJS_ = !asmJS_;
        return *this;
    }

    bool wasm() const { return wasm_; }
    ContextOptions& setWasm(bool flag) {
        wasm_ = flag;
        return *this;
    }
    ContextOptions& toggleWasm() {
        wasm_ = !wasm_;
        return *this;
    }

    bool wasmAlwaysBaseline() const { return wasmAlwaysBaseline_; }
    ContextOptions& setWasmAlwaysBaseline(bool flag) {
        wasmAlwaysBaseline_ = flag;
        return *this;
    }
    ContextOptions& toggleWasmAlwaysBaseline() {
        wasmAlwaysBaseline_ = !wasmAlwaysBaseline_;
        return *this;
    }

    bool throwOnAsmJSValidationFailure() const { return throwOnAsmJSValidationFailure_; }
    ContextOptions& setThrowOnAsmJSValidationFailure(bool flag) {
        throwOnAsmJSValidationFailure_ = flag;
        return *this;
    }
    ContextOptions& toggleThrowOnAsmJSValidationFailure() {
        throwOnAsmJSValidationFailure_ = !throwOnAsmJSValidationFailure_;
        return *this;
    }

    bool nativeRegExp() const { return nativeRegExp_; }
    ContextOptions& setNativeRegExp(bool flag) {
        nativeRegExp_ = flag;
        return *this;
    }

    bool unboxedArrays() const { return unboxedArrays_; }
    ContextOptions& setUnboxedArrays(bool flag) {
        unboxedArrays_ = flag;
        return *this;
    }

    bool asyncStack() const { return asyncStack_; }
    ContextOptions& setAsyncStack(bool flag) {
        asyncStack_ = flag;
        return *this;
    }

    bool throwOnDebuggeeWouldRun() const { return throwOnDebuggeeWouldRun_; }
    ContextOptions& setThrowOnDebuggeeWouldRun(bool flag) {
        throwOnDebuggeeWouldRun_ = flag;
        return *this;
    }

    bool dumpStackOnDebuggeeWouldRun() const { return dumpStackOnDebuggeeWouldRun_; }
    ContextOptions& setDumpStackOnDebuggeeWouldRun(bool flag) {
        dumpStackOnDebuggeeWouldRun_ = flag;
        return *this;
    }

    bool werror() const { return werror_; }
    ContextOptions& setWerror(bool flag) {
        werror_ = flag;
        return *this;
    }
    ContextOptions& toggleWerror() {
        werror_ = !werror_;
        return *this;
    }

    bool strictMode() const { return strictMode_; }
    ContextOptions& setStrictMode(bool flag) {
        strictMode_ = flag;
        return *this;
    }
    ContextOptions& toggleStrictMode() {
        strictMode_ = !strictMode_;
        return *this;
    }

    bool extraWarnings() const { return extraWarnings_; }
    ContextOptions& setExtraWarnings(bool flag) {
        extraWarnings_ = flag;
        return *this;
    }
    ContextOptions& toggleExtraWarnings() {
        extraWarnings_ = !extraWarnings_;
        return *this;
    }

    bool forEachStatement() const { return forEachStatement_; }
    ContextOptions& setForEachStatement(bool flag) {
        forEachStatement_ = flag;
        return *this;
    }
# 1288 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
  private:
    bool baseline_ : 1;
    bool ion_ : 1;
    bool asmJS_ : 1;
    bool wasm_ : 1;
    bool wasmAlwaysBaseline_ : 1;
    bool throwOnAsmJSValidationFailure_ : 1;
    bool nativeRegExp_ : 1;
    bool unboxedArrays_ : 1;
    bool asyncStack_ : 1;
    bool throwOnDebuggeeWouldRun_ : 1;
    bool dumpStackOnDebuggeeWouldRun_ : 1;
    bool werror_ : 1;
    bool strictMode_ : 1;
    bool extraWarnings_ : 1;
    bool forEachStatement_: 1;




};

ContextOptions&
ContextOptionsRef(JSContext* cx);






bool
InitSelfHostedCode(JSContext* cx);





void
AssertObjectBelongsToCurrentThread(JSObject* obj);

}

extern const char*
JS_GetImplementationVersion(void);

extern void
JS_SetDestroyCompartmentCallback(JSContext* cx, JSDestroyCompartmentCallback callback);

extern void
JS_SetSizeOfIncludingThisCompartmentCallback(JSContext* cx,
                                             JSSizeOfIncludingThisCompartmentCallback callback);

extern void
JS_SetCompartmentNameCallback(JSContext* cx, JSCompartmentNameCallback callback);

extern void
JS_SetWrapObjectCallbacks(JSContext* cx, const JSWrapObjectCallbacks* callbacks);

extern void
JS_SetExternalStringSizeofCallback(JSContext* cx, JSExternalStringSizeofCallback callback);

extern void
JS_SetCompartmentPrivate(JSCompartment* compartment, void* data);

extern void*
JS_GetCompartmentPrivate(JSCompartment* compartment);

extern void
JS_SetZoneUserData(JS::Zone* zone, void* data);

extern void*
JS_GetZoneUserData(JS::Zone* zone);

extern bool
JS_WrapObject(JSContext* cx, JS::MutableHandleObject objp);

extern bool
JS_WrapValue(JSContext* cx, JS::MutableHandleValue vp);

extern JSObject*
JS_TransplantObject(JSContext* cx, JS::HandleObject origobj, JS::HandleObject target);

extern bool
JS_RefreshCrossCompartmentWrappers(JSContext* cx, JS::Handle<JSObject*> obj);
# 1408 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class JSAutoCompartment
{
    JSContext* cx_;
    JSCompartment* oldCompartment_;
  public:
    JSAutoCompartment(JSContext* cx, JSObject* target
                                                     );
    JSAutoCompartment(JSContext* cx, JSScript* target
                                                     );
    ~JSAutoCompartment();


};

class JSAutoNullableCompartment
{
    JSContext* cx_;
    JSCompartment* oldCompartment_;
  public:
    explicit JSAutoNullableCompartment(JSContext* cx, JSObject* targetOrNull
                                                                      );
    ~JSAutoNullableCompartment();


};


extern JSCompartment*
JS_EnterCompartment(JSContext* cx, JSObject* target);

extern void
JS_LeaveCompartment(JSContext* cx, JSCompartment* oldCompartment);

typedef void (*JSIterateCompartmentCallback)(JSContext* cx, void* data, JSCompartment* compartment);






extern void
JS_IterateCompartments(JSContext* cx, void* data,
                       JSIterateCompartmentCallback compartmentCallback);







extern void
JS_MarkCrossZoneId(JSContext* cx, jsid id);





extern void
JS_MarkCrossZoneIdValue(JSContext* cx, const JS::Value& value);
# 1475 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_InitStandardClasses(JSContext* cx, JS::Handle<JSObject*> obj);
# 1491 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_ResolveStandardClass(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool* resolved);

extern bool
JS_MayResolveStandardClass(const JSAtomState& names, jsid id, JSObject* maybeObj);

extern bool
JS_EnumerateStandardClasses(JSContext* cx, JS::HandleObject obj);

extern bool
JS_GetClassObject(JSContext* cx, JSProtoKey key, JS::MutableHandle<JSObject*> objp);

extern bool
JS_GetClassPrototype(JSContext* cx, JSProtoKey key, JS::MutableHandle<JSObject*> objp);

namespace JS {






extern JSProtoKey
IdentifyStandardInstance(JSObject* obj);

extern JSProtoKey
IdentifyStandardPrototype(JSObject* obj);

extern JSProtoKey
IdentifyStandardInstanceOrPrototype(JSObject* obj);

extern JSProtoKey
IdentifyStandardConstructor(JSObject* obj);

extern void
ProtoKeyToId(JSContext* cx, JSProtoKey key, JS::MutableHandleId idp);

}

extern JSProtoKey
JS_IdToProtoKey(JSContext* cx, JS::HandleId id);





extern JSObject*
JS_GetFunctionPrototype(JSContext* cx, JS::HandleObject forObj);





extern JSObject*
JS_GetObjectPrototype(JSContext* cx, JS::HandleObject forObj);





extern JSObject*
JS_GetArrayPrototype(JSContext* cx, JS::HandleObject forObj);





extern JSObject*
JS_GetErrorPrototype(JSContext* cx);





extern JSObject*
JS_GetIteratorPrototype(JSContext* cx);

extern JSObject*
JS_GetGlobalForObject(JSContext* cx, JSObject* obj);

extern bool
JS_IsGlobalObject(JSObject* obj);

extern JSObject*
JS_GlobalLexicalEnvironment(JSObject* obj);

extern bool
JS_HasExtensibleLexicalEnvironment(JSObject* obj);

extern JSObject*
JS_ExtensibleLexicalEnvironment(JSObject* obj);





extern JSObject*
JS_GetGlobalForCompartmentOrNull(JSContext* cx, JSCompartment* c);

namespace JS {

extern JSObject*
CurrentGlobalOrNull(JSContext* cx);

}





extern bool
JS_InitReflectParse(JSContext* cx, JS::HandleObject global);





extern bool
JS_DefineProfilingFunctions(JSContext* cx, JS::HandleObject obj);


extern bool
JS_DefineDebuggerObject(JSContext* cx, JS::HandleObject obj);






extern bool
JS_InitCTypesClass(JSContext* cx, JS::HandleObject global);






typedef char*
(* JSCTypesUnicodeToNativeFun)(JSContext* cx, const char16_t* source, size_t slen);






struct JSCTypesCallbacks {
    JSCTypesUnicodeToNativeFun unicodeToNative;
};







extern void
JS_SetCTypesCallbacks(JSObject* ctypesObj, const JSCTypesCallbacks* callbacks);


extern void*
JS_malloc(JSContext* cx, size_t nbytes);

extern void*
JS_realloc(JSContext* cx, void* p, size_t oldBytes, size_t newBytes);






extern void
JS_free(JSContext* cx, void* p);





extern void
JS_freeop(JSFreeOp* fop, void* p);

extern void
JS_updateMallocCounter(JSContext* cx, size_t nbytes);

extern char*
JS_strdup(JSContext* cx, const char* s);
# 1684 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_AddExtraGCRootsTracer(JSContext* cx, JSTraceDataOp traceOp, void* data);


extern void
JS_RemoveExtraGCRootsTracer(JSContext* cx, JSTraceDataOp traceOp, void* data);




extern void
JS_GC(JSContext* cx);

extern void
JS_MaybeGC(JSContext* cx);

extern void
JS_SetGCCallback(JSContext* cx, JSGCCallback cb, void* data);

extern void
JS_SetObjectsTenuredCallback(JSContext* cx, JSObjectsTenuredCallback cb,
                             void* data);

extern bool
JS_AddFinalizeCallback(JSContext* cx, JSFinalizeCallback cb, void* data);

extern void
JS_RemoveFinalizeCallback(JSContext* cx, JSFinalizeCallback cb);
# 1747 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_AddWeakPointerZonesCallback(JSContext* cx, JSWeakPointerZonesCallback cb, void* data);

extern void
JS_RemoveWeakPointerZonesCallback(JSContext* cx, JSWeakPointerZonesCallback cb);

extern bool
JS_AddWeakPointerCompartmentCallback(JSContext* cx, JSWeakPointerCompartmentCallback cb,
                                     void* data);

extern void
JS_RemoveWeakPointerCompartmentCallback(JSContext* cx, JSWeakPointerCompartmentCallback cb);

extern void
JS_UpdateWeakPointerAfterGC(JS::Heap<JSObject*>* objp);

extern void
JS_UpdateWeakPointerAfterGCUnbarriered(JSObject** objp);

typedef enum JSGCParamKey {

    JSGC_MAX_BYTES = 0,


    JSGC_MAX_MALLOC_BYTES = 1,


    JSGC_MAX_NURSERY_BYTES = 2,


    JSGC_BYTES = 3,


    JSGC_NUMBER = 4,


    JSGC_MODE = 6,


    JSGC_UNUSED_CHUNKS = 7,


    JSGC_TOTAL_CHUNKS = 8,


    JSGC_SLICE_TIME_BUDGET = 9,


    JSGC_MARK_STACK_LIMIT = 10,





    JSGC_HIGH_FREQUENCY_TIME_LIMIT = 11,


    JSGC_HIGH_FREQUENCY_LOW_LIMIT = 12,


    JSGC_HIGH_FREQUENCY_HIGH_LIMIT = 13,


    JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX = 14,


    JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN = 15,


    JSGC_LOW_FREQUENCY_HEAP_GROWTH = 16,





    JSGC_DYNAMIC_HEAP_GROWTH = 17,


    JSGC_DYNAMIC_MARK_SLICE = 18,


    JSGC_ALLOCATION_THRESHOLD = 19,





    JSGC_MIN_EMPTY_CHUNK_COUNT = 21,


    JSGC_MAX_EMPTY_CHUNK_COUNT = 22,


    JSGC_COMPACTING_ENABLED = 23,


    JSGC_REFRESH_FRAME_SLICES_ENABLED = 24,
} JSGCParamKey;

extern void
JS_SetGCParameter(JSContext* cx, JSGCParamKey key, uint32_t value);

extern uint32_t
JS_GetGCParameter(JSContext* cx, JSGCParamKey key);

extern void
JS_SetGCParametersBasedOnAvailableMemory(JSContext* cx, uint32_t availMem);





extern JSString*
JS_NewExternalString(JSContext* cx, const char16_t* chars, size_t length,
                     const JSStringFinalizer* fin);
# 1870 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSString*
JS_NewMaybeExternalString(JSContext* cx, const char16_t* chars, size_t length,
                          const JSStringFinalizer* fin, bool* allocatedExternal);





extern bool
JS_IsExternalString(JSString* str);




extern const JSStringFinalizer*
JS_GetExternalStringFinalizer(JSString* str);
# 1905 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
JS_SetNativeStackQuota(JSContext* cx, size_t systemCodeStackSize,
                       size_t trustedScriptStackSize = 0,
                       size_t untrustedScriptStackSize = 0);



extern bool
JS_ValueToId(JSContext* cx, JS::HandleValue v, JS::MutableHandleId idp);

extern bool
JS_StringToId(JSContext* cx, JS::HandleString s, JS::MutableHandleId idp);

extern bool
JS_IdToValue(JSContext* cx, jsid id, JS::MutableHandle<JS::Value> vp);

namespace JS {
# 1932 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
ToPrimitive(JSContext* cx, JS::HandleObject obj, JSType hint, JS::MutableHandleValue vp);
# 1942 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
GetFirstArgumentAsTypeHint(JSContext* cx, CallArgs args, JSType *result);

}

extern bool
JS_PropertyStub(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                JS::MutableHandleValue vp);

extern bool
JS_StrictPropertyStub(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                      JS::MutableHandleValue vp, JS::ObjectOpResult& result);

template<typename T>
struct JSConstScalarSpec {
    const char* name;
    T val;
};

typedef JSConstScalarSpec<double> JSConstDoubleSpec;
typedef JSConstScalarSpec<int32_t> JSConstIntegerSpec;

struct JSJitInfo;






struct JSNativeWrapper {
    JSNative op;
    const JSJitInfo* info;
};
# 1987 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
struct JSPropertySpec {
    struct SelfHostedWrapper {
        void* unused;
        const char* funname;
    };

    struct ValueWrapper {
        uintptr_t type;
        union {
            const char* string;
            int32_t int32;
        };
    };

    const char* name;
    uint8_t flags;
    union {
        struct {
            union {
                JSNativeWrapper native;
                SelfHostedWrapper selfHosted;
            } getter;
            union {
                JSNativeWrapper native;
                SelfHostedWrapper selfHosted;
            } setter;
        } accessors;
        ValueWrapper value;
    };

    bool isAccessor() const {
        return !(flags & JSPROP_INTERNAL_USE_BIT);
    }
    bool getValue(JSContext* cx, JS::MutableHandleValue value) const;

    bool isSelfHosted() const {
        do { } while (0);
# 2032 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
        return (flags & JSPROP_GETTER);
    }

    static_assert(sizeof(SelfHostedWrapper) == sizeof(JSNativeWrapper),
                  "JSPropertySpec::getter/setter must be compact");
    static_assert(__builtin_offsetof(SelfHostedWrapper, funname) == __builtin_offsetof(JSNativeWrapper, info),
                  "JS_SELF_HOSTED* macros below require that "
                  "SelfHostedWrapper::funname overlay "
                  "JSNativeWrapper::info");
private:
    void checkAccessorsAreNative() const {
        do { } while (0);




        do { } while (0);
    }

    void checkAccessorsAreSelfHosted() const {
        do { } while (0);
        do { } while (0);
    }
};

namespace JS {
namespace detail {


inline int CheckIsNative(JSNative native);


template<size_t N>
inline int
CheckIsCharacterLiteral(const char (&arr)[N]);


inline int CheckIsInt32(int32_t value);


inline int CheckIsGetterOp(JSGetterOp op);


inline int CheckIsSetterOp(JSSetterOp op);

}
}
# 2158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
struct JSFunctionSpec {
    const char* name;
    JSNativeWrapper call;
    uint16_t nargs;
    uint16_t flags;
    const char* selfHostedName;
};
# 2206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
JS_InitClass(JSContext* cx, JS::HandleObject obj, JS::HandleObject parent_proto,
             const JSClass* clasp, JSNative constructor, unsigned nargs,
             const JSPropertySpec* ps, const JSFunctionSpec* fs,
             const JSPropertySpec* static_ps, const JSFunctionSpec* static_fs);





extern bool
JS_LinkConstructorAndPrototype(JSContext* cx, JS::Handle<JSObject*> ctor,
                               JS::Handle<JSObject*> proto);

extern const JSClass*
JS_GetClass(JSObject* obj);

extern bool
JS_InstanceOf(JSContext* cx, JS::Handle<JSObject*> obj, const JSClass* clasp, JS::CallArgs* args);

extern bool
JS_HasInstance(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<JS::Value> v, bool* bp);

namespace JS {





extern bool
OrdinaryHasInstance(JSContext* cx, HandleObject objArg, HandleValue v, bool* bp);

}

extern void*
JS_GetPrivate(JSObject* obj);

extern void
JS_SetPrivate(JSObject* obj, void* data);

extern void*
JS_GetInstancePrivate(JSContext* cx, JS::Handle<JSObject*> obj, const JSClass* clasp,
                      JS::CallArgs* args);

extern JSObject*
JS_GetConstructor(JSContext* cx, JS::Handle<JSObject*> proto);

namespace JS {


enum ZoneSpecifier {


    SystemZone,


    ExistingZone,


    NewZoneInNewZoneGroup,


    NewZoneInSystemZoneGroup,


    NewZoneInExistingZoneGroup
};
# 2282 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class CompartmentCreationOptions
{
  public:
    CompartmentCreationOptions()
      : addonId_(nullptr),
        traceGlobal_(nullptr),
        zoneSpec_(NewZoneInSystemZoneGroup),
        zonePointer_(nullptr),
        invisibleToDebugger_(false),
        mergeable_(false),
        preserveJitCode_(false),
        cloneSingletons_(false),
        experimentalNumberFormatFormatToPartsEnabled_(false),
        sharedMemoryAndAtomics_(false),
        secureContext_(false)
    {}



    JSAddonId* addonIdOrNull() const { return addonId_; }
    CompartmentCreationOptions& setAddonId(JSAddonId* id) {
        addonId_ = id;
        return *this;
    }

    JSTraceOp getTrace() const {
        return traceGlobal_;
    }
    CompartmentCreationOptions& setTrace(JSTraceOp op) {
        traceGlobal_ = op;
        return *this;
    }

    void* zonePointer() const { return zonePointer_; }
    ZoneSpecifier zoneSpecifier() const { return zoneSpec_; }


    CompartmentCreationOptions& setSystemZone();
    CompartmentCreationOptions& setExistingZone(JSObject* obj);
    CompartmentCreationOptions& setNewZoneInNewZoneGroup();
    CompartmentCreationOptions& setNewZoneInSystemZoneGroup();
    CompartmentCreationOptions& setNewZoneInExistingZoneGroup(JSObject* obj);





    bool invisibleToDebugger() const { return invisibleToDebugger_; }
    CompartmentCreationOptions& setInvisibleToDebugger(bool flag) {
        invisibleToDebugger_ = flag;
        return *this;
    }





    bool mergeable() const { return mergeable_; }
    CompartmentCreationOptions& setMergeable(bool flag) {
        mergeable_ = flag;
        return *this;
    }



    bool preserveJitCode() const { return preserveJitCode_; }
    CompartmentCreationOptions& setPreserveJitCode(bool flag) {
        preserveJitCode_ = flag;
        return *this;
    }

    bool cloneSingletons() const { return cloneSingletons_; }
    CompartmentCreationOptions& setCloneSingletons(bool flag) {
        cloneSingletons_ = flag;
        return *this;
    }
# 2368 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
    bool experimentalNumberFormatFormatToPartsEnabled() const {
        return experimentalNumberFormatFormatToPartsEnabled_;
    }
    CompartmentCreationOptions& setExperimentalNumberFormatFormatToPartsEnabled(bool flag) {
        experimentalNumberFormatFormatToPartsEnabled_ = flag;
        return *this;
    }

    bool getSharedMemoryAndAtomicsEnabled() const;
    CompartmentCreationOptions& setSharedMemoryAndAtomicsEnabled(bool flag);





    bool secureContext() const { return secureContext_; }
    CompartmentCreationOptions& setSecureContext(bool flag) {
        secureContext_ = flag;
        return *this;
    }

  private:
    JSAddonId* addonId_;
    JSTraceOp traceGlobal_;
    ZoneSpecifier zoneSpec_;
    void* zonePointer_;
    bool invisibleToDebugger_;
    bool mergeable_;
    bool preserveJitCode_;
    bool cloneSingletons_;
    bool experimentalNumberFormatFormatToPartsEnabled_;
    bool sharedMemoryAndAtomics_;
    bool secureContext_;
};





class CompartmentBehaviors
{
  public:
    class Override {
      public:
        Override() : mode_(Default) {}

        bool get(bool defaultValue) const {
            if (mode_ == Default)
                return defaultValue;
            return mode_ == ForceTrue;
        }

        void set(bool overrideValue) {
            mode_ = overrideValue ? ForceTrue : ForceFalse;
        }

        void reset() {
            mode_ = Default;
        }

      private:
        enum Mode {
            Default,
            ForceTrue,
            ForceFalse
        };

        Mode mode_;
    };

    CompartmentBehaviors()
      : version_(JSVERSION_UNKNOWN)
      , discardSource_(false)
      , disableLazyParsing_(false)
      , singletonsAsTemplates_(true)
    {
    }

    JSVersion version() const { return version_; }
    CompartmentBehaviors& setVersion(JSVersion aVersion) {
        do { } while (0);
        version_ = aVersion;
        return *this;
    }



    bool discardSource() const { return discardSource_; }
    CompartmentBehaviors& setDiscardSource(bool flag) {
        discardSource_ = flag;
        return *this;
    }

    bool disableLazyParsing() const { return disableLazyParsing_; }
    CompartmentBehaviors& setDisableLazyParsing(bool flag) {
        disableLazyParsing_ = flag;
        return *this;
    }

    bool extraWarnings(JSContext* cx) const;
    Override& extraWarningsOverride() { return extraWarningsOverride_; }

    bool getSingletonsAsTemplates() const {
        return singletonsAsTemplates_;
    }
    CompartmentBehaviors& setSingletonsAsValues() {
        singletonsAsTemplates_ = false;
        return *this;
    }

  private:
    JSVersion version_;
    bool discardSource_;
    bool disableLazyParsing_;
    Override extraWarningsOverride_;




    bool singletonsAsTemplates_;
};







class CompartmentOptions
{
  public:
    explicit CompartmentOptions()
      : creationOptions_(),
        behaviors_()
    {}

    CompartmentOptions(const CompartmentCreationOptions& compartmentCreation,
                       const CompartmentBehaviors& compartmentBehaviors)
      : creationOptions_(compartmentCreation),
        behaviors_(compartmentBehaviors)
    {}




    CompartmentCreationOptions& creationOptions() {
        return creationOptions_;
    }
    const CompartmentCreationOptions& creationOptions() const {
        return creationOptions_;
    }



    CompartmentBehaviors& behaviors() {
        return behaviors_;
    }
    const CompartmentBehaviors& behaviors() const {
        return behaviors_;
    }

  private:
    CompartmentCreationOptions creationOptions_;
    CompartmentBehaviors behaviors_;
};

const CompartmentCreationOptions&
CompartmentCreationOptionsRef(JSCompartment* compartment);

const CompartmentCreationOptions&
CompartmentCreationOptionsRef(JSObject* obj);

const CompartmentCreationOptions&
CompartmentCreationOptionsRef(JSContext* cx);

CompartmentBehaviors&
CompartmentBehaviorsRef(JSCompartment* compartment);

CompartmentBehaviors&
CompartmentBehaviorsRef(JSObject* obj);

CompartmentBehaviors&
CompartmentBehaviorsRef(JSContext* cx);
# 2574 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
enum OnNewGlobalHookOption {
    FireOnNewGlobalHook,
    DontFireOnNewGlobalHook
};

}

extern JSObject*
JS_NewGlobalObject(JSContext* cx, const JSClass* clasp, JSPrincipals* principals,
                   JS::OnNewGlobalHookOption hookOption,
                   const JS::CompartmentOptions& options);
# 2594 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
JS_GlobalObjectTraceHook(JSTracer* trc, JSObject* global);

extern void
JS_FireOnNewGlobalObject(JSContext* cx, JS::HandleObject global);

extern JSObject*
JS_NewObject(JSContext* cx, const JSClass* clasp);

extern bool
JS_IsNative(JSObject* obj);





extern JSObject*
JS_NewObjectWithGivenProto(JSContext* cx, const JSClass* clasp, JS::Handle<JSObject*> proto);


extern JSObject*
JS_NewPlainObject(JSContext* cx);






extern bool
JS_DeepFreezeObject(JSContext* cx, JS::Handle<JSObject*> obj);




extern bool
JS_FreezeObject(JSContext* cx, JS::Handle<JSObject*> obj);




namespace JS {

struct PropertyDescriptor {
    JSObject* obj;
    unsigned attrs;
    JSGetterOp getter;
    JSSetterOp setter;
    JS::Value value;

    PropertyDescriptor()
      : obj(nullptr), attrs(0), getter(nullptr), setter(nullptr), value(JS::UndefinedValue())
    {}

    static void trace(PropertyDescriptor* self, JSTracer* trc) { self->trace(trc); }
    void trace(JSTracer* trc);
};

}

namespace js {

template <typename Wrapper>
class WrappedPtrOperations<JS::PropertyDescriptor, Wrapper>
{
    const JS::PropertyDescriptor& desc() const { return static_cast<const Wrapper*>(this)->get(); }

    bool has(unsigned bit) const {
        do { } while (0);
        do { } while (0);
        return (desc().attrs & bit) != 0;
    }

    bool hasAny(unsigned bits) const {
        return (desc().attrs & bits) != 0;
    }

    bool hasAll(unsigned bits) const {
        return (desc().attrs & bits) == bits;
    }


    enum { SHADOWABLE = JSPROP_INTERNAL_USE_BIT };

  public:


    bool isAccessorDescriptor() const { return hasAny(JSPROP_GETTER | JSPROP_SETTER); }
    bool isGenericDescriptor() const {
        return (desc().attrs&
                (JSPROP_GETTER | JSPROP_SETTER | JSPROP_IGNORE_READONLY | JSPROP_IGNORE_VALUE)) ==
               (JSPROP_IGNORE_READONLY | JSPROP_IGNORE_VALUE);
    }
    bool isDataDescriptor() const { return !isAccessorDescriptor() && !isGenericDescriptor(); }

    bool hasConfigurable() const { return !has(JSPROP_IGNORE_PERMANENT); }
    bool configurable() const { do { } while (0); return !has(JSPROP_PERMANENT); }

    bool hasEnumerable() const { return !has(JSPROP_IGNORE_ENUMERATE); }
    bool enumerable() const { do { } while (0); return has(JSPROP_ENUMERATE); }

    bool hasValue() const { return !isAccessorDescriptor() && !has(JSPROP_IGNORE_VALUE); }
    JS::HandleValue value() const {
        return JS::HandleValue::fromMarkedLocation(&desc().value);
    }

    bool hasWritable() const { return !isAccessorDescriptor() && !has(JSPROP_IGNORE_READONLY); }
    bool writable() const { do { } while (0); return !has(JSPROP_READONLY); }

    bool hasGetterObject() const { return has(JSPROP_GETTER); }
    JS::HandleObject getterObject() const {
        do { } while (0);
        return JS::HandleObject::fromMarkedLocation(
                reinterpret_cast<JSObject* const*>(&desc().getter));
    }
    bool hasSetterObject() const { return has(JSPROP_SETTER); }
    JS::HandleObject setterObject() const {
        do { } while (0);
        return JS::HandleObject::fromMarkedLocation(
                reinterpret_cast<JSObject* const*>(&desc().setter));
    }

    bool hasGetterOrSetter() const { return desc().getter || desc().setter; }
    bool isShared() const { return has(JSPROP_SHARED); }

    JS::HandleObject object() const {
        return JS::HandleObject::fromMarkedLocation(&desc().obj);
    }
    unsigned attributes() const { return desc().attrs; }
    JSGetterOp getter() const { return desc().getter; }
    JSSetterOp setter() const { return desc().setter; }

    void assertValid() const {
# 2761 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
    }

    void assertComplete() const {
# 2777 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
    }

    void assertCompleteIfFound() const {




    }
};

template <typename Wrapper>
class MutableWrappedPtrOperations<JS::PropertyDescriptor, Wrapper>
    : public js::WrappedPtrOperations<JS::PropertyDescriptor, Wrapper>
{
    JS::PropertyDescriptor& desc() { return static_cast<Wrapper*>(this)->get(); }

  public:
    void clear() {
        object().set(nullptr);
        setAttributes(0);
        setGetter(nullptr);
        setSetter(nullptr);
        value().setUndefined();
    }

    void initFields(JS::HandleObject obj, JS::HandleValue v, unsigned attrs,
                    JSGetterOp getterOp, JSSetterOp setterOp) {
        do { } while (0);
        do { } while (0);

        object().set(obj);
        value().set(v);
        setAttributes(attrs);
        setGetter(getterOp);
        setSetter(setterOp);
    }

    void assign(JS::PropertyDescriptor& other) {
        object().set(other.obj);
        setAttributes(other.attrs);
        setGetter(other.getter);
        setSetter(other.setter);
        value().set(other.value);
    }

    void setDataDescriptor(JS::HandleValue v, unsigned attrs) {
        do { } while (0);





        object().set(nullptr);
        setAttributes(attrs);
        setGetter(nullptr);
        setSetter(nullptr);
        value().set(v);
    }

    JS::MutableHandleObject object() {
        return JS::MutableHandleObject::fromMarkedLocation(&desc().obj);
    }
    unsigned& attributesRef() { return desc().attrs; }
    JSGetterOp& getter() { return desc().getter; }
    JSSetterOp& setter() { return desc().setter; }
    JS::MutableHandleValue value() {
        return JS::MutableHandleValue::fromMarkedLocation(&desc().value);
    }
    void setValue(JS::HandleValue v) {
        do { } while (0);
        attributesRef() &= ~JSPROP_IGNORE_VALUE;
        value().set(v);
    }

    void setConfigurable(bool configurable) {
        setAttributes((desc().attrs & ~(JSPROP_IGNORE_PERMANENT | JSPROP_PERMANENT)) |
                      (configurable ? 0 : JSPROP_PERMANENT));
    }
    void setEnumerable(bool enumerable) {
        setAttributes((desc().attrs & ~(JSPROP_IGNORE_ENUMERATE | JSPROP_ENUMERATE)) |
                      (enumerable ? JSPROP_ENUMERATE : 0));
    }
    void setWritable(bool writable) {
        do { } while (0);
        setAttributes((desc().attrs & ~(JSPROP_IGNORE_READONLY | JSPROP_READONLY)) |
                      (writable ? 0 : JSPROP_READONLY));
    }
    void setAttributes(unsigned attrs) { desc().attrs = attrs; }

    void setGetter(JSGetterOp op) {
        do { } while (0);
        desc().getter = op;
    }
    void setSetter(JSSetterOp op) {
        do { } while (0);
        desc().setter = op;
    }
    void setGetterObject(JSObject* obj) {
        desc().getter = reinterpret_cast<JSGetterOp>(obj);
        desc().attrs &= ~(JSPROP_IGNORE_VALUE | JSPROP_IGNORE_READONLY | JSPROP_READONLY);
        desc().attrs |= JSPROP_GETTER | JSPROP_SHARED;
    }
    void setSetterObject(JSObject* obj) {
        desc().setter = reinterpret_cast<JSSetterOp>(obj);
        desc().attrs &= ~(JSPROP_IGNORE_VALUE | JSPROP_IGNORE_READONLY | JSPROP_READONLY);
        desc().attrs |= JSPROP_SETTER | JSPROP_SHARED;
    }

    JS::MutableHandleObject getterObject() {
        do { } while (0);
        return JS::MutableHandleObject::fromMarkedLocation(
                reinterpret_cast<JSObject**>(&desc().getter));
    }
    JS::MutableHandleObject setterObject() {
        do { } while (0);
        return JS::MutableHandleObject::fromMarkedLocation(
                reinterpret_cast<JSObject**>(&desc().setter));
    }
};

}

namespace JS {

extern bool
ObjectToCompletePropertyDescriptor(JSContext* cx,
                                   JS::HandleObject obj,
                                   JS::HandleValue descriptor,
                                   JS::MutableHandle<PropertyDescriptor> desc);






extern bool
FromPropertyDescriptor(JSContext* cx,
                       JS::Handle<JS::PropertyDescriptor> desc,
                       JS::MutableHandleValue vp);

}
# 2942 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_GetPrototype(JSContext* cx, JS::HandleObject obj, JS::MutableHandleObject result);
# 2952 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_GetPrototypeIfOrdinary(JSContext* cx, JS::HandleObject obj, bool* isOrdinary,
                          JS::MutableHandleObject result);
# 2969 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_SetPrototype(JSContext* cx, JS::HandleObject obj, JS::HandleObject proto);
# 2979 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_IsExtensible(JSContext* cx, JS::HandleObject obj, bool* extensible);
# 2990 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_PreventExtensions(JSContext* cx, JS::HandleObject obj, JS::ObjectOpResult& result);
# 3002 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_SetImmutablePrototype(JSContext* cx, JS::HandleObject obj, bool* succeeded);







extern bool
JS_GetOwnPropertyDescriptorById(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                                JS::MutableHandle<JS::PropertyDescriptor> desc);

extern bool
JS_GetOwnPropertyDescriptor(JSContext* cx, JS::HandleObject obj, const char* name,
                            JS::MutableHandle<JS::PropertyDescriptor> desc);

extern bool
JS_GetOwnUCPropertyDescriptor(JSContext* cx, JS::HandleObject obj, const char16_t* name,
                              JS::MutableHandle<JS::PropertyDescriptor> desc);







extern bool
JS_GetPropertyDescriptorById(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                             JS::MutableHandle<JS::PropertyDescriptor> desc);

extern bool
JS_GetPropertyDescriptor(JSContext* cx, JS::HandleObject obj, const char* name,
                         JS::MutableHandle<JS::PropertyDescriptor> desc);
# 3048 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                      JS::Handle<JS::PropertyDescriptor> desc,
                      JS::ObjectOpResult& result);





extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                      JS::Handle<JS::PropertyDescriptor> desc);

extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue value,
                      unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject value,
                      unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleString value,
                      unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, int32_t value,
                      unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, uint32_t value,
                      unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefinePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, double value,
                      unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineProperty(JSContext* cx, JS::HandleObject obj, const char* name, JS::HandleValue value,
                  unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineProperty(JSContext* cx, JS::HandleObject obj, const char* name, JS::HandleObject value,
                  unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineProperty(JSContext* cx, JS::HandleObject obj, const char* name, JS::HandleString value,
                  unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineProperty(JSContext* cx, JS::HandleObject obj, const char* name, int32_t value,
                  unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineProperty(JSContext* cx, JS::HandleObject obj, const char* name, uint32_t value,
                  unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineProperty(JSContext* cx, JS::HandleObject obj, const char* name, double value,
                  unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    JS::Handle<JS::PropertyDescriptor> desc,
                    JS::ObjectOpResult& result);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    JS::Handle<JS::PropertyDescriptor> desc);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    JS::HandleValue value, unsigned attrs,
                    JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    JS::HandleObject value, unsigned attrs,
                    JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    JS::HandleString value, unsigned attrs,
                    JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    int32_t value, unsigned attrs,
                    JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    uint32_t value, unsigned attrs,
                    JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    double value, unsigned attrs,
                    JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::HandleValue value,
                 unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::HandleObject value,
                 unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::HandleString value,
                 unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineElement(JSContext* cx, JS::HandleObject obj, uint32_t index, int32_t value,
                 unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineElement(JSContext* cx, JS::HandleObject obj, uint32_t index, uint32_t value,
                 unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);

extern bool
JS_DefineElement(JSContext* cx, JS::HandleObject obj, uint32_t index, double value,
                 unsigned attrs, JSNative getter = nullptr, JSNative setter = nullptr);
# 3181 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_HasPropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool* foundp);

extern bool
JS_HasProperty(JSContext* cx, JS::HandleObject obj, const char* name, bool* foundp);

extern bool
JS_HasUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                 bool* vp);

extern bool
JS_HasElement(JSContext* cx, JS::HandleObject obj, uint32_t index, bool* foundp);






extern bool
JS_HasOwnPropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool* foundp);

extern bool
JS_HasOwnProperty(JSContext* cx, JS::HandleObject obj, const char* name, bool* foundp);
# 3216 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_ForwardGetPropertyTo(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                        JS::HandleValue receiver, JS::MutableHandleValue vp);

extern bool
JS_ForwardGetElementTo(JSContext* cx, JS::HandleObject obj, uint32_t index,
                       JS::HandleObject receiver, JS::MutableHandleValue vp);







extern bool
JS_GetPropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                   JS::MutableHandleValue vp);

extern bool
JS_GetProperty(JSContext* cx, JS::HandleObject obj, const char* name, JS::MutableHandleValue vp);

extern bool
JS_GetUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                 JS::MutableHandleValue vp);

extern bool
JS_GetElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::MutableHandleValue vp);
# 3252 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_ForwardSetPropertyTo(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue v,
                        JS::HandleValue receiver, JS::ObjectOpResult& result);







extern bool
JS_SetPropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue v);

extern bool
JS_SetProperty(JSContext* cx, JS::HandleObject obj, const char* name, JS::HandleValue v);

extern bool
JS_SetUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                 JS::HandleValue v);

extern bool
JS_SetElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::HandleValue v);

extern bool
JS_SetElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::HandleObject v);

extern bool
JS_SetElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::HandleString v);

extern bool
JS_SetElement(JSContext* cx, JS::HandleObject obj, uint32_t index, int32_t v);

extern bool
JS_SetElement(JSContext* cx, JS::HandleObject obj, uint32_t index, uint32_t v);

extern bool
JS_SetElement(JSContext* cx, JS::HandleObject obj, uint32_t index, double v);
# 3301 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_DeletePropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                      JS::ObjectOpResult& result);

extern bool
JS_DeleteProperty(JSContext* cx, JS::HandleObject obj, const char* name,
                  JS::ObjectOpResult& result);

extern bool
JS_DeleteUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
                    JS::ObjectOpResult& result);

extern bool
JS_DeleteElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::ObjectOpResult& result);





extern bool
JS_DeletePropertyById(JSContext* cx, JS::HandleObject obj, jsid id);

extern bool
JS_DeleteProperty(JSContext* cx, JS::HandleObject obj, const char* name);

extern bool
JS_DeleteElement(JSContext* cx, JS::HandleObject obj, uint32_t index);
# 3344 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_Enumerate(JSContext* cx, JS::HandleObject obj, JS::MutableHandle<JS::IdVector> props);







namespace JS {
# 3364 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
IsCallable(JSObject* obj);
# 3378 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
IsConstructor(JSObject* obj);

}
# 3390 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_CallFunctionValue(JSContext* cx, JS::HandleObject obj, JS::HandleValue fval,
                     const JS::HandleValueArray& args, JS::MutableHandleValue rval);

extern bool
JS_CallFunction(JSContext* cx, JS::HandleObject obj, JS::HandleFunction fun,
                const JS::HandleValueArray& args, JS::MutableHandleValue rval);




extern bool
JS_CallFunctionName(JSContext* cx, JS::HandleObject obj, const char* name,
                    const JS::HandleValueArray& args, JS::MutableHandleValue rval);

namespace JS {

static inline bool
Call(JSContext* cx, JS::HandleObject thisObj, JS::HandleFunction fun,
     const JS::HandleValueArray& args, MutableHandleValue rval)
{
    return !!JS_CallFunction(cx, thisObj, fun, args, rval);
}

static inline bool
Call(JSContext* cx, JS::HandleObject thisObj, JS::HandleValue fun, const JS::HandleValueArray& args,
     MutableHandleValue rval)
{
    return !!JS_CallFunctionValue(cx, thisObj, fun, args, rval);
}

static inline bool
Call(JSContext* cx, JS::HandleObject thisObj, const char* name, const JS::HandleValueArray& args,
     MutableHandleValue rval)
{
    return !!JS_CallFunctionName(cx, thisObj, name, args, rval);
}

extern bool
Call(JSContext* cx, JS::HandleValue thisv, JS::HandleValue fun, const JS::HandleValueArray& args,
     MutableHandleValue rval);

static inline bool
Call(JSContext* cx, JS::HandleValue thisv, JS::HandleObject funObj, const JS::HandleValueArray& args,
     MutableHandleValue rval)
{
    do { } while (0);
    JS::RootedValue fun(cx, JS::ObjectValue(*funObj));
    return Call(cx, thisv, fun, args, rval);
}
# 3453 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
Construct(JSContext* cx, JS::HandleValue fun, HandleObject newTarget,
          const JS::HandleValueArray &args, MutableHandleObject objp);
# 3464 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
Construct(JSContext* cx, JS::HandleValue fun, const JS::HandleValueArray& args,
          MutableHandleObject objp);

}





extern JSObject*
JS_New(JSContext* cx, JS::HandleObject ctor, const JS::HandleValueArray& args);




extern JSObject*
JS_DefineObject(JSContext* cx, JS::HandleObject obj, const char* name,
                const JSClass* clasp = nullptr, unsigned attrs = 0);

extern bool
JS_DefineConstDoubles(JSContext* cx, JS::HandleObject obj, const JSConstDoubleSpec* cds);

extern bool
JS_DefineConstIntegers(JSContext* cx, JS::HandleObject obj, const JSConstIntegerSpec* cis);

extern bool
JS_DefineProperties(JSContext* cx, JS::HandleObject obj, const JSPropertySpec* ps);




extern bool
JS_AlreadyHasOwnPropertyById(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                             bool* foundp);

extern bool
JS_AlreadyHasOwnProperty(JSContext* cx, JS::HandleObject obj, const char* name,
                         bool* foundp);

extern bool
JS_AlreadyHasOwnUCProperty(JSContext* cx, JS::HandleObject obj, const char16_t* name,
                           size_t namelen, bool* foundp);

extern bool
JS_AlreadyHasOwnElement(JSContext* cx, JS::HandleObject obj, uint32_t index, bool* foundp);

extern JSObject*
JS_NewArrayObject(JSContext* cx, const JS::HandleValueArray& contents);

extern JSObject*
JS_NewArrayObject(JSContext* cx, size_t length);
# 3524 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_IsArrayObject(JSContext* cx, JS::HandleValue value, bool* isArray);
# 3534 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_IsArrayObject(JSContext* cx, JS::HandleObject obj, bool* isArray);

extern bool
JS_GetArrayLength(JSContext* cx, JS::Handle<JSObject*> obj, uint32_t* lengthp);

extern bool
JS_SetArrayLength(JSContext* cx, JS::Handle<JSObject*> obj, uint32_t length);

namespace JS {
# 3552 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
IsMapObject(JSContext* cx, JS::HandleObject obj, bool* isMap);
# 3562 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
IsSetObject(JSContext* cx, JS::HandleObject obj, bool* isSet);

}





void
JS_SetAllNonReservedSlotsToUndefined(JSContext* cx, JSObject* objArg);






extern JSObject*
JS_NewArrayBufferWithContents(JSContext* cx, size_t nbytes, void* contents);





extern JSObject*
JS_NewArrayBufferWithExternalContents(JSContext* cx, size_t nbytes, void* contents);







extern void*
JS_StealArrayBufferContents(JSContext* cx, JS::HandleObject obj);
# 3614 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void*
JS_ExternalizeArrayBufferContents(JSContext* cx, JS::HandleObject obj);






extern JSObject*
JS_NewMappedArrayBufferWithContents(JSContext* cx, size_t nbytes, void* contents);





extern void*
JS_CreateMappedArrayBufferContents(int fd, size_t offset, size_t length);
# 3639 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
JS_ReleaseMappedArrayBufferContents(void* contents, size_t length);

extern JS::Value
JS_GetReservedSlot(JSObject* obj, uint32_t index);

extern void
JS_SetReservedSlot(JSObject* obj, uint32_t index, const JS::Value& v);







extern JSFunction*
JS_NewFunction(JSContext* cx, JSNative call, unsigned nargs, unsigned flags,
               const char* name);

namespace JS {

extern JSFunction*
GetSelfHostedFunction(JSContext* cx, const char* selfHostedName, HandleId id,
                      unsigned nargs);
# 3672 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSFunction*
NewFunctionFromSpec(JSContext* cx, const JSFunctionSpec* fs, HandleId id);

}

extern JSObject*
JS_GetFunctionObject(JSFunction* fun);







extern JSString*
JS_GetFunctionId(JSFunction* fun);
# 3696 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSString*
JS_GetFunctionDisplayId(JSFunction* fun);




extern uint16_t
JS_GetFunctionArity(JSFunction* fun);







extern bool
JS_ObjectIsFunction(JSContext* cx, JSObject* obj);

extern bool
JS_IsNativeFunction(JSObject* funobj, JSNative call);


extern bool
JS_IsConstructor(JSFunction* fun);

extern bool
JS_DefineFunctions(JSContext* cx, JS::Handle<JSObject*> obj, const JSFunctionSpec* fs);

extern JSFunction*
JS_DefineFunction(JSContext* cx, JS::Handle<JSObject*> obj, const char* name, JSNative call,
                  unsigned nargs, unsigned attrs);

extern JSFunction*
JS_DefineUCFunction(JSContext* cx, JS::Handle<JSObject*> obj,
                    const char16_t* name, size_t namelen, JSNative call,
                    unsigned nargs, unsigned attrs);

extern JSFunction*
JS_DefineFunctionById(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JSNative call,
                      unsigned nargs, unsigned attrs);

extern bool
JS_IsFunctionBound(JSFunction* fun);

extern JSObject*
JS_GetBoundFunctionTarget(JSFunction* fun);

namespace JS {





extern JSObject*
CloneFunctionObject(JSContext* cx, HandleObject funobj);






extern JSObject*
CloneFunctionObject(JSContext* cx, HandleObject funobj, AutoObjectVector& scopeChain);

}
# 3769 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_BufferIsCompilableUnit(JSContext* cx, JS::Handle<JSObject*> obj, const char* utf8,
                          size_t length);




extern bool
JS_CompileScript(JSContext* cx, const char* ascii, size_t length,
                 const JS::CompileOptions& options,
                 JS::MutableHandleScript script);




extern bool
JS_CompileUCScript(JSContext* cx, const char16_t* chars, size_t length,
                   const JS::CompileOptions& options,
                   JS::MutableHandleScript script);

extern JSObject*
JS_GetGlobalFromScript(JSScript* script);

extern const char*
JS_GetScriptFilename(JSScript* script);

extern unsigned
JS_GetScriptBaseLineNumber(JSContext* cx, JSScript* script);

extern JSScript*
JS_GetFunctionScript(JSContext* cx, JS::HandleFunction fun);

namespace JS {
# 3849 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
enum class AsmJSOption : uint8_t { Enabled, Disabled, DisabledByDebugger };







class TransitiveCompileOptions
{
  protected:
# 3871 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
    bool mutedErrors_;
    const char* filename_;
    const char* introducerFilename_;
    const char16_t* sourceMapURL_;





    TransitiveCompileOptions()
      : mutedErrors_(false),
        filename_(nullptr),
        introducerFilename_(nullptr),
        sourceMapURL_(nullptr),
        version(JSVERSION_UNKNOWN),
        versionSet(false),
        utf8(false),
        selfHostingMode(false),
        canLazilyParse(true),
        strictOption(false),
        extraWarningsOption(false),
        forEachStatementOption(false),
        werrorOption(false),
        asmJSOption(AsmJSOption::Disabled),
        throwOnAsmJSValidationFailureOption(false),
        forceAsync(false),
        sourceIsLazy(false),
        allowHTMLComments(true),
        isProbablySystemOrAddonCode(false),
        introductionType(nullptr),
        introductionLineno(0),
        introductionOffset(0),
        hasIntroductionInfo(false)
    { }



    void copyPODTransitiveOptions(const TransitiveCompileOptions& rhs);

  public:


    bool mutedErrors() const { return mutedErrors_; }
    const char* filename() const { return filename_; }
    const char* introducerFilename() const { return introducerFilename_; }
    const char16_t* sourceMapURL() const { return sourceMapURL_; }
    virtual JSObject* element() const = 0;
    virtual JSString* elementAttributeName() const = 0;
    virtual JSScript* introductionScript() const = 0;


    JSVersion version;
    bool versionSet;
    bool utf8;
    bool selfHostingMode;
    bool canLazilyParse;
    bool strictOption;
    bool extraWarningsOption;
    bool forEachStatementOption;
    bool werrorOption;
    AsmJSOption asmJSOption;
    bool throwOnAsmJSValidationFailureOption;
    bool forceAsync;
    bool sourceIsLazy;
    bool allowHTMLComments;
    bool isProbablySystemOrAddonCode;



    const char* introductionType;
    unsigned introductionLineno;
    uint32_t introductionOffset;
    bool hasIntroductionInfo;

  private:
    void operator=(const TransitiveCompileOptions&) = delete;
};
# 3957 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class ReadOnlyCompileOptions : public TransitiveCompileOptions
{
    friend class CompileOptions;

  protected:
    ReadOnlyCompileOptions()
      : TransitiveCompileOptions(),
        lineno(1),
        column(0),
        isRunOnce(false),
        noScriptRval(false)
    { }



    void copyPODOptions(const ReadOnlyCompileOptions& rhs);

  public:


    bool mutedErrors() const { return mutedErrors_; }
    const char* filename() const { return filename_; }
    const char* introducerFilename() const { return introducerFilename_; }
    const char16_t* sourceMapURL() const { return sourceMapURL_; }
    virtual JSObject* element() const = 0;
    virtual JSString* elementAttributeName() const = 0;
    virtual JSScript* introductionScript() const = 0;


    unsigned lineno;
    unsigned column;

    bool isRunOnce;
    bool noScriptRval;

  private:
    void operator=(const ReadOnlyCompileOptions&) = delete;
};
# 4009 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class OwningCompileOptions : public ReadOnlyCompileOptions
{
    PersistentRootedObject elementRoot;
    PersistentRootedString elementAttributeNameRoot;
    PersistentRootedScript introductionScriptRoot;

  public:




    explicit OwningCompileOptions(JSContext* cx);
    ~OwningCompileOptions();

    JSObject* element() const override { return elementRoot; }
    JSString* elementAttributeName() const override { return elementAttributeNameRoot; }
    JSScript* introductionScript() const override { return introductionScriptRoot; }


    bool copy(JSContext* cx, const ReadOnlyCompileOptions& rhs);


    bool setFile(JSContext* cx, const char* f);
    bool setFileAndLine(JSContext* cx, const char* f, unsigned l);
    bool setSourceMapURL(JSContext* cx, const char16_t* s);
    bool setIntroducerFilename(JSContext* cx, const char* s);


    OwningCompileOptions& setLine(unsigned l) { lineno = l; return *this; }
    OwningCompileOptions& setElement(JSObject* e) {
        elementRoot = e;
        return *this;
    }
    OwningCompileOptions& setElementAttributeName(JSString* p) {
        elementAttributeNameRoot = p;
        return *this;
    }
    OwningCompileOptions& setIntroductionScript(JSScript* s) {
        introductionScriptRoot = s;
        return *this;
    }
    OwningCompileOptions& setMutedErrors(bool mute) {
        mutedErrors_ = mute;
        return *this;
    }
    OwningCompileOptions& setVersion(JSVersion v) {
        version = v;
        versionSet = true;
        return *this;
    }
    OwningCompileOptions& setUTF8(bool u) { utf8 = u; return *this; }
    OwningCompileOptions& setColumn(unsigned c) { column = c; return *this; }
    OwningCompileOptions& setIsRunOnce(bool once) { isRunOnce = once; return *this; }
    OwningCompileOptions& setNoScriptRval(bool nsr) { noScriptRval = nsr; return *this; }
    OwningCompileOptions& setSelfHostingMode(bool shm) { selfHostingMode = shm; return *this; }
    OwningCompileOptions& setCanLazilyParse(bool clp) { canLazilyParse = clp; return *this; }
    OwningCompileOptions& setSourceIsLazy(bool l) { sourceIsLazy = l; return *this; }
    OwningCompileOptions& setIntroductionType(const char* t) { introductionType = t; return *this; }
    bool setIntroductionInfo(JSContext* cx, const char* introducerFn, const char* intro,
                             unsigned line, JSScript* script, uint32_t offset)
    {
        if (!setIntroducerFilename(cx, introducerFn))
            return false;
        introductionType = intro;
        introductionLineno = line;
        introductionScriptRoot = script;
        introductionOffset = offset;
        hasIntroductionInfo = true;
        return true;
    }

  private:
    void operator=(const CompileOptions& rhs) = delete;
};
# 4091 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class CompileOptions final : public ReadOnlyCompileOptions
{
    RootedObject elementRoot;
    RootedString elementAttributeNameRoot;
    RootedScript introductionScriptRoot;

  public:
    explicit CompileOptions(JSContext* cx, JSVersion version = JSVERSION_UNKNOWN);
    CompileOptions(JSContext* cx, const ReadOnlyCompileOptions& rhs)
      : ReadOnlyCompileOptions(), elementRoot(cx), elementAttributeNameRoot(cx),
        introductionScriptRoot(cx)
    {
        copyPODOptions(rhs);

        filename_ = rhs.filename();
        introducerFilename_ = rhs.introducerFilename();
        sourceMapURL_ = rhs.sourceMapURL();
        elementRoot = rhs.element();
        elementAttributeNameRoot = rhs.elementAttributeName();
        introductionScriptRoot = rhs.introductionScript();
    }

    CompileOptions(JSContext* cx, const TransitiveCompileOptions& rhs)
      : ReadOnlyCompileOptions(), elementRoot(cx), elementAttributeNameRoot(cx),
        introductionScriptRoot(cx)
    {
        copyPODTransitiveOptions(rhs);

        filename_ = rhs.filename();
        introducerFilename_ = rhs.introducerFilename();
        sourceMapURL_ = rhs.sourceMapURL();
        elementRoot = rhs.element();
        elementAttributeNameRoot = rhs.elementAttributeName();
        introductionScriptRoot = rhs.introductionScript();
    }

    JSObject* element() const override { return elementRoot; }
    JSString* elementAttributeName() const override { return elementAttributeNameRoot; }
    JSScript* introductionScript() const override { return introductionScriptRoot; }

    CompileOptions& setFile(const char* f) { filename_ = f; return *this; }
    CompileOptions& setLine(unsigned l) { lineno = l; return *this; }
    CompileOptions& setFileAndLine(const char* f, unsigned l) {
        filename_ = f; lineno = l; return *this;
    }
    CompileOptions& setSourceMapURL(const char16_t* s) { sourceMapURL_ = s; return *this; }
    CompileOptions& setElement(JSObject* e) { elementRoot = e; return *this; }
    CompileOptions& setElementAttributeName(JSString* p) {
        elementAttributeNameRoot = p;
        return *this;
    }
    CompileOptions& setIntroductionScript(JSScript* s) {
        introductionScriptRoot = s;
        return *this;
    }
    CompileOptions& setMutedErrors(bool mute) {
        mutedErrors_ = mute;
        return *this;
    }
    CompileOptions& setVersion(JSVersion v) {
        version = v;
        versionSet = true;
        return *this;
    }
    CompileOptions& setUTF8(bool u) { utf8 = u; return *this; }
    CompileOptions& setColumn(unsigned c) { column = c; return *this; }
    CompileOptions& setIsRunOnce(bool once) { isRunOnce = once; return *this; }
    CompileOptions& setNoScriptRval(bool nsr) { noScriptRval = nsr; return *this; }
    CompileOptions& setSelfHostingMode(bool shm) { selfHostingMode = shm; return *this; }
    CompileOptions& setCanLazilyParse(bool clp) { canLazilyParse = clp; return *this; }
    CompileOptions& setSourceIsLazy(bool l) { sourceIsLazy = l; return *this; }
    CompileOptions& setIntroductionType(const char* t) { introductionType = t; return *this; }
    CompileOptions& setIntroductionInfo(const char* introducerFn, const char* intro,
                                        unsigned line, JSScript* script, uint32_t offset)
    {
        introducerFilename_ = introducerFn;
        introductionType = intro;
        introductionLineno = line;
        introductionScriptRoot = script;
        introductionOffset = offset;
        hasIntroductionInfo = true;
        return *this;
    }
    CompileOptions& maybeMakeStrictMode(bool strict) {
        strictOption = strictOption || strict;
        return *this;
    }

  private:
    void operator=(const CompileOptions& rhs) = delete;
};




extern bool
Compile(JSContext* cx, const ReadOnlyCompileOptions& options,
        SourceBufferHolder& srcBuf, JS::MutableHandleScript script);

extern bool
Compile(JSContext* cx, const ReadOnlyCompileOptions& options,
        const char* bytes, size_t length, JS::MutableHandleScript script);

extern bool
Compile(JSContext* cx, const ReadOnlyCompileOptions& options,
        const char16_t* chars, size_t length, JS::MutableHandleScript script);

extern bool
Compile(JSContext* cx, const ReadOnlyCompileOptions& options,
        FILE* file, JS::MutableHandleScript script);

extern bool
Compile(JSContext* cx, const ReadOnlyCompileOptions& options,
        const char* filename, JS::MutableHandleScript script);

extern bool
CompileForNonSyntacticScope(JSContext* cx, const ReadOnlyCompileOptions& options,
                            SourceBufferHolder& srcBuf, JS::MutableHandleScript script);

extern bool
CompileForNonSyntacticScope(JSContext* cx, const ReadOnlyCompileOptions& options,
                            const char* bytes, size_t length, JS::MutableHandleScript script);

extern bool
CompileForNonSyntacticScope(JSContext* cx, const ReadOnlyCompileOptions& options,
                            const char16_t* chars, size_t length, JS::MutableHandleScript script);

extern bool
CompileForNonSyntacticScope(JSContext* cx, const ReadOnlyCompileOptions& options,
                            FILE* file, JS::MutableHandleScript script);

extern bool
CompileForNonSyntacticScope(JSContext* cx, const ReadOnlyCompileOptions& options,
                            const char* filename, JS::MutableHandleScript script);

extern bool
CanCompileOffThread(JSContext* cx, const ReadOnlyCompileOptions& options, size_t length);
# 4246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
CompileOffThread(JSContext* cx, const ReadOnlyCompileOptions& options,
                 const char16_t* chars, size_t length,
                 OffThreadCompileCallback callback, void* callbackData);

extern JSScript*
FinishOffThreadScript(JSContext* cx, void* token);

extern void
CancelOffThreadScript(JSContext* cx, void* token);

extern bool
CompileOffThreadModule(JSContext* cx, const ReadOnlyCompileOptions& options,
                       const char16_t* chars, size_t length,
                       OffThreadCompileCallback callback, void* callbackData);

extern JSObject*
FinishOffThreadModule(JSContext* cx, void* token);

extern void
CancelOffThreadModule(JSContext* cx, void* token);

extern bool
DecodeOffThreadScript(JSContext* cx, const ReadOnlyCompileOptions& options,
                      mozilla::Vector<uint8_t>& buffer , size_t cursor,
                      OffThreadCompileCallback callback, void* callbackData);

extern JSScript*
FinishOffThreadScriptDecoder(JSContext* cx, void* token);

extern void
CancelOffThreadScriptDecoder(JSContext* cx, void* token);
# 4286 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
CompileFunction(JSContext* cx, AutoObjectVector& envChain,
                const ReadOnlyCompileOptions& options,
                const char* name, unsigned nargs, const char* const* argnames,
                const char16_t* chars, size_t length, JS::MutableHandleFunction fun);




extern bool
CompileFunction(JSContext* cx, AutoObjectVector& envChain,
                const ReadOnlyCompileOptions& options,
                const char* name, unsigned nargs, const char* const* argnames,
                SourceBufferHolder& srcBuf, JS::MutableHandleFunction fun);




extern bool
CompileFunction(JSContext* cx, AutoObjectVector& envChain,
                const ReadOnlyCompileOptions& options,
                const char* name, unsigned nargs, const char* const* argnames,
                const char* bytes, size_t length, JS::MutableHandleFunction fun);

}

extern JSString*
JS_DecompileScript(JSContext* cx, JS::Handle<JSScript*> script, const char* name, unsigned indent);







extern JSString*
JS_DecompileFunction(JSContext* cx, JS::Handle<JSFunction*> fun, unsigned indent);
# 4345 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_ExecuteScript(JSContext* cx, JS::HandleScript script, JS::MutableHandleValue rval);

extern bool
JS_ExecuteScript(JSContext* cx, JS::HandleScript script);






extern bool
JS_ExecuteScript(JSContext* cx, JS::AutoObjectVector& envChain,
                 JS::HandleScript script, JS::MutableHandleValue rval);

extern bool
JS_ExecuteScript(JSContext* cx, JS::AutoObjectVector& envChain, JS::HandleScript script);

namespace JS {





extern bool
CloneAndExecuteScript(JSContext* cx, JS::Handle<JSScript*> script,
                      JS::MutableHandleValue rval);

}

namespace JS {




extern bool
Evaluate(JSContext* cx, const ReadOnlyCompileOptions& options,
         SourceBufferHolder& srcBuf, JS::MutableHandleValue rval);






extern bool
Evaluate(JSContext* cx, AutoObjectVector& envChain, const ReadOnlyCompileOptions& options,
         SourceBufferHolder& srcBuf, JS::MutableHandleValue rval);




extern bool
Evaluate(JSContext* cx, const ReadOnlyCompileOptions& options,
         const char16_t* chars, size_t length, JS::MutableHandleValue rval);






extern bool
Evaluate(JSContext* cx, AutoObjectVector& envChain, const ReadOnlyCompileOptions& options,
         const char16_t* chars, size_t length, JS::MutableHandleValue rval);




extern bool
Evaluate(JSContext* cx, const ReadOnlyCompileOptions& options,
         const char* bytes, size_t length, JS::MutableHandleValue rval);




extern bool
Evaluate(JSContext* cx, const ReadOnlyCompileOptions& options,
         const char* filename, JS::MutableHandleValue rval);




extern JSFunction*
GetModuleResolveHook(JSContext* cx);




extern void
SetModuleResolveHook(JSContext* cx, JS::HandleFunction func);





extern bool
CompileModule(JSContext* cx, const ReadOnlyCompileOptions& options,
              SourceBufferHolder& srcBuf, JS::MutableHandleObject moduleRecord);





extern void
SetModuleHostDefinedField(JSObject* module, const JS::Value& value);




extern JS::Value
GetModuleHostDefinedField(JSObject* module);
# 4464 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
ModuleDeclarationInstantiation(JSContext* cx, JS::HandleObject moduleRecord);
# 4477 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
ModuleEvaluation(JSContext* cx, JS::HandleObject moduleRecord);
# 4488 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
GetRequestedModules(JSContext* cx, JS::HandleObject moduleRecord);




extern JSScript*
GetModuleScript(JSContext* cx, JS::HandleObject moduleRecord);

}

extern bool
JS_CheckForInterrupt(JSContext* cx);
# 4515 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_AddInterruptCallback(JSContext* cx, JSInterruptCallback callback);

extern bool
JS_DisableInterruptCallback(JSContext* cx);

extern void
JS_ResetInterruptCallback(JSContext* cx, bool enable);

extern void
JS_RequestInterruptCallback(JSContext* cx);

namespace JS {
# 4536 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
SetGetIncumbentGlobalCallback(JSContext* cx, JSGetIncumbentGlobalCallback callback);
# 4548 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
SetEnqueuePromiseJobCallback(JSContext* cx, JSEnqueuePromiseJobCallback callback,
                             void* data = nullptr);






extern void
SetPromiseRejectionTrackerCallback(JSContext* cx, JSPromiseRejectionTrackerCallback callback,
                                   void* data = nullptr);







extern JSObject*
NewPromiseObject(JSContext* cx, JS::HandleObject executor, JS::HandleObject proto = nullptr);





extern bool
IsPromiseObject(JS::HandleObject obj);




extern JSObject*
GetPromiseConstructor(JSContext* cx);




extern JSObject*
GetPromisePrototype(JSContext* cx);


enum class PromiseState {
    Pending,
    Fulfilled,
    Rejected
};




extern PromiseState
GetPromiseState(JS::HandleObject promise);




uint64_t
GetPromiseID(JS::HandleObject promise);





extern JS::Value
GetPromiseResult(JS::HandleObject promise);





extern JSObject*
GetPromiseAllocationSite(JS::HandleObject promise);

extern JSObject*
GetPromiseResolutionSite(JS::HandleObject promise);
# 4637 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
CallOriginalPromiseResolve(JSContext* cx, JS::HandleValue resolutionValue);





extern JSObject*
CallOriginalPromiseReject(JSContext* cx, JS::HandleValue rejectionValue);







extern bool
ResolvePromise(JSContext* cx, JS::HandleObject promiseObj, JS::HandleValue resolutionValue);







extern bool
RejectPromise(JSContext* cx, JS::HandleObject promiseObj, JS::HandleValue rejectionValue);
# 4673 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
CallOriginalPromiseThen(JSContext* cx, JS::HandleObject promise,
                        JS::HandleObject onResolve, JS::HandleObject onReject);
# 4688 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
AddPromiseReactions(JSContext* cx, JS::HandleObject promise,
                    JS::HandleObject onResolve, JS::HandleObject onReject);
# 4703 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
GetWaitForAllPromise(JSContext* cx, const JS::AutoObjectVector& promises);
# 4713 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
struct AsyncTask
{
    AsyncTask() : user(nullptr) {}
    virtual ~AsyncTask() {}





    virtual void finish(JSContext* cx) = 0;
    virtual void cancel(JSContext* cx) = 0;


    void* user;
};
# 4740 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef bool
(*StartAsyncTaskCallback)(JSContext* cx, AsyncTask* task);
# 4750 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef bool
(*FinishAsyncTaskCallback)(AsyncTask* task);




extern void
SetAsyncTaskCallbacks(JSContext* cx, StartAsyncTaskCallback start, FinishAsyncTaskCallback finish);
# 4776 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class AutoSetAsyncStackForNewCalls
{
    JSContext* cx;
    RootedObject oldAsyncStack;
    const char* oldAsyncCause;
    bool oldAsyncCallIsExplicit;

  public:
    enum class AsyncCallKind {


        IMPLICIT,


        EXPLICIT
    };
# 4802 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
    AutoSetAsyncStackForNewCalls(JSContext* cx, HandleObject stack,
                                 const char* asyncCause,
                                 AsyncCallKind kind = AsyncCallKind::IMPLICIT);
    ~AutoSetAsyncStackForNewCalls();
};

}
# 4821 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSString*
JS_NewStringCopyN(JSContext* cx, const char* s, size_t n);

extern JSString*
JS_NewStringCopyZ(JSContext* cx, const char* s);

extern JSString*
JS_NewStringCopyUTF8Z(JSContext* cx, const JS::ConstUTF8CharsZ s);

extern JSString*
JS_NewStringCopyUTF8N(JSContext* cx, const JS::UTF8Chars s);

extern JSString*
JS_AtomizeAndPinJSString(JSContext* cx, JS::HandleString str);

extern JSString*
JS_AtomizeStringN(JSContext* cx, const char* s, size_t length);

extern JSString*
JS_AtomizeString(JSContext* cx, const char* s);

extern JSString*
JS_AtomizeAndPinStringN(JSContext* cx, const char* s, size_t length);

extern JSString*
JS_AtomizeAndPinString(JSContext* cx, const char* s);

extern JSString*
JS_NewUCString(JSContext* cx, char16_t* chars, size_t length);

extern JSString*
JS_NewUCStringCopyN(JSContext* cx, const char16_t* s, size_t n);

extern JSString*
JS_NewUCStringCopyZ(JSContext* cx, const char16_t* s);

extern JSString*
JS_AtomizeUCStringN(JSContext* cx, const char16_t* s, size_t length);

extern JSString*
JS_AtomizeUCString(JSContext* cx, const char16_t* s);

extern JSString*
JS_AtomizeAndPinUCStringN(JSContext* cx, const char16_t* s, size_t length);

extern JSString*
JS_AtomizeAndPinUCString(JSContext* cx, const char16_t* s);

extern bool
JS_CompareStrings(JSContext* cx, JSString* str1, JSString* str2, int32_t* result);

extern bool
JS_StringEqualsAscii(JSContext* cx, JSString* str, const char* asciiBytes, bool* match);

extern size_t
JS_PutEscapedString(JSContext* cx, char* buffer, size_t size, JSString* str, char quote);

extern bool
JS_FileEscapedString(FILE* fp, JSString* str, char quote);
# 4920 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern size_t
JS_GetStringLength(JSString* str);

extern bool
JS_StringIsFlat(JSString* str);


extern bool
JS_StringHasLatin1Chars(JSString* str);

extern const JS::Latin1Char*
JS_GetLatin1StringCharsAndLength(JSContext* cx, const JS::AutoCheckCannotGC& nogc, JSString* str,
                                 size_t* length);

extern const char16_t*
JS_GetTwoByteStringCharsAndLength(JSContext* cx, const JS::AutoCheckCannotGC& nogc, JSString* str,
                                  size_t* length);

extern bool
JS_GetStringCharAt(JSContext* cx, JSString* str, size_t index, char16_t* res);

extern char16_t
JS_GetFlatStringCharAt(JSFlatString* str, size_t index);

extern const char16_t*
JS_GetTwoByteExternalStringChars(JSString* str);

extern bool
JS_CopyStringChars(JSContext* cx, mozilla::Range<char16_t> dest, JSString* str);

extern JSFlatString*
JS_FlattenString(JSContext* cx, JSString* str);

extern const JS::Latin1Char*
JS_GetLatin1FlatStringChars(const JS::AutoCheckCannotGC& nogc, JSFlatString* str);

extern const char16_t*
JS_GetTwoByteFlatStringChars(const JS::AutoCheckCannotGC& nogc, JSFlatString* str);

static __attribute__((always_inline)) inline JSFlatString*
JSID_TO_FLAT_STRING(jsid id)
{
    do { } while (0);
    return (JSFlatString*)((id.asBits));
}

static __attribute__((always_inline)) inline JSFlatString*
JS_ASSERT_STRING_IS_FLAT(JSString* str)
{
    do { } while (0);
    return (JSFlatString*)str;
}

static __attribute__((always_inline)) inline JSString*
JS_FORGET_STRING_FLATNESS(JSFlatString* fstr)
{
    return (JSString*)fstr;
}





extern bool
JS_FlatStringEqualsAscii(JSFlatString* str, const char* asciiBytes);

extern size_t
JS_PutEscapedFlatString(char* buffer, size_t size, JSFlatString* str, char quote);






extern JSString*
JS_NewDependentString(JSContext* cx, JS::HandleString str, size_t start,
                      size_t length);





extern JSString*
JS_ConcatStrings(JSContext* cx, JS::HandleString left, JS::HandleString right);
# 5018 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
bool
JS_DecodeBytes(JSContext* cx, const char* src, size_t srclen, char16_t* dst,
               size_t* dstlenp);





char*
JS_EncodeString(JSContext* cx, JSString* str);




char*
JS_EncodeStringToUTF8(JSContext* cx, JS::HandleString str);






size_t
JS_GetStringEncodingLength(JSContext* cx, JSString* str);
# 5051 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
size_t
JS_EncodeStringToBuffer(JSContext* cx, JSString* str, char* buffer, size_t length);

class JSAutoByteString
{
  public:
    JSAutoByteString(JSContext* cx, JSString* str
                                                    )
      : mBytes(JS_EncodeString(cx, str))
    {
        do { } while (0);
        do { } while (0);
    }

    explicit JSAutoByteString()
      : mBytes(nullptr)
    {
        do { } while (0);
    }

    ~JSAutoByteString() {
        JS_free(nullptr, mBytes);
    }


    void initBytes(char* bytes) {
        do { } while (0);
        mBytes = bytes;
    }

    char* encodeLatin1(JSContext* cx, JSString* str) {
        do { } while (0);
        do { } while (0);
        mBytes = JS_EncodeString(cx, str);
        return mBytes;
    }

    char* encodeUtf8(JSContext* cx, JS::HandleString str) {
        do { } while (0);
        do { } while (0);
        mBytes = JS_EncodeStringToUTF8(cx, str);
        return mBytes;
    }

    void clear() {
        js_free(mBytes);
        mBytes = nullptr;
    }

    char* ptr() const {
        return mBytes;
    }

    bool operator!() const {
        return !mBytes;
    }

    size_t length() const {
        if (!mBytes)
            return 0;
        return strlen(mBytes);
    }

  private:
    char* mBytes;



    JSAutoByteString(const JSAutoByteString& another);
    JSAutoByteString& operator=(const JSAutoByteString& another);
};

namespace JS {

extern JSAddonId*
NewAddonId(JSContext* cx, JS::HandleString str);

extern JSString*
StringOfAddonId(JSAddonId* id);

extern JSAddonId*
AddonIdOfObject(JSObject* obj);

}






namespace JS {
# 5150 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
Symbol*
NewSymbol(JSContext* cx, HandleString description);
# 5160 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
Symbol*
GetSymbolFor(JSContext* cx, HandleString key);







JSString*
GetSymbolDescription(HandleSymbol symbol);
# 5187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
enum class SymbolCode : uint32_t {


    isConcatSpreadable, iterator, match, replace, search, species, hasInstance, split, toPrimitive, toStringTag, unscopables, asyncIterator,

    Limit,
    InSymbolRegistry = 0xfffffffe,
    UniqueSymbol = 0xffffffff
};


const size_t WellKnownSymbolLimit = size_t(SymbolCode::Limit);






SymbolCode
GetSymbolCode(Handle<Symbol*> symbol);







Symbol*
GetWellKnownSymbol(JSContext* cx, SymbolCode which);





inline bool
PropertySpecNameIsSymbol(const char* name)
{
    uintptr_t u = reinterpret_cast<uintptr_t>(name);
    return u != 0 && u - 1 < WellKnownSymbolLimit;
}

bool
PropertySpecNameEqualsId(const char* name, HandleId id);
# 5239 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
bool
PropertySpecNameToPermanentId(JSContext* cx, const char* name, jsid* idp);

}





typedef bool (* JSONWriteCallback)(const char16_t* buf, uint32_t len, void* data);




bool
JS_Stringify(JSContext* cx, JS::MutableHandleValue value, JS::HandleObject replacer,
             JS::HandleValue space, JSONWriteCallback callback, void* data);

namespace JS {
# 5276 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
bool
ToJSONMaybeSafely(JSContext* cx, JS::HandleObject input,
                  JSONWriteCallback callback, void* data);

}




bool
JS_ParseJSON(JSContext* cx, const char16_t* chars, uint32_t len, JS::MutableHandleValue vp);

bool
JS_ParseJSON(JSContext* cx, JS::HandleString str, JS::MutableHandleValue vp);

bool
JS_ParseJSONWithReviver(JSContext* cx, const char16_t* chars, uint32_t len, JS::HandleValue reviver,
                        JS::MutableHandleValue vp);

bool
JS_ParseJSONWithReviver(JSContext* cx, JS::HandleString str, JS::HandleValue reviver,
                        JS::MutableHandleValue vp);
# 5308 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_SetDefaultLocale(JSContext* cx, const char* locale);




extern JS::UniqueChars
JS_GetDefaultLocale(JSContext* cx);




extern void
JS_ResetDefaultLocale(JSContext* cx);




struct JSLocaleCallbacks {
    JSLocaleToUpperCase localeToUpperCase;
    JSLocaleToLowerCase localeToLowerCase;
    JSLocaleCompare localeCompare;
    JSLocaleToUnicode localeToUnicode;
};





extern void
JS_SetLocaleCallbacks(JSContext* cx, const JSLocaleCallbacks* callbacks);





extern const JSLocaleCallbacks*
JS_GetLocaleCallbacks(JSContext* cx);







namespace JS {
const uint16_t MaxNumErrorArguments = 10;
};





extern void
JS_ReportErrorASCII(JSContext* cx, const char* format, ...)
    __attribute__ ((format (printf, 2, 3)));

extern void
JS_ReportErrorLatin1(JSContext* cx, const char* format, ...)
    __attribute__ ((format (printf, 2, 3)));

extern void
JS_ReportErrorUTF8(JSContext* cx, const char* format, ...)
    __attribute__ ((format (printf, 2, 3)));




extern void
JS_ReportErrorNumberASCII(JSContext* cx, JSErrorCallback errorCallback,
                          void* userRef, const unsigned errorNumber, ...);

extern void
JS_ReportErrorNumberASCIIVA(JSContext* cx, JSErrorCallback errorCallback,
                            void* userRef, const unsigned errorNumber, va_list ap);

extern void
JS_ReportErrorNumberLatin1(JSContext* cx, JSErrorCallback errorCallback,
                           void* userRef, const unsigned errorNumber, ...);


extern void
JS_ReportErrorNumberLatin1VA(JSContext* cx, JSErrorCallback errorCallback,
                             void* userRef, const unsigned errorNumber, va_list ap);


extern void
JS_ReportErrorNumberUTF8(JSContext* cx, JSErrorCallback errorCallback,
                           void* userRef, const unsigned errorNumber, ...);


extern void
JS_ReportErrorNumberUTF8VA(JSContext* cx, JSErrorCallback errorCallback,
                           void* userRef, const unsigned errorNumber, va_list ap);





extern void
JS_ReportErrorNumberUC(JSContext* cx, JSErrorCallback errorCallback,
                     void* userRef, const unsigned errorNumber, ...);

extern void
JS_ReportErrorNumberUCArray(JSContext* cx, JSErrorCallback errorCallback,
                            void* userRef, const unsigned errorNumber,
                            const char16_t** args);







extern bool
JS_ReportWarningASCII(JSContext* cx, const char* format, ...)
    __attribute__ ((format (printf, 2, 3)));

extern bool
JS_ReportWarningLatin1(JSContext* cx, const char* format, ...)
    __attribute__ ((format (printf, 2, 3)));

extern bool
JS_ReportWarningUTF8(JSContext* cx, const char* format, ...)
    __attribute__ ((format (printf, 2, 3)));

extern bool
JS_ReportErrorFlagsAndNumberASCII(JSContext* cx, unsigned flags,
                                  JSErrorCallback errorCallback, void* userRef,
                                  const unsigned errorNumber, ...);

extern bool
JS_ReportErrorFlagsAndNumberLatin1(JSContext* cx, unsigned flags,
                                   JSErrorCallback errorCallback, void* userRef,
                                   const unsigned errorNumber, ...);

extern bool
JS_ReportErrorFlagsAndNumberUTF8(JSContext* cx, unsigned flags,
                                 JSErrorCallback errorCallback, void* userRef,
                                 const unsigned errorNumber, ...);

extern bool
JS_ReportErrorFlagsAndNumberUC(JSContext* cx, unsigned flags,
                               JSErrorCallback errorCallback, void* userRef,
                               const unsigned errorNumber, ...);




extern void
JS_ReportOutOfMemory(JSContext* cx);




extern void
JS_ReportAllocationOverflow(JSContext* cx);





class JSErrorBase
{


    JS::ConstUTF8CharsZ message_;

  public:
    JSErrorBase()
      : filename(nullptr), lineno(0), column(0),
        errorNumber(0),
        ownsMessage_(false)
    {}

    ~JSErrorBase() {
        freeMessage();
    }


    const char* filename;


    unsigned lineno;


    unsigned column;


    unsigned errorNumber;

  private:
    bool ownsMessage_ : 1;

  public:
    const JS::ConstUTF8CharsZ message() const {
        return message_;
    }

    void initOwnedMessage(const char* messageArg) {
        initBorrowedMessage(messageArg);
        ownsMessage_ = true;
    }
    void initBorrowedMessage(const char* messageArg) {
        do { } while (0);
        message_ = JS::ConstUTF8CharsZ(messageArg, strlen(messageArg));
    }

    JSString* newMessageString(JSContext* cx);

  private:
    void freeMessage();
};




class JSErrorNotes
{
  public:
    class Note : public JSErrorBase
    {};

  private:

    js::Vector<js::UniquePtr<Note>, 1, js::SystemAllocPolicy> notes_;

  public:
    JSErrorNotes();
    ~JSErrorNotes();


    bool addNoteASCII(JSContext* cx,
                      const char* filename, unsigned lineno, unsigned column,
                      JSErrorCallback errorCallback, void* userRef,
                      const unsigned errorNumber, ...);
    bool addNoteLatin1(JSContext* cx,
                       const char* filename, unsigned lineno, unsigned column,
                       JSErrorCallback errorCallback, void* userRef,
                       const unsigned errorNumber, ...);
    bool addNoteUTF8(JSContext* cx,
                     const char* filename, unsigned lineno, unsigned column,
                     JSErrorCallback errorCallback, void* userRef,
                     const unsigned errorNumber, ...);

    size_t length();


    js::UniquePtr<JSErrorNotes> copy(JSContext* cx);

    class iterator : public std::iterator<std::input_iterator_tag, js::UniquePtr<Note>>
    {
        js::UniquePtr<Note>* note_;
      public:
        explicit iterator(js::UniquePtr<Note>* note = nullptr) : note_(note)
        {}

        bool operator==(iterator other) const {
            return note_ == other.note_;
        }
        bool operator!=(iterator other) const {
            return !(*this == other);
        }
        iterator& operator++() {
            note_++;
            return *this;
        }
        reference operator*() {
            return *note_;
        }
    };
    iterator begin();
    iterator end();
};




class JSErrorReport : public JSErrorBase
{


    const char16_t* linebuf_;


    size_t linebufLength_;


    size_t tokenOffset_;

  public:
    JSErrorReport()
      : linebuf_(nullptr), linebufLength_(0), tokenOffset_(0),
        notes(nullptr),
        flags(0), exnType(0), isMuted(false),
        ownsLinebuf_(false)
    {}

    ~JSErrorReport() {
        freeLinebuf();
    }


    js::UniquePtr<JSErrorNotes> notes;


    unsigned flags;


    int16_t exnType;


    bool isMuted : 1;

  private:
    bool ownsLinebuf_ : 1;

  public:
    const char16_t* linebuf() const {
        return linebuf_;
    }
    size_t linebufLength() const {
        return linebufLength_;
    }
    size_t tokenOffset() const {
        return tokenOffset_;
    }
    void initOwnedLinebuf(const char16_t* linebufArg, size_t linebufLengthArg,
                          size_t tokenOffsetArg) {
        initBorrowedLinebuf(linebufArg, linebufLengthArg, tokenOffsetArg);
        ownsLinebuf_ = true;
    }
    void initBorrowedLinebuf(const char16_t* linebufArg, size_t linebufLengthArg,
                             size_t tokenOffsetArg);

  private:
    void freeLinebuf();
};
# 5668 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
namespace JS {

using WarningReporter = void (*)(JSContext* cx, JSErrorReport* report);

extern WarningReporter
SetWarningReporter(JSContext* cx, WarningReporter reporter);

extern WarningReporter
GetWarningReporter(JSContext* cx);

extern bool
CreateError(JSContext* cx, JSExnType type, HandleObject stack,
            HandleString fileName, uint32_t lineNumber, uint32_t columnNumber,
            JSErrorReport* report, HandleString message, MutableHandleValue rval);







extern JSObject*
NewWeakMapObject(JSContext* cx);

extern bool
IsWeakMapObject(JSObject* obj);

extern bool
GetWeakMapEntry(JSContext* cx, JS::HandleObject mapObj, JS::HandleObject key,
                JS::MutableHandleValue val);

extern bool
SetWeakMapEntry(JSContext* cx, JS::HandleObject mapObj, JS::HandleObject key,
                JS::HandleValue val);




extern JSObject*
NewMapObject(JSContext* cx);

extern uint32_t
MapSize(JSContext* cx, HandleObject obj);

extern bool
MapGet(JSContext* cx, HandleObject obj,
       HandleValue key, MutableHandleValue rval);

extern bool
MapHas(JSContext* cx, HandleObject obj, HandleValue key, bool* rval);

extern bool
MapSet(JSContext* cx, HandleObject obj, HandleValue key, HandleValue val);

extern bool
MapDelete(JSContext *cx, HandleObject obj, HandleValue key, bool *rval);

extern bool
MapClear(JSContext* cx, HandleObject obj);

extern bool
MapKeys(JSContext* cx, HandleObject obj, MutableHandleValue rval);

extern bool
MapValues(JSContext* cx, HandleObject obj, MutableHandleValue rval);

extern bool
MapEntries(JSContext* cx, HandleObject obj, MutableHandleValue rval);

extern bool
MapForEach(JSContext *cx, HandleObject obj, HandleValue callbackFn, HandleValue thisVal);




extern JSObject *
NewSetObject(JSContext *cx);

extern uint32_t
SetSize(JSContext *cx, HandleObject obj);

extern bool
SetHas(JSContext *cx, HandleObject obj, HandleValue key, bool *rval);

extern bool
SetDelete(JSContext *cx, HandleObject obj, HandleValue key, bool *rval);

extern bool
SetAdd(JSContext *cx, HandleObject obj, HandleValue key);

extern bool
SetClear(JSContext *cx, HandleObject obj);

extern bool
SetKeys(JSContext *cx, HandleObject obj, MutableHandleValue rval);

extern bool
SetValues(JSContext *cx, HandleObject obj, MutableHandleValue rval);

extern bool
SetEntries(JSContext *cx, HandleObject obj, MutableHandleValue rval);

extern bool
SetForEach(JSContext *cx, HandleObject obj, HandleValue callbackFn, HandleValue thisVal);

}





extern JSObject*
JS_NewDateObject(JSContext* cx, int year, int mon, int mday, int hour, int min, int sec);
# 5789 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_ObjectIsDate(JSContext* cx, JS::HandleObject obj, bool* isDate);
# 5803 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
JS_NewRegExpObject(JSContext* cx, const char* bytes, size_t length, unsigned flags);

extern JSObject*
JS_NewUCRegExpObject(JSContext* cx, const char16_t* chars, size_t length, unsigned flags);

extern bool
JS_SetRegExpInput(JSContext* cx, JS::HandleObject obj, JS::HandleString input);

extern bool
JS_ClearRegExpStatics(JSContext* cx, JS::HandleObject obj);

extern bool
JS_ExecuteRegExp(JSContext* cx, JS::HandleObject obj, JS::HandleObject reobj,
                 char16_t* chars, size_t length, size_t* indexp, bool test,
                 JS::MutableHandleValue rval);



extern bool
JS_ExecuteRegExpNoStatics(JSContext* cx, JS::HandleObject reobj, char16_t* chars, size_t length,
                          size_t* indexp, bool test, JS::MutableHandleValue rval);
# 5833 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
JS_ObjectIsRegExp(JSContext* cx, JS::HandleObject obj, bool* isRegExp);

extern unsigned
JS_GetRegExpFlags(JSContext* cx, JS::HandleObject obj);

extern JSString*
JS_GetRegExpSource(JSContext* cx, JS::HandleObject obj);



extern bool
JS_IsExceptionPending(JSContext* cx);

extern bool
JS_GetPendingException(JSContext* cx, JS::MutableHandleValue vp);

extern void
JS_SetPendingException(JSContext* cx, JS::HandleValue v);

extern void
JS_ClearPendingException(JSContext* cx);

namespace JS {
# 5870 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class AutoSaveExceptionState
{
  private:
    JSContext* context;
    bool wasPropagatingForcedReturn;
    bool wasOverRecursed;
    bool wasThrowing;
    RootedValue exceptionValue;

  public:




    explicit AutoSaveExceptionState(JSContext* cx);





    ~AutoSaveExceptionState();





    void drop() {
        wasPropagatingForcedReturn = false;
        wasOverRecursed = false;
        wasThrowing = false;
        exceptionValue.setUndefined();
    }






    void restore();
};

}


extern JSExceptionState*
JS_SaveExceptionState(JSContext* cx);

extern void
JS_RestoreExceptionState(JSContext* cx, JSExceptionState* state);

extern void
JS_DropExceptionState(JSContext* cx, JSExceptionState* state);
# 5930 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSErrorReport*
JS_ErrorFromException(JSContext* cx, JS::HandleObject obj);
# 5940 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
ExceptionStackOrNull(JS::HandleObject obj);




extern bool
JS_ThrowStopIteration(JSContext* cx);

extern bool
JS_IsStopIteration(const JS::Value& v);
# 5962 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
JS_AbortIfWrongThread(JSContext* cx);
# 5972 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern JSObject*
JS_NewObjectForConstructor(JSContext* cx, const JSClass* clasp, const JS::CallArgs& args);






extern void
JS_GetGCZealBits(JSContext* cx, uint32_t* zealBits, uint32_t* frequency, uint32_t* nextScheduled);

extern void
JS_SetGCZeal(JSContext* cx, uint8_t zeal, uint32_t frequency);

extern void
JS_ScheduleGC(JSContext* cx, uint32_t count);


extern void
JS_SetParallelParsingEnabled(JSContext* cx, bool enabled);

extern void
JS_SetOffthreadIonCompilationEnabled(JSContext* cx, bool enabled);
# 6012 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef enum JSJitCompilerOption {



    JSJITCOMPILER_BASELINE_WARMUP_TRIGGER, JSJITCOMPILER_ION_WARMUP_TRIGGER, JSJITCOMPILER_ION_GVN_ENABLE, JSJITCOMPILER_ION_FORCE_IC, JSJITCOMPILER_ION_ENABLE, JSJITCOMPILER_ION_INTERRUPT_WITHOUT_SIGNAL, JSJITCOMPILER_ION_CHECK_RANGE_ANALYSIS, JSJITCOMPILER_BASELINE_ENABLE, JSJITCOMPILER_OFFTHREAD_COMPILATION_ENABLE, JSJITCOMPILER_FULL_DEBUG_CHECKS, JSJITCOMPILER_JUMP_THRESHOLD, JSJITCOMPILER_ASMJS_ATOMICS_ENABLE, JSJITCOMPILER_WASM_TEST_MODE, JSJITCOMPILER_WASM_FOLD_OFFSETS,


    JSJITCOMPILER_NOT_AN_OPTION
} JSJitCompilerOption;

extern void
JS_SetGlobalJitCompilerOption(JSContext* cx, JSJitCompilerOption opt, uint32_t value);
extern bool
JS_GetGlobalJitCompilerOption(JSContext* cx, JSJitCompilerOption opt, uint32_t* valueOut);




extern bool
JS_IndexToId(JSContext* cx, uint32_t index, JS::MutableHandleId);






extern bool
JS_CharsToId(JSContext* cx, JS::TwoByteChars chars, JS::MutableHandleId);




extern bool
JS_IsIdentifier(JSContext* cx, JS::HandleString str, bool* isIdentifier);






extern bool
JS_IsIdentifier(const char16_t* chars, size_t length);

namespace js {
class ScriptSource;
}

namespace JS {

class AutoFilename
{
  private:
    js::ScriptSource* ss_;
    mozilla::Variant<const char*, UniqueChars> filename_;

    AutoFilename(const AutoFilename&) = delete;
    AutoFilename& operator=(const AutoFilename&) = delete;

  public:
    AutoFilename()
      : ss_(nullptr),
        filename_(mozilla::AsVariant<const char*>(nullptr))
    {}

    ~AutoFilename() {
        reset();
    }

    void reset();

    void setOwned(UniqueChars&& filename);
    void setUnowned(const char* filename);
    void setScriptSource(js::ScriptSource* ss);

    const char* get() const;
};
# 6097 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
DescribeScriptedCaller(JSContext* cx, AutoFilename* filename = nullptr,
                       unsigned* lineno = nullptr, unsigned* column = nullptr);

extern JSObject*
GetScriptedCallerGlobal(JSContext* cx);
# 6116 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
HideScriptedCaller(JSContext* cx);

extern void
UnhideScriptedCaller(JSContext* cx);

class AutoHideScriptedCaller
{
  public:
    explicit AutoHideScriptedCaller(JSContext* cx
                                                                   )
      : mContext(cx)
    {
        do { } while (0);
        HideScriptedCaller(mContext);
    }
    ~AutoHideScriptedCaller() {
        UnhideScriptedCaller(mContext);
    }

  protected:
    JSContext* mContext;

};





typedef mozilla::Vector<uint8_t> TranscodeBuffer;

enum TranscodeResult
{

    TranscodeResult_Ok = 0,


    TranscodeResult_Failure = 0x100,
    TranscodeResult_Failure_BadBuildId = TranscodeResult_Failure | 0x1,
    TranscodeResult_Failure_RunOnceNotSupported = TranscodeResult_Failure | 0x2,
    TranscodeResult_Failure_AsmJSNotSupported = TranscodeResult_Failure | 0x3,
    TranscodeResult_Failure_UnknownClassKind = TranscodeResult_Failure | 0x4,
    TranscodeResult_Failure_WrongCompileOption = TranscodeResult_Failure | 0x5,
    TranscodeResult_Failure_NotInterpretedFun = TranscodeResult_Failure | 0x6,


    TranscodeResult_Throw = 0x200
};

extern TranscodeResult
EncodeScript(JSContext* cx, TranscodeBuffer& buffer, JS::HandleScript script);

extern TranscodeResult
EncodeInterpretedFunction(JSContext* cx, TranscodeBuffer& buffer, JS::HandleObject funobj);

extern TranscodeResult
DecodeScript(JSContext* cx, TranscodeBuffer& buffer, JS::MutableHandleScript scriptp,
             size_t cursorIndex = 0);

extern TranscodeResult
DecodeInterpretedFunction(JSContext* cx, TranscodeBuffer& buffer, JS::MutableHandleFunction funp,
                          size_t cursorIndex = 0);
# 6192 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
StartIncrementalEncoding(JSContext* cx, TranscodeBuffer& buffer, JS::HandleScript script);

extern bool
FinishIncrementalEncoding(JSContext* cx, JS::HandleScript script);

}

namespace js {

enum class StackFormat { SpiderMonkey, V8, Default };
# 6211 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern void
SetStackFormat(JSContext* cx, StackFormat format);

extern StackFormat
GetStackFormat(JSContext* cx);

}

namespace JS {
# 6230 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef bool
(* OpenAsmJSCacheEntryForReadOp)(HandleObject global, const char16_t* begin, const char16_t* limit,
                                 size_t* size, const uint8_t** memory, intptr_t* handle);
typedef void
(* CloseAsmJSCacheEntryForReadOp)(size_t size, const uint8_t* memory, intptr_t handle);


enum AsmJSCacheResult
{
    AsmJSCache_Success,
    AsmJSCache_MIN = AsmJSCache_Success,
    AsmJSCache_ModuleTooSmall,
    AsmJSCache_SynchronousScript,
    AsmJSCache_QuotaExceeded,
    AsmJSCache_StorageInitFailure,
    AsmJSCache_Disabled_Internal,
    AsmJSCache_Disabled_ShellFlags,
    AsmJSCache_Disabled_JitInspector,
    AsmJSCache_InternalError,
    AsmJSCache_Disabled_PrivateBrowsing,
    AsmJSCache_LIMIT
};
# 6262 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef AsmJSCacheResult
(* OpenAsmJSCacheEntryForWriteOp)(HandleObject global, const char16_t* begin,
                                  const char16_t* end, size_t size,
                                  uint8_t** memory, intptr_t* handle);
typedef void
(* CloseAsmJSCacheEntryForWriteOp)(size_t size, uint8_t* memory, intptr_t handle);

struct AsmJSCacheOps
{
    OpenAsmJSCacheEntryForReadOp openEntryForRead;
    CloseAsmJSCacheEntryForReadOp closeEntryForRead;
    OpenAsmJSCacheEntryForWriteOp openEntryForWrite;
    CloseAsmJSCacheEntryForWriteOp closeEntryForWrite;
};

extern void
SetAsmJSCacheOps(JSContext* cx, const AsmJSCacheOps* callbacks);
# 6287 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef js::Vector<char, 0, js::SystemAllocPolicy> BuildIdCharVector;

typedef bool
(* BuildIdOp)(BuildIdCharVector* buildId);

extern void
SetBuildIdOp(JSContext* cx, BuildIdOp buildIdOp);
# 6321 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
struct WasmModule : js::AtomicRefCounted<WasmModule>
{
    virtual ~WasmModule() {}

    virtual void serializedSize(size_t* maybeBytecodeSize, size_t* maybeCompiledSize) const = 0;
    virtual void serialize(uint8_t* maybeBytecodeBegin, size_t maybeBytecodeSize,
                           uint8_t* maybeCompiledBegin, size_t maybeCompiledSize) const = 0;

    virtual JSObject* createObject(JSContext* cx) = 0;
};

extern bool
IsWasmModuleObject(HandleObject obj);

extern RefPtr<WasmModule>
GetWasmModule(HandleObject obj);

extern bool
CompiledWasmModuleAssumptionsMatch(PRFileDesc* compiled, BuildIdCharVector&& buildId);

extern RefPtr<WasmModule>
DeserializeWasmModule(PRFileDesc* bytecode, PRFileDesc* maybeCompiled, BuildIdCharVector&& buildId,
                      JS::UniqueChars filename, unsigned line, unsigned column);
# 6362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
class ForOfIterator {
  protected:
    JSContext* cx_;
# 6379 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
    JS::RootedObject iterator;
    uint32_t index;

    static const uint32_t NOT_ARRAY = (4294967295U);

    ForOfIterator(const ForOfIterator&) = delete;
    ForOfIterator& operator=(const ForOfIterator&) = delete;

  public:
    explicit ForOfIterator(JSContext* cx) : cx_(cx), iterator(cx_), index(NOT_ARRAY) { }

    enum NonIterableBehavior {
        ThrowOnNonIterable,
        AllowNonIterable
    };







    bool init(JS::HandleValue iterable,
              NonIterableBehavior nonIterableBehavior = ThrowOnNonIterable);





    bool next(JS::MutableHandleValue val, bool* done);





    void closeThrow();





    bool valueIsIterable() const {
        return iterator;
    }

  private:
    inline bool nextFromOptimizedArray(MutableHandleValue val, bool* done);
    bool materializeArrayIterator();
};
# 6437 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef void
(* LargeAllocationFailureCallback)(void* data);

extern void
SetLargeAllocationFailureCallback(JSContext* cx, LargeAllocationFailureCallback afc, void* data);
# 6454 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
typedef void
(* OutOfMemoryCallback)(JSContext* cx, void* data);

extern void
SetOutOfMemoryCallback(JSContext* cx, OutOfMemoryCallback cb, void* data);




struct AllFrames { };




struct MaxFrames
{
    uint32_t maxFrames;

    explicit MaxFrames(uint32_t max)
      : maxFrames(max)
    {
        do { } while (0);
    }
};






struct FirstSubsumedFrame
{
    JSContext* cx;
    JSPrincipals* principals;
    bool ignoreSelfHosted;




    explicit FirstSubsumedFrame(JSContext* cx, bool ignoreSelfHostedFrames = true);

    explicit FirstSubsumedFrame(JSContext* ctx, JSPrincipals* p, bool ignoreSelfHostedFrames = true)
      : cx(ctx)
      , principals(p)
      , ignoreSelfHosted(ignoreSelfHostedFrames)
    {
        if (principals)
            JS_HoldPrincipals(principals);
    }



    FirstSubsumedFrame(const FirstSubsumedFrame&) = delete;
    FirstSubsumedFrame& operator=(const FirstSubsumedFrame&) = delete;

    FirstSubsumedFrame(FirstSubsumedFrame&& rhs)
      : principals(rhs.principals)
      , ignoreSelfHosted(rhs.ignoreSelfHosted)
    {
        do { } while (0);
        rhs.principals = nullptr;
    }

    FirstSubsumedFrame& operator=(FirstSubsumedFrame&& rhs) {
        new (this) FirstSubsumedFrame(mozilla::Move(rhs));
        return *this;
    }

    ~FirstSubsumedFrame() {
        if (principals)
            JS_DropPrincipals(cx, principals);
    }
};

using StackCapture = mozilla::Variant<AllFrames, MaxFrames, FirstSubsumedFrame>;
# 6548 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
CaptureCurrentStack(JSContext* cx, MutableHandleObject stackp,
                    StackCapture&& capture = StackCapture(AllFrames()));
# 6566 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
CopyAsyncStack(JSContext* cx, HandleObject asyncStack,
               HandleString asyncCause, MutableHandleObject stackp,
               unsigned maxFrameCount);
# 6601 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
enum class SavedFrameResult {
    Ok,
    AccessDenied
};

enum class SavedFrameSelfHosted {
    Include,
    Exclude
};





extern SavedFrameResult
GetSavedFrameSource(JSContext* cx, HandleObject savedFrame, MutableHandleString sourcep,
                    SavedFrameSelfHosted selfHosted = SavedFrameSelfHosted::Include);




extern SavedFrameResult
GetSavedFrameLine(JSContext* cx, HandleObject savedFrame, uint32_t* linep,
                  SavedFrameSelfHosted selfHosted = SavedFrameSelfHosted::Include);




extern SavedFrameResult
GetSavedFrameColumn(JSContext* cx, HandleObject savedFrame, uint32_t* columnp,
                    SavedFrameSelfHosted selfHosted = SavedFrameSelfHosted::Include);






extern SavedFrameResult
GetSavedFrameFunctionDisplayName(JSContext* cx, HandleObject savedFrame, MutableHandleString namep,
                                 SavedFrameSelfHosted selfHosted = SavedFrameSelfHosted::Include);




extern SavedFrameResult
GetSavedFrameAsyncCause(JSContext* cx, HandleObject savedFrame, MutableHandleString asyncCausep,
                        SavedFrameSelfHosted selfHosted = SavedFrameSelfHosted::Include);






extern SavedFrameResult
GetSavedFrameAsyncParent(JSContext* cx, HandleObject savedFrame, MutableHandleObject asyncParentp,
                SavedFrameSelfHosted selfHosted = SavedFrameSelfHosted::Include);






extern SavedFrameResult
GetSavedFrameParent(JSContext* cx, HandleObject savedFrame, MutableHandleObject parentp,
                    SavedFrameSelfHosted selfHosted = SavedFrameSelfHosted::Include);
# 6679 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
BuildStackString(JSContext* cx, HandleObject stack, MutableHandleString stringp,
                 size_t indent = 0, js::StackFormat stackFormat = js::StackFormat::Default);





extern bool
IsSavedFrame(JSObject* obj);

}




namespace js {

class AutoStopwatch;







struct PerformanceGroup {
    PerformanceGroup();


    uint64_t iteration() const;




    bool isAcquired(uint64_t it) const;




    bool isAcquired(uint64_t it, const AutoStopwatch* owner) const;



    void acquire(uint64_t it, const AutoStopwatch* owner);



    void release(uint64_t it, const AutoStopwatch* owner);





    uint64_t recentCycles(uint64_t iteration) const;
    void addRecentCycles(uint64_t iteration, uint64_t cycles);



    uint64_t recentTicks(uint64_t iteration) const;
    void addRecentTicks(uint64_t iteration, uint64_t ticks);



    uint64_t recentCPOW(uint64_t iteration) const;
    void addRecentCPOW(uint64_t iteration, uint64_t CPOW);


    void resetRecentData();



    bool isActive() const;
    void setIsActive(bool);



    bool isUsedInThisIteration() const;
    void setIsUsedInThisIteration(bool);
  protected:


    virtual void Delete() = 0;

  private:




    uint64_t recentCycles_;



    uint64_t recentTicks_;



    uint64_t recentCPOW_;



    uint64_t iteration_;



    bool isActive_;



    bool isUsedInThisIteration_;



    const AutoStopwatch* owner_;

  public:

    void AddRef();
    void Release();
    uint64_t refCount_;
};

using PerformanceGroupVector = mozilla::Vector<RefPtr<js::PerformanceGroup>, 8, SystemAllocPolicy>;







extern bool
FlushPerformanceMonitoring(JSContext*);




extern void
ResetPerformanceMonitoring(JSContext*);




extern void
DisposePerformanceMonitoring(JSContext*);
# 6831 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsapi.h"
extern bool
SetStopwatchIsMonitoringCPOW(JSContext*, bool);
extern bool
GetStopwatchIsMonitoringCPOW(JSContext*);
extern bool
SetStopwatchIsMonitoringJank(JSContext*, bool);
extern bool
GetStopwatchIsMonitoringJank(JSContext*);


extern void
GetPerfMonitoringTestCpuRescheduling(JSContext*, uint64_t* stayed, uint64_t* moved);






extern void
AddCPOWPerformanceDelta(JSContext*, uint64_t delta);

typedef bool
(*StopwatchStartCallback)(uint64_t, void*);
extern bool
SetStopwatchStartCallback(JSContext*, StopwatchStartCallback, void*);

typedef bool
(*StopwatchCommitCallback)(uint64_t, PerformanceGroupVector&, void*);
extern bool
SetStopwatchCommitCallback(JSContext*, StopwatchCommitCallback, void*);

typedef bool
(*GetGroupsCallback)(JSContext*, PerformanceGroupVector&, void*);
extern bool
SetGetPerformanceGroupsCallback(JSContext*, GetGroupsCallback, void*);

}

namespace js {

enum class CompletionKind {
    Normal,
    Return,
    Throw
};

}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsbytecode.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsbytecode.h"
typedef uint8_t jsbytecode;
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CallNonGenericMethod.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CallNonGenericMethod.h"
namespace JS {


typedef bool (*IsAcceptableThis)(HandleValue v);



typedef bool (*NativeImpl)(JSContext* cx, const CallArgs& args);

namespace detail {


extern bool
CallMethodIfWrapped(JSContext* cx, IsAcceptableThis test, NativeImpl impl, const CallArgs& args);

}
# 94 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/CallNonGenericMethod.h"
template<IsAcceptableThis Test, NativeImpl Impl>
__attribute__((always_inline)) inline bool
CallNonGenericMethod(JSContext* cx, const CallArgs& args)
{
    HandleValue thisv = args.thisv();
    if (Test(thisv))
        return Impl(cx, args);

    return detail::CallMethodIfWrapped(cx, Test, Impl, args);
}

__attribute__((always_inline)) inline bool
CallNonGenericMethod(JSContext* cx, IsAcceptableThis Test, NativeImpl Impl, const CallArgs& args)
{
    HandleValue thisv = args.thisv();
    if (Test(thisv))
        return Impl(cx, args);

    return detail::CallMethodIfWrapped(cx, Test, Impl, args);
}

}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h" 2
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
class JSAtom;
struct JSErrorFormatString;
class JSLinearString;
struct JSJitInfo;
class JSErrorReport;

namespace JS {
template <class T>
class Heap;
}

namespace js {
class BaseProxyHandler;
class InterpreterFrame;
}

extern void
JS_SetGrayGCRootsTracer(JSContext* cx, JSTraceDataOp traceOp, void* data);

extern JSObject*
JS_FindCompilationScope(JSContext* cx, JS::HandleObject obj);

extern JSFunction*
JS_GetObjectFunction(JSObject* obj);

extern bool
JS_SplicePrototype(JSContext* cx, JS::HandleObject obj, JS::HandleObject proto);

extern JSObject*
JS_NewObjectWithUniqueType(JSContext* cx, const JSClass* clasp, JS::HandleObject proto);







extern JSObject*
JS_NewObjectWithoutMetadata(JSContext* cx, const JSClass* clasp, JS::Handle<JSObject*> proto);

extern uint32_t
JS_ObjectCountDynamicSlots(JS::HandleObject obj);

extern size_t
JS_SetProtoCalled(JSContext* cx);

extern size_t
JS_GetCustomIteratorCount(JSContext* cx);

extern bool
JS_NondeterministicGetWeakMapKeys(JSContext* cx, JS::HandleObject obj, JS::MutableHandleObject ret);

extern bool
JS_NondeterministicGetWeakSetKeys(JSContext* cx, JS::HandleObject obj, JS::MutableHandleObject ret);


extern unsigned
JS_PCToLineNumber(JSScript* script, jsbytecode* pc, unsigned* columnp = nullptr);







extern bool
JS_IsDeadWrapper(JSObject* obj);





extern void
JS_TraceShapeCycleCollectorChildren(JS::CallbackTracer* trc, JS::GCCellPtr shape);
extern void
JS_TraceObjectGroupCycleCollectorChildren(JS::CallbackTracer* trc, JS::GCCellPtr group);

enum {
    JS_TELEMETRY_GC_REASON,
    JS_TELEMETRY_GC_IS_ZONE_GC,
    JS_TELEMETRY_GC_MS,
    JS_TELEMETRY_GC_BUDGET_MS,
    JS_TELEMETRY_GC_ANIMATION_MS,
    JS_TELEMETRY_GC_MAX_PAUSE_MS,
    JS_TELEMETRY_GC_MARK_MS,
    JS_TELEMETRY_GC_SWEEP_MS,
    JS_TELEMETRY_GC_COMPACT_MS,
    JS_TELEMETRY_GC_MARK_ROOTS_MS,
    JS_TELEMETRY_GC_MARK_GRAY_MS,
    JS_TELEMETRY_GC_SLICE_MS,
    JS_TELEMETRY_GC_SLOW_PHASE,
    JS_TELEMETRY_GC_MMU_50,
    JS_TELEMETRY_GC_RESET,
    JS_TELEMETRY_GC_RESET_REASON,
    JS_TELEMETRY_GC_INCREMENTAL_DISABLED,
    JS_TELEMETRY_GC_NON_INCREMENTAL,
    JS_TELEMETRY_GC_NON_INCREMENTAL_REASON,
    JS_TELEMETRY_GC_SCC_SWEEP_TOTAL_MS,
    JS_TELEMETRY_GC_SCC_SWEEP_MAX_PAUSE_MS,
    JS_TELEMETRY_GC_MINOR_REASON,
    JS_TELEMETRY_GC_MINOR_REASON_LONG,
    JS_TELEMETRY_GC_MINOR_US,
    JS_TELEMETRY_GC_NURSERY_BYTES,
    JS_TELEMETRY_GC_PRETENURE_COUNT,
    JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT,
    JS_TELEMETRY_DEPRECATED_LANGUAGE_EXTENSIONS_IN_ADDONS,
    JS_TELEMETRY_ADDON_EXCEPTIONS,
    JS_TELEMETRY_AOT_USAGE,
    JS_TELEMETRY_PRIVILEGED_PARSER_COMPILE_LAZY_AFTER_MS,
    JS_TELEMETRY_WEB_PARSER_COMPILE_LAZY_AFTER_MS,
    JS_TELEMETRY_END
};

typedef void
(*JSAccumulateTelemetryDataCallback)(int id, uint32_t sample, const char* key);

extern void
JS_SetAccumulateTelemetryCallback(JSContext* cx, JSAccumulateTelemetryDataCallback callback);

extern bool
JS_GetIsSecureContext(JSCompartment* compartment);

extern JSPrincipals*
JS_GetCompartmentPrincipals(JSCompartment* compartment);

extern void
JS_SetCompartmentPrincipals(JSCompartment* compartment, JSPrincipals* principals);

extern JSPrincipals*
JS_GetScriptPrincipals(JSScript* script);

extern bool
JS_ScriptHasMutedErrors(JSScript* script);

extern JSObject*
JS_CloneObject(JSContext* cx, JS::HandleObject obj, JS::HandleObject proto);
# 181 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
JS_InitializePropertiesFromCompatibleNativeObject(JSContext* cx,
                                                  JS::HandleObject dst,
                                                  JS::HandleObject src);

extern JSString*
JS_BasicObjectToString(JSContext* cx, JS::HandleObject obj);

namespace js {

bool
GetBuiltinClass(JSContext* cx, JS::HandleObject obj, ESClass* cls);

const char*
ObjectClassName(JSContext* cx, JS::HandleObject obj);

void
ReportOverRecursed(JSContext* maybecx);

bool
AddRawValueRoot(JSContext* cx, JS::Value* vp, const char* name);

void
RemoveRawValueRoot(JSContext* cx, JS::Value* vp);

JSAtom*
GetPropertyNameFromPC(JSScript* script, jsbytecode* pc);
# 218 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern void
DumpString(JSString* str, FILE* fp);

extern void
DumpAtom(JSAtom* atom, FILE* fp);

extern void
DumpObject(JSObject* obj, FILE* fp);

extern void
DumpChars(const char16_t* s, size_t n, FILE* fp);

extern void
DumpValue(const JS::Value& val, FILE* fp);

extern void
DumpId(jsid id, FILE* fp);

extern void
DumpInterpreterFrame(JSContext* cx, FILE* fp, InterpreterFrame* start = nullptr);

extern bool
DumpPC(JSContext* cx, FILE* fp);

extern bool
DumpScript(JSContext* cx, JSScript* scriptArg, FILE* fp);



extern void DumpString(JSString* str);
extern void DumpAtom(JSAtom* atom);
extern void DumpObject(JSObject* obj);
extern void DumpChars(const char16_t* s, size_t n);
extern void DumpValue(const JS::Value& val);
extern void DumpId(jsid id);
extern void DumpInterpreterFrame(JSContext* cx, InterpreterFrame* start = nullptr);
extern bool DumpPC(JSContext* cx);
extern bool DumpScript(JSContext* cx, JSScript* scriptArg);



extern void
DumpBacktrace(JSContext* cx, FILE* fp);

extern void
DumpBacktrace(JSContext* cx);

}

namespace JS {


extern char*
FormatStackDump(JSContext* cx, char* buf, bool showArgs, bool showLocals, bool showThisProps);





extern bool
ForceLexicalInitialization(JSContext *cx, HandleObject obj);






extern int
IsGCPoisoning();

}
# 297 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
JS_CopyPropertiesFrom(JSContext* cx, JS::HandleObject target, JS::HandleObject obj);
# 309 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
typedef enum {
    MakeNonConfigurableIntoConfigurable,
    CopyNonConfigurableAsIs
} PropertyCopyBehavior;

extern bool
JS_CopyPropertyFrom(JSContext* cx, JS::HandleId id, JS::HandleObject target,
                    JS::HandleObject obj,
                    PropertyCopyBehavior copyBehavior = CopyNonConfigurableAsIs);

extern bool
JS_WrapPropertyDescriptor(JSContext* cx, JS::MutableHandle<JS::PropertyDescriptor> desc);

struct JSFunctionSpecWithHelp {
    const char* name;
    JSNative call;
    uint16_t nargs;
    uint16_t flags;
    const JSJitInfo* jitInfo;
    const char* usage;
    const char* help;
};
# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
JS_DefineFunctionsWithHelp(JSContext* cx, JS::HandleObject obj, const JSFunctionSpecWithHelp* fs);

namespace js {

extern const js::ClassOps ProxyClassOps;
extern const js::ClassExtension ProxyClassExtension;
extern const js::ObjectOps ProxyObjectOps;
# 377 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern JSObject*
proxy_WeakmapKeyDelegate(JSObject* obj);
# 391 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
class SourceHook {
  public:
    virtual ~SourceHook() { }






    virtual bool load(JSContext* cx, const char* filename, char16_t** src, size_t* length) = 0;
};







extern void
SetSourceHook(JSContext* cx, mozilla::UniquePtr<SourceHook> hook);


extern mozilla::UniquePtr<SourceHook>
ForgetSourceHook(JSContext* cx);

extern JS::Zone*
GetCompartmentZone(JSCompartment* comp);

typedef bool
(* PreserveWrapperCallback)(JSContext* cx, JSObject* obj);

typedef enum {
    CollectNurseryBeforeDump,
    IgnoreNurseryObjects
} DumpHeapNurseryBehaviour;





extern void
DumpHeap(JSContext* cx, FILE* fp, DumpHeapNurseryBehaviour nurseryBehaviour);


bool obj_defineGetter(JSContext* cx, unsigned argc, JS::Value* vp);
bool obj_defineSetter(JSContext* cx, unsigned argc, JS::Value* vp);


extern bool
IsSystemCompartment(JSCompartment* comp);

extern bool
IsSystemZone(JS::Zone* zone);

extern bool
IsAtomsCompartment(JSCompartment* comp);

extern bool
IsAtomsZone(JS::Zone* zone);

struct WeakMapTracer
{
    JSContext* context;

    explicit WeakMapTracer(JSContext* cx) : context(cx) {}







    virtual void trace(JSObject* m, JS::GCCellPtr key, JS::GCCellPtr value) = 0;
};

extern void
TraceWeakMaps(WeakMapTracer* trc);

extern bool
AreGCGrayBitsValid(JSContext* cx);

extern bool
ZoneGlobalsAreAllGray(JS::Zone* zone);

typedef void
(*GCThingCallback)(void* closure, JS::GCCellPtr thing);

extern void
VisitGrayWrapperTargets(JS::Zone* zone, GCThingCallback callback, void* closure);

extern JSObject*
GetWeakmapKeyDelegate(JSObject* key);




extern void
IterateGrayObjects(JS::Zone* zone, GCThingCallback cellCallback, void* data);





extern void
IterateGrayObjectsUnderCC(JS::Zone* zone, GCThingCallback cellCallback, void* data);
# 508 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern size_t
SizeOfDataIfCDataObject(mozilla::MallocSizeOf mallocSizeOf, JSObject* obj);


extern JSCompartment*
GetAnyCompartmentInZone(JS::Zone* zone);







namespace shadow {

struct ObjectGroup {
    const Class* clasp;
    JSObject* proto;
    JSCompartment* compartment;
};

struct BaseShape {
    const js::Class* clasp_;
    JSObject* parent;
};

class Shape {
public:
    shadow::BaseShape* base;
    jsid _1;
    uint32_t slotInfo;

    static const uint32_t FIXED_SLOTS_SHIFT = 27;
};






struct Object {
    shadow::ObjectGroup* group;
    shadow::Shape* shape;
    JS::Value* slots;
    void* _1;

    size_t numFixedSlots() const { return shape->slotInfo >> Shape::FIXED_SLOTS_SHIFT; }
    JS::Value* fixedSlots() const {
        return (JS::Value*)(uintptr_t(this) + sizeof(shadow::Object));
    }

    JS::Value& slotRef(size_t slot) const {
        size_t nfixed = numFixedSlots();
        if (slot < nfixed)
            return fixedSlots()[slot];
        return slots[slot - nfixed];
    }
};

struct Function {
    Object base;
    uint16_t nargs;
    uint16_t flags;

    JSNative native;
    const JSJitInfo* jitinfo;
    void* _1;
};

struct String
{
    static const uint32_t INLINE_CHARS_BIT = ((uint32_t)1 << (2));
    static const uint32_t LATIN1_CHARS_BIT = ((uint32_t)1 << (6));
    static const uint32_t ROPE_FLAGS = 0;
    static const uint32_t EXTERNAL_FLAGS = ((uint32_t)1 << (5));
    static const uint32_t TYPE_FLAGS_MASK = ((uint32_t)1 << (6)) - 1;
    uint32_t flags;
    uint32_t length;
    union {
        const JS::Latin1Char* nonInlineCharsLatin1;
        const char16_t* nonInlineCharsTwoByte;
        JS::Latin1Char inlineStorageLatin1[1];
        char16_t inlineStorageTwoByte[1];
    };
    const JSStringFinalizer* externalFinalizer;
};

}



extern const js::Class* const ObjectClassPtr;

inline const js::Class*
GetObjectClass(const JSObject* obj)
{
    return reinterpret_cast<const shadow::Object*>(obj)->group->clasp;
}

inline const JSClass*
GetObjectJSClass(JSObject* obj)
{
    return js::Jsvalify(GetObjectClass(obj));
}

const Class*
ProtoKeyToClass(JSProtoKey key);
# 623 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
inline JSProtoKey
InheritanceProtoKeyForStandardClass(JSProtoKey key)
{

    if (key == JSProto_Object)
        return JSProto_Null;


    if (ProtoKeyToClass(key)->specDefined())
        return ProtoKeyToClass(key)->specInheritanceProtoKey();


    return JSProto_Object;
}

bool
IsFunctionObject(JSObject* obj);

static __attribute__((always_inline)) inline JSCompartment*
GetObjectCompartment(JSObject* obj)
{
    return reinterpret_cast<shadow::Object*>(obj)->group->compartment;
}

JSObject*
GetGlobalForObjectCrossCompartment(JSObject* obj);

JSObject*
GetPrototypeNoProxy(JSObject* obj);

void
AssertSameCompartment(JSContext* cx, JSObject* obj);

void
AssertSameCompartment(JSContext* cx, JS::HandleValue v);


void
AssertSameCompartment(JSObject* objA, JSObject* objB);




void
NotifyAnimationActivity(JSObject* obj);
# 678 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
JSFunction*
GetOutermostEnclosingFunctionOfScriptedCaller(JSContext* cx);

JSFunction*
DefineFunctionWithReserved(JSContext* cx, JSObject* obj, const char* name, JSNative call,
                           unsigned nargs, unsigned attrs);

JSFunction*
NewFunctionWithReserved(JSContext* cx, JSNative call, unsigned nargs, unsigned flags,
                        const char* name);

JSFunction*
NewFunctionByIdWithReserved(JSContext* cx, JSNative native, unsigned nargs, unsigned flags,
                            jsid id);

const JS::Value&
GetFunctionNativeReserved(JSObject* fun, size_t which);

void
SetFunctionNativeReserved(JSObject* fun, size_t which, const JS::Value& val);

bool
FunctionHasNativeReserved(JSObject* fun);

bool
GetObjectProto(JSContext* cx, JS::HandleObject obj, JS::MutableHandleObject proto);

extern JSObject*
GetStaticPrototype(JSObject* obj);

bool
GetOriginalEval(JSContext* cx, JS::HandleObject scope,
                JS::MutableHandleObject eval);

inline void*
GetObjectPrivate(JSObject* obj)
{
    do { } while (0);
    const shadow::Object* nobj = reinterpret_cast<const shadow::Object*>(obj);
    void** addr = reinterpret_cast<void**>(&nobj->fixedSlots()[nobj->numFixedSlots()]);
    return *addr;
}

inline const JS::Value&
GetReservedSlot(JSObject* obj, size_t slot)
{
    do { } while (0);
    return reinterpret_cast<const shadow::Object*>(obj)->slotRef(slot);
}

void
SetReservedOrProxyPrivateSlotWithBarrier(JSObject* obj, size_t slot, const JS::Value& value);

inline void
SetReservedSlot(JSObject* obj, size_t slot, const JS::Value& value)
{
    do { } while (0);
    shadow::Object* sobj = reinterpret_cast<shadow::Object*>(obj);
    if (sobj->slotRef(slot).isGCThing() || value.isGCThing())
        SetReservedOrProxyPrivateSlotWithBarrier(obj, slot, value);
    else
        sobj->slotRef(slot) = value;
}

uint32_t
GetObjectSlotSpan(JSObject* obj);

inline const JS::Value&
GetObjectSlot(JSObject* obj, size_t slot)
{
    do { } while (0);
    return reinterpret_cast<const shadow::Object*>(obj)->slotRef(slot);
}

__attribute__((always_inline)) inline size_t
GetAtomLength(JSAtom* atom)
{
    return reinterpret_cast<shadow::String*>(atom)->length;
}

static const uint32_t MaxStringLength = (1 << 28) - 1;

__attribute__((always_inline)) inline size_t
GetStringLength(JSString* s)
{
    return reinterpret_cast<shadow::String*>(s)->length;
}

__attribute__((always_inline)) inline size_t
GetFlatStringLength(JSFlatString* s)
{
    return reinterpret_cast<shadow::String*>(s)->length;
}

__attribute__((always_inline)) inline size_t
GetLinearStringLength(JSLinearString* s)
{
    return reinterpret_cast<shadow::String*>(s)->length;
}

__attribute__((always_inline)) inline bool
LinearStringHasLatin1Chars(JSLinearString* s)
{
    return reinterpret_cast<shadow::String*>(s)->flags & shadow::String::LATIN1_CHARS_BIT;
}

__attribute__((always_inline)) inline bool
AtomHasLatin1Chars(JSAtom* atom)
{
    return reinterpret_cast<shadow::String*>(atom)->flags & shadow::String::LATIN1_CHARS_BIT;
}

__attribute__((always_inline)) inline bool
StringHasLatin1Chars(JSString* s)
{
    return reinterpret_cast<shadow::String*>(s)->flags & shadow::String::LATIN1_CHARS_BIT;
}

__attribute__((always_inline)) inline const JS::Latin1Char*
GetLatin1LinearStringChars(const JS::AutoCheckCannotGC& nogc, JSLinearString* linear)
{
    do { } while (0);

    using shadow::String;
    String* s = reinterpret_cast<String*>(linear);
    if (s->flags & String::INLINE_CHARS_BIT)
        return s->inlineStorageLatin1;
    return s->nonInlineCharsLatin1;
}

__attribute__((always_inline)) inline const char16_t*
GetTwoByteLinearStringChars(const JS::AutoCheckCannotGC& nogc, JSLinearString* linear)
{
    do { } while (0);

    using shadow::String;
    String* s = reinterpret_cast<String*>(linear);
    if (s->flags & String::INLINE_CHARS_BIT)
        return s->inlineStorageTwoByte;
    return s->nonInlineCharsTwoByte;
}

__attribute__((always_inline)) inline JSLinearString*
AtomToLinearString(JSAtom* atom)
{
    return reinterpret_cast<JSLinearString*>(atom);
}

__attribute__((always_inline)) inline JSFlatString*
AtomToFlatString(JSAtom* atom)
{
    return reinterpret_cast<JSFlatString*>(atom);
}

__attribute__((always_inline)) inline JSLinearString*
FlatStringToLinearString(JSFlatString* s)
{
    return reinterpret_cast<JSLinearString*>(s);
}

__attribute__((always_inline)) inline const JS::Latin1Char*
GetLatin1AtomChars(const JS::AutoCheckCannotGC& nogc, JSAtom* atom)
{
    return GetLatin1LinearStringChars(nogc, AtomToLinearString(atom));
}

__attribute__((always_inline)) inline const char16_t*
GetTwoByteAtomChars(const JS::AutoCheckCannotGC& nogc, JSAtom* atom)
{
    return GetTwoByteLinearStringChars(nogc, AtomToLinearString(atom));
}

__attribute__((always_inline)) inline bool
IsExternalString(JSString* str, const JSStringFinalizer** fin, const char16_t** chars)
{
    using shadow::String;
    String* s = reinterpret_cast<String*>(str);

    if ((s->flags & String::TYPE_FLAGS_MASK) != String::EXTERNAL_FLAGS)
        return false;

    do { } while (0);
    *fin = s->externalFinalizer;
    *chars = s->nonInlineCharsTwoByte;
    return true;
}

JSLinearString*
StringToLinearStringSlow(JSContext* cx, JSString* str);

__attribute__((always_inline)) inline JSLinearString*
StringToLinearString(JSContext* cx, JSString* str)
{
    using shadow::String;
    String* s = reinterpret_cast<String*>(str);
    if ((__builtin_expect(!!((s->flags & String::TYPE_FLAGS_MASK) == String::ROPE_FLAGS), 0)))
        return StringToLinearStringSlow(cx, str);
    return reinterpret_cast<JSLinearString*>(str);
}

template<typename CharType>
__attribute__((always_inline)) inline void
CopyLinearStringChars(CharType* dest, JSLinearString* s, size_t len, size_t start = 0);

__attribute__((always_inline)) inline void
CopyLinearStringChars(char16_t* dest, JSLinearString* s, size_t len, size_t start = 0)
{
    do { } while (0);
    JS::AutoCheckCannotGC nogc;
    if (LinearStringHasLatin1Chars(s)) {
        const JS::Latin1Char* src = GetLatin1LinearStringChars(nogc, s);
        for (size_t i = 0; i < len; i++)
            dest[i] = src[start + i];
    } else {
        const char16_t* src = GetTwoByteLinearStringChars(nogc, s);
        mozilla::PodCopy(dest, src + start, len);
    }
}

__attribute__((always_inline)) inline void
CopyLinearStringChars(char* dest, JSLinearString* s, size_t len, size_t start = 0)
{
    do { } while (0);
    JS::AutoCheckCannotGC nogc;
    if (LinearStringHasLatin1Chars(s)) {
        const JS::Latin1Char* src = GetLatin1LinearStringChars(nogc, s);
        for (size_t i = 0; i < len; i++)
           dest[i] = char(src[start + i]);
    } else {
      const char16_t* src = GetTwoByteLinearStringChars(nogc, s);
      for (size_t i = 0; i < len; i++)
          dest[i] = char(src[start + i]);
    }
}

template<typename CharType>
inline bool
CopyStringChars(JSContext* cx, CharType* dest, JSString* s, size_t len, size_t start = 0)
{
    JSLinearString* linear = StringToLinearString(cx, s);
    if (!linear)
        return false;

    CopyLinearStringChars(dest, linear, len, start);
    return true;
}

inline void
CopyFlatStringChars(char16_t* dest, JSFlatString* s, size_t len)
{
    CopyLinearStringChars(dest, FlatStringToLinearString(s), len);
}
# 952 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
bool
GetPropertyKeys(JSContext* cx, JS::HandleObject obj, unsigned flags, JS::AutoIdVector* props);

bool
AppendUnique(JSContext* cx, JS::AutoIdVector& base, JS::AutoIdVector& others);

bool
StringIsArrayIndex(JSLinearString* str, uint32_t* indexp);

void
SetPreserveWrapperCallback(JSContext* cx, PreserveWrapperCallback callback);

bool
IsObjectInContextCompartment(JSObject* obj, const JSContext* cx);
# 980 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
bool
RunningWithTrustedPrincipals(JSContext* cx);

__attribute__((always_inline)) inline uintptr_t
GetNativeStackLimit(JSContext* cx, JS::StackKind kind, int extraAllowance = 0)
{
    uintptr_t limit = JS::RootingContext::get(cx)->nativeStackLimit[kind];



    limit -= extraAllowance;

    return limit;
}

__attribute__((always_inline)) inline uintptr_t
GetNativeStackLimit(JSContext* cx, int extraAllowance = 0)
{
    JS::StackKind kind = RunningWithTrustedPrincipals(cx) ? JS::StackForTrustedScript
                                                          : JS::StackForUntrustedScript;
    return GetNativeStackLimit(cx, kind, extraAllowance);
}
# 1012 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
__attribute__((always_inline)) inline bool
CheckRecursionLimit(JSContext* cx, uintptr_t limit)
{
    int stackDummy;
    if (!((__builtin_expect(!!((uintptr_t)(&stackDummy) > (limit)), 1)))) {
        ReportOverRecursed(cx);
        return false;
    }
    return true;
}

__attribute__((always_inline)) inline bool
CheckRecursionLimitDontReport(JSContext* cx, uintptr_t limit)
{
    int stackDummy;
    return ((__builtin_expect(!!((uintptr_t)(&stackDummy) > (limit)), 1)));
}

__attribute__((always_inline)) inline bool
CheckRecursionLimit(JSContext* cx)
{




    uintptr_t untrustedLimit = GetNativeStackLimit(cx, JS::StackForUntrustedScript);
    if ((__builtin_expect(!!(CheckRecursionLimitDontReport(cx, untrustedLimit)), 1)))
        return true;
    return CheckRecursionLimit(cx, GetNativeStackLimit(cx));
}

__attribute__((always_inline)) inline bool
CheckRecursionLimitDontReport(JSContext* cx)
{
    return CheckRecursionLimitDontReport(cx, GetNativeStackLimit(cx));
}

__attribute__((always_inline)) inline bool
CheckRecursionLimitWithStackPointerDontReport(JSContext* cx, void* sp)
{
    return ((__builtin_expect(!!((uintptr_t)(sp) > (GetNativeStackLimit(cx))), 1)));
}

__attribute__((always_inline)) inline bool
CheckRecursionLimitWithStackPointer(JSContext* cx, void* sp)
{
    if (!((__builtin_expect(!!((uintptr_t)(sp) > (GetNativeStackLimit(cx))), 1)))) {
        ReportOverRecursed(cx);
        return false;
    }
    return true;
}

__attribute__((always_inline)) inline bool
CheckSystemRecursionLimit(JSContext* cx)
{
    return CheckRecursionLimit(cx, GetNativeStackLimit(cx, JS::StackForSystemCode));
}

__attribute__((always_inline)) inline bool
CheckRecursionLimitConservative(JSContext* cx)
{
    return CheckRecursionLimit(cx, GetNativeStackLimit(cx, JS::StackForUntrustedScript,
                                                       -1024 * int(sizeof(size_t))));
}

__attribute__((always_inline)) inline bool
CheckRecursionLimitConservativeDontReport(JSContext* cx)
{
    return CheckRecursionLimitDontReport(cx, GetNativeStackLimit(cx, JS::StackForUntrustedScript,
                                                                 -1024 * int(sizeof(size_t))));
}

void
StartPCCountProfiling(JSContext* cx);

void
StopPCCountProfiling(JSContext* cx);

void
PurgePCCounts(JSContext* cx);

size_t
GetPCCountScriptCount(JSContext* cx);

JSString*
GetPCCountScriptSummary(JSContext* cx, size_t script);

JSString*
GetPCCountScriptContents(JSContext* cx, size_t script);
# 1111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
char*
GetCodeCoverageSummary(JSContext* cx, size_t* length);

typedef void
(* ActivityCallback)(void* arg, bool active);






void
SetActivityCallback(JSContext* cx, ActivityCallback cb, void* arg);

typedef bool
(* DOMInstanceClassHasProtoAtDepth)(const Class* instanceClass,
                                    uint32_t protoID, uint32_t depth);
struct JSDOMCallbacks {
    DOMInstanceClassHasProtoAtDepth instanceClassMatchesProto;
};
typedef struct JSDOMCallbacks DOMCallbacks;

extern void
SetDOMCallbacks(JSContext* cx, const DOMCallbacks* callbacks);

extern const DOMCallbacks*
GetDOMCallbacks(JSContext* cx);

extern JSObject*
GetTestingFunctions(JSContext* cx);






inline JSFreeOp*
CastToJSFreeOp(FreeOp* fop)
{
    return reinterpret_cast<JSFreeOp*>(fop);
}







extern JSFlatString*
GetErrorTypeName(JSContext* cx, int16_t exnType);


extern unsigned
GetEnterCompartmentDepth(JSContext* cx);


extern bool
RegExpToSharedNonInline(JSContext* cx, JS::HandleObject regexp,
                        JS::MutableHandle<RegExpShared*> shared);


typedef enum NukeReferencesToWindow {
    NukeWindowReferences,
    DontNukeWindowReferences
} NukeReferencesToWindow;

typedef enum NukeReferencesFromTarget {
    NukeAllReferences,
    NukeIncomingReferences,
} NukeReferencesFromTarget;





struct CompartmentFilter {
    virtual bool match(JSCompartment* c) const = 0;
};

struct AllCompartments : public CompartmentFilter {
    virtual bool match(JSCompartment* c) const override { return true; }
};

struct ContentCompartmentsOnly : public CompartmentFilter {
    virtual bool match(JSCompartment* c) const override {
        return !IsSystemCompartment(c);
    }
};

struct ChromeCompartmentsOnly : public CompartmentFilter {
    virtual bool match(JSCompartment* c) const override {
        return IsSystemCompartment(c);
    }
};

struct SingleCompartment : public CompartmentFilter {
    JSCompartment* ours;
    explicit SingleCompartment(JSCompartment* c) : ours(c) {}
    virtual bool match(JSCompartment* c) const override { return c == ours; }
};

struct CompartmentsWithPrincipals : public CompartmentFilter {
    JSPrincipals* principals;
    explicit CompartmentsWithPrincipals(JSPrincipals* p) : principals(p) {}
    virtual bool match(JSCompartment* c) const override {
        return JS_GetCompartmentPrincipals(c) == principals;
    }
};

extern bool
NukeCrossCompartmentWrappers(JSContext* cx,
                             const CompartmentFilter& sourceFilter,
                             const CompartmentFilter& targetFilter,
                             NukeReferencesToWindow nukeReferencesToWindow,
                             NukeReferencesFromTarget nukeReferencesFromTarget);
# 1252 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
struct ExpandoAndGeneration {
  ExpandoAndGeneration()
    : expando(JS::UndefinedValue()),
      generation(0)
  {}

  void OwnerUnlinked()
  {
      ++generation;
  }

  static size_t offsetOfExpando()
  {
      return __builtin_offsetof(ExpandoAndGeneration, expando);
  }

  static size_t offsetOfGeneration()
  {
      return __builtin_offsetof(ExpandoAndGeneration, generation);
  }

  JS::Heap<JS::Value> expando;
  uint64_t generation;
};

typedef enum DOMProxyShadowsResult {
  ShadowCheckFailed,
  Shadows,
  DoesntShadow,
  DoesntShadowUnique,
  ShadowsViaDirectExpando,
  ShadowsViaIndirectExpando
} DOMProxyShadowsResult;
typedef DOMProxyShadowsResult
(* DOMProxyShadowsCheck)(JSContext* cx, JS::HandleObject object, JS::HandleId id);
void
SetDOMProxyInformation(const void* domProxyHandlerFamily, uint32_t domProxyExpandoSlot,
                       DOMProxyShadowsCheck domProxyShadowsCheck);

const void* GetDOMProxyHandlerFamily();
uint32_t GetDOMProxyExpandoSlot();
DOMProxyShadowsCheck GetDOMProxyShadowsCheck();
inline bool DOMProxyIsShadowing(DOMProxyShadowsResult result) {
    return result == Shadows ||
           result == ShadowsViaDirectExpando ||
           result == ShadowsViaIndirectExpando;
}




extern bool
DateIsValid(JSContext* cx, JS::HandleObject obj, bool* isValid);

extern bool
DateGetMsecSinceEpoch(JSContext* cx, JS::HandleObject obj, double* msecSinceEpoch);

}







typedef enum JSErrNum {



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js.msg" 1
# 42 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js.msg"
JSMSG_NOT_AN_ERROR,
JSMSG_NOT_DEFINED,
JSMSG_MORE_ARGS_NEEDED,
JSMSG_INCOMPATIBLE_PROTO,
JSMSG_NO_CONSTRUCTOR,
JSMSG_BAD_SORT_ARG,
JSMSG_CANT_WATCH,
JSMSG_READ_ONLY,
JSMSG_CANT_DELETE,
JSMSG_CANT_TRUNCATE_ARRAY,
JSMSG_NOT_FUNCTION,
JSMSG_NOT_CONSTRUCTOR,
JSMSG_CANT_CONVERT_TO,
JSMSG_TOPRIMITIVE_NOT_CALLABLE,
JSMSG_TOPRIMITIVE_RETURNED_OBJECT,
JSMSG_NO_PROPERTIES,
JSMSG_BAD_REGEXP_FLAG,
JSMSG_ARG_INDEX_OUT_OF_RANGE,
JSMSG_SPREAD_TOO_LARGE,
JSMSG_BAD_WEAKMAP_KEY,
JSMSG_BAD_GETTER_OR_SETTER,
JSMSG_BAD_ARRAY_LENGTH,
JSMSG_REDECLARED_PREV,
JSMSG_REDECLARED_VAR,
JSMSG_UNDECLARED_VAR,
JSMSG_GETTER_ONLY,
JSMSG_OVERWRITING_ACCESSOR,
JSMSG_UNDEFINED_PROP,
JSMSG_INVALID_MAP_ITERABLE,
JSMSG_NESTING_GENERATOR,
JSMSG_INCOMPATIBLE_METHOD,
JSMSG_OBJECT_WATCH_DEPRECATED,
JSMSG_BAD_SURROGATE_CHAR,
JSMSG_UTF8_CHAR_TOO_LARGE,
JSMSG_MALFORMED_UTF8_CHAR,
JSMSG_BUILTIN_CTOR_NO_NEW,
JSMSG_BAD_GENERATOR_YIELD,
JSMSG_EMPTY_ARRAY_REDUCE,
JSMSG_UNEXPECTED_TYPE,
JSMSG_MISSING_FUN_ARG,
JSMSG_NOT_NONNULL_OBJECT,
JSMSG_NOT_NONNULL_OBJECT_NAME,
JSMSG_NOT_NONNULL_OBJECT_ARG,
JSMSG_SET_NON_OBJECT_RECEIVER,
JSMSG_INVALID_DESCRIPTOR,
JSMSG_OBJECT_NOT_EXTENSIBLE,
JSMSG_CANT_DEFINE_PROP_OBJECT_NOT_EXTENSIBLE,
JSMSG_CANT_REDEFINE_PROP,
JSMSG_CANT_REDEFINE_ARRAY_LENGTH,
JSMSG_CANT_DEFINE_PAST_ARRAY_LENGTH,
JSMSG_BAD_GET_SET_FIELD,
JSMSG_THROW_TYPE_ERROR,
JSMSG_NOT_EXPECTED_TYPE,
JSMSG_NOT_ITERABLE,
JSMSG_NOT_ITERATOR,
JSMSG_ALREADY_HAS_PRAGMA,
JSMSG_GET_ITER_RETURNED_PRIMITIVE,
JSMSG_ITER_METHOD_RETURNED_PRIMITIVE,
JSMSG_CANT_SET_PROTO,
JSMSG_CANT_SET_PROTO_OF,
JSMSG_CANT_SET_PROTO_CYCLE,
JSMSG_INVALID_ARG_TYPE,
JSMSG_TERMINATED,
JSMSG_PROTO_NOT_OBJORNULL,
JSMSG_CANT_CALL_CLASS_CONSTRUCTOR,
JSMSG_UNINITIALIZED_THIS,
JSMSG_UNINITIALIZED_THIS_ARROW,
JSMSG_BAD_DERIVED_RETURN,


JSMSG_JSON_BAD_PARSE,
JSMSG_JSON_CYCLIC_VALUE,


JSMSG_BAD_INSTANCEOF_RHS,
JSMSG_BAD_LEFTSIDE_OF_ASS,
JSMSG_BAD_PROTOTYPE,
JSMSG_IN_NOT_OBJECT,
JSMSG_TOO_MANY_CON_SPREADARGS,
JSMSG_TOO_MANY_FUN_SPREADARGS,
JSMSG_UNINITIALIZED_LEXICAL,
JSMSG_BAD_CONST_ASSIGN,
JSMSG_CANT_DECLARE_GLOBAL_BINDING,


JSMSG_INVALID_DATE,
JSMSG_BAD_TOISOSTRING_PROP,
JSMSG_DEPRECATED_TOLOCALEFORMAT,


JSMSG_BAD_URI,
JSMSG_INVALID_NORMALIZE_FORM,
JSMSG_NEGATIVE_REPETITION_COUNT,
JSMSG_NOT_A_CODEPOINT,
JSMSG_RESULTING_STRING_TOO_LARGE,
JSMSG_DEPRECATED_STRING_METHOD,


JSMSG_BAD_RADIX,
JSMSG_PRECISION_RANGE,


JSMSG_BAD_APPLY_ARGS,
JSMSG_BAD_FORMAL,
JSMSG_CALLER_IS_STRICT,
JSMSG_DEPRECATED_USAGE,
JSMSG_NOT_SCRIPTED_FUNCTION,
JSMSG_NO_REST_NAME,
JSMSG_PARAMETER_AFTER_REST,
JSMSG_TOO_MANY_ARGUMENTS,


JSMSG_CSP_BLOCKED_EVAL,
JSMSG_CSP_BLOCKED_FUNCTION,


JSMSG_ACCESSOR_DEF_DENIED,
JSMSG_DEAD_OBJECT,
JSMSG_OBJECT_ACCESS_DENIED,
JSMSG_PROPERTY_ACCESS_DENIED,


JSMSG_BAD_CLONE_FUNOBJ_SCOPE,
JSMSG_CANT_CLONE_OBJECT,
JSMSG_CANT_OPEN,
JSMSG_USER_DEFINED_ERROR,


JSMSG_ALLOC_OVERFLOW,
JSMSG_BAD_BYTECODE,
JSMSG_BUFFER_TOO_SMALL,
JSMSG_BUILD_ID_NOT_AVAILABLE,
JSMSG_BYTECODE_TOO_BIG,
JSMSG_ERR_DURING_THROW,
JSMSG_NEED_DIET,
JSMSG_OUT_OF_MEMORY,
JSMSG_OVER_RECURSED,
JSMSG_TOO_BIG_TO_ENCODE,
JSMSG_TOO_DEEP,
JSMSG_UNCAUGHT_EXCEPTION,
JSMSG_UNKNOWN_FORMAT,


JSMSG_ACCESSOR_WRONG_ARGS,
JSMSG_ARRAY_COMP_LEFTSIDE,
JSMSG_ARRAY_INIT_TOO_BIG,
JSMSG_AS_AFTER_IMPORT_STAR,
JSMSG_AS_AFTER_RESERVED_WORD,
JSMSG_ASYNC_GENERATOR,
JSMSG_AWAIT_IN_DEFAULT,
JSMSG_AWAIT_OUTSIDE_ASYNC,
JSMSG_BAD_ARROW_ARGS,
JSMSG_BAD_BINDING,
JSMSG_BAD_CONST_DECL,
JSMSG_BAD_CONTINUE,
JSMSG_BAD_DESTRUCT_ASS,
JSMSG_BAD_DESTRUCT_TARGET,
JSMSG_BAD_DESTRUCT_PARENS,
JSMSG_BAD_DESTRUCT_DECL,
JSMSG_BAD_DUP_ARGS,
JSMSG_BAD_FOR_EACH_LOOP,
JSMSG_BAD_FOR_LEFTSIDE,
JSMSG_LEXICAL_DECL_DEFINES_LET,
JSMSG_LET_STARTING_FOROF_LHS,
JSMSG_BAD_FUNCTION_YIELD,
JSMSG_BAD_GENERATOR_RETURN,
JSMSG_BAD_GENEXP_BODY,
JSMSG_BAD_INCOP_OPERAND,
JSMSG_BAD_METHOD_DEF,
JSMSG_BAD_OCTAL,
JSMSG_BAD_POW_LEFTSIDE,
JSMSG_BAD_PROP_ID,
JSMSG_BAD_RETURN_OR_YIELD,
JSMSG_BAD_STRICT_ASSIGN,
JSMSG_BAD_SWITCH,
JSMSG_BAD_SUPER,
JSMSG_BAD_SUPERPROP,
JSMSG_BAD_SUPERCALL,
JSMSG_BRACKET_AFTER_ARRAY_COMPREHENSION,
JSMSG_BRACKET_AFTER_LIST,
JSMSG_BRACKET_IN_INDEX,
JSMSG_BRACKET_OPENED,
JSMSG_CATCH_AFTER_GENERAL,
JSMSG_CATCH_IDENTIFIER,
JSMSG_CATCH_OR_FINALLY,
JSMSG_CATCH_WITHOUT_TRY,
JSMSG_COLON_AFTER_CASE,
JSMSG_COLON_AFTER_ID,
JSMSG_COLON_IN_COND,
JSMSG_COMP_PROP_UNTERM_EXPR,
JSMSG_CONTRARY_NONDIRECTIVE,
JSMSG_CURLY_AFTER_BODY,
JSMSG_CURLY_OPENED,
JSMSG_CURLY_AFTER_CATCH,
JSMSG_CURLY_AFTER_FINALLY,
JSMSG_CURLY_AFTER_LIST,
JSMSG_CURLY_AFTER_TRY,
JSMSG_CURLY_BEFORE_BODY,
JSMSG_CURLY_BEFORE_CATCH,
JSMSG_CURLY_BEFORE_CLASS,
JSMSG_CURLY_BEFORE_FINALLY,
JSMSG_CURLY_BEFORE_SWITCH,
JSMSG_CURLY_BEFORE_TRY,
JSMSG_CURLY_IN_COMPOUND,
JSMSG_DECLARATION_AFTER_EXPORT,
JSMSG_DECLARATION_AFTER_IMPORT,
JSMSG_DEPRECATED_DELETE_OPERAND,
JSMSG_DEPRECATED_EXPR_CLOSURE,
JSMSG_DEPRECATED_FOR_EACH,
JSMSG_DEPRECATED_OCTAL,
JSMSG_DEPRECATED_PRAGMA,
JSMSG_DEPRECATED_BLOCK_SCOPE_FUN_REDECL,
JSMSG_DUPLICATE_EXPORT_NAME,
JSMSG_DUPLICATE_FORMAL,
JSMSG_DUPLICATE_LABEL,
JSMSG_DUPLICATE_PROPERTY,
JSMSG_DUPLICATE_PROTO_PROPERTY,
JSMSG_EMPTY_CONSEQUENT,
JSMSG_EQUAL_AS_ASSIGN,
JSMSG_EXPORT_DECL_AT_TOP_LEVEL,
JSMSG_FINALLY_WITHOUT_TRY,
JSMSG_FORBIDDEN_AS_STATEMENT,
JSMSG_FROM_AFTER_IMPORT_CLAUSE,
JSMSG_FROM_AFTER_EXPORT_STAR,
JSMSG_GARBAGE_AFTER_INPUT,
JSMSG_IDSTART_AFTER_NUMBER,
JSMSG_ILLEGAL_CHARACTER,
JSMSG_IMPORT_DECL_AT_TOP_LEVEL,
JSMSG_OF_AFTER_FOR_LOOP_DECL,
JSMSG_IN_AFTER_LEXICAL_FOR_DECL,
JSMSG_INVALID_FOR_IN_DECL_WITH_INIT,
JSMSG_INVALID_ID,
JSMSG_LABEL_NOT_FOUND,
JSMSG_LET_COMP_BINDING,
JSMSG_LEXICAL_DECL_NOT_IN_BLOCK,
JSMSG_LEXICAL_DECL_LABEL,
JSMSG_GENERATOR_LABEL,
JSMSG_FUNCTION_LABEL,
JSMSG_SLOPPY_FUNCTION_LABEL,
JSMSG_LINE_BREAK_AFTER_THROW,
JSMSG_LINE_BREAK_BEFORE_ARROW,
JSMSG_MALFORMED_ESCAPE,
JSMSG_MISSING_BINARY_DIGITS,
JSMSG_MISSING_EXPONENT,
JSMSG_MISSING_EXPR_AFTER_THROW,
JSMSG_MISSING_FORMAL,
JSMSG_MISSING_HEXDIGITS,
JSMSG_MISSING_OCTAL_DIGITS,
JSMSG_MODULE_SPEC_AFTER_FROM,
JSMSG_NAME_AFTER_DOT,
JSMSG_NAMED_IMPORTS_OR_NAMESPACE_IMPORT,
JSMSG_NO_BINDING_NAME,
JSMSG_NO_EXPORT_NAME,
JSMSG_NO_IMPORT_NAME,
JSMSG_NO_VARIABLE_NAME,
JSMSG_OF_AFTER_FOR_NAME,
JSMSG_PAREN_AFTER_ARGS,
JSMSG_PAREN_AFTER_CATCH,
JSMSG_PAREN_AFTER_COND,
JSMSG_PAREN_AFTER_FOR,
JSMSG_PAREN_AFTER_FORMAL,
JSMSG_PAREN_AFTER_FOR_CTRL,
JSMSG_PAREN_AFTER_FOR_OF_ITERABLE,
JSMSG_PAREN_AFTER_SWITCH,
JSMSG_PAREN_AFTER_WITH,
JSMSG_PAREN_BEFORE_CATCH,
JSMSG_PAREN_BEFORE_COND,
JSMSG_PAREN_BEFORE_FORMAL,
JSMSG_PAREN_BEFORE_SWITCH,
JSMSG_PAREN_BEFORE_WITH,
JSMSG_PAREN_IN_PAREN,
JSMSG_RC_AFTER_EXPORT_SPEC_LIST,
JSMSG_RC_AFTER_IMPORT_SPEC_LIST,
JSMSG_REDECLARED_CATCH_IDENTIFIER,
JSMSG_RESERVED_ID,
JSMSG_REST_WITH_COMMA,
JSMSG_REST_WITH_DEFAULT,
JSMSG_SELFHOSTED_TOP_LEVEL_LEXICAL,
JSMSG_SELFHOSTED_METHOD_CALL,
JSMSG_SELFHOSTED_UNBOUND_NAME,
JSMSG_SEMI_AFTER_FOR_COND,
JSMSG_SEMI_AFTER_FOR_INIT,
JSMSG_SEMI_BEFORE_STMNT,
JSMSG_SOURCE_TOO_LONG,
JSMSG_STMT_AFTER_RETURN,
JSMSG_STRICT_CODE_WITH,
JSMSG_STRICT_NON_SIMPLE_PARAMS,
JSMSG_TEMPLSTR_UNTERM_EXPR,
JSMSG_SIMD_NOT_A_VECTOR,
JSMSG_TOO_MANY_CASES,
JSMSG_TOO_MANY_CATCH_VARS,
JSMSG_TOO_MANY_CON_ARGS,
JSMSG_TOO_MANY_DEFAULTS,
JSMSG_TOO_MANY_FUN_ARGS,
JSMSG_TOO_MANY_LOCALS,
JSMSG_TOO_MANY_YIELDS,
JSMSG_TOUGH_BREAK,
JSMSG_UNEXPECTED_TOKEN,
JSMSG_UNEXPECTED_PARAMLIST_END,
JSMSG_UNNAMED_CLASS_STMT,
JSMSG_UNNAMED_FUNCTION_STMT,
JSMSG_UNTERMINATED_COMMENT,
JSMSG_UNTERMINATED_REGEXP,
JSMSG_UNTERMINATED_STRING,
JSMSG_USELESS_EXPR,
JSMSG_USE_ASM_DIRECTIVE_FAIL,
JSMSG_VAR_HIDES_ARG,
JSMSG_WHILE_AFTER_DO,
JSMSG_YIELD_IN_ARROW,
JSMSG_YIELD_IN_DEFAULT,
JSMSG_YIELD_IN_METHOD,
JSMSG_BAD_COLUMN_NUMBER,
JSMSG_COMPUTED_NAME_IN_PATTERN,
JSMSG_DEFAULT_IN_PATTERN,
JSMSG_BAD_NEWTARGET,
JSMSG_ESCAPED_KEYWORD,


JSMSG_USE_ASM_TYPE_FAIL,
JSMSG_USE_ASM_LINK_FAIL,
JSMSG_USE_ASM_TYPE_OK,


JSMSG_WASM_COMPILE_ERROR,
JSMSG_WASM_BAD_IMPORT_TYPE,
JSMSG_WASM_BAD_IMPORT_SIG,
JSMSG_WASM_BAD_IMP_SIZE,
JSMSG_WASM_BAD_IMP_MAX,
JSMSG_WASM_BAD_FIT,
JSMSG_WASM_IND_CALL_TO_NULL,
JSMSG_WASM_IND_CALL_BAD_SIG,
JSMSG_WASM_UNREACHABLE,
JSMSG_WASM_INTEGER_OVERFLOW,
JSMSG_WASM_INVALID_CONVERSION,
JSMSG_WASM_INT_DIVIDE_BY_ZERO,
JSMSG_WASM_OUT_OF_BOUNDS,
JSMSG_WASM_UNALIGNED_ACCESS,
JSMSG_WASM_BAD_UINT32,
JSMSG_WASM_BAD_GROW,
JSMSG_WASM_BAD_BUF_ARG,
JSMSG_WASM_BAD_MOD_ARG,
JSMSG_WASM_BAD_BUF_MOD_ARG,
JSMSG_WASM_BAD_DESC_ARG,
JSMSG_WASM_BAD_ELEMENT,
JSMSG_WASM_BAD_IMPORT_ARG,
JSMSG_WASM_BAD_IMPORT_FIELD,
JSMSG_WASM_BAD_TABLE_VALUE,
JSMSG_WASM_BAD_I64,
JSMSG_WASM_NO_TRANSFER,
JSMSG_WASM_TEXT_FAIL,


JSMSG_BAD_TRAP_RETURN_VALUE,
JSMSG_BAD_GETPROTOTYPEOF_TRAP_RETURN,
JSMSG_INCONSISTENT_GETPROTOTYPEOF_TRAP,
JSMSG_PROXY_SETPROTOTYPEOF_RETURNED_FALSE,
JSMSG_PROXY_ISEXTENSIBLE_RETURNED_FALSE,
JSMSG_INCONSISTENT_SETPROTOTYPEOF_TRAP,
JSMSG_CANT_CHANGE_EXTENSIBILITY,
JSMSG_CANT_DEFINE_INVALID,
JSMSG_CANT_DEFINE_NEW,
JSMSG_CANT_DEFINE_NE_AS_NC,
JSMSG_PROXY_DEFINE_RETURNED_FALSE,
JSMSG_PROXY_DELETE_RETURNED_FALSE,
JSMSG_PROXY_PREVENTEXTENSIONS_RETURNED_FALSE,
JSMSG_PROXY_SET_RETURNED_FALSE,
JSMSG_CANT_REPORT_AS_NON_EXTENSIBLE,
JSMSG_CANT_REPORT_C_AS_NC,
JSMSG_CANT_REPORT_E_AS_NE,
JSMSG_CANT_REPORT_INVALID,
JSMSG_CANT_REPORT_NC_AS_NE,
JSMSG_CANT_REPORT_NEW,
JSMSG_CANT_REPORT_NE_AS_NC,
JSMSG_CANT_SET_NW_NC,
JSMSG_CANT_SET_WO_SETTER,
JSMSG_CANT_SKIP_NC,
JSMSG_ONWKEYS_STR_SYM,
JSMSG_MUST_REPORT_SAME_VALUE,
JSMSG_MUST_REPORT_UNDEFINED,
JSMSG_PROXY_CONSTRUCT_OBJECT,
JSMSG_PROXY_EXTENSIBILITY,
JSMSG_PROXY_GETOWN_OBJORUNDEF,
JSMSG_PROXY_REVOKED,
JSMSG_PROXY_ARG_REVOKED,
JSMSG_BAD_TRAP,


JSMSG_SC_BAD_CLONE_VERSION,
JSMSG_SC_BAD_SERIALIZED_DATA,
JSMSG_SC_DUP_TRANSFERABLE,
JSMSG_SC_NOT_TRANSFERABLE,
JSMSG_SC_UNSUPPORTED_TYPE,
JSMSG_SC_NOT_CLONABLE,
JSMSG_SC_SAB_TRANSFERABLE,
JSMSG_SC_SAB_DISABLED,
JSMSG_SC_SAB_REFCNT_OFLO,


JSMSG_ASSIGN_FUNCTION_OR_NULL,
JSMSG_DEBUG_BAD_LINE,
JSMSG_DEBUG_BAD_OFFSET,
JSMSG_DEBUG_BAD_REFERENT,
JSMSG_DEBUG_BAD_RESUMPTION,
JSMSG_DEBUG_BAD_YIELD,
JSMSG_DEBUG_CANT_DEBUG_GLOBAL,
JSMSG_DEBUG_CCW_REQUIRED,
JSMSG_DEBUG_COMPARTMENT_MISMATCH,
JSMSG_DEBUG_LOOP,
JSMSG_DEBUG_NOT_DEBUGGEE,
JSMSG_DEBUG_NOT_DEBUGGING,
JSMSG_DEBUG_NOT_IDLE,
JSMSG_DEBUG_NOT_LIVE,
JSMSG_DEBUG_NO_ENV_OBJECT,
JSMSG_DEBUG_PROTO,
JSMSG_DEBUG_WRONG_OWNER,
JSMSG_DEBUG_OPTIMIZED_OUT,
JSMSG_DEBUG_RESUMPTION_VALUE_DISALLOWED,
JSMSG_DEBUG_VARIABLE_NOT_FOUND,
JSMSG_DEBUG_WRAPPER_IN_WAY,
JSMSG_DEBUGGEE_WOULD_RUN,
JSMSG_NOT_CALLABLE_OR_UNDEFINED,
JSMSG_NOT_TRACKING_ALLOCATIONS,
JSMSG_OBJECT_METADATA_CALLBACK_ALREADY_SET,
JSMSG_QUERY_INNERMOST_WITHOUT_LINE_URL,
JSMSG_QUERY_LINE_WITHOUT_URL,
JSMSG_DEBUG_CANT_SET_OPT_ENV,
JSMSG_DEBUG_INVISIBLE_COMPARTMENT,
JSMSG_DEBUG_CENSUS_BREAKDOWN,
JSMSG_DEBUG_PROMISE_NOT_RESOLVED,
JSMSG_DEBUG_PROMISE_NOT_FULFILLED,
JSMSG_DEBUG_PROMISE_NOT_REJECTED,


JSMSG_TRACELOGGER_ENABLE_FAIL,


JSMSG_DATE_NOT_FINITE,
JSMSG_INTERNAL_INTL_ERROR,
JSMSG_INTL_OBJECT_NOT_INITED,
JSMSG_INVALID_CURRENCY_CODE,
JSMSG_INVALID_DIGITS_VALUE,
JSMSG_INVALID_KEYS_TYPE,
JSMSG_INVALID_KEY,
JSMSG_INVALID_LANGUAGE_TAG,
JSMSG_INVALID_LOCALES_ELEMENT,
JSMSG_INVALID_LOCALE_MATCHER,
JSMSG_INVALID_OPTION_VALUE,
JSMSG_INVALID_TIME_ZONE,
JSMSG_UNDEFINED_CURRENCY,


JSMSG_BACK_REF_OUT_OF_RANGE,
JSMSG_BAD_CLASS_RANGE,
JSMSG_ESCAPE_AT_END_OF_REGEXP,
JSMSG_EXEC_NOT_OBJORNULL,
JSMSG_INVALID_DECIMAL_ESCAPE,
JSMSG_INVALID_GROUP,
JSMSG_INVALID_IDENTITY_ESCAPE,
JSMSG_INVALID_UNICODE_ESCAPE,
JSMSG_MISSING_PAREN,
JSMSG_NEWREGEXP_FLAGGED,
JSMSG_NOTHING_TO_REPEAT,
JSMSG_NUMBERS_OUT_OF_ORDER,
JSMSG_RANGE_WITH_CLASS_ESCAPE,
JSMSG_RAW_BRACE_IN_REGEP,
JSMSG_RAW_BRACKET_IN_REGEP,
JSMSG_TOO_MANY_PARENS,
JSMSG_UNICODE_OVERFLOW,
JSMSG_UNMATCHED_RIGHT_PAREN,
JSMSG_UNTERM_CLASS,


JSMSG_DEFAULT_LOCALE_ERROR,
JSMSG_NO_SUCH_SELF_HOSTED_PROP,


JSMSG_INVALID_PROTOTYPE,
JSMSG_TYPEDOBJECT_BAD_ARGS,
JSMSG_TYPEDOBJECT_BINARYARRAY_BAD_INDEX,
JSMSG_TYPEDOBJECT_HANDLE_UNATTACHED,
JSMSG_TYPEDOBJECT_STRUCTTYPE_BAD_ARGS,
JSMSG_TYPEDOBJECT_TOO_BIG,
JSMSG_SIMD_FAILED_CONVERSION,
JSMSG_SIMD_TO_NUMBER,


JSMSG_TOO_LONG_ARRAY,


JSMSG_BAD_INDEX,
JSMSG_NON_ARRAY_BUFFER_RETURNED,
JSMSG_SAME_ARRAY_BUFFER_RETURNED,
JSMSG_SHORT_ARRAY_BUFFER_RETURNED,
JSMSG_TYPED_ARRAY_BAD_ARGS,
JSMSG_TYPED_ARRAY_NEGATIVE_ARG,
JSMSG_TYPED_ARRAY_DETACHED,
JSMSG_TYPED_ARRAY_CONSTRUCT_BOUNDS,
JSMSG_TYPED_ARRAY_CALL_OR_CONSTRUCT,
JSMSG_NON_TYPED_ARRAY_RETURNED,
JSMSG_SHORT_TYPED_ARRAY_RETURNED,


JSMSG_SHARED_ARRAY_BAD_LENGTH,
JSMSG_NON_SHARED_ARRAY_BUFFER_RETURNED,
JSMSG_SAME_SHARED_ARRAY_BUFFER_RETURNED,
JSMSG_SHORT_SHARED_ARRAY_BUFFER_RETURNED,


JSMSG_BAD_PARSE_NODE,


JSMSG_SYMBOL_TO_STRING,
JSMSG_SYMBOL_TO_NUMBER,


JSMSG_ATOMICS_BAD_ARRAY,
JSMSG_ATOMICS_TOO_LONG,
JSMSG_ATOMICS_WAIT_NOT_ALLOWED,


JSMSG_CANT_SET_INTERPOSED,
JSMSG_CANT_DEFINE_WINDOW_ELEMENT,
JSMSG_CANT_DELETE_WINDOW_ELEMENT,
JSMSG_CANT_DELETE_WINDOW_NAMED_PROPERTY,
JSMSG_CANT_PREVENT_EXTENSIONS,
JSMSG_NO_NAMED_SETTER,
JSMSG_NO_INDEXED_SETTER,


JSMSG_CANT_DELETE_SUPER,
JSMSG_REINIT_THIS,


JSMSG_BAD_DEFAULT_EXPORT,
JSMSG_MISSING_INDIRECT_EXPORT,
JSMSG_AMBIGUOUS_INDIRECT_EXPORT,
JSMSG_MISSING_IMPORT,
JSMSG_AMBIGUOUS_IMPORT,
JSMSG_MISSING_NAMESPACE_EXPORT,
JSMSG_MISSING_EXPORT,
JSMSG_MODULE_INSTANTIATE_FAILED,
JSMSG_BAD_MODULE_STATE,


JSMSG_CANNOT_RESOLVE_PROMISE_WITH_ITSELF,
JSMSG_PROMISE_CAPABILITY_HAS_SOMETHING_ALREADY,
JSMSG_PROMISE_RESOLVE_FUNCTION_NOT_CALLABLE,
JSMSG_PROMISE_REJECT_FUNCTION_NOT_CALLABLE,
JSMSG_PROMISE_ERROR_IN_WRAPPED_REJECTION_REASON,


JSMSG_RETURN_NOT_CALLABLE,
JSMSG_ITERATOR_NO_THROW,


JSMSG_FOR_AWAIT_NOT_OF,
JSMSG_NOT_AN_ASYNC_GENERATOR,
JSMSG_NOT_AN_ASYNC_ITERATOR,
JSMSG_GET_ASYNC_ITER_RETURNED_PRIMITIVE,
# 1321 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h" 2

    JSErr_Limit
} JSErrNum;

namespace js {

extern const JSErrorFormatString*
GetErrorMessage(void* userRef, const unsigned errorNumber);
# 1342 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
class AutoStableStringChars
{





    static const size_t InlineCapacity = 24;


    JS::RootedString s_;
    union {
        const char16_t* twoByteChars_;
        const JS::Latin1Char* latin1Chars_;
    };
    mozilla::Maybe<Vector<uint8_t, InlineCapacity>> ownChars_;
    enum State { Uninitialized, Latin1, TwoByte };
    State state_;

  public:
    explicit AutoStableStringChars(JSContext* cx)
      : s_(cx), state_(Uninitialized)
    {}

    __attribute__ ((warn_unused_result))
    bool init(JSContext* cx, JSString* s);


    __attribute__ ((warn_unused_result))
    bool initTwoByte(JSContext* cx, JSString* s);

    bool isLatin1() const { return state_ == Latin1; }
    bool isTwoByte() const { return state_ == TwoByte; }

    const char16_t* twoByteChars() const {
        do { } while (0);
        return twoByteChars_;
    }

    mozilla::Range<const JS::Latin1Char> latin1Range() const {
        do { } while (0);
        return mozilla::Range<const JS::Latin1Char>(latin1Chars_,
                                                    GetStringLength(s_));
    }

    mozilla::Range<const char16_t> twoByteRange() const {
        do { } while (0);
        return mozilla::Range<const char16_t>(twoByteChars_,
                                              GetStringLength(s_));
    }


    bool maybeGiveOwnershipToCaller() {
        do { } while (0);
        if (!ownChars_.isSome() || !ownChars_->extractRawBuffer())
            return false;
        state_ = Uninitialized;
        ownChars_.reset();
        return true;
    }

  private:
    AutoStableStringChars(const AutoStableStringChars& other) = delete;
    void operator=(const AutoStableStringChars& other) = delete;

    bool baseIsInline(JS::Handle<JSLinearString*> linearString);
    template <typename T> T* allocOwnChars(JSContext* cx, size_t count);
    bool copyLatin1Chars(JSContext* cx, JS::Handle<JSLinearString*> linearString);
    bool copyTwoByteChars(JSContext* cx, JS::Handle<JSLinearString*> linearString);
    bool copyAndInflateLatin1Chars(JSContext*, JS::Handle<JSLinearString*> linearString);
};

struct ErrorReport
{
    explicit ErrorReport(JSContext* cx);
    ~ErrorReport();

    enum SniffingBehavior {
        WithSideEffects,
        NoSideEffects
    };
# 1452 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
    bool init(JSContext* cx, JS::HandleValue exn,
              SniffingBehavior sniffingBehavior);

    JSErrorReport* report()
    {
        return reportp;
    }

    const JS::ConstUTF8CharsZ toStringResult()
    {
        return toStringResult_;
    }

  private:






    bool populateUncaughtExceptionReportUTF8(JSContext* cx, ...);
    bool populateUncaughtExceptionReportUTF8VA(JSContext* cx, va_list ap);


    void ReportAddonExceptionToTelementry(JSContext* cx);


    JSErrorReport* reportp;


    JSErrorReport ownedReport;



    JS::RootedString str;


    AutoStableStringChars strChars;


    JS::RootedObject exnObject;


    JSAutoByteString filename;




    JS::ConstUTF8CharsZ toStringResult_;
    JSAutoByteString toStringResultBytesStorage;
};


extern uint64_t
GetSCOffset(JSStructuredCloneWriter* writer);

namespace Scalar {







enum Type {
    Int8 = 0,
    Uint8,
    Int16,
    Uint16,
    Int32,
    Uint32,
    Float32,
    Float64,





    Uint8Clamped,




    MaxTypedArrayViewType,

    Int64,
    Float32x4,
    Int8x16,
    Int16x8,
    Int32x4
};

static inline size_t
byteSize(Type atype)
{
    switch (atype) {
      case Int8:
      case Uint8:
      case Uint8Clamped:
        return 1;
      case Int16:
      case Uint16:
        return 2;
      case Int32:
      case Uint32:
      case Float32:
        return 4;
      case Int64:
      case Float64:
        return 8;
      case Int8x16:
      case Int16x8:
      case Int32x4:
      case Float32x4:
        return 16;
      default:
        do { AnnotateMozCrashReason("MOZ_CRASH(" "invalid scalar type" ")"); do { *((volatile int*) __null) = 1568; ::abort(); } while (0); } while (0);
    }
}

static inline bool
isSignedIntType(Type atype) {
    switch (atype) {
      case Int8:
      case Int16:
      case Int32:
      case Int64:
      case Int8x16:
      case Int16x8:
      case Int32x4:
        return true;
      case Uint8:
      case Uint8Clamped:
      case Uint16:
      case Uint32:
      case Float32:
      case Float64:
      case Float32x4:
        return false;
      default:
        do { AnnotateMozCrashReason("MOZ_CRASH(" "invalid scalar type" ")"); do { *((volatile int*) __null) = 1592; ::abort(); } while (0); } while (0);
    }
}

static inline bool
isSimdType(Type atype) {
    switch (atype) {
      case Int8:
      case Uint8:
      case Uint8Clamped:
      case Int16:
      case Uint16:
      case Int32:
      case Uint32:
      case Int64:
      case Float32:
      case Float64:
        return false;
      case Int8x16:
      case Int16x8:
      case Int32x4:
      case Float32x4:
        return true;
      case MaxTypedArrayViewType:
        break;
    }
    do { AnnotateMozCrashReason("MOZ_CRASH(" "invalid scalar type" ")"); do { *((volatile int*) __null) = 1618; ::abort(); } while (0); } while (0);
}

static inline size_t
scalarByteSize(Type atype) {
    switch (atype) {
      case Int8x16:
        return 1;
      case Int16x8:
        return 2;
      case Int32x4:
      case Float32x4:
        return 4;
      case Int8:
      case Uint8:
      case Uint8Clamped:
      case Int16:
      case Uint16:
      case Int32:
      case Uint32:
      case Int64:
      case Float32:
      case Float64:
      case MaxTypedArrayViewType:
        break;
    }
    do { AnnotateMozCrashReason("MOZ_CRASH(" "invalid simd type" ")"); do { *((volatile int*) __null) = 1644; ::abort(); } while (0); } while (0);
}

}
}







extern JSObject*
JS_NewInt8Array(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewUint8Array(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewUint8ClampedArray(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewInt16Array(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewUint16Array(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewInt32Array(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewUint32Array(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewFloat32Array(JSContext* cx, uint32_t nelements);
extern JSObject*
JS_NewFloat64Array(JSContext* cx, uint32_t nelements);
# 1683 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern JSObject*
JS_NewInt8ArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewUint8ArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewUint8ClampedArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewInt16ArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewUint16ArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewInt32ArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewUint32ArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewFloat32ArrayFromArray(JSContext* cx, JS::HandleObject array);
extern JSObject*
JS_NewFloat64ArrayFromArray(JSContext* cx, JS::HandleObject array);
# 1709 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern JSObject*
JS_NewInt8ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                          uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewUint8ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                           uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewUint8ClampedArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                                  uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewInt16ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                           uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewUint16ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                            uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewInt32ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                           uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewUint32ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                            uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewFloat32ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                             uint32_t byteOffset, int32_t length);
extern JSObject*
JS_NewFloat64ArrayWithBuffer(JSContext* cx, JS::HandleObject arrayBuffer,
                             uint32_t byteOffset, int32_t length);







extern JSObject*
JS_NewSharedArrayBuffer(JSContext* cx, uint32_t nbytes);




extern JSObject*
JS_NewArrayBuffer(JSContext* cx, uint32_t nbytes);







extern bool
JS_IsTypedArrayObject(JSObject* obj);
# 1768 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
JS_IsArrayBufferViewObject(JSObject* obj);





extern bool
JS_IsInt8Array(JSObject* obj);
extern bool
JS_IsUint8Array(JSObject* obj);
extern bool
JS_IsUint8ClampedArray(JSObject* obj);
extern bool
JS_IsInt16Array(JSObject* obj);
extern bool
JS_IsUint16Array(JSObject* obj);
extern bool
JS_IsInt32Array(JSObject* obj);
extern bool
JS_IsUint32Array(JSObject* obj);
extern bool
JS_IsFloat32Array(JSObject* obj);
extern bool
JS_IsFloat64Array(JSObject* obj);
# 1802 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
JS_GetTypedArraySharedness(JSObject* obj);






namespace js {

extern JSObject*
UnwrapInt8Array(JSObject* obj);
extern JSObject*
UnwrapUint8Array(JSObject* obj);
extern JSObject*
UnwrapUint8ClampedArray(JSObject* obj);
extern JSObject*
UnwrapInt16Array(JSObject* obj);
extern JSObject*
UnwrapUint16Array(JSObject* obj);
extern JSObject*
UnwrapInt32Array(JSObject* obj);
extern JSObject*
UnwrapUint32Array(JSObject* obj);
extern JSObject*
UnwrapFloat32Array(JSObject* obj);
extern JSObject*
UnwrapFloat64Array(JSObject* obj);

extern JSObject*
UnwrapArrayBuffer(JSObject* obj);

extern JSObject*
UnwrapArrayBufferView(JSObject* obj);

extern JSObject*
UnwrapSharedArrayBuffer(JSObject* obj);


namespace detail {

extern const Class* const Int8ArrayClassPtr;
extern const Class* const Uint8ArrayClassPtr;
extern const Class* const Uint8ClampedArrayClassPtr;
extern const Class* const Int16ArrayClassPtr;
extern const Class* const Uint16ArrayClassPtr;
extern const Class* const Int32ArrayClassPtr;
extern const Class* const Uint32ArrayClassPtr;
extern const Class* const Float32ArrayClassPtr;
extern const Class* const Float64ArrayClassPtr;

const size_t TypedArrayLengthSlot = 1;

}
# 1868 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
inline void GetInt8ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, int8_t** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<int8_t*>(GetObjectPrivate(obj)); }
inline void GetUint8ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<uint8_t*>(GetObjectPrivate(obj)); }
inline void GetUint8ClampedArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<uint8_t*>(GetObjectPrivate(obj)); }
inline void GetInt16ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, int16_t** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<int16_t*>(GetObjectPrivate(obj)); }
inline void GetUint16ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint16_t** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<uint16_t*>(GetObjectPrivate(obj)); }
inline void GetInt32ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, int32_t** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<int32_t*>(GetObjectPrivate(obj)); }
inline void GetUint32ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint32_t** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<uint32_t*>(GetObjectPrivate(obj)); }
inline void GetFloat32ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, float** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<float*>(GetObjectPrivate(obj)); }
inline void GetFloat64ArrayLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, double** data) { do { } while (0); const JS::Value& lenSlot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); *length = mozilla::AssertedCast<uint32_t>(lenSlot.toInt32()); *isSharedMemory = JS_GetTypedArraySharedness(obj); *data = static_cast<double*>(GetObjectPrivate(obj)); }





extern void
GetArrayBufferViewLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data);






extern void
GetArrayBufferLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data);





extern void
GetSharedArrayBufferLengthAndData(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data);

}

uint8_t*
JS_GetSharedArrayBufferData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);






extern JSObject*
JS_GetObjectAsInt8Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, int8_t** data);
extern JSObject*
JS_GetObjectAsUint8Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data);
extern JSObject*
JS_GetObjectAsUint8ClampedArray(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data);
extern JSObject*
JS_GetObjectAsInt16Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, int16_t** data);
extern JSObject*
JS_GetObjectAsUint16Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint16_t** data);
extern JSObject*
JS_GetObjectAsInt32Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, int32_t** data);
extern JSObject*
JS_GetObjectAsUint32Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint32_t** data);
extern JSObject*
JS_GetObjectAsFloat32Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, float** data);
extern JSObject*
JS_GetObjectAsFloat64Array(JSObject* obj, uint32_t* length, bool* isSharedMemory, double** data);
extern JSObject*
JS_GetObjectAsArrayBufferView(JSObject* obj, uint32_t* length, bool* isSharedMemory, uint8_t** data);




extern JSObject*
JS_GetObjectAsArrayBuffer(JSObject* obj, uint32_t* length, uint8_t** data);
# 1944 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern js::Scalar::Type
JS_GetArrayBufferViewType(JSObject* obj);

extern js::Scalar::Type
JS_GetSharedArrayBufferViewType(JSObject* obj);







extern bool
JS_IsArrayBufferObject(JSObject* obj);

extern bool
JS_IsSharedArrayBufferObject(JSObject* obj);
# 1969 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern uint32_t
JS_GetArrayBufferByteLength(JSObject* obj);

extern uint32_t
JS_GetSharedArrayBufferByteLength(JSObject* obj);
# 1983 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
JS_ArrayBufferHasData(JSObject* obj);
# 2000 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern uint8_t*
JS_GetArrayBufferData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);






extern bool
JS_IsMappedArrayBufferObject(JSObject* obj);
# 2018 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern uint32_t
JS_GetTypedArrayLength(JSObject* obj);
# 2029 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern uint32_t
JS_GetTypedArrayByteOffset(JSObject* obj);
# 2039 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern uint32_t
JS_GetTypedArrayByteLength(JSObject* obj);






extern bool
JS_IsArrayBufferViewObject(JSObject* obj);




extern uint32_t
JS_GetArrayBufferViewByteLength(JSObject* obj);
# 2071 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern int8_t*
JS_GetInt8ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern uint8_t*
JS_GetUint8ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern uint8_t*
JS_GetUint8ClampedArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern int16_t*
JS_GetInt16ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern uint16_t*
JS_GetUint16ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern int32_t*
JS_GetInt32ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern uint32_t*
JS_GetUint32ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern float*
JS_GetFloat32ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);
extern double*
JS_GetFloat64ArrayData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);





extern void*
JS_GetArrayBufferViewData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);






extern JSObject*
JS_GetArrayBufferViewBuffer(JSContext* cx, JS::HandleObject obj, bool* isSharedMemory);







extern bool
JS_DetachArrayBuffer(JSContext* cx, JS::HandleObject obj);






extern bool
JS_IsDetachedArrayBufferObject(JSObject* obj);




bool
JS_IsDataViewObject(JSObject* obj);
# 2135 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
JSObject*
JS_NewDataView(JSContext* cx, JS::HandleObject buffer, uint32_t byteOffset, int32_t byteLength);
# 2146 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
uint32_t
JS_GetDataViewByteOffset(JSObject* obj);
# 2157 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
uint32_t
JS_GetDataViewByteLength(JSObject* obj);
# 2171 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
void*
JS_GetDataViewData(JSObject* obj, bool* isSharedMemory, const JS::AutoCheckCannotGC&);

namespace js {
# 2185 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
WatchGuts(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject callable);
# 2196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
UnwatchGuts(JSContext* cx, JS::HandleObject obj, JS::HandleId id);

namespace jit {

enum class InlinableNative : uint16_t;

}

}





class JSJitGetterCallArgs : protected JS::MutableHandleValue
{
  public:
    explicit JSJitGetterCallArgs(const JS::CallArgs& args)
      : JS::MutableHandleValue(args.rval())
    {}

    explicit JSJitGetterCallArgs(JS::RootedValue* rooted)
      : JS::MutableHandleValue(rooted)
    {}

    JS::MutableHandleValue rval() {
        return *this;
    }
};





class JSJitSetterCallArgs : protected JS::MutableHandleValue
{
  public:
    explicit JSJitSetterCallArgs(const JS::CallArgs& args)
      : JS::MutableHandleValue(args[0])
    {}

    JS::MutableHandleValue operator[](unsigned i) {
        do { } while (0);
        return *this;
    }

    unsigned length() const { return 1; }


};

struct JSJitMethodCallArgsTraits;





class JSJitMethodCallArgs : protected JS::detail::CallArgsBase<JS::detail::NoUsedRval>
{
  private:
    typedef JS::detail::CallArgsBase<JS::detail::NoUsedRval> Base;
    friend struct JSJitMethodCallArgsTraits;

  public:
    explicit JSJitMethodCallArgs(const JS::CallArgs& args) {
        argv_ = args.array();
        argc_ = args.length();
    }

    JS::MutableHandleValue rval() const {
        return Base::rval();
    }

    unsigned length() const { return Base::length(); }

    JS::MutableHandleValue operator[](unsigned i) const {
        return Base::operator[](i);
    }

    bool hasDefined(unsigned i) const {
        return Base::hasDefined(i);
    }

    JSObject& callee() const {


        return argv_[-2].toObject();
    }

    JS::HandleValue get(unsigned i) const {
        return Base::get(i);
    }
};

struct JSJitMethodCallArgsTraits
{
    static const size_t offsetOfArgv = __builtin_offsetof(JSJitMethodCallArgs, argv_);
    static const size_t offsetOfArgc = __builtin_offsetof(JSJitMethodCallArgs, argc_);
};

typedef bool
(* JSJitGetterOp)(JSContext* cx, JS::HandleObject thisObj,
                  void* specializedThis, JSJitGetterCallArgs args);
typedef bool
(* JSJitSetterOp)(JSContext* cx, JS::HandleObject thisObj,
                  void* specializedThis, JSJitSetterCallArgs args);
typedef bool
(* JSJitMethodOp)(JSContext* cx, JS::HandleObject thisObj,
                  void* specializedThis, const JSJitMethodCallArgs& args);






struct JSJitInfo {
    enum OpType {
        Getter,
        Setter,
        Method,
        StaticMethod,
        InlinableNative,
        IgnoresReturnValueNative,

        OpTypeCount
    };

    enum ArgType {

        String = (1 << 0),
        Integer = (1 << 1),
        Double = (1 << 2),
        Boolean = (1 << 3),
        Object = (1 << 4),
        Null = (1 << 5),


        Numeric = Integer | Double,


        Primitive = Numeric | Boolean | Null | String,
        ObjectOrNull = Object | Null,
        Any = ObjectOrNull | Primitive,


        ArgTypeListEnd = (1 << 31)
    };

    static_assert(Any & String, "Any must include String.");
    static_assert(Any & Integer, "Any must include Integer.");
    static_assert(Any & Double, "Any must include Double.");
    static_assert(Any & Boolean, "Any must include Boolean.");
    static_assert(Any & Object, "Any must include Object.");
    static_assert(Any & Null, "Any must include Null.");






    enum AliasSet {




        AliasNone,





        AliasDOMSets,





        AliasEverything,


        AliasSetCount
    };

    bool needsOuterizedThisObject() const
    {
        return type() != Getter && type() != Setter;
    }

    bool isTypedMethodJitInfo() const
    {
        return isTypedMethod;
    }

    OpType type() const
    {
        return OpType(type_);
    }

    AliasSet aliasSet() const
    {
        return AliasSet(aliasSet_);
    }

    JSValueType returnType() const
    {
        return JSValueType(returnType_);
    }

    union {
        JSJitGetterOp getter;
        JSJitSetterOp setter;
        JSJitMethodOp method;

        JSNative staticMethod;
        JSNative ignoresReturnValueMethod;
    };

    static unsigned offsetOfIgnoresReturnValueNative() {
        return __builtin_offsetof(JSJitInfo, ignoresReturnValueMethod);
    }

    union {
        uint16_t protoID;
        js::jit::InlinableNative inlinableNative;
    };

    union {
        uint16_t depth;


        uint16_t nativeOp;
    };
# 2440 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
    uint32_t type_ : 4;







    uint32_t aliasSet_ : 4;


    uint32_t returnType_ : 8;

    static_assert(OpTypeCount <= (1 << 4),
                  "Not enough space for OpType");
    static_assert(AliasSetCount <= (1 << 4),
                  "Not enough space for AliasSet");
    static_assert((sizeof(JSValueType) * 8) <= 8,
                  "Not enough space for JSValueType");






    uint32_t isInfallible : 1;







    uint32_t isMovable : 1;






    uint32_t isEliminatable : 1;






    uint32_t isAlwaysInSlot : 1;





    uint32_t isLazilyCachedInSlot : 1;


    uint32_t isTypedMethod : 1;






    uint32_t slotIndex : 10;

    static const size_t maxSlotIndex = (1 << 10) - 1;


};

static_assert(sizeof(JSJitInfo) == (sizeof(void*) + 2 * sizeof(uint32_t)),
              "There are several thousand instances of JSJitInfo stored in "
              "a binary. Please don't increase its space requirements without "
              "verifying that there is no other way forward (better packing, "
              "smaller datatypes for fields, subclassing, etc.).");

struct JSTypedMethodJitInfo
{
# 2526 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
    JSJitInfo base;

    const JSJitInfo::ArgType* const argTypes;





};

namespace js {

static __attribute__((always_inline)) inline shadow::Function*
FunctionObjectToShadowFunction(JSObject* fun)
{
    do { } while (0);
    return reinterpret_cast<shadow::Function*>(fun);
}


static const unsigned JS_FUNCTION_INTERPRETED_BITS = 0x0201;


static __attribute__((always_inline)) inline bool
FunctionObjectIsNative(JSObject* fun)
{
    return !(FunctionObjectToShadowFunction(fun)->flags & JS_FUNCTION_INTERPRETED_BITS);
}

static __attribute__((always_inline)) inline JSNative
GetFunctionObjectNative(JSObject* fun)
{
    do { } while (0);
    return FunctionObjectToShadowFunction(fun)->native;
}

}

static __attribute__((always_inline)) inline const JSJitInfo*
FUNCTION_VALUE_TO_JITINFO(const JS::Value& v)
{
    do { } while (0);
    return js::FunctionObjectToShadowFunction(&v.toObject())->jitinfo;
}

static __attribute__((always_inline)) inline void
SET_JITINFO(JSFunction * func, const JSJitInfo* info)
{
    js::shadow::Function* fun = reinterpret_cast<js::shadow::Function*>(func);
    do { } while (0);
    fun->jitinfo = info;
}






static __attribute__((always_inline)) inline jsid
JSID_FROM_BITS(size_t bits)
{
    jsid id;
    (id.asBits) = bits;
    return id;
}

namespace js {
namespace detail {
bool IdMatchesAtom(jsid id, JSAtom* atom);
}
}
# 2619 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
static __attribute__((always_inline)) inline jsid
NON_INTEGER_ATOM_TO_JSID(JSAtom* atom)
{
    do { } while (0);
    jsid id = JSID_FROM_BITS((size_t)atom);
    do { } while (0);
    return id;
}


static __attribute__((always_inline)) inline bool
JSID_IS_ATOM(jsid id)
{
    return JSID_IS_STRING(id);
}

static __attribute__((always_inline)) inline bool
JSID_IS_ATOM(jsid id, JSAtom* atom)
{
    return id == JSID_FROM_BITS((size_t)atom);
}

static __attribute__((always_inline)) inline JSAtom*
JSID_TO_ATOM(jsid id)
{
    return (JSAtom*)JSID_TO_STRING(id);
}

static_assert(sizeof(jsid) == sizeof(void*), "JS_STATIC_ASSERT");

namespace js {

static __attribute__((always_inline)) inline JS::Value
IdToValue(jsid id)
{
    if (JSID_IS_STRING(id))
        return JS::StringValue(JSID_TO_STRING(id));
    if (JSID_IS_INT(id))
        return JS::Int32Value(JSID_TO_INT(id));
    if (JSID_IS_SYMBOL(id))
        return JS::SymbolValue(JSID_TO_SYMBOL(id));
    do { } while (0);
    return JS::UndefinedValue();
}
# 2681 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
struct ScriptEnvironmentPreparer {
    struct Closure {
        virtual bool operator()(JSContext* cx) = 0;
    };

    virtual void invoke(JS::HandleObject scope, Closure& closure) = 0;
};

extern void
PrepareScriptEnvironmentAndInvoke(JSContext* cx, JS::HandleObject scope,
                                  ScriptEnvironmentPreparer::Closure& closure);

void
SetScriptEnvironmentPreparer(JSContext* cx, ScriptEnvironmentPreparer* preparer);

enum CTypesActivityType {
    CTYPES_CALL_BEGIN,
    CTYPES_CALL_END,
    CTYPES_CALLBACK_BEGIN,
    CTYPES_CALLBACK_END
};

typedef void
(* CTypesActivityCallback)(JSContext* cx, CTypesActivityType type);





void
SetCTypesActivityCallback(JSContext* cx, CTypesActivityCallback cb);

class AutoCTypesActivityCallback {
  private:
    JSContext* cx;
    CTypesActivityCallback callback;
    CTypesActivityType endType;


  public:
    AutoCTypesActivityCallback(JSContext* cx, CTypesActivityType beginType,
                               CTypesActivityType endType
                                                              );
    ~AutoCTypesActivityCallback() {
        DoEndCallback();
    }
    void DoEndCallback() {
        if (callback) {
            callback(cx, endType);
            callback = nullptr;
        }
    }
};



struct AllocationMetadataBuilder {
    AllocationMetadataBuilder() { }







    virtual JSObject* build(JSContext* cx, JS::HandleObject obj,
                            AutoEnterOOMUnsafeRegion& oomUnsafe) const
    {
        return nullptr;
    }
};






void
SetAllocationMetadataBuilder(JSContext* cx, const AllocationMetadataBuilder *callback);


JSObject*
GetAllocationMetadata(JSObject* obj);

bool
GetElementsWithAdder(JSContext* cx, JS::HandleObject obj, JS::HandleObject receiver,
                     uint32_t begin, uint32_t end, js::ElementAdder* adder);

bool
ForwardToNative(JSContext* cx, JSNative native, const JS::CallArgs& args);
# 2792 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
bool
SetPropertyIgnoringNamedGetter(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
                               JS::HandleValue v, JS::HandleValue receiver,
                               JS::Handle<JS::PropertyDescriptor> ownDesc,
                               JS::ObjectOpResult& result);


extern bool
ExecuteInGlobalAndReturnScope(JSContext* cx, JS::HandleObject obj, JS::HandleScript script,
                              JS::MutableHandleObject scope);
# 2838 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern JSObject*
GetNearestEnclosingWithEnvironmentObjectForFunction(JSFunction* fun);
# 2849 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern JSObject*
GetFirstSubsumedSavedFrame(JSContext* cx, JS::HandleObject savedFrame, JS::SavedFrameSelfHosted selfHosted);

extern bool
ReportIsNotFunction(JSContext* cx, JS::HandleValue v);

extern JSObject*
ConvertArgsToArray(JSContext* cx, const JS::CallArgs& args);
# 2878 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern void
SetWindowProxyClass(JSContext* cx, const Class* clasp);





extern void
SetWindowProxy(JSContext* cx, JS::HandleObject global, JS::HandleObject windowProxy);

namespace detail {

bool
IsWindowSlow(JSObject* obj);

}





inline bool
IsWindow(JSObject* obj)
{
    if (GetObjectClass(obj)->flags & JSCLASS_IS_GLOBAL)
        return detail::IsWindowSlow(obj);
    return false;
}




bool
IsWindowProxy(JSObject* obj);






extern JSObject*
ToWindowProxyIfWindow(JSObject* obj);






extern JSObject*
ToWindowIfWindowProxy(JSObject* obj);




extern bool
AddPluralRulesConstructor(JSContext* cx, JS::Handle<JSObject*> intl);
# 2947 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jsfriendapi.h"
extern bool
AddMozDateTimeFormatConstructor(JSContext* cx, JS::Handle<JSObject*> intl);

class AutoAssertNoContentJS
{
  public:
    explicit AutoAssertNoContentJS(JSContext* cx);
    ~AutoAssertNoContentJS();

  private:
    JSContext* context_;
    bool prevAllowContentJS_;
};





extern void
EnableAccessValidation(JSContext* cx, bool enabled);





extern void
SetCompartmentValidAccessPtr(JSContext* cx, JS::HandleObject global, bool* accessp);

}

class NativeProfiler
{
  public:
    virtual ~NativeProfiler() {};
    virtual void sampleNative(void* addr, uint32_t size) = 0;
    virtual void removeNative(void* addr) = 0;
    virtual void reset() = 0;
};

class GCHeapProfiler
{
  public:
    virtual ~GCHeapProfiler() {};
    virtual void sampleTenured(void* addr, uint32_t size) = 0;
    virtual void sampleNursery(void* addr, uint32_t size) = 0;
    virtual void markTenuredStart() = 0;
    virtual void markTenured(void* addr) = 0;
    virtual void sweepTenured() = 0;
    virtual void sweepNursery() = 0;
    virtual void moveNurseryToTenured(void* addrOld, void* addrNew) = 0;
    virtual void reset() = 0;
};

class MemProfiler
{
    static mozilla::Atomic<uint32_t, mozilla::Relaxed> sActiveProfilerCount;
    static NativeProfiler* sNativeProfiler;

    static GCHeapProfiler* GetGCHeapProfiler(void* addr);
    static GCHeapProfiler* GetGCHeapProfiler(JSRuntime* runtime);

    static NativeProfiler* GetNativeProfiler() {
        return sNativeProfiler;
    }

    GCHeapProfiler* mGCHeapProfiler;
    JSRuntime* mRuntime;

  public:
    explicit MemProfiler(JSRuntime* aRuntime) : mGCHeapProfiler(nullptr), mRuntime(aRuntime) {}

    void start(GCHeapProfiler* aGCHeapProfiler);
    void stop();

    GCHeapProfiler* getGCHeapProfiler() const {
        return mGCHeapProfiler;
    }

    static __attribute__((always_inline)) inline bool enabled() {
        return sActiveProfilerCount > 0;
    }

    static MemProfiler* GetMemProfiler(JSContext* context);

    static void SetNativeProfiler(NativeProfiler* aProfiler) {
        sNativeProfiler = aProfiler;
    }

    static __attribute__((always_inline)) inline void SampleNative(void* addr, uint32_t size) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        NativeProfiler* profiler = GetNativeProfiler();
        if (profiler)
            profiler->sampleNative(addr, size);
    }

    static __attribute__((always_inline)) inline void SampleTenured(void* addr, uint32_t size) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        GCHeapProfiler* profiler = GetGCHeapProfiler(addr);
        if (profiler)
            profiler->sampleTenured(addr, size);
    }

    static __attribute__((always_inline)) inline void SampleNursery(void* addr, uint32_t size) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        GCHeapProfiler* profiler = GetGCHeapProfiler(addr);
        if (profiler)
            profiler->sampleNursery(addr, size);
    }

    static __attribute__((always_inline)) inline void RemoveNative(void* addr) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        NativeProfiler* profiler = GetNativeProfiler();
        if (profiler)
            profiler->removeNative(addr);
    }

    static __attribute__((always_inline)) inline void MarkTenuredStart(JSRuntime* runtime) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        GCHeapProfiler* profiler = GetGCHeapProfiler(runtime);
        if (profiler)
            profiler->markTenuredStart();
    }

    static __attribute__((always_inline)) inline void MarkTenured(void* addr) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        GCHeapProfiler* profiler = GetGCHeapProfiler(addr);
        if (profiler)
            profiler->markTenured(addr);
    }

    static __attribute__((always_inline)) inline void SweepTenured(JSRuntime* runtime) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        GCHeapProfiler* profiler = GetGCHeapProfiler(runtime);
        if (profiler)
            profiler->sweepTenured();
    }

    static __attribute__((always_inline)) inline void SweepNursery(JSRuntime* runtime) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        GCHeapProfiler* profiler = GetGCHeapProfiler(runtime);
        if (profiler)
            profiler->sweepNursery();
    }

    static __attribute__((always_inline)) inline void MoveNurseryToTenured(void* addrOld, void* addrNew) {
        JS::AutoSuppressGCAnalysis nogc;

        if ((__builtin_expect(!!(!enabled()), 1)))
            return;

        GCHeapProfiler* profiler = GetGCHeapProfiler(addrOld);
        if (profiler)
            profiler->moveNurseryToTenured(addrOld, addrNew);
    }
};
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h" 2




namespace js {

using JS::AutoIdVector;
using JS::CallArgs;
using JS::Handle;
using JS::HandleId;
using JS::HandleObject;
using JS::HandleValue;
using JS::IsAcceptableThis;
using JS::MutableHandle;
using JS::MutableHandleObject;
using JS::MutableHandleValue;
using JS::NativeImpl;
using JS::ObjectOpResult;
using JS::PrivateValue;
using JS::PropertyDescriptor;
using JS::Value;

class RegExpShared;

class Wrapper;
# 152 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
class BaseProxyHandler
{
# 162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
    const void* mFamily;
# 182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
    bool mHasPrototype;







    bool mHasSecurityPolicy;

  public:
    explicit constexpr BaseProxyHandler(const void* aFamily, bool aHasPrototype = false,
                                            bool aHasSecurityPolicy = false)
      : mFamily(aFamily),
        mHasPrototype(aHasPrototype),
        mHasSecurityPolicy(aHasSecurityPolicy)
    { }

    bool hasPrototype() const {
        return mHasPrototype;
    }

    bool hasSecurityPolicy() const {
        return mHasSecurityPolicy;
    }

    inline const void* family() const {
        return mFamily;
    }
    static size_t offsetOfFamily() {
        return __builtin_offsetof(BaseProxyHandler, mFamily);
    }

    virtual bool finalizeInBackground(const Value& priv) const {




        return true;
    }

    virtual bool canNurseryAllocate() const {




        return false;
    }
# 248 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
    typedef uint32_t Action;
    enum {
        NONE = 0x00,
        GET = 0x01,
        SET = 0x02,
        CALL = 0x04,
        ENUMERATE = 0x08,
        GET_PROPERTY_DESCRIPTOR = 0x10
    };

    virtual bool enter(JSContext* cx, HandleObject wrapper, HandleId id, Action act, bool mayThrow,
                       bool* bp) const;


    virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id,
                                          MutableHandle<PropertyDescriptor> desc) const = 0;
    virtual bool defineProperty(JSContext* cx, HandleObject proxy, HandleId id,
                                Handle<PropertyDescriptor> desc,
                                ObjectOpResult& result) const = 0;
    virtual bool ownPropertyKeys(JSContext* cx, HandleObject proxy,
                                 AutoIdVector& props) const = 0;
    virtual bool delete_(JSContext* cx, HandleObject proxy, HandleId id,
                         ObjectOpResult& result) const = 0;







    virtual bool getPrototype(JSContext* cx, HandleObject proxy, MutableHandleObject protop) const;
    virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto,
                              ObjectOpResult& result) const;


    virtual bool getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* isOrdinary,
                                        MutableHandleObject protop) const = 0;
    virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy, bool* succeeded) const;

    virtual bool preventExtensions(JSContext* cx, HandleObject proxy,
                                   ObjectOpResult& result) const = 0;
    virtual bool isExtensible(JSContext* cx, HandleObject proxy, bool* extensible) const = 0;
# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
    virtual bool has(JSContext* cx, HandleObject proxy, HandleId id, bool* bp) const;
    virtual bool get(JSContext* cx, HandleObject proxy, HandleValue receiver,
                     HandleId id, MutableHandleValue vp) const;
    virtual bool set(JSContext* cx, HandleObject proxy, HandleId id, HandleValue v,
                     HandleValue receiver, ObjectOpResult& result) const;
# 316 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
    virtual bool call(JSContext* cx, HandleObject proxy, const CallArgs& args) const;
    virtual bool construct(JSContext* cx, HandleObject proxy, const CallArgs& args) const;


    virtual bool enumerate(JSContext* cx, HandleObject proxy, MutableHandleObject objp) const;
    virtual bool getPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id,
                                       MutableHandle<PropertyDescriptor> desc) const;
    virtual bool hasOwn(JSContext* cx, HandleObject proxy, HandleId id, bool* bp) const;
    virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject proxy,
                                              AutoIdVector& props) const;
    virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl,
                            const CallArgs& args) const;
    virtual bool hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue v, bool* bp) const;
    virtual bool getBuiltinClass(JSContext* cx, HandleObject proxy,
                                 ESClass* cls) const;
    virtual bool isArray(JSContext* cx, HandleObject proxy, JS::IsArrayAnswer* answer) const;
    virtual const char* className(JSContext* cx, HandleObject proxy) const;
    virtual JSString* fun_toString(JSContext* cx, HandleObject proxy, unsigned indent) const;
    virtual bool regexp_toShared(JSContext* cx, HandleObject proxy,
                                 MutableHandle<js::RegExpShared*> shared) const;
    virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, MutableHandleValue vp) const;
    virtual void trace(JSTracer* trc, JSObject* proxy) const;
    virtual void finalize(JSFreeOp* fop, JSObject* proxy) const;
    virtual void objectMoved(JSObject* proxy, const JSObject* old) const;





    virtual bool isCallable(JSObject* obj) const;
    virtual bool isConstructor(JSObject* obj) const;



    virtual bool watch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id,
                       JS::HandleObject callable) const;
    virtual bool unwatch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id) const;

    virtual bool getElements(JSContext* cx, HandleObject proxy, uint32_t begin, uint32_t end,
                             ElementAdder* adder) const;


    virtual JSObject* weakmapKeyDelegate(JSObject* proxy) const;
    virtual bool isScripted() const { return false; }
};

extern const js::Class* const ProxyClassPtr;

inline bool IsProxy(const JSObject* obj)
{
    return GetObjectClass(obj)->isProxy();
}

namespace detail {
const uint32_t PROXY_EXTRA_SLOTS = 2;






struct ProxyValueArray
{
    Value privateSlot;
    Value extraSlots[PROXY_EXTRA_SLOTS];

    ProxyValueArray()
      : privateSlot(JS::UndefinedValue())
    {
        for (size_t i = 0; i < PROXY_EXTRA_SLOTS; i++)
            extraSlots[i] = JS::UndefinedValue();
    }

    static size_t offsetOfPrivateSlot() {
        return __builtin_offsetof(ProxyValueArray, privateSlot);
    }
};
# 402 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
struct ProxyDataLayout
{
    ProxyValueArray* values;
    const BaseProxyHandler* handler;
};

const uint32_t ProxyDataOffset = 2 * sizeof(void*);

inline ProxyDataLayout*
GetProxyDataLayout(JSObject* obj)
{
    do { } while (0);
    return reinterpret_cast<ProxyDataLayout*>(reinterpret_cast<uint8_t*>(obj) + ProxyDataOffset);
}

inline const ProxyDataLayout*
GetProxyDataLayout(const JSObject* obj)
{
    do { } while (0);
    return reinterpret_cast<const ProxyDataLayout*>(reinterpret_cast<const uint8_t*>(obj) +
                                                    ProxyDataOffset);
}
}

inline const BaseProxyHandler*
GetProxyHandler(const JSObject* obj)
{
    return detail::GetProxyDataLayout(obj)->handler;
}

inline const Value&
GetProxyPrivate(const JSObject* obj)
{
    return detail::GetProxyDataLayout(obj)->values->privateSlot;
}

inline JSObject*
GetProxyTargetObject(JSObject* obj)
{
    return GetProxyPrivate(obj).toObjectOrNull();
}

inline const Value&
GetProxyExtra(const JSObject* obj, size_t n)
{
    do { } while (0);
    return detail::GetProxyDataLayout(obj)->values->extraSlots[n];
}

inline void
SetProxyHandler(JSObject* obj, const BaseProxyHandler* handler)
{
    detail::GetProxyDataLayout(obj)->handler = handler;
}

void
SetValueInProxy(Value* slot, const Value& value);

inline void
SetProxyExtra(JSObject* obj, size_t n, const Value& extra)
{
    do { } while (0);
    Value* vp = &detail::GetProxyDataLayout(obj)->values->extraSlots[n];


    if (vp->isGCThing() || extra.isGCThing())
        SetValueInProxy(vp, extra);
    else
        *vp = extra;
}

inline bool
IsScriptedProxy(const JSObject* obj)
{
    return IsProxy(obj) && GetProxyHandler(obj)->isScripted();
}

inline const Value&
GetReservedOrProxyPrivateSlot(const JSObject* obj, size_t slot)
{
    do { } while (0);
    do { } while (0);
    return reinterpret_cast<const shadow::Object*>(obj)->slotRef(slot);
}

inline void
SetReservedOrProxyPrivateSlot(JSObject* obj, size_t slot, const Value& value)
{
    do { } while (0);
    do { } while (0);
    shadow::Object* sobj = reinterpret_cast<shadow::Object*>(obj);
    if (sobj->slotRef(slot).isGCThing() || value.isGCThing())
        SetReservedOrProxyPrivateSlotWithBarrier(obj, slot, value);
    else
        sobj->slotRef(slot) = value;
}

class ProxyOptions {
  protected:

    explicit ProxyOptions(bool singletonArg, bool lazyProtoArg = false)
      : singleton_(singletonArg),
        lazyProto_(lazyProtoArg),
        clasp_(ProxyClassPtr)
    {}

  public:
    ProxyOptions() : singleton_(false),
                     lazyProto_(false),
                     clasp_(ProxyClassPtr)
    {}

    bool singleton() const { return singleton_; }
    ProxyOptions& setSingleton(bool flag) {
        singleton_ = flag;
        return *this;
    }

    bool lazyProto() const { return lazyProto_; }
    ProxyOptions& setLazyProto(bool flag) {
        lazyProto_ = flag;
        return *this;
    }

    const Class* clasp() const {
        return clasp_;
    }
    ProxyOptions& setClass(const Class* claspArg) {
        clasp_ = claspArg;
        return *this;
    }

  private:
    bool singleton_;
    bool lazyProto_;
    const Class* clasp_;
};

JSObject*
NewProxyObject(JSContext* cx, const BaseProxyHandler* handler, HandleValue priv,
               JSObject* proto, const ProxyOptions& options = ProxyOptions());

JSObject*
RenewProxyObject(JSContext* cx, JSObject* obj, BaseProxyHandler* handler, const Value& priv);

class AutoEnterPolicy
{
  public:
    typedef BaseProxyHandler::Action Action;
    AutoEnterPolicy(JSContext* cx, const BaseProxyHandler* handler,
                    HandleObject wrapper, HandleId id, Action act, bool mayThrow)

        : context(nullptr)

    {
        allow = handler->hasSecurityPolicy() ? handler->enter(cx, wrapper, id, act, mayThrow, &rv)
                                             : true;
        recordEnter(cx, wrapper, id, act);





        if (!allow && !rv && mayThrow)
            reportErrorIfExceptionIsNotPending(cx, id);
    }

    virtual ~AutoEnterPolicy() { recordLeave(); }
    inline bool allowed() { return allow; }
    inline bool returnValue() { do { } while (0); return rv; }

  protected:

    AutoEnterPolicy()

        : context(nullptr)
        , enteredAction(BaseProxyHandler::NONE)

        {}
    void reportErrorIfExceptionIsNotPending(JSContext* cx, jsid id);
    bool allow;
    bool rv;


    JSContext* context;
    mozilla::Maybe<HandleObject> enteredProxy;
    mozilla::Maybe<HandleId> enteredId;
    Action enteredAction;




    AutoEnterPolicy* prev;
    void recordEnter(JSContext* cx, HandleObject proxy, HandleId id, Action act);
    void recordLeave();

    friend void assertEnteredPolicy(JSContext* cx, JSObject* proxy, jsid id, Action act);





  private:






    AutoEnterPolicy(const AutoEnterPolicy&) = delete;
    AutoEnterPolicy& operator=(const AutoEnterPolicy&) = delete;
};


class AutoWaivePolicy : public AutoEnterPolicy {
public:
    AutoWaivePolicy(JSContext* cx, HandleObject proxy, HandleId id,
                    BaseProxyHandler::Action act)
    {
        allow = true;
        recordEnter(cx, proxy, id, act);
    }
};
# 635 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Proxy.h"
extern void
assertEnteredPolicy(JSContext* cx, JSObject* obj, jsid id,
                    BaseProxyHandler::Action act);






extern JSObject*
InitProxyClass(JSContext* cx, JS::HandleObject obj);

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jswrapper.h" 2

namespace js {







class WrapperOptions : public ProxyOptions {
  public:
    WrapperOptions() : ProxyOptions(false),
                       proto_()
    {}

    explicit WrapperOptions(JSContext* cx) : ProxyOptions(false),
                                             proto_()
    {
        proto_.emplace(cx);
    }

    inline JSObject* proto() const;
    WrapperOptions& setProto(JSObject* protoArg) {
        do { } while (0);
        *proto_ = protoArg;
        return *this;
    }

  private:
    mozilla::Maybe<JS::RootedObject> proto_;
};
# 58 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jswrapper.h"
class Wrapper : public BaseProxyHandler
{
    unsigned mFlags;

  public:
    explicit constexpr Wrapper(unsigned aFlags, bool aHasPrototype = false,
                                   bool aHasSecurityPolicy = false)
      : BaseProxyHandler(&family, aHasPrototype, aHasSecurityPolicy),
        mFlags(aFlags)
    { }

    virtual bool finalizeInBackground(const Value& priv) const override;


    virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id,
                                          MutableHandle<PropertyDescriptor> desc) const override;
    virtual bool defineProperty(JSContext* cx, HandleObject proxy, HandleId id,
                                Handle<PropertyDescriptor> desc,
                                ObjectOpResult& result) const override;
    virtual bool ownPropertyKeys(JSContext* cx, HandleObject proxy,
                                 AutoIdVector& props) const override;
    virtual bool delete_(JSContext* cx, HandleObject proxy, HandleId id,
                         ObjectOpResult& result) const override;
    virtual bool enumerate(JSContext* cx, HandleObject proxy,
                           MutableHandleObject objp) const override;
    virtual bool getPrototype(JSContext* cx, HandleObject proxy,
                              MutableHandleObject protop) const override;
    virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto,
                              ObjectOpResult& result) const override;
    virtual bool getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* isOrdinary,
                                        MutableHandleObject protop) const override;
    virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy,
                                       bool* succeeded) const override;
    virtual bool preventExtensions(JSContext* cx, HandleObject proxy,
                                   ObjectOpResult& result) const override;
    virtual bool isExtensible(JSContext* cx, HandleObject proxy, bool* extensible) const override;
    virtual bool has(JSContext* cx, HandleObject proxy, HandleId id,
                     bool* bp) const override;
    virtual bool get(JSContext* cx, HandleObject proxy, HandleValue receiver,
                     HandleId id, MutableHandleValue vp) const override;
    virtual bool set(JSContext* cx, HandleObject proxy, HandleId id, HandleValue v,
                     HandleValue receiver, ObjectOpResult& result) const override;
    virtual bool call(JSContext* cx, HandleObject proxy, const CallArgs& args) const override;
    virtual bool construct(JSContext* cx, HandleObject proxy, const CallArgs& args) const override;


    virtual bool getPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id,
                                       MutableHandle<PropertyDescriptor> desc) const override;
    virtual bool hasOwn(JSContext* cx, HandleObject proxy, HandleId id,
                        bool* bp) const override;
    virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject proxy,
                                              AutoIdVector& props) const override;
    virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl,
                            const CallArgs& args) const override;
    virtual bool hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue v,
                             bool* bp) const override;
    virtual bool getBuiltinClass(JSContext* cx, HandleObject proxy, ESClass* cls) const override;
    virtual bool isArray(JSContext* cx, HandleObject proxy,
                         JS::IsArrayAnswer* answer) const override;
    virtual const char* className(JSContext* cx, HandleObject proxy) const override;
    virtual JSString* fun_toString(JSContext* cx, HandleObject proxy,
                                   unsigned indent) const override;
    virtual bool regexp_toShared(JSContext* cx, HandleObject proxy,
                                 MutableHandle<RegExpShared*> shared) const override;
    virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy,
                                  MutableHandleValue vp) const override;
    virtual bool isCallable(JSObject* obj) const override;
    virtual bool isConstructor(JSObject* obj) const override;
    virtual JSObject* weakmapKeyDelegate(JSObject* proxy) const override;

  public:
    using BaseProxyHandler::Action;

    enum Flags {
        CROSS_COMPARTMENT = 1 << 0,
        LAST_USED_FLAG = CROSS_COMPARTMENT
    };

    static JSObject* New(JSContext* cx, JSObject* obj, const Wrapper* handler,
                         const WrapperOptions& options = WrapperOptions());

    static JSObject* Renew(JSObject* existing, JSObject* obj, const Wrapper* handler);

    static const Wrapper* wrapperHandler(JSObject* wrapper);

    static JSObject* wrappedObject(JSObject* wrapper);

    unsigned flags() const {
        return mFlags;
    }

    static const char family;
    static const Wrapper singleton;
    static const Wrapper singletonWithPrototype;

    static JSObject* defaultProto;
};

inline JSObject*
WrapperOptions::proto() const
{
    return proto_ ? *proto_ : Wrapper::defaultProto;
}


class CrossCompartmentWrapper : public Wrapper
{
  public:
    explicit constexpr CrossCompartmentWrapper(unsigned aFlags, bool aHasPrototype = false,
                                                   bool aHasSecurityPolicy = false)
      : Wrapper(CROSS_COMPARTMENT | aFlags, aHasPrototype, aHasSecurityPolicy)
    { }


    virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
                                          MutableHandle<PropertyDescriptor> desc) const override;
    virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
                                Handle<PropertyDescriptor> desc,
                                ObjectOpResult& result) const override;
    virtual bool ownPropertyKeys(JSContext* cx, HandleObject wrapper,
                                 AutoIdVector& props) const override;
    virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id,
                         ObjectOpResult& result) const override;
    virtual bool enumerate(JSContext* cx, HandleObject wrapper, MutableHandleObject objp) const override;
    virtual bool getPrototype(JSContext* cx, HandleObject proxy,
                              MutableHandleObject protop) const override;
    virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto,
                              ObjectOpResult& result) const override;

    virtual bool getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* isOrdinary,
                                        MutableHandleObject protop) const override;
    virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy,
                                       bool* succeeded) const override;
    virtual bool preventExtensions(JSContext* cx, HandleObject wrapper,
                                   ObjectOpResult& result) const override;
    virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override;
    virtual bool has(JSContext* cx, HandleObject wrapper, HandleId id, bool* bp) const override;
    virtual bool get(JSContext* cx, HandleObject wrapper, HandleValue receiver,
                     HandleId id, MutableHandleValue vp) const override;
    virtual bool set(JSContext* cx, HandleObject wrapper, HandleId id, HandleValue v,
                     HandleValue receiver, ObjectOpResult& result) const override;
    virtual bool call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override;
    virtual bool construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override;


    virtual bool getPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
                                       MutableHandle<PropertyDescriptor> desc) const override;
    virtual bool hasOwn(JSContext* cx, HandleObject wrapper, HandleId id, bool* bp) const override;
    virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper,
                                              AutoIdVector& props) const override;
    virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl,
                            const CallArgs& args) const override;
    virtual bool hasInstance(JSContext* cx, HandleObject wrapper, MutableHandleValue v,
                             bool* bp) const override;
    virtual const char* className(JSContext* cx, HandleObject proxy) const override;
    virtual JSString* fun_toString(JSContext* cx, HandleObject wrapper,
                                   unsigned indent) const override;
    virtual bool regexp_toShared(JSContext* cx, HandleObject proxy,
                                 MutableHandle<RegExpShared*> shared) const override;
    virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, MutableHandleValue vp) const override;


    virtual bool canNurseryAllocate() const override { return true; }

    static const CrossCompartmentWrapper singleton;
    static const CrossCompartmentWrapper singletonWithPrototype;
};

class OpaqueCrossCompartmentWrapper : public CrossCompartmentWrapper
{
  public:
    explicit constexpr OpaqueCrossCompartmentWrapper() : CrossCompartmentWrapper(0)
    { }


    virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
                                          MutableHandle<PropertyDescriptor> desc) const override;
    virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
                                Handle<PropertyDescriptor> desc,
                                ObjectOpResult& result) const override;
    virtual bool ownPropertyKeys(JSContext* cx, HandleObject wrapper,
                                 AutoIdVector& props) const override;
    virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id,
                         ObjectOpResult& result) const override;
    virtual bool enumerate(JSContext* cx, HandleObject wrapper,
                           MutableHandleObject objp) const override;
    virtual bool getPrototype(JSContext* cx, HandleObject wrapper,
                              MutableHandleObject protop) const override;
    virtual bool setPrototype(JSContext* cx, HandleObject wrapper, HandleObject proto,
                              ObjectOpResult& result) const override;
    virtual bool getPrototypeIfOrdinary(JSContext* cx, HandleObject wrapper, bool* isOrdinary,
                                        MutableHandleObject protop) const override;
    virtual bool setImmutablePrototype(JSContext* cx, HandleObject wrapper,
                                       bool* succeeded) const override;
    virtual bool preventExtensions(JSContext* cx, HandleObject wrapper,
                                   ObjectOpResult& result) const override;
    virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override;
    virtual bool has(JSContext* cx, HandleObject wrapper, HandleId id,
                     bool* bp) const override;
    virtual bool get(JSContext* cx, HandleObject wrapper, HandleValue receiver,
                     HandleId id, MutableHandleValue vp) const override;
    virtual bool set(JSContext* cx, HandleObject wrapper, HandleId id, HandleValue v,
                     HandleValue receiver, ObjectOpResult& result) const override;
    virtual bool call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override;
    virtual bool construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override;


    virtual bool getPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
                                       MutableHandle<PropertyDescriptor> desc) const override;
    virtual bool hasOwn(JSContext* cx, HandleObject wrapper, HandleId id,
                        bool* bp) const override;
    virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper,
                                              AutoIdVector& props) const override;
    virtual bool getBuiltinClass(JSContext* cx, HandleObject wrapper, ESClass* cls) const override;
    virtual bool isArray(JSContext* cx, HandleObject obj,
                         JS::IsArrayAnswer* answer) const override;
    virtual const char* className(JSContext* cx, HandleObject wrapper) const override;
    virtual JSString* fun_toString(JSContext* cx, HandleObject proxy, unsigned indent) const override;

    static const OpaqueCrossCompartmentWrapper singleton;
};
# 289 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/jswrapper.h"
template <class Base>
class SecurityWrapper : public Base
{
  public:
    explicit constexpr SecurityWrapper(unsigned flags, bool hasPrototype = false)
      : Base(flags, hasPrototype, true)
    { }

    virtual bool enter(JSContext* cx, HandleObject wrapper, HandleId id, Wrapper::Action act,
                       bool mayThrow, bool* bp) const override;

    virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
                                Handle<PropertyDescriptor> desc,
                                ObjectOpResult& result) const override;
    virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override;
    virtual bool preventExtensions(JSContext* cx, HandleObject wrapper,
                                   ObjectOpResult& result) const override;
    virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto,
                              ObjectOpResult& result) const override;
    virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy, bool* succeeded) const override;

    virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl,
                            const CallArgs& args) const override;
    virtual bool getBuiltinClass(JSContext* cx, HandleObject wrapper, ESClass* cls) const override;
    virtual bool isArray(JSContext* cx, HandleObject wrapper, JS::IsArrayAnswer* answer) const override;
    virtual bool regexp_toShared(JSContext* cx, HandleObject proxy,
                                 MutableHandle<RegExpShared*> shared) const override;
    virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, MutableHandleValue vp) const override;




    virtual bool watch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id,
                       JS::HandleObject callable) const override;
    virtual bool unwatch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id) const override;





    typedef Base Permissive;
    typedef SecurityWrapper<Base> Restrictive;
};

typedef SecurityWrapper<CrossCompartmentWrapper> CrossCompartmentSecurityWrapper;

extern JSObject*
TransparentObjectWrapper(JSContext* cx, HandleObject existing, HandleObject obj);

inline bool
IsWrapper(JSObject* obj)
{
    return IsProxy(obj) && GetProxyHandler(obj)->family() == &Wrapper::family;
}





JSObject*
UncheckedUnwrap(JSObject* obj, bool stopAtWindowProxy = true, unsigned* flagsp = nullptr);





JSObject*
CheckedUnwrap(JSObject* obj, bool stopAtWindowProxy = true);



JSObject*
UnwrapOneChecked(JSObject* obj, bool stopAtWindowProxy = true);

void
ReportAccessDenied(JSContext* cx);

bool
IsCrossCompartmentWrapper(JSObject* obj);

void
NukeCrossCompartmentWrapper(JSContext* cx, JSObject* wrapper);

void
RemapWrapper(JSContext* cx, JSObject* wobj, JSObject* newTarget);

bool
RemapAllWrappersForObject(JSContext* cx, JSObject* oldTarget,
                          JSObject* newTarget);



bool
RecomputeWrappers(JSContext* cx, const CompartmentFilter& sourceFilter,
                  const CompartmentFilter& targetFilter);

}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HoldDropJSObjects.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/HoldDropJSObjects.h"
class nsISupports;
class nsScriptObjectTracer;



namespace mozilla {
namespace cyclecollector {

void HoldJSObjectsImpl(void* aHolder, nsScriptObjectTracer* aTracer);
void HoldJSObjectsImpl(nsISupports* aHolder);
void DropJSObjectsImpl(void* aHolder);
void DropJSObjectsImpl(nsISupports* aHolder);

}


template<class T, bool isISupports = IsBaseOf<nsISupports, T>::value>
struct HoldDropJSObjectsHelper
{
  static void Hold(T* aHolder)
  {
    cyclecollector::HoldJSObjectsImpl(aHolder,
                                      T::cycleCollection::GetParticipant());
  }
  static void Drop(T* aHolder)
  {
    cyclecollector::DropJSObjectsImpl(aHolder);
  }
};

template<class T>
struct HoldDropJSObjectsHelper<T, true>
{
  static void Hold(T* aHolder)
  {
    cyclecollector::HoldJSObjectsImpl(ToSupports(aHolder));
  }
  static void Drop(T* aHolder)
  {
    cyclecollector::DropJSObjectsImpl(ToSupports(aHolder));
  }
};


template<class T>
void
HoldJSObjects(T* aHolder)
{
  HoldDropJSObjectsHelper<T>::Hold(aHolder);
}

template<class T>
void
DropJSObjects(T* aHolder)
{
  HoldDropJSObjectsHelper<T>::Drop(aHolder);
}





}
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/MainThreadUtils.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/MainThreadUtils.h"
class nsIThread;







extern nsresult NS_GetMainThread(nsIThread** aResult);






extern nsIThread* NS_GetCurrentThread();



bool NS_IsMainThread();
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIGlobalObject.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIGlobalObject.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DispatcherTrait.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DispatcherTrait.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TaskCategory.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/TaskCategory.h"
namespace mozilla {



enum class TaskCategory {

  UI,


  Network,


  Timer,


  Worker,


  IdleCallback,


  RefreshDriver,


  GarbageCollection,


  Other,

  Count
};

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DispatcherTrait.h" 2

class nsIEventTarget;
class nsIRunnable;

namespace mozilla {
class AbstractThread;
namespace dom {
class TabGroup;





class DispatcherTrait {
public:


  virtual nsresult Dispatch(const char* aName,
                            TaskCategory aCategory,
                            already_AddRefed<nsIRunnable>&& aRunnable);




  virtual nsIEventTarget* EventTargetFor(TaskCategory aCategory) const;



  virtual AbstractThread* AbstractMainThreadFor(TaskCategory aCategory);
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIGlobalObject.h" 2








class nsACString;
class nsCString;
class nsCycleCollectionTraversalCallback;
class nsIPrincipal;

class nsIGlobalObject : public nsISupports,
                        public mozilla::dom::DispatcherTrait
{
  nsTArray<nsCString> mHostObjectURIs;
  bool mIsDying;

protected:
  nsIGlobalObject()
   : mIsDying(false)
  {}

public:
  template<typename T, typename U> struct COMTypeInfo;
# 52 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIGlobalObject.h"
  bool
  IsDying() const
  {
    return mIsDying;
  }







  virtual JSObject* GetGlobalJSObject() = 0;


  nsIPrincipal* PrincipalOrNull();

  void RegisterHostObjectURI(const nsACString& aURI);

  void UnregisterHostObjectURI(const nsACString& aURI);



  void UnlinkHostObjectURIs();
  void TraverseHostObjectURIs(nsCycleCollectionTraversalCallback &aCb);

protected:
  virtual ~nsIGlobalObject();

  void
  StartDying()
  {
    mIsDying = true;
  }
};

template<typename T> struct nsIGlobalObject::COMTypeInfo<nsIGlobalObject, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIGlobalObject::COMTypeInfo<nsIGlobalObject, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x11afa8be, 0xd997, 0x4e07, { 0xa6, 0xa3, 0x6f, 0x87, 0x2e, 0xc3, 0xee, 0x7f } };
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrincipal.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrincipal.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISerializable.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISerializable.h"
class nsIObjectInputStream;

class nsIObjectOutputStream;
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISerializable.h"
class nsISerializable : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Read(nsIObjectInputStream *aInputStream) = 0;


  virtual nsresult Write(nsIObjectOutputStream *aOutputStream) = 0;

};

  template<typename T> struct nsISerializable::COMTypeInfo<nsISerializable, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISerializable::COMTypeInfo<nsISerializable, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x91cca981, 0xc26d, 0x44a8, { 0xbe, 0xbe, 0xd9, 0xed, 0x48, 0x91, 0x50, 0x3a }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrincipal.h" 2
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrincipal.h"
struct JSPrincipals;



namespace mozilla {
class OriginAttributes;
}
# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrincipal.h"
class nsIURI;

class nsIContentSecurityPolicy;

class nsIDOMDocument;
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrincipal.h"
class nsIPrincipal : public nsISerializable {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Equals(nsIPrincipal *other, bool *_retval) = 0;


  virtual nsresult EqualsConsideringDomain(nsIPrincipal *other, bool *_retval) = 0;

       inline bool Equals(nsIPrincipal* aOther) { mozilla::DebugOnly<bool> val = false; do { } while (0); bool retVal = false; return this == aOther || (((bool)(__builtin_expect(!!(!NS_FAILED_impl(Equals(aOther, &retVal))), 1))) && retVal); }
      inline bool EqualsConsideringDomain(nsIPrincipal* aOther) { mozilla::DebugOnly<bool> val = false; do { } while (0); bool retVal = false; return this == aOther || (((bool)(__builtin_expect(!!(!NS_FAILED_impl(EqualsConsideringDomain(aOther, &retVal))), 1))) && retVal); }

  virtual nsresult GetHashValue(uint32_t *aHashValue) = 0;


  virtual nsresult GetURI(nsIURI * *aURI) = 0;


  virtual nsresult GetDomain(nsIURI * *aDomain) = 0;
  virtual nsresult SetDomain(nsIURI *aDomain) = 0;


  virtual nsresult Subsumes(nsIPrincipal *other, bool *_retval) = 0;


  virtual nsresult SubsumesConsideringDomain(nsIPrincipal *other, bool *_retval) = 0;


  virtual nsresult SubsumesConsideringDomainIgnoringFPD(nsIPrincipal *other, bool *_retval) = 0;

       inline bool Subsumes(nsIPrincipal* aOther) { mozilla::DebugOnly<bool> val = false; do { } while (0); bool retVal = false; return this == aOther || (((bool)(__builtin_expect(!!(!NS_FAILED_impl(Subsumes(aOther, &retVal))), 1))) && retVal); }
      inline bool SubsumesConsideringDomain(nsIPrincipal* aOther) { mozilla::DebugOnly<bool> val = false; do { } while (0); bool retVal = false; return this == aOther || (((bool)(__builtin_expect(!!(!NS_FAILED_impl(SubsumesConsideringDomain(aOther, &retVal))), 1))) && retVal); }
      inline bool SubsumesConsideringDomainIgnoringFPD(nsIPrincipal* aOther) { mozilla::DebugOnly<bool> val = false; do { } while (0); bool retVal = false; return this == aOther || (((bool)(__builtin_expect(!!(!NS_FAILED_impl(SubsumesConsideringDomainIgnoringFPD(aOther, &retVal))), 1))) && retVal); }


  virtual nsresult CheckMayLoad(nsIURI *uri, bool report, bool allowIfInheritsPrincipal) = 0;


  virtual nsresult GetCsp(nsIContentSecurityPolicy * *aCsp) = 0;
  virtual nsresult SetCsp(nsIContentSecurityPolicy *aCsp) = 0;


  virtual nsresult EnsureCSP(nsIDOMDocument *aDocument, nsIContentSecurityPolicy * *_retval) = 0;


  virtual nsresult GetPreloadCsp(nsIContentSecurityPolicy * *aPreloadCsp) = 0;


  virtual nsresult EnsurePreloadCSP(nsIDOMDocument *aDocument, nsIContentSecurityPolicy * *_retval) = 0;


  virtual nsresult GetCspJSON(nsAString & aCspJSON) = 0;


  virtual nsresult GetOriginAttributes(JSContext* cx, JS::MutableHandleValue aOriginAttributes) = 0;


  virtual const mozilla::OriginAttributes & OriginAttributesRef(void) = 0;


  virtual nsresult GetOrigin(nsACString & aOrigin) = 0;


  virtual nsresult GetOriginNoSuffix(nsACString & aOriginNoSuffix) = 0;


  virtual nsresult GetOriginSuffix(nsACString & aOriginSuffix) = 0;


  virtual nsresult GetBaseDomain(nsACString & aBaseDomain) = 0;

  enum {
    APP_STATUS_NOT_INSTALLED = 0,
    APP_STATUS_INSTALLED = 1,
    APP_STATUS_PRIVILEGED = 2,
    APP_STATUS_CERTIFIED = 3
  };


  virtual nsresult GetAppStatus(uint16_t *aAppStatus) = 0;
  inline uint16_t GetAppStatus()
  {
    uint16_t result;
    mozilla::DebugOnly<nsresult> rv = GetAppStatus(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetAppId(uint32_t *aAppId) = 0;
  inline uint32_t GetAppId()
  {
    uint32_t result;
    mozilla::DebugOnly<nsresult> rv = GetAppId(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetAddonId(nsAString & aAddonId) = 0;


  virtual nsresult GetUserContextId(uint32_t *aUserContextId) = 0;
  inline uint32_t GetUserContextId()
  {
    uint32_t result;
    mozilla::DebugOnly<nsresult> rv = GetUserContextId(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetPrivateBrowsingId(uint32_t *aPrivateBrowsingId) = 0;
  inline uint32_t GetPrivateBrowsingId()
  {
    uint32_t result;
    mozilla::DebugOnly<nsresult> rv = GetPrivateBrowsingId(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsInIsolatedMozBrowserElement(bool *aIsInIsolatedMozBrowserElement) = 0;
  inline bool GetIsInIsolatedMozBrowserElement()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsInIsolatedMozBrowserElement(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetUnknownAppId(bool *aUnknownAppId) = 0;
  inline bool GetUnknownAppId()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetUnknownAppId(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsNullPrincipal(bool *aIsNullPrincipal) = 0;
  inline bool GetIsNullPrincipal()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsNullPrincipal(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsCodebasePrincipal(bool *aIsCodebasePrincipal) = 0;
  inline bool GetIsCodebasePrincipal()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsCodebasePrincipal(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsExpandedPrincipal(bool *aIsExpandedPrincipal) = 0;
  inline bool GetIsExpandedPrincipal()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsExpandedPrincipal(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsSystemPrincipal(bool *aIsSystemPrincipal) = 0;
  inline bool GetIsSystemPrincipal()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsSystemPrincipal(&result);
    do { } while (0);
    return result;
  }

};

  template<typename T> struct nsIPrincipal::COMTypeInfo<nsIPrincipal, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIPrincipal::COMTypeInfo<nsIPrincipal, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xf75f502d, 0x79fd, 0x48be, { 0xa0, 0x79, 0xe5, 0xa7, 0xb8, 0xf8, 0x0c, 0x8b }};
# 658 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrincipal.h"
class nsIExpandedPrincipal : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetWhiteList(nsTArray<nsCOMPtr<nsIPrincipal> > **aWhiteList) = 0;

};

  template<typename T> struct nsIExpandedPrincipal::COMTypeInfo<nsIExpandedPrincipal, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIExpandedPrincipal::COMTypeInfo<nsIExpandedPrincipal, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xf3e177df, 0x6a5e, 0x489f, { 0x80, 0xa7, 0x2d, 0xd1, 0x48, 0x14, 0x71, 0xd8 }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
namespace js {
class Debugger;
}

namespace JS {
namespace dbg {
# 120 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
class BuilderOrigin;

class Builder {


    PersistentRootedObject debuggerObject;


    js::Debugger* debugger;







    void assertBuilt(JSObject* obj) { }


  protected:


    template<typename T>
    class BuiltThing {
        friend class BuilderOrigin;

      protected:

        Builder& owner;


        PersistentRooted<T> value;

        BuiltThing(JSContext* cx, Builder& owner_, T value_ = GCPolicy<T>::initial())
          : owner(owner_), value(cx, value_)
        {
            owner.assertBuilt(value_);
        }


        js::Debugger* debugger() const { return owner.debugger; }
        JSObject* debuggerObject() const { return owner.debuggerObject; }

      public:
        BuiltThing(const BuiltThing& rhs) : owner(rhs.owner), value(rhs.value) { }
        BuiltThing& operator=(const BuiltThing& rhs) {
            do { } while (0);
            owner.assertBuilt(rhs.value);
            value = rhs.value;
            return *this;
        }

        explicit operator bool() const {

            return value;
        }

      private:
        BuiltThing() = delete;
    };

  public:



    class Object: private BuiltThing<JSObject*> {
        friend class Builder;
        friend class BuilderOrigin;

        typedef BuiltThing<JSObject*> Base;



        Object(JSContext* cx, Builder& owner_, HandleObject obj) : Base(cx, owner_, obj.get()) { }

        bool definePropertyToTrusted(JSContext* cx, const char* name,
                                     JS::MutableHandleValue value);

      public:
        Object(JSContext* cx, Builder& owner_) : Base(cx, owner_, nullptr) { }
        Object(const Object& rhs) : Base(rhs) { }
# 218 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
        bool defineProperty(JSContext* cx, const char* name, JS::HandleValue value);
        bool defineProperty(JSContext* cx, const char* name, JS::HandleObject value);
        bool defineProperty(JSContext* cx, const char* name, Object& value);

        using Base::operator bool;
    };



    Object newObject(JSContext* cx);

  protected:
    Builder(JSContext* cx, js::Debugger* debugger);
};



class BuilderOrigin : public Builder {
    template<typename T>
    T unwrapAny(const BuiltThing<T>& thing) {
        do { } while (0);
        return thing.value.get();
    }

  public:
    BuilderOrigin(JSContext* cx, js::Debugger* debugger_)
      : Builder(cx, debugger_)
    { }

    JSObject* unwrap(Object& object) { return unwrapAny(object); }
};
# 262 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
void
SetDebuggerMallocSizeOf(JSContext* cx, mozilla::MallocSizeOf mallocSizeOf);



mozilla::MallocSizeOf
GetDebuggerMallocSizeOf(JSContext* cx);
# 285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
bool
FireOnGarbageCollectionHook(JSContext* cx, GarbageCollectionEvent::Ptr&& data);
# 303 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
void
onNewPromise(JSContext* cx, HandleObject promise);
# 315 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
void
onPromiseSettled(JSContext* cx, HandleObject promise);




bool
IsDebugger(JSObject& obj);



bool
GetDebuggeeGlobals(JSContext* cx, JSObject& dbgObj, AutoObjectVector& vector);
# 343 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
class AutoEntryMonitor {
    JSContext* cx_;
    AutoEntryMonitor* savedMonitor_;

  public:
    explicit AutoEntryMonitor(JSContext* cx);
    ~AutoEntryMonitor();
# 363 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Debug.h"
    virtual void Entry(JSContext* cx, JSFunction* function,
                       HandleValue asyncStack,
                       const char* asyncCause) = 0;




    virtual void Entry(JSContext* cx, JSScript* script,
                       HandleValue asyncStack,
                       const char* asyncCause) = 0;


    virtual void Exit(JSContext* cx) { }
};



}
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h" 2

class nsPIDOMWindowInner;
class nsGlobalWindow;
class nsIScriptContext;
class nsIDocument;
class nsIDocShell;

namespace mozilla {
namespace dom {





void InitScriptSettings();
void DestroyScriptSettings();
bool ScriptSettingsInitialized();
# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
void UseEntryScriptProfiling();
void UnuseEntryScriptProfiling();
# 86 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
nsIGlobalObject* GetEntryGlobal();



nsIDocument* GetEntryDocument();



nsIGlobalObject* GetIncumbentGlobal();


nsIGlobalObject* GetCurrentGlobal();
# 115 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
nsIPrincipal* GetWebIDLCallerPrincipal();




inline JSObject& IncumbentJSGlobal()
{
  return *GetIncumbentGlobal()->GetGlobalJSObject();
}




bool IsJSAPIActive();

namespace danger {




JSContext* GetJSContext();

}

JS::RootingContext* RootingCx();

class ScriptSettingsStack;
class ScriptSettingsStackEntry {
  friend class ScriptSettingsStack;

public:
  ~ScriptSettingsStackEntry();

  bool NoJSAPI() const { return mType == eNoJSAPI; }
  bool IsEntryCandidate() const {
    return mType == eEntryScript || mType == eNoJSAPI;
  }
  bool IsIncumbentCandidate() { return mType != eJSAPI; }
  bool IsIncumbentScript() { return mType == eIncumbentScript; }

protected:
  enum Type {
    eEntryScript,
    eIncumbentScript,
    eJSAPI,
    eNoJSAPI
  };

  ScriptSettingsStackEntry(nsIGlobalObject *aGlobal,
                           Type aEntryType);

  nsCOMPtr<nsIGlobalObject> mGlobalObject;
  Type mType;

private:
  ScriptSettingsStackEntry *mOlder;
};
# 203 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
class AutoJSAPI : protected ScriptSettingsStackEntry {
public:


  AutoJSAPI();

  ~AutoJSAPI();
# 218 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
  void Init();
# 228 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
  __attribute__ ((warn_unused_result)) bool Init(nsIGlobalObject* aGlobalObject);



  __attribute__ ((warn_unused_result)) bool Init(JSObject* aObject);
# 242 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
  __attribute__ ((warn_unused_result)) bool Init(nsIGlobalObject* aGlobalObject, JSContext* aCx);



  __attribute__ ((warn_unused_result)) bool Init(nsPIDOMWindowInner* aWindow);
  __attribute__ ((warn_unused_result)) bool Init(nsPIDOMWindowInner* aWindow, JSContext* aCx);

  __attribute__ ((warn_unused_result)) bool Init(nsGlobalWindow* aWindow);
  __attribute__ ((warn_unused_result)) bool Init(nsGlobalWindow* aWindow, JSContext* aCx);

  JSContext* cx() const {
    do { } while (0);
    do { } while (0);
    return mCx;
  }






  void ReportException();

  bool HasException() const {
    do { } while (0);
    return JS_IsExceptionPending(cx());
  };







  __attribute__ ((warn_unused_result)) bool StealException(JS::MutableHandle<JS::Value> aVal);







  __attribute__ ((warn_unused_result)) bool PeekException(JS::MutableHandle<JS::Value> aVal);

  void ClearException() {
    do { } while (0);
    JS_ClearPendingException(cx());
  }

protected:


  AutoJSAPI(nsIGlobalObject* aGlobalObject, bool aIsMainThread, Type aType);

private:
  mozilla::Maybe<JSAutoRequest> mAutoRequest;
  mozilla::Maybe<JSAutoNullableCompartment> mAutoNullableCompartment;
  JSContext *mCx;


  bool mIsMainThread;
  Maybe<JS::WarningReporter> mOldWarningReporter;

  void InitInternal(nsIGlobalObject* aGlobalObject, JSObject* aGlobal,
                    JSContext* aCx, bool aIsMainThread);

  AutoJSAPI(const AutoJSAPI&) = delete;
  AutoJSAPI& operator= (const AutoJSAPI&) = delete;
};
# 319 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
class AutoEntryScript : public AutoJSAPI {
public:
  AutoEntryScript(nsIGlobalObject* aGlobalObject,
                  const char *aReason,
                  bool aIsMainThread = NS_IsMainThread());

  AutoEntryScript(JSObject* aObject,
                  const char *aReason,
                  bool aIsMainThread = NS_IsMainThread());

  ~AutoEntryScript();

  void SetWebIDLCallerPrincipal(nsIPrincipal *aPrincipal) {
    mWebIDLCallerPrincipal = aPrincipal;
  }

private:

  class DocshellEntryMonitor final : public JS::dbg::AutoEntryMonitor
  {
  public:
    DocshellEntryMonitor(JSContext* aCx, const char* aReason);






    void Entry(JSContext* aCx, JSFunction* aFunction,
               JS::Handle<JS::Value> aAsyncStack,
               const char* aAsyncCause) override
    {
      Entry(aCx, aFunction, nullptr, aAsyncStack, aAsyncCause);
    }

    void Entry(JSContext* aCx, JSScript* aScript,
               JS::Handle<JS::Value> aAsyncStack,
               const char* aAsyncCause) override
    {
      Entry(aCx, nullptr, aScript, aAsyncStack, aAsyncCause);
    }

    void Exit(JSContext* aCx) override;

  private:
    void Entry(JSContext* aCx, JSFunction* aFunction, JSScript* aScript,
               JS::Handle<JS::Value> aAsyncStack,
               const char* aAsyncCause);

    const char* mReason;
  };
# 378 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
  nsIPrincipal* mWebIDLCallerPrincipal;
  friend nsIPrincipal* GetWebIDLCallerPrincipal();

  Maybe<DocshellEntryMonitor> mDocShellEntryMonitor;
  JS::AutoHideScriptedCaller mCallerOverride;
};




class AutoIncumbentScript : protected ScriptSettingsStackEntry {
public:
  explicit AutoIncumbentScript(nsIGlobalObject* aGlobalObject);
  ~AutoIncumbentScript();

private:
  JS::AutoHideScriptedCaller mCallerOverride;
};
# 405 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
class AutoNoJSAPI : protected ScriptSettingsStackEntry {
public:
  explicit AutoNoJSAPI();
  ~AutoNoJSAPI();
};

}






class AutoJSContext {
public:
  explicit AutoJSContext();
  operator JSContext*() const;

protected:
  JSContext* mCx;
  dom::AutoJSAPI mJSAPI;

};







class AutoSafeJSContext : public dom::AutoJSAPI {
public:
  explicit AutoSafeJSContext();
  operator JSContext*() const
  {
    return cx();
  }

private:

};
# 455 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ScriptSettings.h"
class AutoSlowOperation : public dom::AutoJSAPI
{
public:
  explicit AutoSlowOperation();
  void CheckForInterrupt();
private:

};

}
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCache.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCache.h"
namespace mozilla {
namespace dom {
class TabChildGlobal;
class ProcessGlobal;
}
}
class SandboxPrivate;
class nsInProcessTabChildGlobal;
class nsWindowRoot;
# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCache.h"
class nsWrapperCache
{
public:
  template<typename T, typename U> struct COMTypeInfo;

  nsWrapperCache() : mWrapper(nullptr), mFlags(0)
  {
  }
  ~nsWrapperCache()
  {
    do { } while (0);

  }







  JSObject* GetWrapper() const;
# 101 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCache.h"
  JSObject* GetWrapperPreserveColor() const
  {
    return GetWrapperJSObject();
  }
# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCache.h"
  void SetWrapper(JSObject* aWrapper)
  {
    do { } while (0);
    do { } while (0);
    do { } while (0);


    SetWrapperJSObject(aWrapper);
  }





  void ClearWrapper()
  {
    do { } while (0);

    SetWrapperJSObject(nullptr);
  }







  void UpdateWrapper(JSObject* aNewObject, const JSObject* aOldObject)
  {
    if (mWrapper) {
      do { } while (0);
      mWrapper = aNewObject;
    }
  }

  bool PreservingWrapper() const
  {
    return HasWrapperFlag(WRAPPER_BIT_PRESERVED);
  }

  bool IsDOMBinding() const
  {
    return !HasWrapperFlag(WRAPPER_IS_NOT_DOM_BINDING);
  }





  virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto) = 0;





  bool HasKnownLiveWrapper() const;






  bool HasKnownLiveWrapperAndDoesNotNeedTracing(nsISupports* aThis);

  bool HasNothingToTrace(nsISupports* aThis);




  void MarkWrapperLive();


  void SetPreservingWrapper(bool aPreserve)
  {
    if(aPreserve) {
      SetWrapperFlags(WRAPPER_BIT_PRESERVED);
    }
    else {
      UnsetWrapperFlags(WRAPPER_BIT_PRESERVED);
    }
  }

  void TraceWrapper(const TraceCallbacks& aCallbacks, void* aClosure)
  {
    if (PreservingWrapper() && mWrapper) {
      aCallbacks.Trace(&mWrapper, "Preserved wrapper", aClosure);
    }
  }






  typedef uint32_t FlagsType;

  FlagsType GetFlags() const
  {
    return mFlags & ~kWrapperFlagsMask;
  }

  bool HasFlag(FlagsType aFlag) const
  {
    do { } while (0);
    return !!(mFlags & aFlag);
  }

  void SetFlags(FlagsType aFlagsToSet)
  {
    do { } while (0);
    mFlags |= aFlagsToSet;
  }

  void UnsetFlags(FlagsType aFlagsToUnset)
  {
    do { } while (0);
    mFlags &= ~aFlagsToUnset;
  }

  void PreserveWrapper(nsISupports* aScriptObjectHolder)
  {
    if (PreservingWrapper()) {
      return;
    }

    nsISupports* ccISupports;
    aScriptObjectHolder->QueryInterface((nsCycleCollectionISupports::COMTypeInfo<nsCycleCollectionISupports, void>::kIID),
                                        reinterpret_cast<void**>(&ccISupports));
    do { } while (0);

    nsXPCOMCycleCollectionParticipant* participant;
    CallQueryInterface(ccISupports, &participant);
    PreserveWrapper(ccISupports, participant);
  }

  void PreserveWrapper(void* aScriptObjectHolder, nsScriptObjectTracer* aTracer)
  {
    if (PreservingWrapper()) {
      return;
    }

    HoldJSObjects(aScriptObjectHolder, aTracer);
    SetPreservingWrapper(true);




  }

  void ReleaseWrapper(void* aScriptObjectHolder);

protected:
  void TraceWrapper(JSTracer* aTrc, const char* name)
  {
    if (mWrapper) {
      js::UnsafeTraceManuallyBarrieredEdge(aTrc, &mWrapper, name);
    }
  }

  void PoisonWrapper()
  {
    if (mWrapper) {


      mWrapper = reinterpret_cast<JSObject*>(1);
    }
  }

private:



  friend class mozilla::dom::TabChildGlobal;
  friend class mozilla::dom::ProcessGlobal;
  friend class SandboxPrivate;
  friend class nsInProcessTabChildGlobal;
  friend class nsWindowRoot;
  void SetIsNotDOMBinding()
  {
    do { } while (0);

    SetWrapperFlags(WRAPPER_IS_NOT_DOM_BINDING);
  }

  JSObject *GetWrapperJSObject() const
  {
    return mWrapper;
  }

  void SetWrapperJSObject(JSObject* aWrapper);

  FlagsType GetWrapperFlags() const
  {
    return mFlags & kWrapperFlagsMask;
  }

  bool HasWrapperFlag(FlagsType aFlag) const
  {
    do { } while (0);
    return !!(mFlags & aFlag);
  }

  void SetWrapperFlags(FlagsType aFlagsToSet)
  {
    do { } while (0);
    mFlags |= aFlagsToSet;
  }

  void UnsetWrapperFlags(FlagsType aFlagsToUnset)
  {
    do { } while (0);
    mFlags &= ~aFlagsToUnset;
  }

  void HoldJSObjects(void* aScriptObjectHolder,
                     nsScriptObjectTracer* aTracer);
# 347 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCache.h"
  enum { WRAPPER_BIT_PRESERVED = 1 << 0 };





  enum { WRAPPER_IS_NOT_DOM_BINDING = 1 << 1 };

  enum { kWrapperFlagsMask = (WRAPPER_BIT_PRESERVED | WRAPPER_IS_NOT_DOM_BINDING) };

  JSObject* mWrapper;
  FlagsType mFlags;
};

enum { WRAPPER_CACHE_FLAGS_BITS_USED = 2 };

template<typename T> struct nsWrapperCache::COMTypeInfo<nsWrapperCache, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsWrapperCache::COMTypeInfo<nsWrapperCache, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x6f3179a1, 0x36f7, 0x4a5c, { 0x8c, 0xf1, 0xad, 0xc8, 0x7c, 0xde, 0x3e, 0x87 } };
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptContext.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptContext.h"
class nsIScriptGlobalObject;





class nsIOffThreadScriptReceiver;





class nsIScriptContext : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;





  virtual nsIScriptGlobalObject *GetGlobalObject() = 0;




  virtual nsresult InitContext() = 0;
# 52 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptContext.h"
  virtual bool IsContextInitialized() = 0;



  virtual nsresult SetProperty(JS::Handle<JSObject*> aTarget,
                               const char* aPropName, nsISupports* aVal) = 0;




  virtual bool GetProcessingScriptTag() = 0;
  virtual void SetProcessingScriptTag(bool aResult) = 0;







  virtual nsresult InitClasses(JS::Handle<JSObject*> aGlobalObj) = 0;




  virtual void WillInitializeContext() = 0;




  virtual void DidInitializeContext() = 0;




  virtual void SetWindowProxy(JS::Handle<JSObject*> aWindowProxy) = 0;
  virtual JSObject* GetWindowProxy() = 0;
};

template<typename T> struct nsIScriptContext::COMTypeInfo<nsIScriptContext, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIScriptContext::COMTypeInfo<nsIScriptContext, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x54cbe9cf, 0x7282, 0x421a, { 0x91, 0x6f, 0xd0, 0x70, 0x73, 0xde, 0xb8, 0xc0 } };





class nsIOffThreadScriptReceiver : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;






  virtual nsresult OnScriptCompileComplete(JSScript* aScript, nsresult aStatus) = 0;
};

template<typename T> struct nsIOffThreadScriptReceiver::COMTypeInfo<nsIOffThreadScriptReceiver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIOffThreadScriptReceiver::COMTypeInfo<nsIOffThreadScriptReceiver, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x3a980010, 0x878d, 0x46a9, {0x93, 0xad, 0xbc, 0xfd, 0xd3, 0x8e, 0xa0, 0xc2}};
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptGlobalObject.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptGlobalObject.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h"
class nsCString;
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h"
enum nsEventStatus
{

  nsEventStatus_eIgnore,

  nsEventStatus_eConsumeNoDefault,

  nsEventStatus_eConsumeDoDefault,

  nsEventStatus_eSentinel
};

namespace mozilla {





typedef uint16_t EventMessageType;

enum EventMessage : EventMessageType
{






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventMessageList.h" 1
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventMessageList.h"
eVoidEvent,



eAllEvents,


eWindowClose,

eKeyPress,
eKeyUp,
eKeyDown,





eKeyDownOnPlugin,
eKeyUpOnPlugin,





eAccessKeyNotFound,

eResize,
eScroll,


eInstall,
eAppInstalled,





ePluginActivate,
ePluginFocus,

eOffline,
eOnline,

eLanguageChange,

eMouseMove,
eMouseUp,
eMouseDown,
eMouseEnterIntoWidget,
eMouseExitFromWidget,
eMouseDoubleClick,
eMouseClick,
eMouseAuxClick,

eMouseActivate,
eMouseOver,
eMouseOut,
eMouseHitTest,
eMouseEnter,
eMouseLeave,
eMouseTouchDrag,
eMouseLongTap,
eMouseEventFirst = eMouseMove, eMouseEventLast = eMouseLongTap,


ePointerMove,
ePointerUp,
ePointerDown,
ePointerOver,
ePointerOut,
ePointerEnter,
ePointerLeave,
ePointerCancel,
ePointerGotCapture,
ePointerLostCapture,
ePointerEventFirst = ePointerMove, ePointerEventLast = ePointerLostCapture,

eContextMenu,

eLoad,
eUnload,
eHashChange,
eImageAbort,
eLoadError,
eLoadEnd,
ePopState,
eStorage,
eBeforeUnload,
eReadyStateChange,

eFormSubmit,
eFormReset,
eFormChange,
eFormSelect,
eFormInvalid,


eFocus,
eBlur,
eFocusIn,
eFocusOut,

eDragEnter,
eDragOver,
eDragExit,
eDrag,
eDragEnd,
eDragStart,
eDrop,
eDragLeave,
eDragDropEventFirst = eDragEnter, eDragDropEventLast = eDragLeave,


eXULPopupShowing,
eXULPopupShown,
eXULPopupPositioned,
eXULPopupHiding,
eXULPopupHidden,
eXULBroadcast,
eXULCommandUpdate,


eLegacyMouseLineOrPageScroll,
eLegacyMousePixelScroll,

eScrollPortUnderflow,
eScrollPortOverflow,

eLegacySubtreeModified,
eLegacyNodeInserted,
eLegacyNodeRemoved,
eLegacyNodeRemovedFromDocument,
eLegacyNodeInsertedIntoDocument,
eLegacyAttrModified,
eLegacyCharacterDataModified,
eLegacyMutationEventFirst = eLegacySubtreeModified, eLegacyMutationEventLast = eLegacyCharacterDataModified,


eUnidentifiedEvent,


eCompositionStart,



eCompositionEnd,




eCompositionUpdate,




eCompositionChange,






eCompositionCommitAsIs,





eCompositionCommit,




eLegacyDOMActivate,

eLegacyDOMFocusIn,

eLegacyDOMFocusOut,


ePageShow,
ePageHide,


eSVGLoad,
eSVGUnload,
eSVGResize,
eSVGScroll,


eSVGZoom,


eXULCommand,


eCopy,
eCut,
ePaste,
ePasteNoFormatting,



eQuerySelectedText,



eQueryTextContent,


eQueryCaretRect,



eQueryTextRect,


eQueryTextRectArray,


eQueryEditorRect,


eQueryContentState,

eQuerySelectionAsTransferable,



eQueryCharacterAtPoint,


eQueryDOMWidgetHittest,


eLoadStart,
eProgress,
eSuspend,
eEmptied,
eStalled,
ePlay,
ePause,
eLoadedMetaData,
eLoadedData,
eWaiting,
ePlaying,
eCanPlay,
eCanPlayThrough,
eSeeking,
eSeeked,
eTimeUpdate,
eEnded,
eRateChange,
eDurationChange,
eVolumeChange,


eAfterPaint,


eSwipeGestureMayStart,
eSwipeGestureStart,
eSwipeGestureUpdate,
eSwipeGestureEnd,
eSwipeGesture,
eMagnifyGestureStart,
eMagnifyGestureUpdate,
eMagnifyGesture,
eRotateGestureStart,
eRotateGestureUpdate,
eRotateGesture,
eTapGesture,
ePressTapGesture,
eEdgeUIStarted,
eEdgeUICanceled,
eEdgeUICompleted,


ePluginInputEvent,



eSetSelection,


eContentCommandCut,
eContentCommandCopy,
eContentCommandPaste,
eContentCommandDelete,
eContentCommandUndo,
eContentCommandRedo,
eContentCommandPasteTransferable,
eContentCommandLookUpDictionary,






eContentCommandScroll,


eGestureNotify,

eScrolledAreaChanged,


eTransitionStart,
eTransitionRun,
eTransitionEnd,
eTransitionCancel,
eAnimationStart,
eAnimationEnd,
eAnimationIteration,
eAnimationCancel,


eWebkitTransitionEnd,
eWebkitAnimationStart,
eWebkitAnimationEnd,
eWebkitAnimationIteration,

eSMILBeginEvent,
eSMILEndEvent,
eSMILRepeatEvent,

eAudioProcess,
eAudioComplete,


eBeforeScriptExecute,
eAfterScriptExecute,

eBeforePrint,
eAfterPrint,

eMessage,


eOpen,


eDeviceOrientation,
eAbsoluteDeviceOrientation,
eDeviceMotion,
eDeviceProximity,
eUserProximity,
eDeviceLight,





eVRDisplayActivate,
eVRDisplayDeactivate,
eVRDisplayConnect,
eVRDisplayDisconnect,
eVRDisplayPresentChange,

eShow,


eFullscreenChange,
eFullscreenError,
eMozFullscreenChange,
eMozFullscreenError,

eTouchStart,
eTouchMove,
eTouchEnd,
eTouchCancel,
eTouchPointerCancel,


ePointerLockChange,
ePointerLockError,
eMozPointerLockChange,
eMozPointerLockError,


eWheel,



eWheelOperationStart,



eWheelOperationEnd,


eTimeChange,


eNetworkUpload,
eNetworkDownload,


eMediaRecorderDataAvailable,
eMediaRecorderWarning,
eMediaRecorderStop,


eGamepadButtonDown,
eGamepadButtonUp,
eGamepadAxisMove,
eGamepadConnected,
eGamepadDisconnected,
eGamepadEventFirst = eGamepadButtonDown, eGamepadEventLast = eGamepadDisconnected,



eEditorInput,


eSelectStart,
eSelectionChange,


eToggle,


eClose,
# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h" 2





  eEventMessage_MaxValue
};

const char* ToChar(EventMessage aEventMessage);





typedef uint8_t EventClassIDType;

enum EventClassID : EventClassIDType
{







# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventClassList.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventClassList.h"
eBasicEventClass
, eGUIEventClass
, eInputEventClass
, eUIEventClass


, eKeyboardEventClass
, eCompositionEventClass
, eQueryContentEventClass
, eSelectionEventClass
, eEditorInputEventClass


, eMouseEventBaseClass
, eMouseEventClass
, eDragEventClass
, eMouseScrollEventClass
, eWheelEventClass
, ePointerEventClass


, eGestureNotifyEventClass
, eSimpleGestureEventClass
, eTouchEventClass


, eScrollPortEventClass
, eScrollAreaEventClass
, eFormEventClass
, eClipboardEventClass
, eFocusEventClass
, eTransitionEventClass
, eAnimationEventClass
, eSMILTimeEventClass


, eCommandEventClass
, eContentCommandEventClass
, ePluginEventClass


, eMutationEventClass
# 76 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h" 2



};

const char* ToChar(EventClassID aEventClassID);

typedef uint16_t Modifiers;




typedef uint16_t KeyNameIndexType;
enum KeyNameIndex : KeyNameIndexType
{

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/KeyNameList.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/KeyNameList.h"
KEY_NAME_INDEX_Unidentified,




KEY_NAME_INDEX_PrintableKey,
KEY_NAME_INDEX_SoftLeft,
KEY_NAME_INDEX_SoftRight,
# 42 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/KeyNameList.h"
KEY_NAME_INDEX_Alt,
KEY_NAME_INDEX_AltGraph,
KEY_NAME_INDEX_CapsLock,
KEY_NAME_INDEX_Control,
KEY_NAME_INDEX_Fn,
KEY_NAME_INDEX_FnLock,
KEY_NAME_INDEX_Hyper,
KEY_NAME_INDEX_Meta,
KEY_NAME_INDEX_NumLock,
KEY_NAME_INDEX_OS,
KEY_NAME_INDEX_ScrollLock,
KEY_NAME_INDEX_Shift,
KEY_NAME_INDEX_Super,
KEY_NAME_INDEX_Symbol,
KEY_NAME_INDEX_SymbolLock,




KEY_NAME_INDEX_Enter,
KEY_NAME_INDEX_Tab,




KEY_NAME_INDEX_ArrowDown,
KEY_NAME_INDEX_ArrowLeft,
KEY_NAME_INDEX_ArrowRight,
KEY_NAME_INDEX_ArrowUp,
KEY_NAME_INDEX_End,
KEY_NAME_INDEX_Home,
KEY_NAME_INDEX_PageDown,
KEY_NAME_INDEX_PageUp,




KEY_NAME_INDEX_Backspace,
KEY_NAME_INDEX_Clear,
KEY_NAME_INDEX_Copy,
KEY_NAME_INDEX_CrSel,
KEY_NAME_INDEX_Cut,
KEY_NAME_INDEX_Delete,
KEY_NAME_INDEX_EraseEof,
KEY_NAME_INDEX_ExSel,
KEY_NAME_INDEX_Insert,
KEY_NAME_INDEX_Paste,
KEY_NAME_INDEX_Redo,
KEY_NAME_INDEX_Undo,




KEY_NAME_INDEX_Accept,
KEY_NAME_INDEX_Again,
KEY_NAME_INDEX_Attn,
KEY_NAME_INDEX_Cancel,
KEY_NAME_INDEX_ContextMenu,
KEY_NAME_INDEX_Escape,
KEY_NAME_INDEX_Execute,
KEY_NAME_INDEX_Find,
KEY_NAME_INDEX_Help,
KEY_NAME_INDEX_Pause,
KEY_NAME_INDEX_Play,
KEY_NAME_INDEX_Props,
KEY_NAME_INDEX_Select,
KEY_NAME_INDEX_ZoomIn,
KEY_NAME_INDEX_ZoomOut,




KEY_NAME_INDEX_BrightnessDown,
KEY_NAME_INDEX_BrightnessUp,
KEY_NAME_INDEX_Eject,
KEY_NAME_INDEX_LogOff,
KEY_NAME_INDEX_Power,
KEY_NAME_INDEX_PowerOff,
KEY_NAME_INDEX_PrintScreen,
KEY_NAME_INDEX_Hibernate,
KEY_NAME_INDEX_Standby,
KEY_NAME_INDEX_WakeUp,




KEY_NAME_INDEX_AllCandidates,
KEY_NAME_INDEX_Alphanumeric,
KEY_NAME_INDEX_CodeInput,
KEY_NAME_INDEX_Compose,
KEY_NAME_INDEX_Convert,
KEY_NAME_INDEX_Dead,
KEY_NAME_INDEX_FinalMode,
KEY_NAME_INDEX_GroupFirst,
KEY_NAME_INDEX_GroupLast,
KEY_NAME_INDEX_GroupNext,
KEY_NAME_INDEX_GroupPrevious,
KEY_NAME_INDEX_ModeChange,
KEY_NAME_INDEX_NextCandidate,
KEY_NAME_INDEX_NonConvert,
KEY_NAME_INDEX_PreviousCandidate,
KEY_NAME_INDEX_Process,
KEY_NAME_INDEX_SingleCandidate,




KEY_NAME_INDEX_HangulMode,
KEY_NAME_INDEX_HanjaMode,
KEY_NAME_INDEX_JunjaMode,




KEY_NAME_INDEX_Eisu,
KEY_NAME_INDEX_Hankaku,
KEY_NAME_INDEX_Hiragana,
KEY_NAME_INDEX_HiraganaKatakana,
KEY_NAME_INDEX_KanaMode,
KEY_NAME_INDEX_KanjiMode,
KEY_NAME_INDEX_Katakana,
KEY_NAME_INDEX_Romaji,
KEY_NAME_INDEX_Zenkaku,
KEY_NAME_INDEX_ZenkakuHankaku,




KEY_NAME_INDEX_F1,
KEY_NAME_INDEX_F2,
KEY_NAME_INDEX_F3,
KEY_NAME_INDEX_F4,
KEY_NAME_INDEX_F5,
KEY_NAME_INDEX_F6,
KEY_NAME_INDEX_F7,
KEY_NAME_INDEX_F8,
KEY_NAME_INDEX_F9,
KEY_NAME_INDEX_F10,
KEY_NAME_INDEX_F11,
KEY_NAME_INDEX_F12,
KEY_NAME_INDEX_F13,
KEY_NAME_INDEX_F14,
KEY_NAME_INDEX_F15,
KEY_NAME_INDEX_F16,
KEY_NAME_INDEX_F17,
KEY_NAME_INDEX_F18,
KEY_NAME_INDEX_F19,
KEY_NAME_INDEX_F20,
KEY_NAME_INDEX_F21,
KEY_NAME_INDEX_F22,
KEY_NAME_INDEX_F23,
KEY_NAME_INDEX_F24,
KEY_NAME_INDEX_F25,
KEY_NAME_INDEX_F26,
KEY_NAME_INDEX_F27,
KEY_NAME_INDEX_F28,
KEY_NAME_INDEX_F29,
KEY_NAME_INDEX_F30,
KEY_NAME_INDEX_F31,
KEY_NAME_INDEX_F32,
KEY_NAME_INDEX_F33,
KEY_NAME_INDEX_F34,
KEY_NAME_INDEX_F35,
KEY_NAME_INDEX_Soft1,
KEY_NAME_INDEX_Soft2,
KEY_NAME_INDEX_Soft3,
KEY_NAME_INDEX_Soft4,




KEY_NAME_INDEX_ChannelDown,
KEY_NAME_INDEX_ChannelUp,
KEY_NAME_INDEX_Close,
KEY_NAME_INDEX_MailForward,
KEY_NAME_INDEX_MailReply,
KEY_NAME_INDEX_MailSend,
KEY_NAME_INDEX_MediaFastForward,
KEY_NAME_INDEX_MediaPause,
KEY_NAME_INDEX_MediaPlay,
KEY_NAME_INDEX_MediaPlayPause,
KEY_NAME_INDEX_MediaRecord,
KEY_NAME_INDEX_MediaRewind,
KEY_NAME_INDEX_MediaStop,
KEY_NAME_INDEX_MediaTrackNext,
KEY_NAME_INDEX_MediaTrackPrevious,
KEY_NAME_INDEX_New,
KEY_NAME_INDEX_Open,
KEY_NAME_INDEX_Print,
KEY_NAME_INDEX_Save,
KEY_NAME_INDEX_SpellCheck,




KEY_NAME_INDEX_Key11,
KEY_NAME_INDEX_Key12,




KEY_NAME_INDEX_AudioBalanceLeft,
KEY_NAME_INDEX_AudioBalanceRight,
KEY_NAME_INDEX_AudioBassBoostDown,
KEY_NAME_INDEX_AudioBassBoostToggle,
KEY_NAME_INDEX_AudioBassBoostUp,
KEY_NAME_INDEX_AudioFaderFront,
KEY_NAME_INDEX_AudioFaderRear,
KEY_NAME_INDEX_AudioSurroundModeNext,
KEY_NAME_INDEX_AudioTrebleDown,
KEY_NAME_INDEX_AudioTrebleUp,
KEY_NAME_INDEX_AudioVolumeDown,
KEY_NAME_INDEX_AudioVolumeUp,
KEY_NAME_INDEX_AudioVolumeMute,

KEY_NAME_INDEX_MicrophoneToggle,
KEY_NAME_INDEX_MicrophoneVolumeDown,
KEY_NAME_INDEX_MicrophoneVolumeUp,
KEY_NAME_INDEX_MicrophoneVolumeMute,




KEY_NAME_INDEX_SpeechCorrectionList,
KEY_NAME_INDEX_SpeechInputToggle,




KEY_NAME_INDEX_LaunchCalculator,
KEY_NAME_INDEX_LaunchCalendar,
KEY_NAME_INDEX_LaunchContacts,
KEY_NAME_INDEX_LaunchMail,
KEY_NAME_INDEX_LaunchMediaPlayer,
KEY_NAME_INDEX_LaunchMusicPlayer,
KEY_NAME_INDEX_LaunchMyComputer,
KEY_NAME_INDEX_LaunchPhone,
KEY_NAME_INDEX_LaunchScreenSaver,
KEY_NAME_INDEX_LaunchSpreadsheet,
KEY_NAME_INDEX_LaunchWebBrowser,
KEY_NAME_INDEX_LaunchWebCam,
KEY_NAME_INDEX_LaunchWordProcessor,

KEY_NAME_INDEX_LaunchApplication1,
KEY_NAME_INDEX_LaunchApplication2,
KEY_NAME_INDEX_LaunchApplication3,
KEY_NAME_INDEX_LaunchApplication4,
KEY_NAME_INDEX_LaunchApplication5,
KEY_NAME_INDEX_LaunchApplication6,
KEY_NAME_INDEX_LaunchApplication7,
KEY_NAME_INDEX_LaunchApplication8,
KEY_NAME_INDEX_LaunchApplication9,
KEY_NAME_INDEX_LaunchApplication10,
KEY_NAME_INDEX_LaunchApplication11,
KEY_NAME_INDEX_LaunchApplication12,
KEY_NAME_INDEX_LaunchApplication13,
KEY_NAME_INDEX_LaunchApplication14,
KEY_NAME_INDEX_LaunchApplication15,
KEY_NAME_INDEX_LaunchApplication16,
KEY_NAME_INDEX_LaunchApplication17,
KEY_NAME_INDEX_LaunchApplication18,




KEY_NAME_INDEX_BrowserBack,
KEY_NAME_INDEX_BrowserFavorites,
KEY_NAME_INDEX_BrowserForward,
KEY_NAME_INDEX_BrowserHome,
KEY_NAME_INDEX_BrowserRefresh,
KEY_NAME_INDEX_BrowserSearch,
KEY_NAME_INDEX_BrowserStop,




KEY_NAME_INDEX_AppSwitch,
KEY_NAME_INDEX_Call,
KEY_NAME_INDEX_Camera,
KEY_NAME_INDEX_CameraFocus,
KEY_NAME_INDEX_EndCall,
KEY_NAME_INDEX_GoBack,
KEY_NAME_INDEX_GoHome,
KEY_NAME_INDEX_HeadsetHook,
KEY_NAME_INDEX_LastNumberRedial,
KEY_NAME_INDEX_Notification,
KEY_NAME_INDEX_MannerMode,
KEY_NAME_INDEX_VoiceDial,




KEY_NAME_INDEX_TV,
KEY_NAME_INDEX_TV3DMode,
KEY_NAME_INDEX_TVAntennaCable,
KEY_NAME_INDEX_TVAudioDescription,
KEY_NAME_INDEX_TVAudioDescriptionMixDown,
KEY_NAME_INDEX_TVAudioDescriptionMixUp,
KEY_NAME_INDEX_TVContentsMenu,
KEY_NAME_INDEX_TVDataService,
KEY_NAME_INDEX_TVInput,
KEY_NAME_INDEX_TVInputComponent1,
KEY_NAME_INDEX_TVInputComponent2,
KEY_NAME_INDEX_TVInputComposite1,
KEY_NAME_INDEX_TVInputComposite2,
KEY_NAME_INDEX_TVInputHDMI1,
KEY_NAME_INDEX_TVInputHDMI2,
KEY_NAME_INDEX_TVInputHDMI3,
KEY_NAME_INDEX_TVInputHDMI4,
KEY_NAME_INDEX_TVInputVGA1,
KEY_NAME_INDEX_TVMediaContext,
KEY_NAME_INDEX_TVNetwork,
KEY_NAME_INDEX_TVNumberEntry,
KEY_NAME_INDEX_TVPower,
KEY_NAME_INDEX_TVRadioService,
KEY_NAME_INDEX_TVSatellite,
KEY_NAME_INDEX_TVSatelliteBS,
KEY_NAME_INDEX_TVSatelliteCS,
KEY_NAME_INDEX_TVSatelliteToggle,
KEY_NAME_INDEX_TVTerrestrialAnalog,
KEY_NAME_INDEX_TVTerrestrialDigital,
KEY_NAME_INDEX_TVTimer,




KEY_NAME_INDEX_AVRInput,
KEY_NAME_INDEX_AVRPower,
KEY_NAME_INDEX_ColorF0Red,
KEY_NAME_INDEX_ColorF1Green,
KEY_NAME_INDEX_ColorF2Yellow,
KEY_NAME_INDEX_ColorF3Blue,
KEY_NAME_INDEX_ColorF4Grey,
KEY_NAME_INDEX_ColorF5Brown,
KEY_NAME_INDEX_ClosedCaptionToggle,
KEY_NAME_INDEX_Dimmer,
KEY_NAME_INDEX_DisplaySwap,
KEY_NAME_INDEX_DVR,
KEY_NAME_INDEX_Exit,
KEY_NAME_INDEX_FavoriteClear0,
KEY_NAME_INDEX_FavoriteClear1,
KEY_NAME_INDEX_FavoriteClear2,
KEY_NAME_INDEX_FavoriteClear3,
KEY_NAME_INDEX_FavoriteRecall0,
KEY_NAME_INDEX_FavoriteRecall1,
KEY_NAME_INDEX_FavoriteRecall2,
KEY_NAME_INDEX_FavoriteRecall3,
KEY_NAME_INDEX_FavoriteStore0,
KEY_NAME_INDEX_FavoriteStore1,
KEY_NAME_INDEX_FavoriteStore2,
KEY_NAME_INDEX_FavoriteStore3,
KEY_NAME_INDEX_Guide,
KEY_NAME_INDEX_GuideNextDay,
KEY_NAME_INDEX_GuidePreviousDay,
KEY_NAME_INDEX_Info,
KEY_NAME_INDEX_InstantReplay,
KEY_NAME_INDEX_Link,
KEY_NAME_INDEX_ListProgram,
KEY_NAME_INDEX_LiveContent,
KEY_NAME_INDEX_Lock,
KEY_NAME_INDEX_MediaApps,
KEY_NAME_INDEX_MediaAudioTrack,
KEY_NAME_INDEX_MediaLast,
KEY_NAME_INDEX_MediaSkipBackward,
KEY_NAME_INDEX_MediaSkipForward,
KEY_NAME_INDEX_MediaStepBackward,
KEY_NAME_INDEX_MediaStepForward,
KEY_NAME_INDEX_MediaTopMenu,
KEY_NAME_INDEX_NavigateIn,
KEY_NAME_INDEX_NavigateNext,
KEY_NAME_INDEX_NavigateOut,
KEY_NAME_INDEX_NavigatePrevious,
KEY_NAME_INDEX_NextFavoriteChannel,
KEY_NAME_INDEX_NextUserProfile,
KEY_NAME_INDEX_OnDemand,
KEY_NAME_INDEX_Pairing,
KEY_NAME_INDEX_PinPDown,
KEY_NAME_INDEX_PinPMove,
KEY_NAME_INDEX_PinPToggle,
KEY_NAME_INDEX_PinPUp,
KEY_NAME_INDEX_PlaySpeedDown,
KEY_NAME_INDEX_PlaySpeedReset,
KEY_NAME_INDEX_PlaySpeedUp,
KEY_NAME_INDEX_RandomToggle,
KEY_NAME_INDEX_RcLowBattery,
KEY_NAME_INDEX_RecordSpeedNext,
KEY_NAME_INDEX_RfBypass,
KEY_NAME_INDEX_ScanChannelsToggle,
KEY_NAME_INDEX_ScreenModeNext,
KEY_NAME_INDEX_Settings,
KEY_NAME_INDEX_SplitScreenToggle,
KEY_NAME_INDEX_STBInput,
KEY_NAME_INDEX_STBPower,
KEY_NAME_INDEX_Subtitle,
KEY_NAME_INDEX_Teletext,
KEY_NAME_INDEX_VideoModeNext,
KEY_NAME_INDEX_Wink,
KEY_NAME_INDEX_ZoomToggle,
# 92 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h" 2


  KEY_NAME_INDEX_USE_STRING
};



const nsCString ToString(KeyNameIndex aKeyNameIndex);




typedef uint8_t CodeNameIndexType;
enum CodeNameIndex : CodeNameIndexType
{

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PhysicalKeyCodeNameList.h" 1
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PhysicalKeyCodeNameList.h"
CODE_NAME_INDEX_UNKNOWN,


CODE_NAME_INDEX_Backquote,
CODE_NAME_INDEX_Backslash,
CODE_NAME_INDEX_Backspace,
CODE_NAME_INDEX_BracketLeft,
CODE_NAME_INDEX_BracketRight,
CODE_NAME_INDEX_Comma,
CODE_NAME_INDEX_Digit0,
CODE_NAME_INDEX_Digit1,
CODE_NAME_INDEX_Digit2,
CODE_NAME_INDEX_Digit3,
CODE_NAME_INDEX_Digit4,
CODE_NAME_INDEX_Digit5,
CODE_NAME_INDEX_Digit6,
CODE_NAME_INDEX_Digit7,
CODE_NAME_INDEX_Digit8,
CODE_NAME_INDEX_Digit9,
CODE_NAME_INDEX_Equal,
CODE_NAME_INDEX_IntlBackslash,
CODE_NAME_INDEX_IntlHash,
CODE_NAME_INDEX_IntlRo,
CODE_NAME_INDEX_IntlYen,
CODE_NAME_INDEX_KeyA,
CODE_NAME_INDEX_KeyB,
CODE_NAME_INDEX_KeyC,
CODE_NAME_INDEX_KeyD,
CODE_NAME_INDEX_KeyE,
CODE_NAME_INDEX_KeyF,
CODE_NAME_INDEX_KeyG,
CODE_NAME_INDEX_KeyH,
CODE_NAME_INDEX_KeyI,
CODE_NAME_INDEX_KeyJ,
CODE_NAME_INDEX_KeyK,
CODE_NAME_INDEX_KeyL,
CODE_NAME_INDEX_KeyM,
CODE_NAME_INDEX_KeyN,
CODE_NAME_INDEX_KeyO,
CODE_NAME_INDEX_KeyP,
CODE_NAME_INDEX_KeyQ,
CODE_NAME_INDEX_KeyR,
CODE_NAME_INDEX_KeyS,
CODE_NAME_INDEX_KeyT,
CODE_NAME_INDEX_KeyU,
CODE_NAME_INDEX_KeyV,
CODE_NAME_INDEX_KeyW,
CODE_NAME_INDEX_KeyX,
CODE_NAME_INDEX_KeyY,
CODE_NAME_INDEX_KeyZ,
CODE_NAME_INDEX_Minus,
CODE_NAME_INDEX_Period,
CODE_NAME_INDEX_Quote,
CODE_NAME_INDEX_Semicolon,
CODE_NAME_INDEX_Slash,


CODE_NAME_INDEX_AltLeft,
CODE_NAME_INDEX_AltRight,
CODE_NAME_INDEX_CapsLock,
CODE_NAME_INDEX_ContextMenu,
CODE_NAME_INDEX_ControlLeft,
CODE_NAME_INDEX_ControlRight,
CODE_NAME_INDEX_Enter,
CODE_NAME_INDEX_OSLeft,
CODE_NAME_INDEX_OSRight,
CODE_NAME_INDEX_ShiftLeft,
CODE_NAME_INDEX_ShiftRight,
CODE_NAME_INDEX_Space,
CODE_NAME_INDEX_Tab,


CODE_NAME_INDEX_Convert,
CODE_NAME_INDEX_KanaMode,
CODE_NAME_INDEX_Lang1,
CODE_NAME_INDEX_Lang2,
CODE_NAME_INDEX_Lang3,
CODE_NAME_INDEX_Lang4,
CODE_NAME_INDEX_Lang5,
CODE_NAME_INDEX_NonConvert,


CODE_NAME_INDEX_Delete,
CODE_NAME_INDEX_End,
CODE_NAME_INDEX_Help,
CODE_NAME_INDEX_Home,
CODE_NAME_INDEX_Insert,
CODE_NAME_INDEX_PageDown,
CODE_NAME_INDEX_PageUp,


CODE_NAME_INDEX_ArrowDown,
CODE_NAME_INDEX_ArrowLeft,
CODE_NAME_INDEX_ArrowRight,
CODE_NAME_INDEX_ArrowUp,


CODE_NAME_INDEX_NumLock,
CODE_NAME_INDEX_Numpad0,
CODE_NAME_INDEX_Numpad1,
CODE_NAME_INDEX_Numpad2,
CODE_NAME_INDEX_Numpad3,
CODE_NAME_INDEX_Numpad4,
CODE_NAME_INDEX_Numpad5,
CODE_NAME_INDEX_Numpad6,
CODE_NAME_INDEX_Numpad7,
CODE_NAME_INDEX_Numpad8,
CODE_NAME_INDEX_Numpad9,
CODE_NAME_INDEX_NumpadAdd,
CODE_NAME_INDEX_NumpadBackspace,
CODE_NAME_INDEX_NumpadClear,
CODE_NAME_INDEX_NumpadClearEntry,
CODE_NAME_INDEX_NumpadComma,
CODE_NAME_INDEX_NumpadDecimal,
CODE_NAME_INDEX_NumpadDivide,
CODE_NAME_INDEX_NumpadEnter,
CODE_NAME_INDEX_NumpadEqual,
CODE_NAME_INDEX_NumpadMemoryAdd,
CODE_NAME_INDEX_NumpadMemoryClear,
CODE_NAME_INDEX_NumpadMemoryRecall,
CODE_NAME_INDEX_NumpadMemoryStore,
CODE_NAME_INDEX_NumpadMemorySubtract,
CODE_NAME_INDEX_NumpadMultiply,
CODE_NAME_INDEX_NumpadParenLeft,
CODE_NAME_INDEX_NumpadParenRight,
CODE_NAME_INDEX_NumpadSubtract,


CODE_NAME_INDEX_Escape,
CODE_NAME_INDEX_F1,
CODE_NAME_INDEX_F2,
CODE_NAME_INDEX_F3,
CODE_NAME_INDEX_F4,
CODE_NAME_INDEX_F5,
CODE_NAME_INDEX_F6,
CODE_NAME_INDEX_F7,
CODE_NAME_INDEX_F8,
CODE_NAME_INDEX_F9,
CODE_NAME_INDEX_F10,
CODE_NAME_INDEX_F11,
CODE_NAME_INDEX_F12,
CODE_NAME_INDEX_F13,
CODE_NAME_INDEX_F14,
CODE_NAME_INDEX_F15,
CODE_NAME_INDEX_F16,
CODE_NAME_INDEX_F17,
CODE_NAME_INDEX_F18,
CODE_NAME_INDEX_F19,
CODE_NAME_INDEX_F20,
CODE_NAME_INDEX_F21,
CODE_NAME_INDEX_F22,
CODE_NAME_INDEX_F23,
CODE_NAME_INDEX_F24,
CODE_NAME_INDEX_Fn,
CODE_NAME_INDEX_FnLock,
CODE_NAME_INDEX_PrintScreen,
CODE_NAME_INDEX_ScrollLock,
CODE_NAME_INDEX_Pause,


CODE_NAME_INDEX_BrowserBack,
CODE_NAME_INDEX_BrowserFavorites,
CODE_NAME_INDEX_BrowserForward,
CODE_NAME_INDEX_BrowserHome,
CODE_NAME_INDEX_BrowserRefresh,
CODE_NAME_INDEX_BrowserSearch,
CODE_NAME_INDEX_BrowserStop,
CODE_NAME_INDEX_Eject,
CODE_NAME_INDEX_LaunchApp1,
CODE_NAME_INDEX_LaunchApp2,
CODE_NAME_INDEX_LaunchMail,
CODE_NAME_INDEX_MediaPlayPause,
CODE_NAME_INDEX_MediaSelect,
CODE_NAME_INDEX_MediaStop,
CODE_NAME_INDEX_MediaTrackNext,
CODE_NAME_INDEX_MediaTrackPrevious,
CODE_NAME_INDEX_Power,
CODE_NAME_INDEX_Sleep,
CODE_NAME_INDEX_VolumeDown,
CODE_NAME_INDEX_VolumeMute,
CODE_NAME_INDEX_VolumeUp,
CODE_NAME_INDEX_WakeUp,
# 220 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PhysicalKeyCodeNameList.h"
CODE_NAME_INDEX_Again,
CODE_NAME_INDEX_Copy,
CODE_NAME_INDEX_Cut,
CODE_NAME_INDEX_Find,
CODE_NAME_INDEX_Open,
CODE_NAME_INDEX_Paste,
CODE_NAME_INDEX_Props,
CODE_NAME_INDEX_Select,
CODE_NAME_INDEX_Undo,
# 108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h" 2


  CODE_NAME_INDEX_USE_STRING
};



const nsCString ToString(CodeNameIndex aCodeNameIndex);



typedef int8_t CommandInt;
enum Command : CommandInt
{
  CommandDoNothing


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CommandList.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CommandList.h"
, CommandBeginLine
, CommandCharNext
, CommandCharPrevious
, CommandCopy
, CommandCut
, CommandDelete
, CommandDeleteCharBackward
, CommandDeleteCharForward
, CommandDeleteToBeginningOfLine
, CommandDeleteToEndOfLine
, CommandDeleteWordBackward
, CommandDeleteWordForward
, CommandEndLine
, CommandLineNext
, CommandLinePrevious
, CommandMoveBottom
, CommandMovePageDown
, CommandMovePageUp
, CommandMoveTop
, CommandPaste
, CommandScrollBottom
, CommandScrollLineDown
, CommandScrollLineUp
, CommandScrollPageDown
, CommandScrollPageUp
, CommandScrollTop
, CommandSelectAll
, CommandSelectBeginLine
, CommandSelectBottom
, CommandSelectCharNext
, CommandSelectCharPrevious
, CommandSelectEndLine
, CommandSelectLineNext
, CommandSelectLinePrevious
, CommandSelectPageDown
, CommandSelectPageUp
, CommandSelectTop
, CommandSelectWordNext
, CommandSelectWordPrevious
, CommandWordNext
, CommandWordPrevious
# 125 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h" 2
};


}





namespace mozilla {





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventClassList.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventClassList.h"
class WidgetEvent;
class WidgetGUIEvent;
class WidgetInputEvent;
class InternalUIEvent;


class WidgetKeyboardEvent;
class WidgetCompositionEvent;
class WidgetQueryContentEvent;
class WidgetSelectionEvent;
class InternalEditorInputEvent;


class WidgetMouseEventBase;
class WidgetMouseEvent;
class WidgetDragEvent;
class WidgetMouseScrollEvent;
class WidgetWheelEvent;
class WidgetPointerEvent;


class WidgetGestureNotifyEvent;
class WidgetSimpleGestureEvent;
class WidgetTouchEvent;


class InternalScrollPortEvent;
class InternalScrollAreaEvent;
class InternalFormEvent;
class InternalClipboardEvent;
class InternalFocusEvent;
class InternalTransitionEvent;
class InternalAnimationEvent;
class InternalSMILTimeEvent;


class WidgetCommandEvent;
class WidgetContentCommandEvent;
class WidgetPluginEvent;


class InternalMutationEvent;
# 140 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventForwards.h" 2





struct BaseEventFlags;
struct EventFlags;

class WidgetEventTime;

class NativeEventData;


struct AlternativeCharCode;
struct ShortcutKeyCandidate;

typedef nsTArray<ShortcutKeyCandidate> ShortcutKeyCandidateArray;
typedef AutoTArray<ShortcutKeyCandidate, 10> AutoShortcutKeyCandidateArray;


typedef uint8_t RawTextRangeType;
enum class TextRangeType : RawTextRangeType;

struct TextRangeStyle;
struct TextRange;

class TextRangeArray;


struct FontRange;

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptGlobalObject.h" 2

class nsIScriptContext;
class nsIScriptGlobalObject;

namespace mozilla {
namespace dom {
struct ErrorEventInit;
}
}






bool
NS_HandleScriptError(nsIScriptGlobalObject *aScriptGlobal,
                     const mozilla::dom::ErrorEventInit &aErrorEvent,
                     nsEventStatus *aStatus);
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptGlobalObject.h"
class nsIScriptGlobalObject : public nsIGlobalObject
{
public:
  template<typename T, typename U> struct COMTypeInfo;
# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptGlobalObject.h"
  virtual nsresult EnsureScriptEnvironment() = 0;



  virtual nsIScriptContext *GetScriptContext() = 0;

  nsIScriptContext* GetContext() {
    return GetScriptContext();
  }




  virtual nsresult HandleScriptError(
                     const mozilla::dom::ErrorEventInit &aErrorEventInit,
                     nsEventStatus *aEventStatus) {
    do { if ((__builtin_expect(!!(!(NS_HandleScriptError(this, aErrorEventInit, aEventStatus))), 0))) { do { } while(0); return NS_ERROR_UNEXPECTED; } } while(0);
    return NS_OK;
  }

  virtual bool IsBlackForCC(bool aTracingNeeded = true) { return false; }

protected:
  virtual ~nsIScriptGlobalObject() {}
};

template<typename T> struct nsIScriptGlobalObject::COMTypeInfo<nsIScriptGlobalObject, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIScriptGlobalObject::COMTypeInfo<nsIScriptGlobalObject, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x876f83bd, 0x6314, 0x460a, { 0xa0, 0x45, 0x1c, 0x8f, 0x46, 0x2f, 0xb8, 0xe1 } };
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIObserver.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIObserver.h"
class nsIObserver : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Observe(nsISupports *aSubject, const char * aTopic, const char16_t * aData) = 0;

};

  template<typename T> struct nsIObserver::COMTypeInfo<nsIObserver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIObserver::COMTypeInfo<nsIObserver, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xdb242e01, 0xe4d9, 0x11d2, { 0x9d, 0xde, 0x00, 0x00, 0x64, 0x65, 0x73, 0x74 }};
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prlong.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prlong.h"
extern "C" {
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prlong.h"
extern __attribute__((visibility("default"))) PRInt64 LL_MaxInt(void);
extern __attribute__((visibility("default"))) PRInt64 LL_MinInt(void);
extern __attribute__((visibility("default"))) PRInt64 LL_Zero(void);
extern __attribute__((visibility("default"))) PRUint64 LL_MaxUint(void);
# 401 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prlong.h"
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h" 2

extern "C" {
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
typedef PRInt64 PRTime;






typedef struct PRTimeParameters {
    PRInt32 tp_gmt_offset;
    PRInt32 tp_dst_offset;
} PRTimeParameters;
# 83 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
typedef struct PRExplodedTime {
    PRInt32 tm_usec;
    PRInt32 tm_sec;

    PRInt32 tm_min;
    PRInt32 tm_hour;
    PRInt32 tm_mday;

    PRInt32 tm_month;
    PRInt16 tm_year;


    PRInt8 tm_wday;

    PRInt16 tm_yday;


    PRTimeParameters tm_params;
} PRExplodedTime;
# 126 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
typedef PRTimeParameters ( *PRTimeParamFn)(const PRExplodedTime *gmt);
# 145 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
extern __attribute__((visibility("default"))) PRTime
PR_Now(void);
# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
extern __attribute__((visibility("default"))) void PR_ExplodeTime(
    PRTime usecs, PRTimeParamFn params, PRExplodedTime *exploded);


extern __attribute__((visibility("default"))) PRTime
PR_ImplodeTime(const PRExplodedTime *exploded);
# 177 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
extern __attribute__((visibility("default"))) void PR_NormalizeTime(
    PRExplodedTime *exploded, PRTimeParamFn params);






extern __attribute__((visibility("default"))) PRTimeParameters PR_LocalTimeParameters(const PRExplodedTime *gmt);


extern __attribute__((visibility("default"))) PRTimeParameters PR_GMTParameters(const PRExplodedTime *gmt);





extern __attribute__((visibility("default"))) PRTimeParameters PR_USPacificTimeParameters(const PRExplodedTime *gmt);
# 231 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
extern __attribute__((visibility("default"))) PRStatus PR_ParseTimeStringToExplodedTime (
        const char *string,
        PRBool default_to_gmt,
        PRExplodedTime *result);
# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prtime.h"
extern __attribute__((visibility("default"))) PRStatus PR_ParseTimeString (
 const char *string,
 PRBool default_to_gmt,
 PRTime *result);


extern __attribute__((visibility("default"))) PRUint32 PR_FormatTime(char *buf, int buflen, const char *fmt,
                                 const PRExplodedTime *time);




extern __attribute__((visibility("default"))) PRUint32
PR_FormatTimeUSEnglish(char *buf, PRUint32 bufSize,
                       const char *format, const PRExplodedTime *time);

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
struct JSFreeOp;
class nsWrapperCache;
class nsAXPCNativeCallContext;
class nsIXPCScriptable;

class nsIXPConnect;

class nsIXPConnectWrappedNative;

class nsIInterfaceInfo;

class nsIXPCSecurityManager;

class nsIPrincipal;

class nsIClassInfo;

class nsIVariant;

class nsIStackFrame;

class nsIObjectInputStream;

class nsIObjectOutputStream;
# 56 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
class nsIXPConnectJSObjectHolder : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual JSObject * GetJSObject(void) = 0;

};

  template<typename T> struct nsIXPConnectJSObjectHolder::COMTypeInfo<nsIXPConnectJSObjectHolder, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPConnectJSObjectHolder::COMTypeInfo<nsIXPConnectJSObjectHolder, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x73e6ff4a, 0xab99, 0x4d99, { 0xac, 0x00, 0xba, 0x39, 0xcc, 0xb8, 0xe4, 0xd7 }};
# 134 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
class nsIXPConnectWrappedNative : public nsIXPConnectJSObjectHolder {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetNative(nsISupports * *aNative) = 0;


  virtual nsresult GetJSObjectPrototype(JSObject **aJSObjectPrototype) = 0;


  virtual nsresult FindInterfaceWithMember(JS::Handle<jsid> nameID, nsIInterfaceInfo * *_retval) = 0;


  virtual nsresult FindInterfaceWithName(JS::Handle<jsid> nameID, nsIInterfaceInfo * *_retval) = 0;


  virtual bool HasNativeMember(JS::Handle<jsid> name) = 0;


  virtual nsresult DebugDump(int16_t depth) = 0;




    nsISupports* Native() const { return mIdentity; }
protected:
    nsCOMPtr<nsISupports> mIdentity;
public:
};

  template<typename T> struct nsIXPConnectWrappedNative::COMTypeInfo<nsIXPConnectWrappedNative, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPConnectWrappedNative::COMTypeInfo<nsIXPConnectWrappedNative, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xe787be29, 0xdb5d, 0x4a45, { 0xa3, 0xd6, 0x1d, 0xe1, 0xd6, 0xb8, 0x5c, 0x30 }};
# 277 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
inline
const nsQueryInterface
do_QueryWrappedNative(nsIXPConnectWrappedNative *aWrappedNative)
{
    return nsQueryInterface(aWrappedNative->Native());
}
inline
const nsQueryInterfaceWithError
do_QueryWrappedNative(nsIXPConnectWrappedNative *aWrappedNative,
                      nsresult *aError)
{
    return nsQueryInterfaceWithError(aWrappedNative->Native(), aError);
}
# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
class nsIXPConnectWrappedJS : public nsIXPConnectJSObjectHolder {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetInterfaceInfo(nsIInterfaceInfo * *aInterfaceInfo) = 0;


  virtual nsresult GetInterfaceIID(nsIID **aInterfaceIID) = 0;


  virtual nsresult DebugDump(int16_t depth) = 0;


  virtual nsresult AggregatedQueryInterface(const nsIID & uuid, void **result) = 0;

};

  template<typename T> struct nsIXPConnectWrappedJS::COMTypeInfo<nsIXPConnectWrappedJS, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPConnectWrappedJS::COMTypeInfo<nsIXPConnectWrappedJS, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x3a01b0d6, 0x074b, 0x49ed, { 0xba, 0xc3, 0x08, 0xc7, 0x63, 0x66, 0xca, 0xe4 }};
# 415 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
class nsIXPConnectWrappedJSUnmarkGray : public nsIXPConnectWrappedJS {
 public:

  template<typename T, typename U> struct COMTypeInfo;

};

  template<typename T> struct nsIXPConnectWrappedJSUnmarkGray::COMTypeInfo<nsIXPConnectWrappedJSUnmarkGray, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPConnectWrappedJSUnmarkGray::COMTypeInfo<nsIXPConnectWrappedJSUnmarkGray, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xc02a0ce6, 0x275f, 0x4ea1, { 0x9c, 0x23, 0x08, 0x49, 0x48, 0x98, 0xb0, 0x70 }};
# 484 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
class nsIXPCWrappedJSObjectGetter : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetNeverCalled(nsISupports * *aNeverCalled) = 0;

};

  template<typename T> struct nsIXPCWrappedJSObjectGetter::COMTypeInfo<nsIXPCWrappedJSObjectGetter, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPCWrappedJSObjectGetter::COMTypeInfo<nsIXPCWrappedJSObjectGetter, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x254bb2e0, 0x6439, 0x11d4, { 0x8f, 0xe0, 0x00, 0x10, 0xa4, 0xe7, 0x3d, 0x9a }};
# 562 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
class nsIXPCFunctionThisTranslator : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult TranslateThis(nsISupports *aInitialThis, nsISupports * *_retval) = 0;

};

  template<typename T> struct nsIXPCFunctionThisTranslator::COMTypeInfo<nsIXPCFunctionThisTranslator, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPCFunctionThisTranslator::COMTypeInfo<nsIXPCFunctionThisTranslator, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xf5f84b70, 0x92eb, 0x41f1, { 0xa1, 0xdd, 0x2e, 0xaa, 0xc0, 0xed, 0x56, 0x4c }};
# 645 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPConnect.h"
class nsIXPConnect : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

   static const nsID& GetCID() {static const nsID cid = { 0xcb6593e0, 0xf9b2, 0x11d2, { 0xbd, 0xd6, 0x0, 0x0, 0x64, 0x65, 0x73, 0x74 } }; return cid;}

  virtual nsresult InitClassesWithNewWrappedGlobal(JSContext *aJSContext, nsISupports *aCOMObj, nsIPrincipal *aPrincipal, uint32_t aFlags, JS::CompartmentOptions & aOptions, nsIXPConnectJSObjectHolder * *_retval) = 0;

  enum {
    INIT_JS_STANDARD_CLASSES = 1U,
    DONT_FIRE_ONNEWGLOBALHOOK = 2U,
    OMIT_COMPONENTS_OBJECT = 4U
  };


  virtual nsresult WrapNative(JSContext *aJSContext, JSObject *aScope, nsISupports *aCOMObj, const nsIID & aIID, JSObject **_retval) = 0;


  virtual nsresult WrapNativeHolder(JSContext *aJSContext, JSObject *aScope, nsISupports *aCOMObj, const nsIID & aIID, nsIXPConnectJSObjectHolder * *_retval) = 0;


  virtual nsresult WrapNativeToJSVal(JSContext *aJSContext, JSObject *aScope, nsISupports *aCOMObj, nsWrapperCache *aCache, const nsIID *aIID, bool aAllowWrapper, JS::MutableHandleValue aVal) = 0;


  virtual nsresult WrapJS(JSContext *aJSContext, JSObject *aJSObj, const nsIID & aIID, void **result) = 0;


  virtual nsresult JSValToVariant(JSContext *cx, JS::HandleValue aJSVal, nsIVariant * *_retval) = 0;


  virtual nsresult GetWrappedNativeOfJSObject(JSContext *aJSContext, JSObject *aJSObj, nsIXPConnectWrappedNative * *_retval) = 0;


  virtual nsISupports * GetNativeOfWrapper(JSContext *aJSContext, JSObject *aJSObj) = 0;


  virtual nsresult GetCurrentJSStack(nsIStackFrame * *aCurrentJSStack) = 0;


  virtual nsresult GetCurrentNativeCallContext(nsAXPCNativeCallContext **aCurrentNativeCallContext) = 0;


  virtual nsresult DebugDump(int16_t depth) = 0;


  virtual nsresult DebugDumpObject(nsISupports *aCOMObj, int16_t depth) = 0;


  virtual nsresult DebugDumpJSStack(bool showArgs, bool showLocals, bool showThisProps) = 0;


  virtual nsresult WrapJSAggregatedToNative(nsISupports *aOuter, JSContext *aJSContext, JSObject *aJSObj, const nsIID & aIID, void **result) = 0;


  virtual nsresult GetWrappedNativeOfNativeObject(JSContext *aJSContext, JSObject *aScope, nsISupports *aCOMObj, const nsIID & aIID, nsIXPConnectWrappedNative * *_retval) = 0;


  virtual nsresult SetFunctionThisTranslator(const nsIID & aIID, nsIXPCFunctionThisTranslator *aTranslator) = 0;


  virtual nsresult GetWrappedNativePrototype(JSContext *aJSContext, JSObject *aScope, nsIClassInfo *aClassInfo, JSObject **_retval) = 0;


  virtual nsresult VariantToJS(JSContext *ctx, JSObject *scope, nsIVariant *value, JS::MutableHandleValue _retval) = 0;


  virtual nsresult JSToVariant(JSContext *ctx, JS::HandleValue value, nsIVariant * *_retval) = 0;


  virtual nsresult CreateSandbox(JSContext *cx, nsIPrincipal *principal, JSObject **_retval) = 0;


  virtual nsresult EvalInSandboxObject(const nsAString & source, const char * filename, JSContext *cx, JSObject *sandbox, JS::MutableHandleValue _retval) = 0;


  virtual nsresult GarbageCollect(uint32_t reason) = 0;


  virtual nsresult NotifyDidPaint(void) = 0;







    virtual nsIPrincipal* GetPrincipal(JSObject* obj,
                                       bool allowShortCircuit) const = 0;
    virtual char* DebugPrintJSStack(bool showArgs,
                                    bool showLocals,
                                    bool showThisProps) = 0;

  virtual nsresult WriteScript(nsIObjectOutputStream *aStream, JSContext *aJSContext, JSScript *aJSScript) = 0;


  virtual nsresult ReadScript(nsIObjectInputStream *aStream, JSContext *aJSContext, JSScript **_retval) = 0;


  virtual nsresult WriteFunction(nsIObjectOutputStream *aStream, JSContext *aJSContext, JSObject *aJSObject) = 0;


  virtual nsresult ReadFunction(nsIObjectInputStream *aStream, JSContext *aJSContext, JSObject **_retval) = 0;

};

  template<typename T> struct nsIXPConnect::COMTypeInfo<nsIXPConnect, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPConnect::COMTypeInfo<nsIXPConnect, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x768507b5, 0xb981, 0x40c7, { 0x82, 0x76, 0xf6, 0xa1, 0xda, 0x50, 0x2a, 0x24 }};
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIArray.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIArray.h"
class nsISimpleEnumerator;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIArray.h"
class nsIArray : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetLength(uint32_t *aLength) = 0;


  virtual nsresult QueryElementAt(uint32_t index, const nsIID & uuid, void **result) = 0;


  virtual nsresult IndexOf(uint32_t startIndex, nsISupports *element, uint32_t *_retval) = 0;


  virtual nsresult Enumerate(nsISimpleEnumerator * *_retval) = 0;

};

  template<typename T> struct nsIArray::COMTypeInfo<nsIArray, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIArray::COMTypeInfo<nsIArray, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x114744d9, 0xc369, 0x456e, { 0xb5, 0x5a, 0x52, 0xfe, 0x52, 0x88, 0x0d, 0x2d }};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICancelableRunnable.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICancelableRunnable.h"
class nsICancelableRunnable : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICancelableRunnable.h"
  virtual nsresult Cancel() = 0;

protected:
  nsICancelableRunnable() { }
  virtual ~nsICancelableRunnable() {}
};

template<typename T> struct nsICancelableRunnable::COMTypeInfo<nsICancelableRunnable, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsICancelableRunnable::COMTypeInfo<nsICancelableRunnable, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xde93dc4c, 0x5eea, 0x4eb7, { 0xb6, 0xd1, 0xdb, 0xf1, 0xe0, 0xce, 0xf6, 0x5c } };
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIIdlePeriod.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIIdlePeriod.h"
namespace mozilla {
class TimeStamp;
}
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIIdlePeriod.h"
class nsIIdlePeriod : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetIdlePeriodHint(mozilla::TimeStamp *_retval) = 0;

};

  template<typename T> struct nsIIdlePeriod::COMTypeInfo<nsIIdlePeriod, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIIdlePeriod::COMTypeInfo<nsIIdlePeriod, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x21dd35a2, 0xeae9, 0x4bd8, { 0xb4, 0x70, 0x0d, 0xfa, 0x35, 0xa0, 0xe3, 0xb9 }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIIncrementalRunnable.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIIncrementalRunnable.h"
class nsIIncrementalRunnable : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;





  virtual void SetDeadline(mozilla::TimeStamp aDeadline) = 0;

protected:
  nsIIncrementalRunnable() { }
  virtual ~nsIIncrementalRunnable() {}
};

template<typename T> struct nsIIncrementalRunnable::COMTypeInfo<nsIIncrementalRunnable, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIIncrementalRunnable::COMTypeInfo<nsIIncrementalRunnable, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x688be92e, 0x7ade, 0x4fdc, { 0x9d, 0x83, 0x74, 0xcb, 0xef, 0xf4, 0xa5, 0x2c } };
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINamed.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINamed.h"
class nsINamed : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetName(nsACString & aName) = 0;


  virtual nsresult SetName(const char * aName) = 0;

};

  template<typename T> struct nsINamed::COMTypeInfo<nsINamed, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsINamed::COMTypeInfo<nsINamed, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x0c5fe7de, 0x7e83, 0x4d0d, { 0xa8, 0xa6, 0x4a, 0x65, 0x18, 0xb9, 0xa7, 0xb3 }};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRunnable.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRunnable.h"
class nsIRunnable : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Run(void) = 0;

};

  template<typename T> struct nsIRunnable::COMTypeInfo<nsIRunnable, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIRunnable::COMTypeInfo<nsIRunnable, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x4a2abaf0, 0x6886, 0x11d3, { 0x93, 0x82, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40 }};
# 103 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRunnable.h"
class nsIRunnablePriority : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    PRIORITY_NORMAL = 0U,
    PRIORITY_HIGH = 1U
  };


  virtual nsresult GetPriority(uint32_t *aPriority) = 0;

};

  template<typename T> struct nsIRunnablePriority::COMTypeInfo<nsIRunnablePriority, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIRunnablePriority::COMTypeInfo<nsIRunnablePriority, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xe75aa42a, 0x80a9, 0x11e6, { 0xaf, 0xb5, 0xe8, 0x9d, 0x87, 0x34, 0x8e, 0x2c }};
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThreadManager.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThreadManager.h"
class nsIThread;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThreadManager.h"
class nsIThreadManager : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    DEFAULT_STACK_SIZE = 0U
  };


  virtual nsresult NewThread(uint32_t creationFlags, uint32_t stackSize, nsIThread * *_retval) = 0;


  virtual nsresult NewNamedThread(const nsACString & name, uint32_t stackSize, nsIThread * *_retval) = 0;


  virtual nsresult GetThreadFromPRThread(PRThread *prthread, nsIThread * *_retval) = 0;


  virtual nsresult GetMainThread(nsIThread * *aMainThread) = 0;


  virtual nsresult GetCurrentThread(nsIThread * *aCurrentThread) = 0;


  virtual nsresult GetIsMainThread(bool *aIsMainThread) = 0;

};

  template<typename T> struct nsIThreadManager::COMTypeInfo<nsIThreadManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIThreadManager::COMTypeInfo<nsIThreadManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x1be89eca, 0xe2f7, 0x453b, { 0x8d, 0x38, 0xc1, 0x1b, 0xa2, 0x47, 0xf6, 0xf3 }};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThread.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThread.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIEventTarget.h" 1
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIEventTarget.h"
class nsIEventTarget : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

     nsresult Dispatch(nsIRunnable* aEvent, uint32_t aFlags) {
      return Dispatch(nsCOMPtr<nsIRunnable>(aEvent).forget(), aFlags);
    }
  enum {
    DISPATCH_NORMAL = 0U,
    DISPATCH_SYNC = 1U,
    DISPATCH_AT_END = 2U
  };


  virtual nsresult IsOnCurrentThread(bool *_retval) = 0;


  virtual nsresult Dispatch(already_AddRefed<nsIRunnable> event, uint32_t flags) = 0;


  virtual nsresult DispatchFromScript(nsIRunnable *event, uint32_t flags) = 0;


  virtual nsresult DelayedDispatch(already_AddRefed<nsIRunnable> event, uint32_t delay) = 0;

};

  template<typename T> struct nsIEventTarget::COMTypeInfo<nsIEventTarget, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIEventTarget::COMTypeInfo<nsIEventTarget, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x88145945, 0x3278, 0x424e, { 0x9f, 0x37, 0xd8, 0x74, 0xcb, 0xdd, 0x9f, 0x6f }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThread.h" 2
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThread.h"
class nsIThread : public nsIEventTarget {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetPRThread(PRThread **aPRThread) = 0;


  virtual nsresult GetCanInvokeJS(bool *aCanInvokeJS) = 0;
  virtual nsresult SetCanInvokeJS(bool aCanInvokeJS) = 0;


  virtual nsresult Shutdown(void) = 0;


  virtual nsresult HasPendingEvents(bool *_retval) = 0;


  virtual nsresult ProcessNextEvent(bool mayWait, bool *_retval) = 0;


  virtual nsresult AsyncShutdown(void) = 0;


  virtual nsresult RegisterIdlePeriod(already_AddRefed<nsIIdlePeriod> aIdlePeriod) = 0;


  virtual nsresult IdleDispatch(already_AddRefed<nsIRunnable> event) = 0;

};

  template<typename T> struct nsIThread::COMTypeInfo<nsIThread, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIThread::COMTypeInfo<nsIThread, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x5801d193, 0x29d1, 0x4964, { 0xa6, 0xb7, 0x70, 0xeb, 0x69, 0x7d, 0xdf, 0x2b }};
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IndexSequence.h" 1
# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IndexSequence.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 68 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IndexSequence.h" 2

namespace mozilla {




template<size_t... Indices>
struct IndexSequence
{
  static constexpr size_t Size() { return sizeof...(Indices); }
};

namespace detail {



template<size_t... Indices>
struct IndexTuple
{
  typedef IndexTuple<Indices..., sizeof...(Indices)> Next;
};


template<size_t N>
struct BuildIndexTuple
{
  typedef typename BuildIndexTuple<N - 1>::Type::Next Type;
};

template<>
struct BuildIndexTuple<0>
{
  typedef IndexTuple<> Type;
};

template<size_t N, typename IndexTuple>
struct MakeIndexSequenceImpl;

template<size_t N, size_t... Indices>
struct MakeIndexSequenceImpl<N, IndexTuple<Indices...>>
{
  typedef IndexSequence<Indices...> Type;
};

}







template<size_t N>
struct MakeIndexSequence
{
  typedef typename detail::MakeIndexSequenceImpl<N,
    typename detail::BuildIndexTuple<N>::Type>::Type Type;
};
# 135 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/IndexSequence.h"
template<typename... Types>
struct IndexSequenceFor
{
  typedef typename MakeIndexSequence<sizeof...(Types)>::Type Type;
};

}
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h" 2


namespace mozilla {

namespace detail {





template<typename... Ts>
struct Group;
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
template<typename Source, typename Target, bool SameSize>
struct CheckConvertibilityImpl;

template<typename Source, typename Target>
struct CheckConvertibilityImpl<Source, Target, false>
  : FalseType {};

template<typename... SourceTypes, typename... TargetTypes>
struct CheckConvertibilityImpl<Group<SourceTypes...>, Group<TargetTypes...>, true>
  : IntegralConstant<bool, tl::And<IsConvertible<SourceTypes, TargetTypes>::value...>::value> { };

template<typename Source, typename Target>
struct CheckConvertibility;

template<typename... SourceTypes, typename... TargetTypes>
struct CheckConvertibility<Group<SourceTypes...>, Group<TargetTypes...>>
  : CheckConvertibilityImpl<Group<SourceTypes...>, Group<TargetTypes...>,
        sizeof...(SourceTypes) == sizeof...(TargetTypes)> { };
# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
template<std::size_t Index, typename... Elements>
struct TupleImpl;





template<std::size_t Index>
struct TupleImpl<Index> {
  bool operator==(const TupleImpl<Index>& aOther) const
  {
    return true;
  }
};






template<std::size_t Index, typename HeadT, typename... TailT>
struct TupleImpl<Index, HeadT, TailT...>
  : public TupleImpl<Index + 1, TailT...>
{
  typedef TupleImpl<Index + 1, TailT...> Base;






  static HeadT& Head(TupleImpl& aTuple) { return aTuple.mHead; }
  static const HeadT& Head(const TupleImpl& aTuple) { return aTuple.mHead; }
  static Base& Tail(TupleImpl& aTuple) { return aTuple; }
  static const Base& Tail(const TupleImpl& aTuple) { return aTuple; }

  TupleImpl() : Base(), mHead() { }


  explicit TupleImpl(const HeadT& aHead, const TailT&... aTail)
    : Base(aTail...), mHead(aHead) { }





  template <typename OtherHeadT, typename... OtherTailT,
            typename = typename EnableIf<
                CheckConvertibility<
                    Group<OtherHeadT, OtherTailT...>,
                    Group<HeadT, TailT...>>::value>::Type>
  explicit TupleImpl(OtherHeadT&& aHead, OtherTailT&&... aTail)
    : Base(Forward<OtherTailT>(aTail)...), mHead(Forward<OtherHeadT>(aHead)) { }




  TupleImpl(const TupleImpl& aOther)
    : Base(Tail(aOther))
    , mHead(Head(aOther)) {}
  TupleImpl(TupleImpl&& aOther)
    : Base(Move(Tail(aOther)))
    , mHead(Forward<HeadT>(Head(aOther))) {}



  template <typename... OtherElements,
            typename = typename EnableIf<
                sizeof...(OtherElements) == sizeof...(TailT) + 1>::Type>
  TupleImpl& operator=(const TupleImpl<Index, OtherElements...>& aOther)
  {
    typedef TupleImpl<Index, OtherElements...> OtherT;
    Head(*this) = OtherT::Head(aOther);
    Tail(*this) = OtherT::Tail(aOther);
    return *this;
  }
  template <typename... OtherElements,
            typename = typename EnableIf<
                sizeof...(OtherElements) == sizeof...(TailT) + 1>::Type>
  TupleImpl& operator=(TupleImpl<Index, OtherElements...>&& aOther)
  {
    typedef TupleImpl<Index, OtherElements...> OtherT;
    Head(*this) = Move(OtherT::Head(aOther));
    Tail(*this) = Move(OtherT::Tail(aOther));
    return *this;
  }


  TupleImpl& operator=(const TupleImpl& aOther)
  {
    Head(*this) = Head(aOther);
    Tail(*this) = Tail(aOther);
    return *this;
  }
  TupleImpl& operator=(TupleImpl&& aOther)
  {
    Head(*this) = Move(Head(aOther));
    Tail(*this) = Move(Tail(aOther));
    return *this;
  }
  bool operator==(const TupleImpl& aOther) const
  {
    return Head(*this) == Head(aOther) && Tail(*this) == Tail(aOther);
  }
private:
  HeadT mHead;
};

}
# 208 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
template<typename... Elements>
class Tuple : public detail::TupleImpl<0, Elements...>
{
  typedef detail::TupleImpl<0, Elements...> Impl;
public:



  Tuple() : Impl() { }
  explicit Tuple(const Elements&... aElements) : Impl(aElements...) { }




  template <typename OtherHead, typename... OtherTail,
            typename = typename EnableIf<
                detail::CheckConvertibility<
                    detail::Group<OtherHead, OtherTail...>,
                    detail::Group<Elements...>>::value>::Type>
  explicit Tuple(OtherHead&& aHead, OtherTail&&... aTail)
    : Impl(Forward<OtherHead>(aHead), Forward<OtherTail>(aTail)...) { }
  Tuple(const Tuple& aOther) : Impl(aOther) { }
  Tuple(Tuple&& aOther) : Impl(Move(aOther)) { }

  template <typename... OtherElements,
            typename = typename EnableIf<
                sizeof...(OtherElements) == sizeof...(Elements)>::Type>
  Tuple& operator=(const Tuple<OtherElements...>& aOther)
  {
    static_cast<Impl&>(*this) = aOther;
    return *this;
  }
  template <typename... OtherElements,
            typename = typename EnableIf<
                sizeof...(OtherElements) == sizeof...(Elements)>::Type>
  Tuple& operator=(Tuple<OtherElements...>&& aOther)
  {
    static_cast<Impl&>(*this) = Move(aOther);
    return *this;
  }
  Tuple& operator=(const Tuple& aOther)
  {
    static_cast<Impl&>(*this) = aOther;
    return *this;
  }
  Tuple& operator=(Tuple&& aOther)
  {
    static_cast<Impl&>(*this) = Move(aOther);
    return *this;
  }
  bool operator==(const Tuple& aOther) const
  {
    return static_cast<const Impl&>(*this) == static_cast<const Impl&>(aOther);
  }
};





template <typename A, typename B>
class Tuple<A, B> : public detail::TupleImpl<0, A, B>
{
  typedef detail::TupleImpl<0, A, B> Impl;

public:



  Tuple() : Impl() { }
  explicit Tuple(const A& aA, const B& aB) : Impl(aA, aB) { }
  template <typename AArg, typename BArg,
            typename = typename EnableIf<
                detail::CheckConvertibility<
                    detail::Group<AArg, BArg>,
                    detail::Group<A, B>>::value>::Type>
  explicit Tuple(AArg&& aA, BArg&& aB)
    : Impl(Forward<AArg>(aA), Forward<BArg>(aB)) { }
  Tuple(const Tuple& aOther) : Impl(aOther) { }
  Tuple(Tuple&& aOther) : Impl(Move(aOther)) { }
  explicit Tuple(const Pair<A, B>& aOther)
    : Impl(aOther.first(), aOther.second()) { }
  explicit Tuple(Pair<A, B>&& aOther) : Impl(Forward<A>(aOther.first()),
                                    Forward<B>(aOther.second())) { }
  explicit Tuple(const std::pair<A, B>& aOther)
    : Impl(aOther.first, aOther.second) { }
  explicit Tuple(std::pair<A, B>&& aOther) : Impl(Forward<A>(aOther.first),
                                    Forward<B>(aOther.second)) { }

  template <typename AArg, typename BArg>
  Tuple& operator=(const Tuple<AArg, BArg>& aOther)
  {
    static_cast<Impl&>(*this) = aOther;
    return *this;
  }
  template <typename AArg, typename BArg>
  Tuple& operator=(Tuple<AArg, BArg>&& aOther)
  {
    static_cast<Impl&>(*this) = Move(aOther);
    return *this;
  }
  Tuple& operator=(const Tuple& aOther)
  {
    static_cast<Impl&>(*this) = aOther;
    return *this;
  }
  Tuple& operator=(Tuple&& aOther)
  {
    static_cast<Impl&>(*this) = Move(aOther);
    return *this;
  }
  template <typename AArg, typename BArg>
  Tuple& operator=(const Pair<AArg, BArg>& aOther)
  {
    Impl::Head(*this) = aOther.first();
    Impl::Tail(*this).Head(*this) = aOther.second();
    return *this;
  }
  template <typename AArg, typename BArg>
  Tuple& operator=(Pair<AArg, BArg>&& aOther)
  {
    Impl::Head(*this) = Forward<AArg>(aOther.first());
    Impl::Tail(*this).Head(*this) = Forward<BArg>(aOther.second());
    return *this;
  }
  template <typename AArg, typename BArg>
  Tuple& operator=(const std::pair<AArg, BArg>& aOther)
  {
    Impl::Head(*this) = aOther.first;
    Impl::Tail(*this).Head(*this) = aOther.second;
    return *this;
  }
  template <typename AArg, typename BArg>
  Tuple& operator=(std::pair<AArg, BArg>&& aOther)
  {
    Impl::Head(*this) = Forward<AArg>(aOther.first);
    Impl::Tail(*this).Head(*this) = Forward<BArg>(aOther.second);
    return *this;
  }
};







template <>
class Tuple<> {};

namespace detail {
# 369 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
template<std::size_t Index, typename... Elements>
auto TupleGetHelper(TupleImpl<Index, Elements...>& aTuple)
    -> decltype(TupleImpl<Index, Elements...>::Head(aTuple))
{
  return TupleImpl<Index, Elements...>::Head(aTuple);
}


template<std::size_t Index, typename... Elements>
auto TupleGetHelper(const TupleImpl<Index, Elements...>& aTuple)
    -> decltype(TupleImpl<Index, Elements...>::Head(aTuple))
{
  return TupleImpl<Index, Elements...>::Head(aTuple);
}

}
# 398 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
template<std::size_t Index, typename... Elements>
auto Get(Tuple<Elements...>& aTuple)
    -> decltype(detail::TupleGetHelper<Index>(aTuple))
{
  return detail::TupleGetHelper<Index>(aTuple);
}


template<std::size_t Index, typename... Elements>
auto Get(const Tuple<Elements...>& aTuple)
    -> decltype(detail::TupleGetHelper<Index>(aTuple))
{
  return detail::TupleGetHelper<Index>(aTuple);
}


template<std::size_t Index, typename... Elements>
auto Get(Tuple<Elements...>&& aTuple)
    -> decltype(Move(mozilla::Get<Index>(aTuple)))
{


  return Move(mozilla::Get<Index>(aTuple));
}
# 432 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
template<typename... Elements>
inline Tuple<typename Decay<Elements>::Type...>
MakeTuple(Elements&&... aElements)
{
  return Tuple<typename Decay<Elements>::Type...>(Forward<Elements>(aElements)...);
}
# 452 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Tuple.h"
template<typename... Elements>
inline Tuple<Elements&...>
Tie(Elements&... aVariables)
{
  return Tuple<Elements&...>(aVariables...);
}

}
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h" 2
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern nsresult
NS_NewThread(nsIThread** aResult,
             nsIRunnable* aInitialEvent = nullptr,
             uint32_t aStackSize = nsIThreadManager::DEFAULT_STACK_SIZE);




extern nsresult
NS_NewNamedThread(const nsACString& aName,
                  nsIThread** aResult,
                  nsIRunnable* aInitialEvent = nullptr,
                  uint32_t aStackSize = nsIThreadManager::DEFAULT_STACK_SIZE);

template<size_t LEN>
inline nsresult
NS_NewNamedThread(const char (&aName)[LEN],
                  nsIThread** aResult,
                  nsIRunnable* aInitialEvent = nullptr,
                  uint32_t aStackSize = nsIThreadManager::DEFAULT_STACK_SIZE)
{
  static_assert(LEN <= 16,
                "Thread name must be no more than 16 characters");
  return NS_NewNamedThread(nsDependentCString(aName, LEN - 1),
                           aResult, aInitialEvent, aStackSize);
}







extern nsresult NS_GetCurrentThread(nsIThread** aResult);
# 92 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern nsresult NS_DispatchToCurrentThread(nsIRunnable* aEvent);
extern nsresult
NS_DispatchToCurrentThread(already_AddRefed<nsIRunnable>&& aEvent);
# 107 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern nsresult
NS_DispatchToMainThread(nsIRunnable* aEvent,
                        uint32_t aDispatchFlags = nsIEventTarget::DISPATCH_NORMAL);
extern nsresult
NS_DispatchToMainThread(already_AddRefed<nsIRunnable>&& aEvent,
                        uint32_t aDispatchFlags = nsIEventTarget::DISPATCH_NORMAL);

extern nsresult
NS_DelayedDispatchToCurrentThread(
  already_AddRefed<nsIRunnable>&& aEvent, uint32_t aDelayMs);

extern nsresult
NS_IdleDispatchToCurrentThread(already_AddRefed<nsIRunnable>&& aEvent);
# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern nsresult
NS_ProcessPendingEvents(nsIThread* aThread,
                        PRIntervalTime aTimeout = 0xffffffffUL);
# 156 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern bool NS_HasPendingEvents(nsIThread* aThread = nullptr);
# 175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern bool NS_ProcessNextEvent(nsIThread* aThread = nullptr,
                                bool aMayWait = true);
# 185 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern bool NS_IsInCompositorThread();




inline already_AddRefed<nsIThread>
do_GetCurrentThread()
{
  nsIThread* thread = nullptr;
  NS_GetCurrentThread(&thread);
  return already_AddRefed<nsIThread>(thread);
}

inline already_AddRefed<nsIThread>
do_GetMainThread()
{
  nsIThread* thread = nullptr;
  NS_GetMainThread(&thread);
  return already_AddRefed<nsIThread>(thread);
}
# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
extern nsIThread* NS_GetCurrentThread();






namespace mozilla {


class IdlePeriod : public nsIIdlePeriod
{
public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:
  virtual nsresult GetIdlePeriodHint(mozilla::TimeStamp *_retval) override;

  IdlePeriod() {}

protected:
  virtual ~IdlePeriod() {}
private:
  IdlePeriod(const IdlePeriod&) = delete;
  IdlePeriod& operator=(const IdlePeriod&) = delete;
  IdlePeriod& operator=(const IdlePeriod&&) = delete;
};


class Runnable : public nsIRunnable, public nsINamed
{
public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:
  virtual nsresult Run(void) override;
  virtual nsresult GetName(nsACString & aName) override; virtual nsresult SetName(const char * aName) override;

  Runnable() {}




  explicit Runnable(const char* aName) : mName(aName) {}


protected:
  virtual ~Runnable() {}
private:
  Runnable(const Runnable&) = delete;
  Runnable& operator=(const Runnable&) = delete;
  Runnable& operator=(const Runnable&&) = delete;


  const char* mName = nullptr;

};


class CancelableRunnable : public Runnable,
                           public nsICancelableRunnable
{
public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override;

  virtual nsresult Cancel() override;

  CancelableRunnable() {}
  explicit CancelableRunnable(const char* aName) : Runnable(aName) {}

protected:
  virtual ~CancelableRunnable() {}
private:
  CancelableRunnable(const CancelableRunnable&) = delete;
  CancelableRunnable& operator=(const CancelableRunnable&) = delete;
  CancelableRunnable& operator=(const CancelableRunnable&&) = delete;
};


class IncrementalRunnable : public CancelableRunnable,
                            public nsIIncrementalRunnable
{
public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override;

  virtual void SetDeadline(TimeStamp aDeadline) override;

  IncrementalRunnable() {}

protected:
  virtual ~IncrementalRunnable() {}
private:
  IncrementalRunnable(const IncrementalRunnable&) = delete;
  IncrementalRunnable& operator=(const IncrementalRunnable&) = delete;
  IncrementalRunnable& operator=(const IncrementalRunnable&&) = delete;
};

namespace detail {




template<typename StoredFunction>
class RunnableFunction : public Runnable
{
public:
  template <typename F>
  explicit RunnableFunction(F&& aFunction)
    : mFunction(Forward<F>(aFunction))
  { }

  virtual nsresult Run() override {
    static_assert(IsVoid<decltype(mFunction())>::value,
                  "The lambda must return void!");
    mFunction();
    return NS_OK;
  }
private:
  StoredFunction mFunction;
};


template<typename Function>
using RunnableFunctionImpl =

  typename detail::RunnableFunction<typename RemoveReference<Function>::Type>;

template <typename T>
inline already_AddRefed<T>
SetRunnableName(already_AddRefed<T>&& aObj, const char* aName)
{
  do { static_assert(mozilla::detail::AssertionConditionType<decltype(aName)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aName))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aName" ")"); do { *((volatile int*) __null) = 340; ::abort(); } while (0); } } while (0);
  RefPtr<T> ref(aObj);
  ref->SetName(aName);
  return ref.forget();
}

}

namespace detail {

template<typename CVRemoved>
struct IsRefcountedSmartPointerHelper : FalseType {};

template<typename Pointee>
struct IsRefcountedSmartPointerHelper<RefPtr<Pointee>> : TrueType {};

template<typename Pointee>
struct IsRefcountedSmartPointerHelper<nsCOMPtr<Pointee>> : TrueType {};

}

template<typename T>
struct IsRefcountedSmartPointer
  : detail::IsRefcountedSmartPointerHelper<typename RemoveCV<T>::Type>
{};

namespace detail {

template<typename T, typename CVRemoved>
struct RemoveSmartPointerHelper
{
  typedef T Type;
};

template<typename T, typename Pointee>
struct RemoveSmartPointerHelper<T, RefPtr<Pointee>>
{
  typedef Pointee Type;
};

template<typename T, typename Pointee>
struct RemoveSmartPointerHelper<T, nsCOMPtr<Pointee>>
{
  typedef Pointee Type;
};

}

template<typename T>
struct RemoveSmartPointer
  : detail::RemoveSmartPointerHelper<T, typename RemoveCV<T>::Type>
{};

namespace detail {

template<typename T, typename CVRemoved>
struct RemoveRawOrSmartPointerHelper
{
  typedef T Type;
};

template<typename T, typename Pointee>
struct RemoveRawOrSmartPointerHelper<T, Pointee*>
{
  typedef Pointee Type;
};

template<typename T, typename Pointee>
struct RemoveRawOrSmartPointerHelper<T, RefPtr<Pointee>>
{
  typedef Pointee Type;
};

template<typename T, typename Pointee>
struct RemoveRawOrSmartPointerHelper<T, nsCOMPtr<Pointee>>
{
  typedef Pointee Type;
};

}

template<typename T>
struct RemoveRawOrSmartPointer
  : detail::RemoveRawOrSmartPointerHelper<T, typename RemoveCV<T>::Type>
{};

}

inline nsISupports*
ToSupports(mozilla::Runnable *p)
{
  return static_cast<nsIRunnable*>(p);
}

template<typename Function>
already_AddRefed<mozilla::Runnable>
NS_NewRunnableFunction(Function&& aFunction)
{


  return do_AddRef(new mozilla::detail::RunnableFunctionImpl<Function>
    (mozilla::Forward<Function>(aFunction)));
}

template<typename Function>
already_AddRefed<mozilla::Runnable>
NS_NewRunnableFunction(const char* aName, Function&& aFunction)
{
  return mozilla::detail::SetRunnableName(
    NS_NewRunnableFunction(mozilla::Forward<Function>(aFunction)), aName);
}




template<class ClassType,
         typename ReturnType = void,
         bool Owning = true,
         bool Cancelable = false>
class nsRunnableMethod : public mozilla::Conditional<!Cancelable,
                                                     mozilla::Runnable,
                                                     mozilla::CancelableRunnable>::Type
{
public:
  virtual void Revoke() = 0;




  template<typename OtherReturnType>
  class ReturnTypeEnforcer
  {
  public:
    typedef int ReturnTypeIsSafe;
  };

  template<class T>
  class ReturnTypeEnforcer<already_AddRefed<T>>
  {

  };


  typedef typename ReturnTypeEnforcer<ReturnType>::ReturnTypeIsSafe check;
};

template<class ClassType, bool Owning>
struct nsRunnableMethodReceiver
{
  RefPtr<ClassType> mObj;
  explicit nsRunnableMethodReceiver(ClassType* aObj) : mObj(aObj) {}
  ~nsRunnableMethodReceiver() { Revoke(); }
  ClassType* Get() const { return mObj.get(); }
  void Revoke() { mObj = nullptr; }
};

template<class ClassType>
struct nsRunnableMethodReceiver<ClassType, false>
{
  ClassType* mObj;
  explicit nsRunnableMethodReceiver(ClassType* aObj) : mObj(aObj) {}
  ClassType* Get() const { return mObj; }
  void Revoke() { mObj = nullptr; }
};

template<typename PtrType, typename Method, bool Owning, bool Cancelable>
struct nsRunnableMethodTraits;

template<typename PtrType, class C, typename R, bool Owning, bool Cancelable, typename... As>
struct nsRunnableMethodTraits<PtrType, R(C::*)(As...), Owning, Cancelable>
{
  typedef typename mozilla::RemoveRawOrSmartPointer<PtrType>::Type class_type;
  static_assert(mozilla::IsBaseOf<C, class_type>::value,
                "Stored class must inherit from method's class");
  typedef R return_type;
  typedef nsRunnableMethod<C, R, Owning, Cancelable> base_type;
  static const bool can_cancel = Cancelable;
};

template<typename PtrType, class C, typename R, bool Owning, bool Cancelable, typename... As>
struct nsRunnableMethodTraits<PtrType, R(C::*)(As...) const, Owning, Cancelable>
{
  typedef const typename mozilla::RemoveRawOrSmartPointer<PtrType>::Type class_type;
  static_assert(mozilla::IsBaseOf<C, class_type>::value,
                "Stored class must inherit from method's class");
  typedef R return_type;
  typedef nsRunnableMethod<C, R, Owning, Cancelable> base_type;
  static const bool can_cancel = Cancelable;
};
# 582 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
template<typename T>
struct IsParameterStorageClass : public mozilla::FalseType {};




template<typename T>
struct StoreCopyPassByValue
{
  typedef T stored_type;
  typedef T passed_type;
  stored_type m;
  template <typename A>
               StoreCopyPassByValue(A&& a) : m(mozilla::Forward<A>(a)) {}
  passed_type PassAsParameter() { return m; }
};
template<typename S>
struct IsParameterStorageClass<StoreCopyPassByValue<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreCopyPassByConstLRef
{
  typedef T stored_type;
  typedef const T& passed_type;
  stored_type m;
  template <typename A>
               StoreCopyPassByConstLRef(A&& a) : m(mozilla::Forward<A>(a)) {}
  passed_type PassAsParameter() { return m; }
};
template<typename S>
struct IsParameterStorageClass<StoreCopyPassByConstLRef<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreCopyPassByLRef
{
  typedef T stored_type;
  typedef T& passed_type;
  stored_type m;
  template <typename A>
               StoreCopyPassByLRef(A&& a) : m(mozilla::Forward<A>(a)) {}
  passed_type PassAsParameter() { return m; }
};
template<typename S>
struct IsParameterStorageClass<StoreCopyPassByLRef<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreCopyPassByRRef
{
  typedef T stored_type;
  typedef T&& passed_type;
  stored_type m;
  template <typename A>
               StoreCopyPassByRRef(A&& a) : m(mozilla::Forward<A>(a)) {}
  passed_type PassAsParameter() { return mozilla::Move(m); }
};
template<typename S>
struct IsParameterStorageClass<StoreCopyPassByRRef<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreRefPassByLRef
{
  typedef T& stored_type;
  typedef T& passed_type;
  stored_type m;
  template <typename A>
               StoreRefPassByLRef(A& a) : m(a) {}
  passed_type PassAsParameter() { return m; }
};
template<typename S>
struct IsParameterStorageClass<StoreRefPassByLRef<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreConstRefPassByConstLRef
{
  typedef const T& stored_type;
  typedef const T& passed_type;
  stored_type m;
  template <typename A>
               StoreConstRefPassByConstLRef(const A& a) : m(a) {}
  passed_type PassAsParameter() { return m; }
};
template<typename S>
struct IsParameterStorageClass<StoreConstRefPassByConstLRef<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreRefPtrPassByPtr
{
  typedef RefPtr<T> stored_type;
  typedef T* passed_type;
  stored_type m;
  template <typename A>
               StoreRefPtrPassByPtr(A&& a) : m(mozilla::Forward<A>(a)) {}
  passed_type PassAsParameter() { return m.get(); }
};
template<typename S>
struct IsParameterStorageClass<StoreRefPtrPassByPtr<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StorePtrPassByPtr
{
  typedef T* stored_type;
  typedef T* passed_type;
  stored_type m;
  template <typename A>
               StorePtrPassByPtr(A a) : m(a) {}
  passed_type PassAsParameter() { return m; }
};
template<typename S>
struct IsParameterStorageClass<StorePtrPassByPtr<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreConstPtrPassByConstPtr
{
  typedef const T* stored_type;
  typedef const T* passed_type;
  stored_type m;
  template <typename A>
               StoreConstPtrPassByConstPtr(A a) : m(a) {}
  passed_type PassAsParameter() { return m; }
};
template<typename S>
struct IsParameterStorageClass<StoreConstPtrPassByConstPtr<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreCopyPassByConstPtr
{
  typedef T stored_type;
  typedef const T* passed_type;
  stored_type m;
  template <typename A>
               StoreCopyPassByConstPtr(A&& a) : m(mozilla::Forward<A>(a)) {}
  passed_type PassAsParameter() { return &m; }
};
template<typename S>
struct IsParameterStorageClass<StoreCopyPassByConstPtr<S>>
  : public mozilla::TrueType {};

template<typename T>
struct StoreCopyPassByPtr
{
  typedef T stored_type;
  typedef T* passed_type;
  stored_type m;
  template <typename A>
               StoreCopyPassByPtr(A&& a) : m(mozilla::Forward<A>(a)) {}
  passed_type PassAsParameter() { return &m; }
};
template<typename S>
struct IsParameterStorageClass<StoreCopyPassByPtr<S>>
  : public mozilla::TrueType {};

namespace detail {

template<typename>
struct SFINAE1True : mozilla::TrueType
{};

template<class T>
static auto HasRefCountMethodsTest(int)
    -> SFINAE1True<decltype(mozilla::DeclVal<T>().AddRef(),
                            mozilla::DeclVal<T>().Release())>;
template<class>
static auto HasRefCountMethodsTest(long) -> mozilla::FalseType;

template<class T>
struct HasRefCountMethods : decltype(HasRefCountMethodsTest<T>(0))
{};

template<typename TWithoutPointer>
struct NonnsISupportsPointerStorageClass
  : mozilla::Conditional<mozilla::IsConst<TWithoutPointer>::value,
                         StoreConstPtrPassByConstPtr<
                           typename mozilla::RemoveConst<TWithoutPointer>::Type>,
                         StorePtrPassByPtr<TWithoutPointer>>
{};

template<typename TWithoutPointer>
struct PointerStorageClass
  : mozilla::Conditional<HasRefCountMethods<TWithoutPointer>::value,
                         StoreRefPtrPassByPtr<TWithoutPointer>,
                         typename NonnsISupportsPointerStorageClass<
                           TWithoutPointer
                         >::Type>
{};

template<typename TWithoutRef>
struct LValueReferenceStorageClass
  : mozilla::Conditional<mozilla::IsConst<TWithoutRef>::value,
                         StoreConstRefPassByConstLRef<
                           typename mozilla::RemoveConst<TWithoutRef>::Type>,
                         StoreRefPassByLRef<TWithoutRef>>
{};

template<typename T>
struct SmartPointerStorageClass
  : mozilla::Conditional<mozilla::IsRefcountedSmartPointer<T>::value,
                         StoreRefPtrPassByPtr<
                           typename mozilla::RemoveSmartPointer<T>::Type>,
                         StoreCopyPassByConstLRef<T>>
{};

template<typename T>
struct NonLValueReferenceStorageClass
  : mozilla::Conditional<mozilla::IsRvalueReference<T>::value,
                         StoreCopyPassByRRef<
                           typename mozilla::RemoveReference<T>::Type>,
                         typename SmartPointerStorageClass<T>::Type>
{};

template<typename T>
struct NonPointerStorageClass
  : mozilla::Conditional<mozilla::IsLvalueReference<T>::value,
                         typename LValueReferenceStorageClass<
                           typename mozilla::RemoveReference<T>::Type
                         >::Type,
                         typename NonLValueReferenceStorageClass<T>::Type>
{};

template<typename T>
struct NonParameterStorageClass
  : mozilla::Conditional<mozilla::IsPointer<T>::value,
                         typename PointerStorageClass<
                           typename mozilla::RemovePointer<T>::Type
                         >::Type,
                         typename NonPointerStorageClass<T>::Type>
{};
# 837 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
template<typename T>
struct ParameterStorage
  : mozilla::Conditional<IsParameterStorageClass<T>::value,
                         T,
                         typename NonParameterStorageClass<T>::Type>
{};

}

namespace mozilla {

namespace detail {


template <typename... Ts>
struct RunnableMethodArguments final
{
  Tuple<typename ::detail::ParameterStorage<Ts>::Type...> mArguments;
  template <typename... As>
  explicit RunnableMethodArguments(As&&... aArguments)
    : mArguments(Forward<As>(aArguments)...)
  {}
  template<typename C, typename M, typename... Args, size_t... Indices>
  static auto
  applyImpl(C* o, M m, Tuple<Args...>& args, IndexSequence<Indices...>)
      -> decltype(((*o).*m)(Get<Indices>(args).PassAsParameter()...))
  {
    return ((*o).*m)(Get<Indices>(args).PassAsParameter()...);
  }
  template<class C, typename M> auto apply(C* o, M m)
      -> decltype(applyImpl(o, m, mArguments,
                  typename IndexSequenceFor<Ts...>::Type()))
  {
    return applyImpl(o, m, mArguments,
        typename IndexSequenceFor<Ts...>::Type());
  }
};

template<typename PtrType, typename Method, bool Owning, bool Cancelable, typename... Storages>
class RunnableMethodImpl final
  : public ::nsRunnableMethodTraits<PtrType, Method, Owning, Cancelable>::base_type
{
  typedef typename ::nsRunnableMethodTraits<PtrType, Method, Owning, Cancelable>::class_type
      ClassType;
  ::nsRunnableMethodReceiver<ClassType, Owning> mReceiver;
  Method mMethod;
  RunnableMethodArguments<Storages...> mArgs;
private:
  virtual ~RunnableMethodImpl() { Revoke(); };
public:
  template<typename ForwardedPtrType, typename... Args>
  explicit RunnableMethodImpl(ForwardedPtrType&& aObj, Method aMethod,
                              Args&&... aArgs)
    : mReceiver(Forward<ForwardedPtrType>(aObj))
    , mMethod(aMethod)
    , mArgs(Forward<Args>(aArgs)...)
  {
    static_assert(sizeof...(Storages) == sizeof...(Args), "Storages and Args should have equal sizes");
  }
  virtual nsresult Run()
  {
    if ((__builtin_expect(!!(mReceiver.Get()), 1))) {
      mArgs.apply(mReceiver.Get(), mMethod);
    }
    return NS_OK;
  }
  nsresult Cancel() {
    static_assert(Cancelable, "Don't use me!");
    Revoke();
    return NS_OK;
  }
  void Revoke() { mReceiver.Revoke(); }
};


template<typename PtrType, typename Method>
using OwningRunnableMethod = typename ::nsRunnableMethodTraits<
  typename RemoveReference<PtrType>::Type, Method, true, false>::base_type;
template<typename PtrType, typename Method, typename... Storages>
using OwningRunnableMethodImpl = RunnableMethodImpl<
  typename RemoveReference<PtrType>::Type, Method, true, false, Storages...>;


template<typename PtrType, typename Method>
using CancelableRunnableMethod = typename ::nsRunnableMethodTraits<
  typename RemoveReference<PtrType>::Type, Method, true, true>::base_type;
template<typename PtrType, typename Method, typename... Storages>
using CancelableRunnableMethodImpl = RunnableMethodImpl<
  typename RemoveReference<PtrType>::Type, Method, true, true, Storages...>;


template<typename PtrType, typename Method>
using NonOwningRunnableMethod = typename ::nsRunnableMethodTraits<
  typename RemoveReference<PtrType>::Type, Method, false, false>::base_type;
template<typename PtrType, typename Method, typename... Storages>
using NonOwningRunnableMethodImpl = RunnableMethodImpl<
  typename RemoveReference<PtrType>::Type, Method, false, false, Storages...>;


template<typename PtrType, typename Method>
using NonOwningCancelableRunnableMethod = typename ::nsRunnableMethodTraits<
  typename RemoveReference<PtrType>::Type, Method, false, true>::base_type;
template<typename PtrType, typename Method, typename... Storages>
using NonOwningCancelableRunnableMethodImpl = RunnableMethodImpl<
  typename RemoveReference<PtrType>::Type, Method, false, true, Storages...>;

}
# 1031 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
template<typename PtrType, typename Method>
already_AddRefed<detail::OwningRunnableMethod<PtrType, Method>>
NewRunnableMethod(PtrType&& aPtr, Method aMethod)
{
  return do_AddRef(
    new detail::OwningRunnableMethodImpl<PtrType, Method>
      (Forward<PtrType>(aPtr), aMethod));
}

template<typename PtrType, typename Method>
already_AddRefed<detail::OwningRunnableMethod<PtrType, Method>>
NewRunnableMethod(const char* aName, PtrType&& aPtr, Method aMethod)
{
  return detail::SetRunnableName(
    NewRunnableMethod(Forward<PtrType>(aPtr), aMethod), aName);
}

template<typename PtrType, typename Method>
already_AddRefed<detail::CancelableRunnableMethod<PtrType, Method>>
NewCancelableRunnableMethod(PtrType&& aPtr, Method aMethod)
{
  return do_AddRef(
    new detail::CancelableRunnableMethodImpl<PtrType, Method>
      (Forward<PtrType>(aPtr), aMethod));
}

template<typename PtrType, typename Method>
already_AddRefed<detail::CancelableRunnableMethod<PtrType, Method>>
NewCancelableRunnableMethod(const char* aName, PtrType&& aPtr, Method aMethod)
{
  return detail::SetRunnableName(
    NewCancelableRunnableMethod(Forward<PtrType>(aPtr), aMethod), aName);
}

template<typename PtrType, typename Method>
already_AddRefed<detail::NonOwningRunnableMethod<PtrType, Method>>
NewNonOwningRunnableMethod(PtrType&& aPtr, Method aMethod)
{
  return do_AddRef(
    new detail::NonOwningRunnableMethodImpl<PtrType, Method>
      (Forward<PtrType>(aPtr), aMethod));
}

template<typename PtrType, typename Method>
already_AddRefed<detail::NonOwningRunnableMethod<PtrType, Method>>
NewNonOwningRunnableMethod(const char* aName, PtrType&& aPtr, Method aMethod)
{
  return detail::SetRunnableName(
    NewNonOwningRunnableMethod(Forward<PtrType>(aPtr), aMethod), aName);
}

template<typename PtrType, typename Method>
already_AddRefed<detail::NonOwningCancelableRunnableMethod<PtrType, Method>>
NewNonOwningCancelableRunnableMethod(PtrType&& aPtr, Method aMethod)
{
  return do_AddRef(
    new detail::NonOwningCancelableRunnableMethodImpl<PtrType, Method>
      (Forward<PtrType>(aPtr), aMethod));
}

template<typename PtrType, typename Method>
already_AddRefed<detail::NonOwningCancelableRunnableMethod<PtrType, Method>>
NewNonOwningCancelableRunnableMethod(const char* aName, PtrType&& aPtr,
                                     Method aMethod)
{
  return detail::SetRunnableName(
    NewNonOwningCancelableRunnableMethod(Forward<PtrType>(aPtr), aMethod), aName);
}





template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::OwningRunnableMethod<PtrType, Method>>
NewRunnableMethod(PtrType&& aPtr, Method aMethod, Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return do_AddRef(
    new detail::OwningRunnableMethodImpl<PtrType, Method, Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...));
}

template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::OwningRunnableMethod<PtrType, Method>>
NewRunnableMethod(const char* aName, PtrType&& aPtr, Method aMethod, Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return detail::SetRunnableName(
    NewRunnableMethod<Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...), aName);
}

template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::NonOwningRunnableMethod<PtrType, Method>>
NewNonOwningRunnableMethod(PtrType&& aPtr, Method aMethod, Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return do_AddRef(
      new detail::NonOwningRunnableMethodImpl<PtrType, Method, Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...));
}

template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::NonOwningRunnableMethod<PtrType, Method>>
NewNonOwningRunnableMethod(const char* aName, PtrType&& aPtr, Method aMethod,
                           Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return detail::SetRunnableName(
    NewNonOwningRunnableMethod<Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...), aName);
}

template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::CancelableRunnableMethod<PtrType, Method>>
NewCancelableRunnableMethod(PtrType&& aPtr, Method aMethod, Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return do_AddRef(
    new detail::CancelableRunnableMethodImpl<PtrType, Method, Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...));
}

template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::CancelableRunnableMethod<PtrType, Method>>
NewCancelableRunnableMethod(const char* aName, PtrType&& aPtr, Method aMethod,
                            Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return detail::SetRunnableName(
    NewCancelableRunnableMethod<Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...), aName);
}

template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::NonOwningCancelableRunnableMethod<PtrType, Method>>
NewNonOwningCancelableRunnableMethod(PtrType&& aPtr, Method aMethod,
                                     Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return do_AddRef(
    new detail::NonOwningCancelableRunnableMethodImpl<PtrType, Method, Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...));
}

template<typename... Storages, typename PtrType, typename Method, typename... Args>
already_AddRefed<detail::NonOwningCancelableRunnableMethod<PtrType, Method>>
NewNonOwningCancelableRunnableMethod(const char* aName, PtrType&& aPtr,
                                     Method aMethod, Args&&... aArgs)
{
  static_assert(sizeof...(Storages) == sizeof...(Args),
                "<Storages...> size should be equal to number of arguments");
  return detail::SetRunnableName(
    NewNonOwningCancelableRunnableMethod<Storages...>
      (Forward<PtrType>(aPtr), aMethod, mozilla::Forward<Args>(aArgs)...), aName);
}

}
# 1245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThreadUtils.h"
template<class T>
class nsRevocableEventPtr
{
public:
  nsRevocableEventPtr() : mEvent(nullptr) {}
  ~nsRevocableEventPtr() { Revoke(); }

  const nsRevocableEventPtr& operator=(T* aEvent)
  {
    if (mEvent != aEvent) {
      Revoke();
      mEvent = aEvent;
    }
    return *this;
  }

  const nsRevocableEventPtr& operator=(already_AddRefed<T> aEvent)
  {
    RefPtr<T> event = aEvent;
    if (mEvent != event) {
      Revoke();
      mEvent = event.forget();
    }
    return *this;
  }

  void Revoke()
  {
    if (mEvent) {
      mEvent->Revoke();
      mEvent = nullptr;
    }
  }

  void Forget() { mEvent = nullptr; }
  bool IsPending() { return mEvent != nullptr; }
  T* get() { return mEvent; }

private:

  nsRevocableEventPtr(const nsRevocableEventPtr&);
  nsRevocableEventPtr& operator=(const nsRevocableEventPtr&);

  RefPtr<T> mEvent;
};





class nsThreadPoolNaming
{
public:
  nsThreadPoolNaming() : mCounter(0) {}




  nsCString GetNextThreadName(const nsACString& aPoolName);

  template<size_t LEN>
  nsCString GetNextThreadName(const char (&aPoolName)[LEN])
  {
    return GetNextThreadName(nsDependentCString(aPoolName, LEN - 1));
  }

private:
  mozilla::Atomic<uint32_t> mCounter;

  nsThreadPoolNaming(const nsThreadPoolNaming&) = delete;
  void operator=(const nsThreadPoolNaming&) = delete;
};







class nsAutoLowPriorityIO
{
public:
  nsAutoLowPriorityIO();
  ~nsAutoLowPriorityIO();

private:
  bool lowIOPrioritySet;



};

void
NS_SetMainThread();
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIURI.h" 1
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIURI.h"
class nsIURI : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetSpec(nsACString & aSpec) = 0;
  virtual nsresult SetSpec(const nsACString & aSpec) = 0;





    nsCString GetSpecOrDefault()
    {
        nsCString spec;
        nsresult rv = GetSpec(spec);
        if (((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
            spec.Assign("[nsIURI::GetSpec failed]");
        }
        return spec;
    }

  virtual nsresult GetPrePath(nsACString & aPrePath) = 0;


  virtual nsresult GetScheme(nsACString & aScheme) = 0;
  virtual nsresult SetScheme(const nsACString & aScheme) = 0;


  virtual nsresult GetUserPass(nsACString & aUserPass) = 0;
  virtual nsresult SetUserPass(const nsACString & aUserPass) = 0;


  virtual nsresult GetUsername(nsACString & aUsername) = 0;
  virtual nsresult SetUsername(const nsACString & aUsername) = 0;


  virtual nsresult GetPassword(nsACString & aPassword) = 0;
  virtual nsresult SetPassword(const nsACString & aPassword) = 0;


  virtual nsresult GetHostPort(nsACString & aHostPort) = 0;
  virtual nsresult SetHostPort(const nsACString & aHostPort) = 0;


  virtual nsresult SetHostAndPort(const nsACString & hostport) = 0;


  virtual nsresult GetHost(nsACString & aHost) = 0;
  virtual nsresult SetHost(const nsACString & aHost) = 0;


  virtual nsresult GetPort(int32_t *aPort) = 0;
  virtual nsresult SetPort(int32_t aPort) = 0;


  virtual nsresult GetPath(nsACString & aPath) = 0;
  virtual nsresult SetPath(const nsACString & aPath) = 0;


  virtual nsresult Equals(nsIURI *other, bool *_retval) = 0;


  virtual nsresult SchemeIs(const char * scheme, bool *_retval) = 0;


  virtual nsresult Clone(nsIURI * *_retval) = 0;


  virtual nsresult Resolve(const nsACString & relativePath, nsACString & _retval) = 0;


  virtual nsresult GetAsciiSpec(nsACString & aAsciiSpec) = 0;


  virtual nsresult GetAsciiHostPort(nsACString & aAsciiHostPort) = 0;


  virtual nsresult GetAsciiHost(nsACString & aAsciiHost) = 0;


  virtual nsresult GetOriginCharset(nsACString & aOriginCharset) = 0;


  virtual nsresult GetRef(nsACString & aRef) = 0;
  virtual nsresult SetRef(const nsACString & aRef) = 0;


  virtual nsresult EqualsExceptRef(nsIURI *other, bool *_retval) = 0;


  virtual nsresult CloneIgnoringRef(nsIURI * *_retval) = 0;


  virtual nsresult CloneWithNewRef(const nsACString & newRef, nsIURI * *_retval) = 0;


  virtual nsresult GetSpecIgnoringRef(nsACString & aSpecIgnoringRef) = 0;


  virtual nsresult GetHasRef(bool *aHasRef) = 0;


  virtual nsresult GetFilePath(nsACString & aFilePath) = 0;
  virtual nsresult SetFilePath(const nsACString & aFilePath) = 0;


  virtual nsresult GetQuery(nsACString & aQuery) = 0;
  virtual nsresult SetQuery(const nsACString & aQuery) = 0;

};

  template<typename T> struct nsIURI::COMTypeInfo<nsIURI, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIURI::COMTypeInfo<nsIURI, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x92073a54, 0x6d78, 0x4f30, { 0x91, 0x3a, 0xb8, 0x71, 0x81, 0x32, 0x08, 0xc6 }};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMWindow.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMWindow.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/domstubs.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/domstubs.h"
class nsWrapperCache;
typedef uint64_t DOMTimeStamp;

typedef double DOMHighResTimeStamp;

class nsIDOMAttr;

class nsIDOMCDATASection;

class nsIDOMCharacterData;

class nsIDOMComment;

class nsIDOMDOMImplementation;

class nsIDOMDocument;

class nsIDOMDocumentFragment;

class nsIDOMDocumentType;

class nsIDOMElement;

class nsIDOMNode;

class nsIDOMNodeList;

class nsIDOMProcessingInstruction;

class nsIDOMText;

class nsIDOMClientRect;

class nsIDOMClientRectList;

class DOMException;

class nsIDOMStyleSheetList;

class nsIDOMStyleSheet;

class nsIDOMMediaList;

class nsIDOMWindow;

class nsIDOMWindowCollection;

class nsIDOMNavigator;

class nsIDOMScreen;

class nsIDOMEvent;

class nsIDOMEventTarget;

class nsIDOMEventListener;

class nsIDOMHTMLElement;

class nsIDOMHTMLFormElement;

class nsIDOMHTMLCollection;

class nsIDOMHTMLHeadElement;

class nsIDOMCSSValue;

class nsIDOMCSSPrimitiveValue;

class nsIDOMCSSRule;

class nsIDOMCSSRuleList;

class nsIDOMCSSKeyframeRule;

class nsIDOMCSSFontFeatureValuesRule;

class nsIDOMCSSStyleSheet;

class nsIDOMCSSStyleDeclaration;

class nsIDOMCounter;

class nsIDOMRect;

class nsIDOMCSSStyleRule;

class nsIDOMCSSStyleRuleCollection;

class nsIDOMRange;

class nsIDOMCrypto;

class nsIDOMFontFace;

class nsIDOMFontFaceList;
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMWindow.h" 2






class nsIControllers;

class nsIDOMBlob;

class nsIDOMLocation;

class nsIDOMOfflineResourceList;

class nsIPrompt;

class nsISelection;

class nsIVariant;
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMWindow.h"
class nsIDOMWindow : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

};

  template<typename T> struct nsIDOMWindow::COMTypeInfo<nsIDOMWindow, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMWindow::COMTypeInfo<nsIDOMWindow, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xb8343993, 0x0383, 0x4add, { 0x99, 0x30, 0xad, 0x17, 0x6b, 0x18, 0x92, 0x40 }};
# 108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMWindow.h"
class nsIDOMWindowInternal : public nsIDOMWindow {
 public:

  template<typename T, typename U> struct COMTypeInfo;

};

  template<typename T> struct nsIDOMWindowInternal::COMTypeInfo<nsIDOMWindowInternal, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMWindowInternal::COMTypeInfo<nsIDOMWindowInternal, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x8c589e65, 0x3237, 0x4cd1, { 0x8b, 0xad, 0xc5, 0xc4, 0x71, 0x35, 0xe7, 0x9b }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozIDOMWindow.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozIDOMWindow.h"
class mozIDOMWindow : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

};

  template<typename T> struct mozIDOMWindow::COMTypeInfo<mozIDOMWindow, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID mozIDOMWindow::COMTypeInfo<mozIDOMWindow, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x75fbabd6, 0x7a2e, 0x4787, { 0xaa, 0x33, 0x44, 0x9a, 0x33, 0x51, 0x21, 0x35 }};
# 94 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozIDOMWindow.h"
class mozIDOMWindowProxy : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

};

  template<typename T> struct mozIDOMWindowProxy::COMTypeInfo<mozIDOMWindowProxy, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID mozIDOMWindowProxy::COMTypeInfo<mozIDOMWindowProxy, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x53ca090c, 0xe739, 0x48b9, { 0x89, 0x11, 0x20, 0x8c, 0x72, 0xf9, 0x19, 0x1e }};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventTarget.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventTarget.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMEventTarget.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMEventTarget.h"
using mozilla::dom::Nullable;
namespace mozilla {
class EventChainVisitor;
class EventChainPostVisitor;
class EventChainPreVisitor;
class EventListenerManager;
namespace dom {
class EventTarget;
}
}
class nsPresContext;
class nsIScriptContext;

class nsIDOMEventListener;

class nsIDOMEvent;
# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMEventTarget.h"
class nsIDOMEventTarget : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult AddEventListener(const nsAString & type, nsIDOMEventListener *listener, bool useCapture, bool wantsUntrusted, uint8_t _argc) = 0;


  virtual nsresult AddSystemEventListener(const nsAString & type, nsIDOMEventListener *listener, bool aUseCapture, bool aWantsUntrusted, uint8_t _argc) = 0;


  nsresult AddEventListener(const nsAString& aType,
                            nsIDOMEventListener* aListener,
                            bool aUseCapture)
  {
    return AddEventListener(aType, aListener, aUseCapture, false, 1);
  }

  nsresult AddEventListener(const nsAString& aType,
                            nsIDOMEventListener* aListener,
                            bool aUseCapture,
                            bool aWantsUntrusted)
  {
    return AddEventListener(aType, aListener, aUseCapture, aWantsUntrusted, 2);
  }

  nsresult AddSystemEventListener(const nsAString& aType,
                                  nsIDOMEventListener* aListener,
                                  bool aUseCapture)
  {
    return AddSystemEventListener(aType, aListener, aUseCapture, false, 1);
  }

  nsresult AddSystemEventListener(const nsAString& aType,
                                  nsIDOMEventListener* aListener,
                                  bool aUseCapture,
                                  bool aWantsUntrusted)
  {
    return AddSystemEventListener(aType, aListener, aUseCapture,
                                  aWantsUntrusted, 2);
  }

  virtual nsresult RemoveEventListener(const nsAString & type, nsIDOMEventListener *listener, bool useCapture) = 0;


  virtual nsresult RemoveSystemEventListener(const nsAString & type, nsIDOMEventListener *listener, bool aUseCapture) = 0;


  virtual nsresult DispatchEvent(nsIDOMEvent *evt, bool *_retval) = 0;


  virtual mozilla::dom::EventTarget * GetTargetForDOMEvent(void) = 0;


  virtual mozilla::dom::EventTarget * GetTargetForEventTargetChain(void) = 0;


  virtual nsresult GetEventTargetParent(mozilla::EventChainPreVisitor & aVisitor) = 0;

   virtual nsresult PreHandleEvent(mozilla::EventChainVisitor& aVisitor)
  {
    return NS_OK;
  }

  virtual nsresult WillHandleEvent(mozilla::EventChainPostVisitor & aVisitor) = 0;


  virtual nsresult PostHandleEvent(mozilla::EventChainPostVisitor & aVisitor) = 0;


  virtual nsresult DispatchDOMEvent(mozilla::WidgetEvent *aEvent, nsIDOMEvent *aDOMEvent, nsPresContext *aPresContext, nsEventStatus *aEventStatus) = 0;


  virtual nsIScriptContext * GetContextForEventHandlers(nsresult *aRv) = 0;

};

  template<typename T> struct nsIDOMEventTarget::COMTypeInfo<nsIDOMEventTarget, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMEventTarget::COMTypeInfo<nsIDOMEventTarget, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x9a78ac3c, 0x9507, 0x4d00, { 0xb2, 0xd6, 0x10, 0xb5, 0x08, 0xd2, 0xec, 0x31 }};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventTarget.h" 2



class nsPIDOMWindowOuter;
class nsIGlobalObject;

namespace mozilla {

class AsyncEventDispatcher;
class ErrorResult;
class EventListenerManager;

namespace dom {

class AddEventListenerOptionsOrBoolean;
class Event;
class EventListener;
class EventListenerOptionsOrBoolean;
class EventHandlerNonNull;

template <class T> struct Nullable;






class EventTarget : public nsIDOMEventTarget,
                    public nsWrapperCache
{
public:
  template<typename T, typename U> struct COMTypeInfo;


  using nsIDOMEventTarget::AddEventListener;
  using nsIDOMEventTarget::RemoveEventListener;
  using nsIDOMEventTarget::DispatchEvent;
  virtual void AddEventListener(const nsAString& aType,
                                EventListener* aCallback,
                                const AddEventListenerOptionsOrBoolean& aOptions,
                                const Nullable<bool>& aWantsUntrusted,
                                ErrorResult& aRv) = 0;
  virtual void RemoveEventListener(const nsAString& aType,
                                   EventListener* aCallback,
                                   const EventListenerOptionsOrBoolean& aOptions,
                                   ErrorResult& aRv);
  bool DispatchEvent(Event& aEvent, CallerType aCallerType, ErrorResult& aRv);


  EventHandlerNonNull* GetEventHandler(const nsAString& aType)
  {
    nsCOMPtr<nsIAtom> type = NS_Atomize(aType);
    return GetEventHandler(type, EmptyString());
  }


  void SetEventHandler(const nsAString& aType, EventHandlerNonNull* aHandler,
                       ErrorResult& rv);


  virtual void EventListenerAdded(nsIAtom* aType) {}
  virtual void EventListenerRemoved(nsIAtom* aType) {}




  virtual nsPIDOMWindowOuter* GetOwnerGlobalForBindings() = 0;




  virtual nsIGlobalObject* GetOwnerGlobal() const = 0;




  virtual EventListenerManager* GetOrCreateListenerManager() = 0;





  virtual EventListenerManager* GetExistingListenerManager() const = 0;


  virtual void AsyncEventRunning(AsyncEventDispatcher* aEvent) {}

  virtual bool IsApzAware() const;

protected:
  EventHandlerNonNull* GetEventHandler(nsIAtom* aType,
                                       const nsAString& aTypeString);
  void SetEventHandler(nsIAtom* aType, const nsAString& aTypeString,
                       EventHandlerNonNull* aHandler);
};

template<typename T> struct EventTarget::COMTypeInfo<EventTarget, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID EventTarget::COMTypeInfo<EventTarget, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xde651c36, 0x0053, 0x4c67, { 0xb1, 0x3d, 0x67, 0xb9, 0x40, 0xfc, 0x82, 0xe4 } };

}
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRefPtrHashtable.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRefPtrHashtable.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
typedef uint32_t PLDHashNumber;

class PLDHashTable;
struct PLDHashTableOps;
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
struct PLDHashEntryHdr
{
private:
  friend class PLDHashTable;

  PLDHashNumber mKeyHash;
};
# 207 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
class PLDHashTable
{
private:


  class EntryStore
  {
  private:
    char* mEntryStore;
    uint32_t mGeneration;

  public:
    EntryStore() : mEntryStore(nullptr), mGeneration(0) {}

    ~EntryStore()
    {
      free(mEntryStore);
      mEntryStore = nullptr;
      mGeneration++;
    }

    char* Get() { return mEntryStore; }
    const char* Get() const { return mEntryStore; }

    void Set(char* aEntryStore)
    {
      mEntryStore = aEntryStore;
      mGeneration++;
    }

    uint32_t Generation() const { return mGeneration; }
  };

  const PLDHashTableOps* const mOps;
  int16_t mHashShift;
  const uint32_t mEntrySize;
  uint32_t mEntryCount;
  uint32_t mRemovedCount;
  EntryStore mEntryStore;





public:






  static const uint32_t kMaxCapacity = ((uint32_t)1 << 26);

  static const uint32_t kMinCapacity = 8;



  static const uint32_t kMaxInitialLength = kMaxCapacity / 2;


  static const uint32_t kDefaultInitialLength = 4;
# 277 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
  PLDHashTable(const PLDHashTableOps* aOps, uint32_t aEntrySize,
               uint32_t aLength = kDefaultInitialLength);

  PLDHashTable(PLDHashTable&& aOther)


    : mOps(aOther.mOps)
    , mEntrySize(aOther.mEntrySize)


    , mEntryStore()



  {
    *this = mozilla::Move(aOther);
  }

  PLDHashTable& operator=(PLDHashTable&& aOther);

  ~PLDHashTable();


  const PLDHashTableOps* Ops() const { return mOps; }




  uint32_t Capacity() const
  {
    return mEntryStore.Get() ? CapacityFromHashShift() : 0;
  }

  uint32_t EntrySize() const { return mEntrySize; }
  uint32_t EntryCount() const { return mEntryCount; }
  uint32_t Generation() const { return mEntryStore.Generation(); }







  PLDHashEntryHdr* Search(const void* aKey);
# 334 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
  PLDHashEntryHdr* Add(const void* aKey, const mozilla::fallible_t&);



  PLDHashEntryHdr* Add(const void* aKey);







  void Remove(const void* aKey);







  void RemoveEntry(PLDHashEntryHdr* aEntry);







  void RawRemove(PLDHashEntryHdr* aEntry);



  void Clear();
# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
  void ClearAndPrepareForLength(uint32_t aLength);




  size_t ShallowSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;


  size_t ShallowSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
# 396 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
  static const PLDHashTableOps* StubOps();


  static PLDHashNumber HashVoidPtrKeyStub(const void* aKey);
  static bool MatchEntryStub(const PLDHashEntryHdr* aEntry, const void* aKey);
  static void MoveEntryStub(PLDHashTable* aTable, const PLDHashEntryHdr* aFrom,
                            PLDHashEntryHdr* aTo);
  static void ClearEntryStub(PLDHashTable* aTable, PLDHashEntryHdr* aEntry);


  static PLDHashNumber HashStringKey(const void* aKey);
  static bool MatchStringKey(const PLDHashEntryHdr* aEntry, const void* aKey);
# 435 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
  class Iterator
  {
  public:
    explicit Iterator(PLDHashTable* aTable);
    Iterator(Iterator&& aOther);
    ~Iterator();


    bool Done() const { return mNexts == mNextsLimit; }


    PLDHashEntryHdr* Get() const
    {
      do { } while (0);

      PLDHashEntryHdr* entry = reinterpret_cast<PLDHashEntryHdr*>(mCurrent);
      do { } while (0);
      return entry;
    }


    void Next();



    void Remove();

  protected:
    PLDHashTable* mTable;

  private:
    char* mStart;
    char* mLimit;
    char* mCurrent;
    uint32_t mNexts;
    uint32_t mNextsLimit;

    bool mHaveRemoved;

    bool IsOnNonLiveEntry() const;
    void MoveToNextEntry();

    Iterator() = delete;
    Iterator(const Iterator&) = delete;
    Iterator& operator=(const Iterator&) = delete;
    Iterator& operator=(const Iterator&&) = delete;
  };

  Iterator Iter() { return Iterator(this); }



  Iterator ConstIter() const
  {
    return Iterator(const_cast<PLDHashTable*>(this));
  }

private:


  static const uint32_t kHashBits = 32;
  static const uint32_t kGoldenRatio = 0x9E3779B9U;

  static uint32_t HashShift(uint32_t aEntrySize, uint32_t aLength);

  static const PLDHashNumber kCollisionFlag = 1;

  static bool EntryIsFree(PLDHashEntryHdr* aEntry)
  {
    return aEntry->mKeyHash == 0;
  }
  static bool EntryIsRemoved(PLDHashEntryHdr* aEntry)
  {
    return aEntry->mKeyHash == 1;
  }
  static bool EntryIsLive(PLDHashEntryHdr* aEntry)
  {
    return aEntry->mKeyHash >= 2;
  }

  static void MarkEntryFree(PLDHashEntryHdr* aEntry)
  {
    aEntry->mKeyHash = 0;
  }
  static void MarkEntryRemoved(PLDHashEntryHdr* aEntry)
  {
    aEntry->mKeyHash = 1;
  }

  PLDHashNumber Hash1(PLDHashNumber aHash0);
  void Hash2(PLDHashNumber aHash, uint32_t& aHash2Out, uint32_t& aSizeMaskOut);

  static bool MatchEntryKeyhash(PLDHashEntryHdr* aEntry, PLDHashNumber aHash);
  PLDHashEntryHdr* AddressEntry(uint32_t aIndex);



  uint32_t CapacityFromHashShift() const
  {
    return ((uint32_t)1 << (kHashBits - mHashShift));
  }

  PLDHashNumber ComputeKeyHash(const void* aKey);

  enum SearchReason { ForSearchOrRemove, ForAdd };

  template <SearchReason Reason>
  PLDHashEntryHdr*
    SearchTable(const void* aKey, PLDHashNumber aKeyHash);

  PLDHashEntryHdr* FindFreeEntry(PLDHashNumber aKeyHash);

  bool ChangeTable(int aDeltaLog2);

  void ShrinkIfAppropriate();

  PLDHashTable(const PLDHashTable& aOther) = delete;
  PLDHashTable& operator=(const PLDHashTable& aOther) = delete;
};



typedef PLDHashNumber (*PLDHashHashKey)(const void* aKey);



typedef bool (*PLDHashMatchEntry)(const PLDHashEntryHdr* aEntry,
                                  const void* aKey);





typedef void (*PLDHashMoveEntry)(PLDHashTable* aTable,
                                 const PLDHashEntryHdr* aFrom,
                                 PLDHashEntryHdr* aTo);



typedef void (*PLDHashClearEntry)(PLDHashTable* aTable,
                                  PLDHashEntryHdr* aEntry);





typedef void (*PLDHashInitEntry)(PLDHashEntryHdr* aEntry, const void* aKey);
# 603 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PLDHashTable.h"
struct PLDHashTableOps
{

  PLDHashHashKey hashKey;
  PLDHashMatchEntry matchEntry;
  PLDHashMoveEntry moveEntry;
  PLDHashClearEntry clearEntry;


  PLDHashInitEntry initEntry;
};


struct PLDHashEntryStub : public PLDHashEntryHdr
{
  const void* key;
};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPointerHashKeys.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPointerHashKeys.h"
template<class T>
class nsPtrHashKey : public PLDHashEntryHdr
{
public:
  typedef T* KeyType;
  typedef const T* KeyTypePointer;

  explicit nsPtrHashKey(const T* aKey) : mKey(const_cast<T*>(aKey)) {}
  nsPtrHashKey(const nsPtrHashKey<T>& aToCopy) : mKey(aToCopy.mKey) {}
  ~nsPtrHashKey() {}

  KeyType GetKey() const { return mKey; }
  bool KeyEquals(KeyTypePointer aKey) const { return aKey == mKey; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return ((uint32_t)(intptr_t)(aKey)) >> 2;
  }
  enum { ALLOW_MEMMOVE = true };

protected:
  T* mKey;
};

typedef nsPtrHashKey<const void> nsVoidPtrHashKey;
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/MemoryChecking.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h" 2
# 76 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h"
template<class EntryType>
class nsTHashtable
{
  typedef mozilla::fallible_t fallible_t;
  static_assert(mozilla::IsPointer<typename EntryType::KeyTypePointer>::value,
                "KeyTypePointer should be a pointer");

public:


  nsTHashtable()
    : mTable(Ops(), sizeof(EntryType), PLDHashTable::kDefaultInitialLength)
  {}
  explicit nsTHashtable(uint32_t aInitLength)
    : mTable(Ops(), sizeof(EntryType), aInitLength)
  {}




  ~nsTHashtable();

  nsTHashtable(nsTHashtable<EntryType>&& aOther);





  uint32_t GetGeneration() const { return mTable.Generation(); }




  typedef typename EntryType::KeyType KeyType;




  typedef typename EntryType::KeyTypePointer KeyTypePointer;





  uint32_t Count() const { return mTable.EntryCount(); }




  bool IsEmpty() const { return Count() == 0; }







  EntryType* GetEntry(KeyType aKey) const
  {
    return static_cast<EntryType*>(
      const_cast<PLDHashTable*>(&mTable)->Search(EntryType::KeyToPointer(aKey)));
  }






  bool Contains(KeyType aKey) const { return !!GetEntry(aKey); }







  EntryType* PutEntry(KeyType aKey)
  {

    return static_cast<EntryType*>(mTable.Add(EntryType::KeyToPointer(aKey)));
  }

  __attribute__ ((warn_unused_result))
  EntryType* PutEntry(KeyType aKey, const fallible_t&)
  {
    return static_cast<EntryType*>(mTable.Add(EntryType::KeyToPointer(aKey),
                                              mozilla::fallible));
  }





  void RemoveEntry(KeyType aKey)
  {
    mTable.Remove(EntryType::KeyToPointer(aKey));
  }





  void RemoveEntry(EntryType* aEntry)
  {
    mTable.RemoveEntry(aEntry);
  }
# 190 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h"
  void RawRemoveEntry(EntryType* aEntry)
  {
    mTable.RawRemove(aEntry);
  }
# 203 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h"
  class Iterator : public PLDHashTable::Iterator
  {
  public:
    typedef PLDHashTable::Iterator Base;

    explicit Iterator(nsTHashtable* aTable) : Base(&aTable->mTable) {}
    Iterator(Iterator&& aOther) : Base(aOther.mTable) {}
    ~Iterator() {}

    EntryType* Get() const { return static_cast<EntryType*>(Base::Get()); }

  private:
    Iterator() = delete;
    Iterator(const Iterator&) = delete;
    Iterator& operator=(const Iterator&) = delete;
    Iterator& operator=(const Iterator&&) = delete;
  };

  Iterator Iter() { return Iterator(this); }

  Iterator ConstIter() const
  {
    return Iterator(const_cast<nsTHashtable*>(this));
  }






  void Clear()
  {
    mTable.Clear();
  }
# 247 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h"
  size_t ShallowSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return mTable.ShallowSizeOfExcludingThis(aMallocSizeOf);
  }




  size_t ShallowSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(this) + ShallowSizeOfExcludingThis(aMallocSizeOf);
  }






  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    size_t n = ShallowSizeOfExcludingThis(aMallocSizeOf);
    for (auto iter = ConstIter(); !iter.Done(); iter.Next()) {
      n += (*iter.Get()).SizeOfExcludingThis(aMallocSizeOf);
    }
    return n;
  }




  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
  }




  void SwapElements(nsTHashtable<EntryType>& aOther)
  {
    do { } while (0);

    mozilla::Swap(this->mTable, aOther.mTable);
  }
# 305 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h"
protected:
  PLDHashTable mTable;

  static PLDHashNumber s_HashKey(const void* aKey);

  static bool s_MatchEntry(const PLDHashEntryHdr* aEntry,
                           const void* aKey);

  static void s_CopyEntry(PLDHashTable* aTable, const PLDHashEntryHdr* aFrom,
                          PLDHashEntryHdr* aTo);

  static void s_ClearEntry(PLDHashTable* aTable, PLDHashEntryHdr* aEntry);

  static void s_InitEntry(PLDHashEntryHdr* aEntry, const void* aKey);

private:

  nsTHashtable(nsTHashtable<EntryType>& aToCopy) = delete;




  static const PLDHashTableOps* Ops();


  nsTHashtable<EntryType>& operator=(nsTHashtable<EntryType>& aToEqual) = delete;
};





template<class EntryType>
nsTHashtable<EntryType>::nsTHashtable(nsTHashtable<EntryType>&& aOther)
  : mTable(mozilla::Move(aOther.mTable))
{


  do {} while (0);
}

template<class EntryType>
nsTHashtable<EntryType>::~nsTHashtable()
{
}

template<class EntryType>
             const PLDHashTableOps*
nsTHashtable<EntryType>::Ops()
{



  static const PLDHashTableOps sOps =
  {
    s_HashKey,
    s_MatchEntry,
    EntryType::ALLOW_MEMMOVE ? PLDHashTable::MoveEntryStub : s_CopyEntry,
    s_ClearEntry,
    s_InitEntry
  };
  return &sOps;
}



template<class EntryType>
PLDHashNumber
nsTHashtable<EntryType>::s_HashKey(const void* aKey)
{
  return EntryType::HashKey(static_cast<const KeyTypePointer>(aKey));
}

template<class EntryType>
bool
nsTHashtable<EntryType>::s_MatchEntry(const PLDHashEntryHdr* aEntry,
                                      const void* aKey)
{
  return ((const EntryType*)aEntry)->KeyEquals(
    static_cast<const KeyTypePointer>(aKey));
}

template<class EntryType>
void
nsTHashtable<EntryType>::s_CopyEntry(PLDHashTable* aTable,
                                     const PLDHashEntryHdr* aFrom,
                                     PLDHashEntryHdr* aTo)
{
  EntryType* fromEntry =
    const_cast<EntryType*>(static_cast<const EntryType*>(aFrom));

  new (mozilla::KnownNotNull, aTo) EntryType(mozilla::Move(*fromEntry));

  fromEntry->~EntryType();
}

template<class EntryType>
void
nsTHashtable<EntryType>::s_ClearEntry(PLDHashTable* aTable,
                                      PLDHashEntryHdr* aEntry)
{
  static_cast<EntryType*>(aEntry)->~EntryType();
}

template<class EntryType>
void
nsTHashtable<EntryType>::s_InitEntry(PLDHashEntryHdr* aEntry,
                                     const void* aKey)
{
  new (mozilla::KnownNotNull, aEntry) EntryType(static_cast<KeyTypePointer>(aKey));
}

class nsCycleCollectionTraversalCallback;

template<class EntryType>
inline void
ImplCycleCollectionUnlink(nsTHashtable<EntryType>& aField)
{
  aField.Clear();
}

template<class EntryType>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsTHashtable<EntryType>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  for (auto iter = aField.Iter(); !iter.Done(); iter.Next()) {
    EntryType* entry = iter.Get();
    ImplCycleCollectionTraverse(aCallback, *entry, aName, aFlags);
  }
}
# 456 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTHashtable.h"
namespace detail {

class VoidPtrHashKey : public nsPtrHashKey<const void>
{
  typedef nsPtrHashKey<const void> Base;

public:
  explicit VoidPtrHashKey(const void* aKey) : Base(aKey) {}
};

}





template<typename T>
class nsTHashtable<nsPtrHashKey<T>> : protected nsTHashtable<::detail::VoidPtrHashKey>
{
  typedef nsTHashtable<::detail::VoidPtrHashKey> Base;
  typedef nsPtrHashKey<T> EntryType;



  static_assert(sizeof(nsPtrHashKey<T>) == sizeof(::detail::VoidPtrHashKey),
                "hash keys must be the same size");

  nsTHashtable(const nsTHashtable& aOther) = delete;
  nsTHashtable& operator=(const nsTHashtable& aOther) = delete;

public:
  nsTHashtable() = default;
  explicit nsTHashtable(uint32_t aInitLength)
    : Base(aInitLength)
  {}

  ~nsTHashtable() = default;

  nsTHashtable(nsTHashtable&&) = default;


  using Base::GetGeneration;
  using Base::Count;
  using Base::IsEmpty;
  using Base::Clear;

  using Base::ShallowSizeOfExcludingThis;
  using Base::ShallowSizeOfIncludingThis;





  EntryType* GetEntry(T* aKey) const
  {
    return reinterpret_cast<EntryType*>(Base::GetEntry(aKey));
  }

  bool Contains(T* aKey) const
  {
    return Base::Contains(aKey);
  }

  EntryType* PutEntry(T* aKey)
  {
    return reinterpret_cast<EntryType*>(Base::PutEntry(aKey));
  }

  __attribute__ ((warn_unused_result))
  EntryType* PutEntry(T* aKey, const mozilla::fallible_t&)
  {
    return reinterpret_cast<EntryType*>(
      Base::PutEntry(aKey, mozilla::fallible));
  }

  void RemoveEntry(T* aKey)
  {
    Base::RemoveEntry(aKey);
  }

  void RemoveEntry(EntryType* aEntry)
  {
    Base::RemoveEntry(reinterpret_cast<::detail::VoidPtrHashKey*>(aEntry));
  }

  void RawRemoveEntry(EntryType* aEntry)
  {
    Base::RawRemoveEntry(reinterpret_cast<::detail::VoidPtrHashKey*>(aEntry));
  }

  class Iterator : public Base::Iterator
  {
  public:
    typedef nsTHashtable::Base::Iterator Base;

    explicit Iterator(nsTHashtable* aTable) : Base(aTable) {}
    Iterator(Iterator&& aOther) : Base(mozilla::Move(aOther)) {}
    ~Iterator() = default;

    EntryType* Get() const { return reinterpret_cast<EntryType*>(Base::Get()); }

  private:
    Iterator() = delete;
    Iterator(const Iterator&) = delete;
    Iterator& operator=(const Iterator&) = delete;
    Iterator& operator=(Iterator&&) = delete;
  };

  Iterator Iter() { return Iterator(this); }

  Iterator ConstIter() const
  {
    return Iterator(const_cast<nsTHashtable*>(this));
  }

  void SwapElements(nsTHashtable& aOther)
  {
    Base::SwapElements(aOther);
  }
};
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h" 2


template<class KeyClass, class DataType, class UserDataType>
class nsBaseHashtable;






template<class KeyClass, class DataType>
class nsBaseHashtableET : public KeyClass
{
public:
  DataType mData;
  friend class nsTHashtable<nsBaseHashtableET<KeyClass, DataType>>;

private:
  typedef typename KeyClass::KeyType KeyType;
  typedef typename KeyClass::KeyTypePointer KeyTypePointer;

  explicit nsBaseHashtableET(KeyTypePointer aKey);
  nsBaseHashtableET(nsBaseHashtableET<KeyClass, DataType>&& aToMove);
  ~nsBaseHashtableET();
};
# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h"
template<class KeyClass, class DataType, class UserDataType>
class nsBaseHashtable
  : protected nsTHashtable<nsBaseHashtableET<KeyClass, DataType>>
{
  typedef mozilla::fallible_t fallible_t;

public:
  typedef typename KeyClass::KeyType KeyType;
  typedef nsBaseHashtableET<KeyClass, DataType> EntryType;

  using nsTHashtable<EntryType>::Contains;

  nsBaseHashtable() {}
  explicit nsBaseHashtable(uint32_t aInitLength)
    : nsTHashtable<EntryType>(aInitLength)
  {
  }





  uint32_t Count() const { return nsTHashtable<EntryType>::Count(); }
# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h"
  bool Get(KeyType aKey, UserDataType* aData) const
  {
    EntryType* ent = this->GetEntry(aKey);
    if (!ent) {
      return false;
    }

    if (aData) {
      *aData = ent->mData;
    }

    return true;
  }
# 108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h"
  UserDataType Get(KeyType aKey) const
  {
    EntryType* ent = this->GetEntry(aKey);
    if (!ent) {
      return UserDataType{};
    }

    return ent->mData;
  }






  DataType& GetOrInsert(const KeyType& aKey)
  {
    EntryType* ent = this->GetEntry(aKey);
    if (ent) {
      return ent->mData;
    }

    ent = this->PutEntry(aKey);
    return ent->mData;
  }







  void Put(KeyType aKey, const UserDataType& aData)
  {
    if (!Put(aKey, aData, mozilla::fallible)) {
      NS_ABORT_OOM(this->mTable.EntrySize() * this->mTable.EntryCount());
    }
  }

  __attribute__ ((warn_unused_result)) bool Put(KeyType aKey, const UserDataType& aData,
                        const fallible_t&)
  {
    EntryType* ent = this->PutEntry(aKey, mozilla::fallible);
    if (!ent) {
      return false;
    }

    ent->mData = aData;

    return true;
  }





  void Remove(KeyType aKey) { this->RemoveEntry(aKey); }
# 177 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h"
  class Iterator : public PLDHashTable::Iterator
  {
  public:
    typedef PLDHashTable::Iterator Base;

    explicit Iterator(nsBaseHashtable* aTable) : Base(&aTable->mTable) {}
    Iterator(Iterator&& aOther) : Base(aOther.mTable) {}
    ~Iterator() {}

    KeyType Key() const { return static_cast<EntryType*>(Get())->GetKey(); }
    UserDataType UserData() const
    {
      return static_cast<EntryType*>(Get())->mData;
    }
    DataType& Data() const { return static_cast<EntryType*>(Get())->mData; }

  private:
    Iterator() = delete;
    Iterator(const Iterator&) = delete;
    Iterator& operator=(const Iterator&) = delete;
    Iterator& operator=(const Iterator&&) = delete;
  };

  Iterator Iter() { return Iterator(this); }

  Iterator ConstIter() const
  {
    return Iterator(const_cast<nsBaseHashtable*>(this));
  }




  void Clear() { nsTHashtable<EntryType>::Clear(); }
# 219 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsBaseHashtable.h"
  size_t ShallowSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return this->mTable.ShallowSizeOfExcludingThis(aMallocSizeOf);
  }




  size_t ShallowSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(this) + ShallowSizeOfExcludingThis(aMallocSizeOf);
  }




  void SwapElements(nsBaseHashtable& aOther)
  {
    nsTHashtable<EntryType>::SwapElements(aOther);
  }





};





template<class KeyClass, class DataType>
nsBaseHashtableET<KeyClass, DataType>::nsBaseHashtableET(KeyTypePointer aKey)
  : KeyClass(aKey)
  , mData()
{
}

template<class KeyClass, class DataType>
nsBaseHashtableET<KeyClass, DataType>::nsBaseHashtableET(
      nsBaseHashtableET<KeyClass, DataType>&& aToMove)
  : KeyClass(mozilla::Move(aToMove))
  , mData(mozilla::Move(aToMove.mData))
{
}

template<class KeyClass, class DataType>
nsBaseHashtableET<KeyClass, DataType>::~nsBaseHashtableET()
{
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRefPtrHashtable.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHashable.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHashable.h"
class nsIHashable : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Equals(nsIHashable *aOther, bool *_retval) = 0;


  virtual nsresult GetHashCode(uint32_t *aHashCode) = 0;

};

  template<typename T> struct nsIHashable::COMTypeInfo<nsIHashable, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIHashable::COMTypeInfo<nsIHashable, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x17e595fa, 0xb57a, 0x4933, { 0xbd, 0x0f, 0xb1, 0x81, 0x2e, 0x8a, 0xb1, 0x88 }};
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRTGlue.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRTGlue.h"
const char* NS_strspnp(const char* aDelims, const char* aStr);
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRTGlue.h"
char* NS_strtok(const char* aDelims, char** aStr);




uint32_t NS_strlen(const char16_t* aString);




int NS_strcmp(const char16_t* aStrA, const char16_t* aStrB);




int NS_strncmp(const char16_t* aStrA, const char16_t* aStrB, size_t aLen);




char16_t* NS_strdup(const char16_t* aString);




char* NS_strdup(const char* aString);
# 72 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRTGlue.h"
template<typename CharT>
CharT* NS_strndup(const CharT* aString, uint32_t aLen);





class nsLowerUpperUtils
{
public:
  static const unsigned char kLower2Upper[256];
  static const unsigned char kUpper2Lower[256];
};

inline char
NS_ToUpper(char aChar)
{
  return (char)nsLowerUpperUtils::kLower2Upper[(unsigned char)aChar];
}

inline char
NS_ToLower(char aChar)
{
  return (char)nsLowerUpperUtils::kUpper2Lower[(unsigned char)aChar];
}

bool NS_IsUpper(char aChar);
bool NS_IsLower(char aChar);

bool NS_IsAscii(char16_t aChar);
bool NS_IsAscii(const char16_t* aString);
bool NS_IsAsciiAlpha(char16_t aChar);
bool NS_IsAsciiDigit(char16_t aChar);
bool NS_IsAsciiWhitespace(char16_t aChar);
bool NS_IsAscii(const char* aString);
bool NS_IsAscii(const char* aString, uint32_t aLength);


void NS_MakeRandomString(char* aBuf, int32_t aBufLen);
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsUnicharUtils.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsUnicharUtils.h"
void ToLowerCase(nsAString&);
void ToUpperCase(nsAString&);

void ToLowerCase(const nsAString& aSource, nsAString& aDest);
void ToUpperCase(const nsAString& aSource, nsAString& aDest);

uint32_t ToLowerCase(uint32_t);
uint32_t ToUpperCase(uint32_t);
uint32_t ToTitleCase(uint32_t);

void ToLowerCase(const char16_t*, char16_t*, uint32_t);
void ToUpperCase(const char16_t*, char16_t*, uint32_t);

inline bool IsUpperCase(uint32_t c) {
  return ToLowerCase(c) != c;
}

inline bool IsLowerCase(uint32_t c) {
  return ToUpperCase(c) != c;
}



class nsCaseInsensitiveStringComparator : public nsStringComparator
{
public:
  virtual int32_t operator() (const char16_t*,
                              const char16_t*,
                              uint32_t,
                              uint32_t) const override;
};

class nsCaseInsensitiveUTF8StringComparator : public nsCStringComparator
{
public:
  virtual int32_t operator() (const char*,
                              const char*,
                              uint32_t,
                              uint32_t) const override;
};

class nsCaseInsensitiveStringArrayComparator
{
public:
  template<class A, class B>
  bool Equals(const A& a, const B& b) const {
    return a.Equals(b, nsCaseInsensitiveStringComparator());
  }
};

class nsASCIICaseInsensitiveStringComparator : public nsStringComparator
{
public:
  nsASCIICaseInsensitiveStringComparator() {}
  virtual int operator() (const char16_t*,
                          const char16_t*,
                          uint32_t,
                          uint32_t) const override;
};

inline bool
CaseInsensitiveFindInReadable(const nsAString& aPattern,
                              nsAString::const_iterator& aSearchStart,
                              nsAString::const_iterator& aSearchEnd)
{
  return FindInReadable(aPattern, aSearchStart, aSearchEnd,
                        nsCaseInsensitiveStringComparator());
}

inline bool
CaseInsensitiveFindInReadable(const nsAString& aPattern,
                              const nsAString& aHay)
{
  nsAString::const_iterator searchBegin, searchEnd;
  return FindInReadable(aPattern, aHay.BeginReading(searchBegin),
                        aHay.EndReading(searchEnd),
                        nsCaseInsensitiveStringComparator());
}



int32_t
CaseInsensitiveCompare(const char16_t *a, const char16_t *b, uint32_t len);

int32_t
CaseInsensitiveCompare(const char* aLeft, const char* aRight,
                       uint32_t aLeftBytes, uint32_t aRightBytes);
# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsUnicharUtils.h"
bool
CaseInsensitiveUTF8CharsEqual(const char* aLeft, const char* aRight,
                              const char* aLeftEnd, const char* aRightEnd,
                              const char** aLeftNext, const char** aRightNext,
                              bool* aErr);

namespace mozilla {
# 144 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsUnicharUtils.h"
uint32_t
HashUTF8AsUTF16(const char* aUTF8, uint32_t aLength, bool* aErr);

bool
IsSegmentBreakSkipChar(uint32_t u);

}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h" 2


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h" 2





namespace mozilla {



inline uint32_t
HashString(const nsAString& aStr)
{
  return HashString(aStr.BeginReading(), aStr.Length());
}

inline uint32_t
HashString(const nsACString& aStr)
{
  return HashString(aStr.BeginReading(), aStr.Length());
}

}
# 75 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h"
class nsStringHashKey : public PLDHashEntryHdr
{
public:
  typedef const nsAString& KeyType;
  typedef const nsAString* KeyTypePointer;

  explicit nsStringHashKey(KeyTypePointer aStr) : mStr(*aStr) {}
  nsStringHashKey(const nsStringHashKey& aToCopy) : mStr(aToCopy.mStr) {}
  ~nsStringHashKey() {}

  KeyType GetKey() const { return mStr; }
  bool KeyEquals(const KeyTypePointer aKey) const
  {
    return mStr.Equals(*aKey);
  }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(const KeyTypePointer aKey)
  {
    return mozilla::HashString(*aKey);
  }



  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return GetKey().SizeOfExcludingThisIfUnshared(aMallocSizeOf);
  }


  enum { ALLOW_MEMMOVE = true };

private:
  const nsString mStr;
};
# 121 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h"
class nsStringCaseInsensitiveHashKey : public PLDHashEntryHdr
{
public:
  typedef const nsAString& KeyType;
  typedef const nsAString* KeyTypePointer;

  explicit nsStringCaseInsensitiveHashKey(KeyTypePointer aStr)
    : mStr(*aStr)
  {

  }
  nsStringCaseInsensitiveHashKey(const nsStringCaseInsensitiveHashKey& aToCopy)
    : mStr(aToCopy.mStr)
  {
  }
  ~nsStringCaseInsensitiveHashKey() {}

  KeyType GetKey() const { return mStr; }
  bool KeyEquals(const KeyTypePointer aKey) const
  {
    return mStr.Equals(*aKey, nsCaseInsensitiveStringComparator());
  }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(const KeyTypePointer aKey)
  {
    nsAutoString tmKey(*aKey);
    ToLowerCase(tmKey);
    return mozilla::HashString(tmKey);
  }
  enum { ALLOW_MEMMOVE = true };


  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return GetKey().SizeOfExcludingThisIfUnshared(aMallocSizeOf);
  }

private:
  const nsString mStr;
};
# 170 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h"
class nsCStringHashKey : public PLDHashEntryHdr
{
public:
  typedef const nsACString& KeyType;
  typedef const nsACString* KeyTypePointer;

  explicit nsCStringHashKey(const nsACString* aStr) : mStr(*aStr) {}
  nsCStringHashKey(const nsCStringHashKey& aToCopy) : mStr(aToCopy.mStr) {}
  ~nsCStringHashKey() {}

  KeyType GetKey() const { return mStr; }
  bool KeyEquals(KeyTypePointer aKey) const { return mStr.Equals(*aKey); }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return mozilla::HashString(*aKey);
  }



  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return GetKey().SizeOfExcludingThisIfUnshared(aMallocSizeOf);
  }


  enum { ALLOW_MEMMOVE = true };

private:
  const nsCString mStr;
};






class nsUint32HashKey : public PLDHashEntryHdr
{
public:
  typedef const uint32_t& KeyType;
  typedef const uint32_t* KeyTypePointer;

  explicit nsUint32HashKey(KeyTypePointer aKey) : mValue(*aKey) {}
  nsUint32HashKey(const nsUint32HashKey& aToCopy) : mValue(aToCopy.mValue) {}
  ~nsUint32HashKey() {}

  KeyType GetKey() const { return mValue; }
  bool KeyEquals(KeyTypePointer aKey) const { return *aKey == mValue; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey) { return *aKey; }
  enum { ALLOW_MEMMOVE = true };

private:
  const uint32_t mValue;
};






class nsUint64HashKey : public PLDHashEntryHdr
{
public:
  typedef const uint64_t& KeyType;
  typedef const uint64_t* KeyTypePointer;

  explicit nsUint64HashKey(KeyTypePointer aKey) : mValue(*aKey) {}
  nsUint64HashKey(const nsUint64HashKey& aToCopy) : mValue(aToCopy.mValue) {}
  ~nsUint64HashKey() {}

  KeyType GetKey() const { return mValue; }
  bool KeyEquals(KeyTypePointer aKey) const { return *aKey == mValue; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return PLDHashNumber(*aKey);
  }
  enum { ALLOW_MEMMOVE = true };

private:
  const uint64_t mValue;
};






class nsFloatHashKey : public PLDHashEntryHdr
{
public:
  typedef const float& KeyType;
  typedef const float* KeyTypePointer;

  explicit nsFloatHashKey(KeyTypePointer aKey) : mValue(*aKey) {}
  nsFloatHashKey(const nsFloatHashKey& aToCopy) : mValue(aToCopy.mValue) {}
  ~nsFloatHashKey() {}

  KeyType GetKey() const { return mValue; }
  bool KeyEquals(KeyTypePointer aKey) const { return *aKey == mValue; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return *reinterpret_cast<const uint32_t*>(aKey);
  }
  enum { ALLOW_MEMMOVE = true };

private:
  const float mValue;
};






class nsISupportsHashKey : public PLDHashEntryHdr
{
public:
  typedef nsISupports* KeyType;
  typedef const nsISupports* KeyTypePointer;

  explicit nsISupportsHashKey(const nsISupports* aKey)
    : mSupports(const_cast<nsISupports*>(aKey))
  {
  }
  nsISupportsHashKey(const nsISupportsHashKey& aToCopy)
    : mSupports(aToCopy.mSupports)
  {
  }
  ~nsISupportsHashKey() {}

  KeyType GetKey() const { return mSupports; }
  bool KeyEquals(KeyTypePointer aKey) const { return aKey == mSupports; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return ((uint32_t)(intptr_t)(aKey)) >> 2;
  }
  enum { ALLOW_MEMMOVE = true };

private:
  nsCOMPtr<nsISupports> mSupports;
};






template<class T>
class nsRefPtrHashKey : public PLDHashEntryHdr
{
public:
  typedef T* KeyType;
  typedef const T* KeyTypePointer;

  explicit nsRefPtrHashKey(const T* aKey) : mKey(const_cast<T*>(aKey)) {}
  nsRefPtrHashKey(const nsRefPtrHashKey& aToCopy) : mKey(aToCopy.mKey) {}
  ~nsRefPtrHashKey() {}

  KeyType GetKey() const { return mKey; }
  bool KeyEquals(KeyTypePointer aKey) const { return aKey == mKey; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return ((uint32_t)(intptr_t)(aKey)) >> 2;
  }
  enum { ALLOW_MEMMOVE = true };

private:
  RefPtr<T> mKey;
};

template<class T>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsRefPtrHashKey<T>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  CycleCollectionNoteChild(aCallback, aField.GetKey(), aName, aFlags);
}
# 370 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h"
template<class T>
class nsClearingPtrHashKey : public nsPtrHashKey<T>
{
public:
  explicit nsClearingPtrHashKey(const T* aKey) : nsPtrHashKey<T>(aKey) {}
  nsClearingPtrHashKey(const nsClearingPtrHashKey<T>& aToCopy)
    : nsPtrHashKey<T>(aToCopy)
  {
  }
  ~nsClearingPtrHashKey() { nsPtrHashKey<T>::mKey = nullptr; }
};

typedef nsClearingPtrHashKey<const void> nsClearingVoidPtrHashKey;






template<class T>
class nsFuncPtrHashKey : public PLDHashEntryHdr
{
public:
  typedef T& KeyType;
  typedef const T* KeyTypePointer;

  explicit nsFuncPtrHashKey(const T* aKey) : mKey(*const_cast<T*>(aKey)) {}
  nsFuncPtrHashKey(const nsFuncPtrHashKey<T>& aToCopy) : mKey(aToCopy.mKey) {}
  ~nsFuncPtrHashKey() {}

  KeyType GetKey() const { return const_cast<T&>(mKey); }
  bool KeyEquals(KeyTypePointer aKey) const { return *aKey == mKey; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return ((uint32_t)(intptr_t)(*aKey)) >> 2;
  }
  enum { ALLOW_MEMMOVE = true };

protected:
  T mKey;
};






class nsIDHashKey : public PLDHashEntryHdr
{
public:
  typedef const nsID& KeyType;
  typedef const nsID* KeyTypePointer;

  explicit nsIDHashKey(const nsID* aInID) : mID(*aInID) {}
  nsIDHashKey(const nsIDHashKey& aToCopy) : mID(aToCopy.mID) {}
  ~nsIDHashKey() {}

  KeyType GetKey() const { return mID; }
  bool KeyEquals(KeyTypePointer aKey) const { return aKey->Equals(mID); }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {

    return mozilla::HashBytes(aKey, sizeof(KeyType));
  }

  enum { ALLOW_MEMMOVE = true };

private:
  const nsID mID;
};
# 455 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsHashKeys.h"
class nsDepCharHashKey : public PLDHashEntryHdr
{
public:
  typedef const char* KeyType;
  typedef const char* KeyTypePointer;

  explicit nsDepCharHashKey(const char* aKey) : mKey(aKey) {}
  nsDepCharHashKey(const nsDepCharHashKey& aToCopy) : mKey(aToCopy.mKey) {}
  ~nsDepCharHashKey() {}

  const char* GetKey() const { return mKey; }
  bool KeyEquals(const char* aKey) const { return !strcmp(mKey, aKey); }

  static const char* KeyToPointer(const char* aKey) { return aKey; }
  static PLDHashNumber HashKey(const char* aKey)
  {
    return mozilla::HashString(aKey);
  }
  enum { ALLOW_MEMMOVE = true };

private:
  const char* mKey;
};






class nsCharPtrHashKey : public PLDHashEntryHdr
{
public:
  typedef const char* KeyType;
  typedef const char* KeyTypePointer;

  explicit nsCharPtrHashKey(const char* aKey) : mKey(strdup(aKey)) {}
  nsCharPtrHashKey(const nsCharPtrHashKey& aToCopy)
    : mKey(strdup(aToCopy.mKey))
  {
  }

  nsCharPtrHashKey(nsCharPtrHashKey&& aOther)
    : mKey(aOther.mKey)
  {
    aOther.mKey = nullptr;
  }

  ~nsCharPtrHashKey()
  {
    if (mKey) {
      free(const_cast<char*>(mKey));
    }
  }

  const char* GetKey() const { return mKey; }
  bool KeyEquals(KeyTypePointer aKey) const { return !strcmp(mKey, aKey); }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return mozilla::HashString(aKey);
  }

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(mKey);
  }

  enum { ALLOW_MEMMOVE = true };

private:
  const char* mKey;
};






class nsUnicharPtrHashKey : public PLDHashEntryHdr
{
public:
  typedef const char16_t* KeyType;
  typedef const char16_t* KeyTypePointer;

  explicit nsUnicharPtrHashKey(const char16_t* aKey) : mKey(NS_strdup(aKey)) {}
  nsUnicharPtrHashKey(const nsUnicharPtrHashKey& aToCopy)
    : mKey(NS_strdup(aToCopy.mKey))
  {
  }

  nsUnicharPtrHashKey(nsUnicharPtrHashKey&& aOther)
    : mKey(aOther.mKey)
  {
    aOther.mKey = nullptr;
  }

  ~nsUnicharPtrHashKey()
  {
    if (mKey) {
      free(const_cast<char16_t*>(mKey));
    }
  }

  const char16_t* GetKey() const { return mKey; }
  bool KeyEquals(KeyTypePointer aKey) const { return !NS_strcmp(mKey, aKey); }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    return mozilla::HashString(aKey);
  }

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(mKey);
  }

  enum { ALLOW_MEMMOVE = true };

private:
  const char16_t* mKey;
};




class nsHashableHashKey : public PLDHashEntryHdr
{
public:
  typedef nsIHashable* KeyType;
  typedef const nsIHashable* KeyTypePointer;

  explicit nsHashableHashKey(const nsIHashable* aKey)
    : mKey(const_cast<nsIHashable*>(aKey))
  {
  }
  nsHashableHashKey(const nsHashableHashKey& aToCopy) : mKey(aToCopy.mKey) {}
  ~nsHashableHashKey() {}

  nsIHashable* GetKey() const { return mKey; }

  bool KeyEquals(const nsIHashable* aKey) const
  {
    bool eq;
    if (((bool)(__builtin_expect(!!(!NS_FAILED_impl(mKey->Equals(const_cast<nsIHashable*>(aKey), &eq))), 1)))) {
      return eq;
    }
    return false;
  }

  static const nsIHashable* KeyToPointer(nsIHashable* aKey) { return aKey; }
  static PLDHashNumber HashKey(const nsIHashable* aKey)
  {
    uint32_t code = 8888;



      const_cast<nsIHashable*>(aKey)->GetHashCode(&code);
    do { } while(0);
    return code;
  }

  enum { ALLOW_MEMMOVE = true };

private:
  nsCOMPtr<nsIHashable> mKey;
};

namespace mozilla {

template <typename T>
PLDHashNumber
Hash(const T& aValue)
{
  return aValue.Hash();
}

}





template<typename T>
class nsGenericHashKey : public PLDHashEntryHdr
{
public:
  typedef const T& KeyType;
  typedef const T* KeyTypePointer;

  explicit nsGenericHashKey(KeyTypePointer aKey) : mKey(*aKey) {}
  nsGenericHashKey(const nsGenericHashKey<T>& aOther) : mKey(aOther.mKey) {}

  KeyType GetKey() const { return mKey; }
  bool KeyEquals(KeyTypePointer aKey) const { return *aKey == mKey; }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey) { return ::mozilla::Hash(*aKey); }
  enum { ALLOW_MEMMOVE = true };

private:
  T mKey;
};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRefPtrHashtable.h" 2
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRefPtrHashtable.h"
template<class KeyClass, class PtrType>
class nsRefPtrHashtable
  : public nsBaseHashtable<KeyClass, RefPtr<PtrType>, PtrType*>
{
public:
  typedef typename KeyClass::KeyType KeyType;
  typedef PtrType* UserDataType;
  typedef nsBaseHashtable<KeyClass, RefPtr<PtrType>, PtrType*> base_type;

  nsRefPtrHashtable() {}
  explicit nsRefPtrHashtable(uint32_t aInitLength)
    : nsBaseHashtable<KeyClass, RefPtr<PtrType>, PtrType*>(aInitLength)
  {
  }






  bool Get(KeyType aKey, UserDataType* aData) const;







  PtrType* GetWeak(KeyType aKey, bool* aFound = nullptr) const;


  using base_type::Put;

  void Put(KeyType aKey, already_AddRefed<PtrType> aData);

  __attribute__ ((warn_unused_result)) bool Put(KeyType aKey, already_AddRefed<PtrType> aData,
                        const mozilla::fallible_t&);


  using base_type::Remove;
# 70 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRefPtrHashtable.h"
  bool Remove(KeyType aKey, UserDataType* aData);
};

template<typename K, typename T>
inline void
ImplCycleCollectionUnlink(nsRefPtrHashtable<K, T>& aField)
{
  aField.Clear();
}

template<typename K, typename T>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsRefPtrHashtable<K, T>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  for (auto iter = aField.ConstIter(); !iter.Done(); iter.Next()) {
    CycleCollectionNoteChild(aCallback, iter.UserData(), aName, aFlags);
  }
}





template<class KeyClass, class PtrType>
bool
nsRefPtrHashtable<KeyClass, PtrType>::Get(KeyType aKey,
                                          UserDataType* aRefPtr) const
{
  typename base_type::EntryType* ent = this->GetEntry(aKey);

  if (ent) {
    if (aRefPtr) {
      *aRefPtr = ent->mData;

      ns_if_addref(*aRefPtr);
    }

    return true;
  }



  if (aRefPtr) {
    *aRefPtr = nullptr;
  }

  return false;
}

template<class KeyClass, class PtrType>
PtrType*
nsRefPtrHashtable<KeyClass, PtrType>::GetWeak(KeyType aKey, bool* aFound) const
{
  typename base_type::EntryType* ent = this->GetEntry(aKey);

  if (ent) {
    if (aFound) {
      *aFound = true;
    }

    return ent->mData;
  }


  if (aFound) {
    *aFound = false;
  }

  return nullptr;
}

template<class KeyClass, class PtrType>
void
nsRefPtrHashtable<KeyClass, PtrType>::Put(KeyType aKey,
                                          already_AddRefed<PtrType> aData)
{
  if (!Put(aKey, mozilla::Move(aData), mozilla::fallible)) {
    NS_ABORT_OOM(this->mTable.EntrySize() * this->mTable.EntryCount());
  }
}

template<class KeyClass, class PtrType>
bool
nsRefPtrHashtable<KeyClass, PtrType>::Put(KeyType aKey,
                                          already_AddRefed<PtrType> aData,
                                          const mozilla::fallible_t&)
{
  typename base_type::EntryType* ent = this->PutEntry(aKey);

  if (!ent) {
    return false;
  }

  ent->mData = aData;

  return true;
}

template<class KeyClass, class PtrType>
bool
nsRefPtrHashtable<KeyClass, PtrType>::Remove(KeyType aKey,
                                             UserDataType* aRefPtr)
{
  do { } while (0);
  typename base_type::EntryType* ent = this->GetEntry(aKey);

  if (ent) {
    ent->mData.forget(aRefPtr);
    this->Remove(aKey);
    return true;
  }



  *aRefPtr = nullptr;
  return false;
}
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h" 2






class nsGlobalWindow;
class nsIArray;
class nsIContent;
class nsICSSDeclaration;
class nsIDocShell;
class nsIDocShellLoadInfo;
class nsIDocument;
class nsIEventTarget;
class nsIIdleObserver;
class nsIPrincipal;
class nsIScriptTimeoutHandler;
class nsIURI;
class nsPIDOMWindowInner;
class nsPIDOMWindowOuter;
class nsPIWindowRoot;
class nsXBLPrototypeHandler;

typedef uint32_t SuspendTypes;

namespace mozilla {
class ThrottledEventQueue;
namespace dom {
class AudioContext;
class DocGroup;
class TabGroup;
class Element;
class Performance;
class ServiceWorkerRegistration;
class Timeout;
class TimeoutManager;
class CustomElementRegistry;
enum class CallerType : uint32_t;
}
}






enum PopupControlState {
  openAllowed = 0,
  openControlled,
  openAbused,
  openOverridden
};

enum UIStateChangeType
{
  UIStateChangeType_NoChange,
  UIStateChangeType_Set,
  UIStateChangeType_Clear,
  UIStateChangeType_Invalid
};

enum class FullscreenReason
{

  ForFullscreenMode,

  ForFullscreenAPI,



  ForForceExitFullscreen
};

namespace mozilla {
namespace dom {




enum class LargeAllocStatus : uint8_t
{



  NONE,
  SUCCESS,




  NON_GET,
  NON_E10S,
  NOT_ONLY_TOPLEVEL_IN_TABGROUP,
  NON_WIN32
};
}
}




template<class T>
class nsPIDOMWindow : public T
{
public:
  nsPIDOMWindowInner* AsInner();
  const nsPIDOMWindowInner* AsInner() const;
  nsPIDOMWindowOuter* AsOuter();
  const nsPIDOMWindowOuter* AsOuter() const;

  virtual nsPIDOMWindowOuter* GetPrivateRoot() = 0;
  virtual mozilla::dom::CustomElementRegistry* CustomElements() = 0;

  virtual void ActivateOrDeactivate(bool aActivate) = 0;
# 148 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  virtual already_AddRefed<nsPIDOMWindowOuter> GetTop() = 0;
  virtual already_AddRefed<nsPIDOMWindowOuter> GetParent() = 0;
  virtual nsPIDOMWindowOuter* GetScriptableTop() = 0;
  virtual nsPIDOMWindowOuter* GetScriptableParent() = 0;
  virtual already_AddRefed<nsPIWindowRoot> GetTopWindowRoot() = 0;

  bool IsRootOuterWindow()
  {
    do { } while (0);
    return mIsRootOuterWindow;
  }





  virtual nsPIDOMWindowOuter* GetScriptableParentOrNull() = 0;


  virtual nsresult RegisterIdleObserver(nsIIdleObserver* aIdleObserver) = 0;
  virtual nsresult UnregisterIdleObserver(nsIIdleObserver* aIdleObserver) = 0;

  virtual bool IsTopLevelWindowActive() = 0;


  virtual void SetActive(bool aActive)
  {
    do { } while (0);
    mIsActive = aActive;
  }

  virtual void SetIsBackground(bool aIsBackground)
  {
    do { } while (0);
    mIsBackground = aIsBackground;
  }

  mozilla::dom::EventTarget* GetChromeEventHandler() const
  {
    return mChromeEventHandler;
  }


  virtual void SetChromeEventHandler(mozilla::dom::EventTarget* aChromeEventHandler) = 0;

  mozilla::dom::EventTarget* GetParentTarget()
  {
    if (!mParentTarget) {
      UpdateParentTarget();
    }
    return mParentTarget;
  }

  virtual void MaybeUpdateTouchState() {}

  nsIDocument* GetExtantDoc() const
  {
    return mDoc;
  }
  nsIURI* GetDocumentURI() const;
  nsIURI* GetDocBaseURI() const;

  nsIDocument* GetDoc()
  {
    if (!mDoc) {
      MaybeCreateDoc();
    }
    return mDoc;
  }

protected:


  void MaybeCreateDoc();

public:

  inline bool IsLoading() const;
  inline bool IsHandlingResizeEvent() const;




  virtual void SetInitialPrincipalToSubject() = 0;

  virtual PopupControlState PushPopupControlState(PopupControlState aState,
                                                  bool aForce) const = 0;
  virtual void PopPopupControlState(PopupControlState state) const = 0;
  virtual PopupControlState GetPopupControlState() const = 0;



  virtual already_AddRefed<nsISupports> SaveWindowState() = 0;


  virtual nsresult RestoreWindowState(nsISupports *aState) = 0;





  virtual bool IsSuspended() const = 0;
  virtual bool IsFrozen() const = 0;



  virtual nsresult FireDelayedDOMEvents() = 0;

  nsPIDOMWindowOuter* GetOuterWindow()
  {
    return mIsInnerWindow ? mOuterWindow.get() : AsOuter();
  }

  bool IsInnerWindow() const
  {
    return mIsInnerWindow;
  }

  bool IsOuterWindow() const
  {
    return !IsInnerWindow();
  }


  virtual bool WouldReuseInnerWindow(nsIDocument* aNewDocument) = 0;




  nsIDocShell *GetDocShell() const;





  virtual void SetDocShell(nsIDocShell *aDocShell) = 0;




  virtual void DetachFromDocShell() = 0;
# 302 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  virtual nsresult SetNewDocument(nsIDocument *aDocument,
                                  nsISupports *aState,
                                  bool aForceReuseInnerWindow) = 0;
# 313 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  virtual void SetOpenerWindow(nsPIDOMWindowOuter* aOpener,
                               bool aOriginalOpener) = 0;

  virtual void EnsureSizeUpToDate() = 0;





  virtual void EnterModalState() = 0;
  virtual void LeaveModalState() = 0;


  virtual bool CanClose() = 0;
  virtual void ForceClose() = 0;

  bool IsModalContentWindow() const
  {
    return mIsModalContentWindow;
  }





  void SetHasPaintEventListeners()
  {
    mMayHavePaintEventListener = true;
  }





  bool HasPaintEventListeners()
  {
    return mMayHavePaintEventListener;
  }





  void SetHasTouchEventListeners()
  {
    if (!mMayHaveTouchEventListener) {
      mMayHaveTouchEventListener = true;
      MaybeUpdateTouchState();
    }
  }







  virtual nsresult SetFullscreenInternal(
    FullscreenReason aReason, bool aIsFullscreen) = 0;
# 383 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  virtual void FinishFullscreenChange(bool aIsFullscreen) = 0;

  virtual JSObject* GetCachedXBLPrototypeHandler(nsXBLPrototypeHandler* aKey) = 0;
  virtual void CacheXBLPrototypeHandler(nsXBLPrototypeHandler* aKey,
                                        JS::Handle<JSObject*> aHandler) = 0;
# 397 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  nsIContent* GetFocusedNode() const;
  virtual void SetFocusedNode(nsIContent* aNode,
                              uint32_t aFocusMethod = 0,
                              bool aNeedsFocus = false) = 0;




  virtual uint32_t GetFocusMethod() = 0;
# 417 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  virtual bool TakeFocus(bool aFocus, uint32_t aFocusMethod) = 0;





  virtual void SetReadyForFocus() = 0;




  virtual bool ShouldShowFocusRing() = 0;




  virtual void SetKeyboardIndicators(UIStateChangeType aShowAccelerators,
                                     UIStateChangeType aShowFocusRings) = 0;





  virtual void PageHidden() = 0;





  virtual nsresult DispatchAsyncHashchange(nsIURI *aOldURI,
                                           nsIURI *aNewURI) = 0;




  virtual nsresult DispatchSyncPopState() = 0;







  virtual void EnableDeviceSensor(uint32_t aType) = 0;







  virtual void DisableDeviceSensor(uint32_t aType) = 0;






  virtual void EnableTimeChangeNotifications() = 0;
  virtual void DisableTimeChangeNotifications() = 0;
# 501 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  virtual void SetHasGamepadEventListener(bool aHasGamepad = true) = 0;
# 515 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  virtual nsresult SetArguments(nsIArray *aArguments) = 0;






  virtual uint32_t GetSerial() = 0;




  uint64_t WindowID() const { return mWindowID; }







  virtual bool DispatchCustomEvent(const nsAString& aEventName) = 0;






  virtual nsresult
  OpenNoNavigate(const nsAString& aUrl, const nsAString& aName,
                 const nsAString& aOptions, nsPIDOMWindowOuter **_retval) = 0;




  virtual void
  FirePopupBlockedEvent(nsIDocument* aDoc,
                        nsIURI* aPopupURI,
                        const nsAString& aPopupWindowName,
                        const nsAString& aPopupWindowFeatures) = 0;


  void MarkUncollectableForCCGeneration(uint32_t aGeneration)
  {
    mMarkedCCGeneration = aGeneration;
  }

  uint32_t GetMarkedCCGeneration()
  {
    return mMarkedCCGeneration;
  }

  virtual nsIDOMScreen* GetScreen() = 0;
  virtual nsIDOMNavigator* GetNavigator() = 0;
  virtual nsIDOMLocation* GetLocation() = 0;
  virtual nsresult GetPrompter(nsIPrompt** aPrompt) = 0;
  virtual nsresult GetControllers(nsIControllers** aControllers) = 0;
  virtual already_AddRefed<nsISelection> GetSelection() = 0;
  virtual already_AddRefed<nsPIDOMWindowOuter> GetOpener() = 0;
  virtual already_AddRefed<nsIDOMWindowCollection> GetFrames() = 0;



  virtual nsresult Open(const nsAString& aUrl, const nsAString& aName,
                        const nsAString& aOptions,
                        nsIDocShellLoadInfo* aLoadInfo,
                        bool aForceNoOpener,
                        nsPIDOMWindowOuter **_retval) = 0;
  virtual nsresult OpenDialog(const nsAString& aUrl, const nsAString& aName,
                              const nsAString& aOptions,
                              nsISupports* aExtraArgument,
                              nsPIDOMWindowOuter** _retval) = 0;

  virtual nsresult GetInnerWidth(int32_t* aWidth) = 0;
  virtual nsresult GetInnerHeight(int32_t* aHeight) = 0;
  virtual already_AddRefed<nsICSSDeclaration>
    GetComputedStyle(mozilla::dom::Element& aElt, const nsAString& aPseudoElt,
                     mozilla::ErrorResult& aError) = 0;
  virtual already_AddRefed<nsIDOMElement> GetFrameElement() = 0;
  virtual already_AddRefed<nsIDOMOfflineResourceList> GetApplicationCache() = 0;
  virtual bool Closed() = 0;
  virtual bool GetFullScreen() = 0;
  virtual nsresult SetFullScreen(bool aFullScreen) = 0;

  virtual nsresult Focus() = 0;
  virtual nsresult Close() = 0;

  virtual nsresult MoveBy(int32_t aXDif, int32_t aYDif) = 0;
  virtual nsresult UpdateCommands(const nsAString& anAction, nsISelection* aSel, int16_t aReason) = 0;

  mozilla::dom::TabGroup* TabGroup();

  mozilla::dom::DocGroup* GetDocGroup() const;

  virtual nsIEventTarget*
  EventTargetFor(mozilla::TaskCategory aCategory) const = 0;

protected:




  explicit nsPIDOMWindow<T>(nsPIDOMWindowOuter *aOuterWindow);

  ~nsPIDOMWindow<T>();

  void SetChromeEventHandlerInternal(mozilla::dom::EventTarget* aChromeEventHandler) {
    mChromeEventHandler = aChromeEventHandler;

    mParentTarget = nullptr;
  }

  virtual void UpdateParentTarget() = 0;




  nsCOMPtr<mozilla::dom::EventTarget> mChromeEventHandler;
  nsCOMPtr<nsIDocument> mDoc;

  nsCOMPtr<nsIURI> mDocumentURI;
  nsCOMPtr<nsIURI> mDocBaseURI;

  nsCOMPtr<mozilla::dom::EventTarget> mParentTarget;


  nsCOMPtr<mozilla::dom::Element> mFrameElement;



  nsIDocShell* mDocShell;


  RefPtr<mozilla::dom::Performance> mPerformance;

  mozilla::UniquePtr<mozilla::dom::TimeoutManager> mTimeoutManager;

  typedef nsRefPtrHashtable<nsStringHashKey,
                            mozilla::dom::ServiceWorkerRegistration>
          ServiceWorkerRegistrationTable;
  ServiceWorkerRegistrationTable mServiceWorkerRegistrationTable;

  uint32_t mModalStateDepth;


  uint32_t mMutationBits;

  bool mIsDocumentLoaded;
  bool mIsHandlingResizeEvent;
  bool mIsInnerWindow;
  bool mMayHavePaintEventListener;
  bool mMayHaveTouchEventListener;
  bool mMayHaveMouseEnterLeaveEventListener;
  bool mMayHavePointerEnterLeaveEventListener;




  bool mInnerObjectsFreed;




  bool mIsModalContentWindow;



  bool mIsActive;




  bool mIsBackground;
# 699 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  SuspendTypes mMediaSuspend;

  bool mAudioMuted;
  float mAudioVolume;

  bool mAudioCaptured;


  bool mDesktopModeViewport;

  bool mIsRootOuterWindow;


  nsPIDOMWindowInner* mInnerWindow;
  nsCOMPtr<nsPIDOMWindowOuter> mOuterWindow;



  nsCOMPtr<nsIContent> mFocusedNode;


  nsTArray<mozilla::dom::AudioContext*> mAudioContexts;


  RefPtr<mozilla::dom::TabGroup> mTabGroup;



  uint64_t mWindowID;



  bool mHasNotifiedGlobalCreated;

  uint32_t mMarkedCCGeneration;



  bool mServiceWorkersTestingEnabled;

  mozilla::dom::LargeAllocStatus mLargeAllocStatus;



  bool mShouldResumeOnFirstActiveMediaComponent;
};
# 756 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
class nsPIDOMWindowInner : public nsPIDOMWindow<mozIDOMWindow>
{
  friend nsGlobalWindow;

public:
  template<typename T, typename U> struct COMTypeInfo;

  static nsPIDOMWindowInner* From(mozIDOMWindow* aFrom) {
    return static_cast<nsPIDOMWindowInner*>(aFrom);
  }



  inline bool IsCurrentInnerWindow() const;




  inline bool HasActiveDocument();

  bool AddAudioContext(mozilla::dom::AudioContext* aAudioContext);
  void RemoveAudioContext(mozilla::dom::AudioContext* aAudioContext);
  void MuteAudioContexts();
  void UnmuteAudioContexts();

  bool GetAudioCaptured() const;
  nsresult SetAudioCapture(bool aCapture);

  already_AddRefed<mozilla::dom::ServiceWorkerRegistration>
    GetServiceWorkerRegistration(const nsAString& aScope);
  void InvalidateServiceWorkerRegistration(const nsAString& aScope);

  mozilla::dom::Performance* GetPerformance();

  bool HasMutationListeners(uint32_t aMutationEventType) const
  {
    if (!mOuterWindow) {
      do { } while(0);

      return false;
    }

    return (mMutationBits & aMutationEventType) != 0;
  }

  void SetMutationListeners(uint32_t aType)
  {
    if (!mOuterWindow) {
      do { } while(0);

      return;
    }

    mMutationBits |= aType;
  }





  bool HasMouseEnterLeaveEventListeners()
  {
    return mMayHaveMouseEnterLeaveEventListener;
  }





  void SetHasMouseEnterLeaveEventListeners()
  {
    mMayHaveMouseEnterLeaveEventListener = true;
  }





  bool HasPointerEnterLeaveEventListeners()
  {
    return mMayHavePointerEnterLeaveEventListener;
  }





  void SetHasPointerEnterLeaveEventListeners()
  {
    mMayHavePointerEnterLeaveEventListener = true;
  }




  bool InnerObjectsFreed() const
  {
    return mInnerObjectsFreed;
  }




  bool IsSecureContext() const;
  bool IsSecureContextIfOpenerIgnored() const;
# 869 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  void Suspend();
  void Resume();
# 879 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
  void Freeze();
  void Thaw();



  void SyncStateFromParentWindow();

  bool IsPlayingAudio();

  mozilla::dom::TimeoutManager& TimeoutManager();

  bool IsRunningTimeout();

protected:
  void CreatePerformanceObjectIfNeeded();
};

template<typename T> struct nsPIDOMWindowInner::COMTypeInfo<nsPIDOMWindowInner, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsPIDOMWindowInner::COMTypeInfo<nsPIDOMWindowInner, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x775dabc9, 0x8f43, 0x4277, { 0x9a, 0xdb, 0xf1, 0x99, 0x0d, 0x77, 0xcf, 0xfb } };



class nsPIDOMWindowOuter : public nsPIDOMWindow<mozIDOMWindowProxy>
{
protected:
  void RefreshMediaElementsVolume();
  void RefreshMediaElementsSuspend(SuspendTypes aSuspend);
  bool IsDisposableSuspend(SuspendTypes aSuspend) const;
  void MaybeNotifyMediaResumedFromBlock(SuspendTypes aSuspend);

public:
  template<typename T, typename U> struct COMTypeInfo;

  static nsPIDOMWindowOuter* From(mozIDOMWindowProxy* aFrom) {
    return static_cast<nsPIDOMWindowOuter*>(aFrom);
  }



  static nsPIDOMWindowOuter* GetFromCurrentInner(nsPIDOMWindowInner* aInner);

  nsPIDOMWindowInner* GetCurrentInnerWindow() const
  {
    return mInnerWindow;
  }

  nsPIDOMWindowInner* EnsureInnerWindow()
  {
    do { } while (0);

    GetDoc();
    return GetCurrentInnerWindow();
  }




  void SetInitialKeyboardIndicators(UIStateChangeType aShowAccelerators,
                                    UIStateChangeType aShowFocusRings);




  mozilla::dom::Element* GetFrameElementInternal() const;
  void SetFrameElementInternal(mozilla::dom::Element* aFrameElement);

  bool IsActive()
  {
    return mIsActive;
  }

  void SetDesktopModeViewport(bool aDesktopModeViewport)
  {
    mDesktopModeViewport = aDesktopModeViewport;
  }
  bool IsDesktopModeViewport() const
  {
    return mDesktopModeViewport;
  }
  bool IsBackground()
  {
    return mIsBackground;
  }


  SuspendTypes GetMediaSuspend() const;
  void SetMediaSuspend(SuspendTypes aSuspend);

  bool GetAudioMuted() const;
  void SetAudioMuted(bool aMuted);

  float GetAudioVolume() const;
  nsresult SetAudioVolume(float aVolume);

  void NotifyCreatedNewMediaComponent();
  void MaybeActiveMediaComponents();

  void SetServiceWorkersTestingEnabled(bool aEnabled);
  bool GetServiceWorkersTestingEnabled();

  float GetDevicePixelRatio(mozilla::dom::CallerType aCallerType);

  void SetLargeAllocStatus(mozilla::dom::LargeAllocStatus aStatus);

  bool IsTopLevelWindow();
  bool HadOriginalOpener() const;
};

template<typename T> struct nsPIDOMWindowOuter::COMTypeInfo<nsPIDOMWindowOuter, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsPIDOMWindowOuter::COMTypeInfo<nsPIDOMWindowOuter, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x769693d4, 0xb009, 0x4fe2, { 0xaf, 0x18, 0x7d, 0xc8, 0xdf, 0x74, 0x96, 0xdf } };


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindowInlines.h" 1




template<class T>
nsPIDOMWindowInner*
nsPIDOMWindow<T>::AsInner()
{
  do { } while (0);
  return reinterpret_cast<nsPIDOMWindowInner*>(this);
}

template<class T>
const nsPIDOMWindowInner*
nsPIDOMWindow<T>::AsInner() const
{
  do { } while (0);
  return reinterpret_cast<const nsPIDOMWindowInner*>(this);
}

template<class T>
nsPIDOMWindowOuter*
nsPIDOMWindow<T>::AsOuter()
{
  do { } while (0);
  return reinterpret_cast<nsPIDOMWindowOuter*>(this);
}

template<class T>
const nsPIDOMWindowOuter*
nsPIDOMWindow<T>::AsOuter() const
{
  do { } while (0);
  return reinterpret_cast<const nsPIDOMWindowOuter*>(this);
}

template <class T>
bool
nsPIDOMWindow<T>::IsLoading() const
{
  if (IsOuterWindow()) {
    auto* win = AsOuter()->GetCurrentInnerWindow();

    if (!win) {
      do { } while(0);

      return false;
    }

    return win->IsLoading();
  }

  if (!mOuterWindow) {
    do { } while(0);

    return false;
  }

  return !mIsDocumentLoaded;
}

template <class T>
bool
nsPIDOMWindow<T>::IsHandlingResizeEvent() const
{
  if (IsOuterWindow()) {
    auto* win = AsOuter()->GetCurrentInnerWindow();

    if (!win) {
      do { } while(0);

      return false;
    }

    return win->IsHandlingResizeEvent();
  }

  if (!mOuterWindow) {
    do { } while(0);

    return false;
  }

  return mIsHandlingResizeEvent;
}

bool
nsPIDOMWindowInner::IsCurrentInnerWindow() const
{
  return mOuterWindow && mOuterWindow->GetCurrentInnerWindow() == AsInner();
}

bool
nsPIDOMWindowInner::HasActiveDocument()
{
  return IsCurrentInnerWindow() ||
    (mOuterWindow &&
     mOuterWindow->GetCurrentInnerWindow() &&
     mOuterWindow->GetCurrentInnerWindow()->GetDoc() == mDoc);
}

template <class T>
nsIDocShell*
nsPIDOMWindow<T>::GetDocShell() const
{
  if (mOuterWindow) {
    return mOuterWindow->GetDocShell();
  }

  return mDocShell;
}

template <class T>
nsIContent*
nsPIDOMWindow<T>::GetFocusedNode() const
{
  if (IsOuterWindow()) {
    return mInnerWindow ? mInnerWindow->GetFocusedNode() : nullptr;
  }

  return mFocusedNode;
}
# 989 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h" 2


PopupControlState
PushPopupControlState(PopupControlState aState, bool aForce);

void
PopPopupControlState(PopupControlState aState);
# 1008 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
class nsAutoPopupStatePusherInternal
{
public:

  explicit nsAutoPopupStatePusherInternal(PopupControlState aState, bool aForce = false)
    : mOldState(::PushPopupControlState(aState, aForce))
  {
  }

  ~nsAutoPopupStatePusherInternal()
  {
    PopPopupControlState(mOldState);
  }
# 1038 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPIDOMWindow.h"
protected:



  PopupControlState mOldState;

private:

  static void* operator new(size_t ) throw() { return nullptr; }
  static void operator delete(void* ) {}
};
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/JSSlots.h" 1
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" 2
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/float.h" 1 3
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h" 2








inline double
NS_round(double aNum)
{
  return aNum >= 0.0 ? floor(aNum + 0.5) : ceil(aNum - 0.5);
}
inline float
NS_roundf(float aNum)
{
  return aNum >= 0.0f ? floorf(aNum + 0.5f) : ceilf(aNum - 0.5f);
}
inline int32_t
NS_lround(double aNum)
{
  return aNum >= 0.0 ? int32_t(aNum + 0.5) : int32_t(aNum - 0.5);
}
# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h"
inline int32_t
NS_lroundf(float aNum)
{
  return aNum >= 0.0f ? int32_t(aNum + 0.5f) : int32_t(aNum - 0.5f);
}






inline double
NS_hypot(double aNum1, double aNum2)
{

  return __builtin_hypot(aNum1, aNum2);





}





inline bool
NS_finite(double aNum)
{
# 111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMathUtils.h"
  return finite(aNum);

}







inline double
NS_floorModulo(double aNum1, double aNum2)
{
  return (aNum1 - aNum2 * floor(aNum1 / aNum2));
}
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefService.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefService.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranch.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranch.h"
class nsIObserver;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranch.h"
class nsIPrefBranch : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    PREF_INVALID = 0,
    PREF_STRING = 32,
    PREF_INT = 64,
    PREF_BOOL = 128
  };


  virtual nsresult GetRoot(char * *aRoot) = 0;


  virtual nsresult GetPrefType(const char * aPrefName, int32_t *_retval) = 0;


  virtual nsresult GetBoolPrefWithDefault(const char * aPrefName, bool aDefaultValue, uint8_t _argc, bool *_retval) = 0;


  virtual nsresult GetBoolPref(const char * aPrefName, bool *_retval) = 0;


  virtual nsresult SetBoolPref(const char * aPrefName, bool aValue) = 0;


  virtual nsresult GetFloatPrefWithDefault(const char * aPrefName, float aDefaultValue, uint8_t _argc, float *_retval) = 0;


  virtual nsresult GetFloatPref(const char * aPrefName, float *_retval) = 0;


  virtual nsresult GetCharPrefWithDefault(const char * aPrefName, const char * aDefaultValue, uint8_t _argc, char * *_retval) = 0;


  virtual nsresult GetCharPref(const char * aPrefName, char * *_retval) = 0;


  virtual nsresult SetCharPref(const char * aPrefName, const char * aValue) = 0;


  virtual nsresult GetStringPref(const char * aPrefName, const nsACString & aDefaultValue, uint8_t _argc, nsACString & _retval) = 0;


  virtual nsresult SetStringPref(const char * aPrefName, const nsACString & aValue) = 0;


  virtual nsresult GetIntPrefWithDefault(const char * aPrefName, int32_t aDefaultValue, uint8_t _argc, int32_t *_retval) = 0;


  virtual nsresult GetIntPref(const char * aPrefName, int32_t *_retval) = 0;


  virtual nsresult SetIntPref(const char * aPrefName, int32_t aValue) = 0;


  virtual nsresult GetComplexValue(const char * aPrefName, const nsIID & aType, void **aValue) = 0;


  virtual nsresult SetComplexValue(const char * aPrefName, const nsIID & aType, nsISupports *aValue) = 0;


  virtual nsresult ClearUserPref(const char * aPrefName) = 0;


  virtual nsresult LockPref(const char * aPrefName) = 0;


  virtual nsresult PrefHasUserValue(const char * aPrefName, bool *_retval) = 0;


  virtual nsresult PrefIsLocked(const char * aPrefName, bool *_retval) = 0;


  virtual nsresult UnlockPref(const char * aPrefName) = 0;


  virtual nsresult DeleteBranch(const char * aStartingAt) = 0;


  virtual nsresult GetChildList(const char * aStartingAt, uint32_t *aCount, char * **aChildArray) = 0;


  virtual nsresult ResetBranch(const char * aStartingAt) = 0;


  virtual nsresult AddObserver(const char * aDomain, nsIObserver *aObserver, bool aHoldWeak) = 0;


  virtual nsresult RemoveObserver(const char * aDomain, nsIObserver *aObserver) = 0;

};

  template<typename T> struct nsIPrefBranch::COMTypeInfo<nsIPrefBranch, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIPrefBranch::COMTypeInfo<nsIPrefBranch, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x55d25e49, 0x793f, 0x4727, { 0xa6, 0x9f, 0xde, 0x8b, 0x15, 0xf4, 0xb9, 0x85 }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefService.h" 2






struct PrefTuple;

class nsIFile;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefService.h"
class nsIPrefService : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult ReadUserPrefs(nsIFile *aFile) = 0;


  virtual nsresult ResetPrefs(void) = 0;


  virtual nsresult ResetUserPrefs(void) = 0;


  virtual nsresult SavePrefFile(nsIFile *aFile) = 0;


  virtual nsresult GetBranch(const char * aPrefRoot, nsIPrefBranch * *_retval) = 0;


  virtual nsresult GetDefaultBranch(const char * aPrefRoot, nsIPrefBranch * *_retval) = 0;


  virtual nsresult GetDirty(bool *aDirty) = 0;

};

  template<typename T> struct nsIPrefService::COMTypeInfo<nsIPrefService, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIPrefService::COMTypeInfo<nsIPrefService, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x1f84fd56, 0x3956, 0x40df, { 0xb8, 0x6a, 0x1e, 0xa0, 0x14, 0x02, 0xee, 0x96 }};
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranchInternal.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranchInternal.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranch2.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranch2.h"
class nsIPrefBranch2 : public nsIPrefBranch {
 public:

  template<typename T, typename U> struct COMTypeInfo;

};

  template<typename T> struct nsIPrefBranch2::COMTypeInfo<nsIPrefBranch2, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIPrefBranch2::COMTypeInfo<nsIPrefBranch2, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x8892016d, 0x07f7, 0x4530, { 0xb5, 0xc1, 0xd7, 0x3d, 0xfc, 0xde, 0x4a, 0x1c }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranchInternal.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPrefBranchInternal.h"
class nsIPrefBranchInternal : public nsIPrefBranch2 {
 public:

  template<typename T, typename U> struct COMTypeInfo;

};

  template<typename T> struct nsIPrefBranchInternal::COMTypeInfo<nsIPrefBranchInternal, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIPrefBranchInternal::COMTypeInfo<nsIPrefBranchInternal, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x355bd1e9, 0x248a, 0x438b, { 0x80, 0x9d, 0xe0, 0xdb, 0x1b, 0x28, 0x78, 0x82 }};
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWeakReference.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWeakReference.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReferenceUtils.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReferenceUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReference.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReference.h"
class nsIWeakReference : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult QueryReferent(const nsIID & uuid, void **result) = 0;

     virtual size_t SizeOfOnlyThis(mozilla::MallocSizeOf aMallocSizeOf) const = 0;
};

  template<typename T> struct nsIWeakReference::COMTypeInfo<nsIWeakReference, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIWeakReference::COMTypeInfo<nsIWeakReference, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x9188bc85, 0xf92e, 0x11d2, { 0x81, 0xef, 0x00, 0x60, 0x08, 0x3a, 0x0b, 0xcf }};
# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReference.h"
class nsISupportsWeakReference : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetWeakReference(nsIWeakReference * *_retval) = 0;

};

  template<typename T> struct nsISupportsWeakReference::COMTypeInfo<nsISupportsWeakReference, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISupportsWeakReference::COMTypeInfo<nsISupportsWeakReference, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x9188bc86, 0xf92e, 0x11d2, { 0x81, 0xef, 0x00, 0x60, 0x08, 0x3a, 0x0b, 0xcf }};
# 176 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReference.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReferenceUtils.h" 1
# 177 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReference.h" 2
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReferenceUtils.h" 2

typedef nsCOMPtr<nsIWeakReference> nsWeakPtr;







template<class T, class DestinationType>
inline nsresult
CallQueryReferent(T* aSource, DestinationType** aDestination)
{
  do { } while(0);
  do { } while(0);

  return aSource->QueryReferent((DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                                reinterpret_cast<void**>(aDestination));
}


class nsQueryReferent final : public nsCOMPtr_helper
{
public:
  nsQueryReferent(nsIWeakReference* aWeakPtr, nsresult* aError)
    : mWeakPtr(aWeakPtr)
    , mErrorPtr(aError)
  {
  }

  virtual nsresult operator()(const nsIID& aIID, void**) const
    override;

private:
  nsIWeakReference* mWeakPtr;
  nsresult* mErrorPtr;
};

inline const nsQueryReferent
do_QueryReferent(nsIWeakReference* aRawPtr, nsresult* aError = 0)
{
  return nsQueryReferent(aRawPtr, aError);
}





extern nsIWeakReference* NS_GetWeakReference(nsISupports*,
                                             nsresult* aResult = 0);
# 70 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWeakReferenceUtils.h"
inline already_AddRefed<nsIWeakReference>
do_GetWeakReference(nsISupports* aRawPtr, nsresult* aError = 0)
{
  return dont_AddRef(NS_GetWeakReference(aRawPtr, aError));
}

inline void
do_GetWeakReference(nsIWeakReference* aRawPtr, nsresult* aError = 0)
{



}

template<class T>
inline void
do_GetWeakReference(already_AddRefed<T>&)
{



}

template<class T>
inline void
do_GetWeakReference(already_AddRefed<T>&, nsresult*)
{



}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWeakReference.h" 2

class nsWeakReference;

class nsSupportsWeakReference : public nsISupportsWeakReference
{
public:
  nsSupportsWeakReference() : mProxy(0) {}

  virtual nsresult GetWeakReference(nsIWeakReference * *_retval) override;

protected:
  inline ~nsSupportsWeakReference();

private:
  friend class nsWeakReference;



  void NoticeProxyDestruction() { mProxy = nullptr; }

  nsWeakReference* mProxy;

protected:

  void ClearWeakReferences();
  bool HasWeakReferences() const { return !!mProxy; }
};

inline
nsSupportsWeakReference::~nsSupportsWeakReference()
{
  ClearWeakReferences();
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h" 2



class nsIFile;
class nsAdoptingString;
class nsAdoptingCString;


typedef void (*PrefChangedFunc)(const char *, void *);
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h"
namespace mozilla {

namespace dom {
class PrefSetting;
}

class Preferences final : public nsIPrefService,
                          public nsIObserver,
                          public nsIPrefBranchInternal,
                          public nsSupportsWeakReference
{
public:
  typedef mozilla::dom::PrefSetting PrefSetting;

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:
  virtual nsresult ReadUserPrefs(nsIFile *aFile) override; virtual nsresult ResetPrefs(void) override; virtual nsresult ResetUserPrefs(void) override; virtual nsresult SavePrefFile(nsIFile *aFile) override; virtual nsresult GetBranch(const char * aPrefRoot, nsIPrefBranch * *_retval) override; virtual nsresult GetDefaultBranch(const char * aPrefRoot, nsIPrefBranch * *_retval) override; virtual nsresult GetDirty(bool *aDirty) override;
  virtual nsresult GetRoot(char * *aRoot) override { return sRootBranch-> GetRoot(aRoot); } virtual nsresult GetPrefType(const char * aPrefName, int32_t *_retval) override { return sRootBranch-> GetPrefType(aPrefName, _retval); } virtual nsresult GetBoolPrefWithDefault(const char * aPrefName, bool aDefaultValue, uint8_t _argc, bool *_retval) override { return sRootBranch-> GetBoolPrefWithDefault(aPrefName, aDefaultValue, _argc, _retval); } virtual nsresult GetBoolPref(const char * aPrefName, bool *_retval) override { return sRootBranch-> GetBoolPref(aPrefName, _retval); } virtual nsresult SetBoolPref(const char * aPrefName, bool aValue) override { return sRootBranch-> SetBoolPref(aPrefName, aValue); } virtual nsresult GetFloatPrefWithDefault(const char * aPrefName, float aDefaultValue, uint8_t _argc, float *_retval) override { return sRootBranch-> GetFloatPrefWithDefault(aPrefName, aDefaultValue, _argc, _retval); } virtual nsresult GetFloatPref(const char * aPrefName, float *_retval) override { return sRootBranch-> GetFloatPref(aPrefName, _retval); } virtual nsresult GetCharPrefWithDefault(const char * aPrefName, const char * aDefaultValue, uint8_t _argc, char * *_retval) override { return sRootBranch-> GetCharPrefWithDefault(aPrefName, aDefaultValue, _argc, _retval); } virtual nsresult GetCharPref(const char * aPrefName, char * *_retval) override { return sRootBranch-> GetCharPref(aPrefName, _retval); } virtual nsresult SetCharPref(const char * aPrefName, const char * aValue) override { return sRootBranch-> SetCharPref(aPrefName, aValue); } virtual nsresult GetStringPref(const char * aPrefName, const nsACString & aDefaultValue, uint8_t _argc, nsACString & _retval) override { return sRootBranch-> GetStringPref(aPrefName, aDefaultValue, _argc, _retval); } virtual nsresult SetStringPref(const char * aPrefName, const nsACString & aValue) override { return sRootBranch-> SetStringPref(aPrefName, aValue); } virtual nsresult GetIntPrefWithDefault(const char * aPrefName, int32_t aDefaultValue, uint8_t _argc, int32_t *_retval) override { return sRootBranch-> GetIntPrefWithDefault(aPrefName, aDefaultValue, _argc, _retval); } virtual nsresult GetIntPref(const char * aPrefName, int32_t *_retval) override { return sRootBranch-> GetIntPref(aPrefName, _retval); } virtual nsresult SetIntPref(const char * aPrefName, int32_t aValue) override { return sRootBranch-> SetIntPref(aPrefName, aValue); } virtual nsresult GetComplexValue(const char * aPrefName, const nsIID & aType, void **aValue) override { return sRootBranch-> GetComplexValue(aPrefName, aType, aValue); } virtual nsresult SetComplexValue(const char * aPrefName, const nsIID & aType, nsISupports *aValue) override { return sRootBranch-> SetComplexValue(aPrefName, aType, aValue); } virtual nsresult ClearUserPref(const char * aPrefName) override { return sRootBranch-> ClearUserPref(aPrefName); } virtual nsresult LockPref(const char * aPrefName) override { return sRootBranch-> LockPref(aPrefName); } virtual nsresult PrefHasUserValue(const char * aPrefName, bool *_retval) override { return sRootBranch-> PrefHasUserValue(aPrefName, _retval); } virtual nsresult PrefIsLocked(const char * aPrefName, bool *_retval) override { return sRootBranch-> PrefIsLocked(aPrefName, _retval); } virtual nsresult UnlockPref(const char * aPrefName) override { return sRootBranch-> UnlockPref(aPrefName); } virtual nsresult DeleteBranch(const char * aStartingAt) override { return sRootBranch-> DeleteBranch(aStartingAt); } virtual nsresult GetChildList(const char * aStartingAt, uint32_t *aCount, char * **aChildArray) override { return sRootBranch-> GetChildList(aStartingAt, aCount, aChildArray); } virtual nsresult ResetBranch(const char * aStartingAt) override { return sRootBranch-> ResetBranch(aStartingAt); } virtual nsresult AddObserver(const char * aDomain, nsIObserver *aObserver, bool aHoldWeak) override { return sRootBranch-> AddObserver(aDomain, aObserver, aHoldWeak); } virtual nsresult RemoveObserver(const char * aDomain, nsIObserver *aObserver) override { return sRootBranch-> RemoveObserver(aDomain, aObserver); }
  virtual nsresult Observe(nsISupports *aSubject, const char * aTopic, const char16_t * aData) override;

  Preferences();

  nsresult Init();




  static bool IsServiceAvailable();




  static nsresult ResetAndReadUserPrefs();




  static Preferences* GetInstanceForService();




  static void Shutdown();





  static nsIPrefService* GetService()
  {
    do { if ((__builtin_expect(!!(!(InitStaticMembers())), 0))) { do { } while(0); return nullptr; } } while(0);
    return sPreferences;
  }





  static nsIPrefBranch* GetRootBranch()
  {
    do { if ((__builtin_expect(!!(!(InitStaticMembers())), 0))) { do { } while(0); return nullptr; } } while(0);
    return sRootBranch;
  }





  static nsIPrefBranch* GetDefaultRootBranch()
  {
    do { if ((__builtin_expect(!!(!(InitStaticMembers())), 0))) { do { } while(0); return nullptr; } } while(0);
    return sDefaultRootBranch;
  }





  static bool GetBool(const char* aPref, bool aDefault = false)
  {
    bool result = aDefault;
    GetBool(aPref, &result);
    return result;
  }

  static int32_t GetInt(const char* aPref, int32_t aDefault = 0)
  {
    int32_t result = aDefault;
    GetInt(aPref, &result);
    return result;
  }

  static uint32_t GetUint(const char* aPref, uint32_t aDefault = 0)
  {
    uint32_t result = aDefault;
    GetUint(aPref, &result);
    return result;
  }

  static float GetFloat(const char* aPref, float aDefault = 0)
  {
    float result = aDefault;
    GetFloat(aPref, &result);
    return result;
  }
# 172 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h"
  static nsAdoptingCString GetCString(const char* aPref);
  static nsAdoptingString GetString(const char* aPref);
  static nsAdoptingCString GetLocalizedCString(const char* aPref);
  static nsAdoptingString GetLocalizedString(const char* aPref);
# 185 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h"
  static nsresult GetBool(const char* aPref, bool* aResult);
  static nsresult GetInt(const char* aPref, int32_t* aResult);
  static nsresult GetFloat(const char* aPref, float* aResult);
  static nsresult GetUint(const char* aPref, uint32_t* aResult)
  {
    int32_t result;
    nsresult rv = GetInt(aPref, &result);
    if (((bool)(__builtin_expect(!!(!NS_FAILED_impl(rv)), 1)))) {
      *aResult = static_cast<uint32_t>(result);
    }
    return rv;
  }
# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h"
  static nsresult GetCString(const char* aPref, nsACString* aResult);
  static nsresult GetString(const char* aPref, nsAString* aResult);
  static nsresult GetLocalizedCString(const char* aPref, nsACString* aResult);
  static nsresult GetLocalizedString(const char* aPref, nsAString* aResult);

  static nsresult GetComplex(const char* aPref, const nsIID &aType,
                             void** aResult);




  static nsresult SetBool(const char* aPref, bool aValue);
  static nsresult SetInt(const char* aPref, int32_t aValue);
  static nsresult SetUint(const char* aPref, uint32_t aValue)
  {
    return SetInt(aPref, static_cast<int32_t>(aValue));
  }
  static nsresult SetFloat(const char* aPref, float aValue);
  static nsresult SetCString(const char* aPref, const char* aValue);
  static nsresult SetCString(const char* aPref, const nsACString &aValue);
  static nsresult SetString(const char* aPref, const char16ptr_t aValue);
  static nsresult SetString(const char* aPref, const nsAString &aValue);

  static nsresult SetComplex(const char* aPref, const nsIID &aType,
                             nsISupports* aValue);




  static nsresult ClearUser(const char* aPref);




  static bool HasUserValue(const char* aPref);




  static int32_t GetType(const char* aPref);







  static nsresult AddStrongObserver(nsIObserver* aObserver, const char* aPref);
  static nsresult AddWeakObserver(nsIObserver* aObserver, const char* aPref);
  static nsresult RemoveObserver(nsIObserver* aObserver, const char* aPref);





  static nsresult AddStrongObservers(nsIObserver* aObserver,
                                     const char** aPrefs);
  static nsresult AddWeakObservers(nsIObserver* aObserver,
                                   const char** aPrefs);
  static nsresult RemoveObservers(nsIObserver* aObserver,
                                  const char** aPrefs);




  static nsresult RegisterCallback(PrefChangedFunc aCallback,
                                   const char* aPref,
                                   void* aClosure = nullptr)
  {
    return RegisterCallback(aCallback, aPref, aClosure, ExactMatch);
  }
  static nsresult UnregisterCallback(PrefChangedFunc aCallback,
                                     const char* aPref,
                                     void* aClosure = nullptr)
  {
    return UnregisterCallback(aCallback, aPref, aClosure, ExactMatch);
  }


  static nsresult RegisterCallbackAndCall(PrefChangedFunc aCallback,
                                          const char* aPref,
                                          void* aClosure = nullptr)
  {
    return RegisterCallbackAndCall(aCallback, aPref, aClosure, ExactMatch);
  }





  static nsresult RegisterPrefixCallback(PrefChangedFunc aCallback,
                                         const char* aPref,
                                         void* aClosure = nullptr)
  {
    return RegisterCallback(aCallback, aPref, aClosure, PrefixMatch);
  }





  static nsresult RegisterPrefixCallbackAndCall(PrefChangedFunc aCallback,
                                                const char* aPref,
                                                void* aClosure = nullptr)
  {
    return RegisterCallbackAndCall(aCallback, aPref, aClosure, PrefixMatch);
  }





  static nsresult UnregisterPrefixCallback(PrefChangedFunc aCallback,
                                           const char* aPref,
                                           void* aClosure = nullptr)
  {
    return UnregisterCallback(aCallback, aPref, aClosure, PrefixMatch);
  }







  static nsresult AddBoolVarCache(bool* aVariable,
                                  const char* aPref,
                                  bool aDefault = false);
  static nsresult AddIntVarCache(int32_t* aVariable,
                                 const char* aPref,
                                 int32_t aDefault = 0);
  static nsresult AddUintVarCache(uint32_t* aVariable,
                                  const char* aPref,
                                  uint32_t aDefault = 0);
  template <MemoryOrdering Order>
  static nsresult AddAtomicUintVarCache(Atomic<uint32_t, Order>* aVariable,
                                        const char* aPref,
                                        uint32_t aDefault = 0);
  static nsresult AddFloatVarCache(float* aVariable,
                                   const char* aPref,
                                   float aDefault = 0.0f);







  static nsresult GetDefaultBool(const char* aPref, bool* aResult);
  static nsresult GetDefaultInt(const char* aPref, int32_t* aResult);
  static nsresult GetDefaultUint(const char* aPref, uint32_t* aResult)
  {
    return GetDefaultInt(aPref, reinterpret_cast<int32_t*>(aResult));
  }







  static bool GetDefaultBool(const char* aPref, bool aFailedResult)
  {
    bool result;
    return ((bool)(__builtin_expect(!!(!NS_FAILED_impl(GetDefaultBool(aPref, &result))), 1))) ? result :
                                                          aFailedResult;
  }
  static int32_t GetDefaultInt(const char* aPref, int32_t aFailedResult)
  {
    int32_t result;
    return ((bool)(__builtin_expect(!!(!NS_FAILED_impl(GetDefaultInt(aPref, &result))), 1))) ? result : aFailedResult;
  }
  static uint32_t GetDefaultUint(const char* aPref, uint32_t aFailedResult)
  {
   return static_cast<uint32_t>(
     GetDefaultInt(aPref, static_cast<int32_t>(aFailedResult)));
  }
# 391 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Preferences.h"
  static nsAdoptingString GetDefaultString(const char* aPref);
  static nsAdoptingCString GetDefaultCString(const char* aPref);
  static nsAdoptingString GetDefaultLocalizedString(const char* aPref);
  static nsAdoptingCString GetDefaultLocalizedCString(const char* aPref);

  static nsresult GetDefaultCString(const char* aPref, nsACString* aResult);
  static nsresult GetDefaultString(const char* aPref, nsAString* aResult);
  static nsresult GetDefaultLocalizedCString(const char* aPref,
                                             nsACString* aResult);
  static nsresult GetDefaultLocalizedString(const char* aPref,
                                            nsAString* aResult);

  static nsresult GetDefaultComplex(const char* aPref, const nsIID &aType,
                                    void** aResult);




  static int32_t GetDefaultType(const char* aPref);


  static void GetPreferences(InfallibleTArray<PrefSetting>* aPrefs);
  static void GetPreference(PrefSetting* aPref);
  static void SetPreference(const PrefSetting& aPref);

  static void SetInitPreferences(nsTArray<PrefSetting>* aPrefs);






  static int64_t SizeOfIncludingThisAndOtherStuff(mozilla::MallocSizeOf aMallocSizeOf);

  static void DirtyCallback();

protected:
  virtual ~Preferences();

  nsresult NotifyServiceObservers(const char *aSubject);






  nsresult UseDefaultPrefFile();
  nsresult UseUserPrefFile();
  nsresult ReadAndOwnUserPrefFile(nsIFile *aFile);
  nsresult ReadAndOwnSharedUserPrefFile(nsIFile *aFile);
  nsresult SavePrefFileInternal(nsIFile* aFile);
  nsresult WritePrefFile(nsIFile* aFile);
  nsresult MakeBackupPrefFile(nsIFile *aFile);





public:

  enum MatchKind {
    PrefixMatch,
    ExactMatch,
  };

protected:
  static nsresult RegisterCallback(PrefChangedFunc aCallback,
                                   const char* aPref,
                                   void* aClosure,
                                   MatchKind aMatchKind);
  static nsresult UnregisterCallback(PrefChangedFunc aCallback,
                                     const char* aPref,
                                     void* aClosure,
                                     MatchKind aMatchKind);
  static nsresult RegisterCallbackAndCall(PrefChangedFunc aCallback,
                                          const char* aPref,
                                          void* aClosure,
                                          MatchKind aMatchKind);

private:
  nsCOMPtr<nsIFile> mCurrentFile;
  bool mDirty;

  static Preferences* sPreferences;
  static nsIPrefBranch* sRootBranch;
  static nsIPrefBranch* sDefaultRootBranch;
  static bool sShutdown;




  static bool InitStaticMembers();
};

}
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h" 2

class nsGlobalWindow;
class nsIPrincipal;
class nsScriptNameSpaceManager;
class nsIMemoryReporterCallback;

namespace mozilla {
namespace dom {
class Exception;
}
}

typedef void (* xpcGCCallback)(JSGCStatus status);

namespace xpc {

class Scriptability {
public:
    explicit Scriptability(JSCompartment* c);
    bool Allowed();
    bool IsImmuneToScriptPolicy();

    void Block();
    void Unblock();
    void SetDocShellAllowsScript(bool aAllowed);

    static Scriptability& Get(JSObject* aScope);

private:




    uint32_t mScriptBlocks;



    bool mDocShellAllowsScript;



    bool mImmuneToScriptPolicy;



    bool mScriptBlockedByPolicy;
};

JSObject*
TransplantObject(JSContext* cx, JS::HandleObject origobj, JS::HandleObject target);

bool IsContentXBLScope(JSCompartment* compartment);
bool IsInContentXBLScope(JSObject* obj);
# 96 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h"
JSObject*
GetXBLScope(JSContext* cx, JSObject* contentScope);

inline JSObject*
GetXBLScopeOrGlobal(JSContext* cx, JSObject* obj)
{
    if (IsInContentXBLScope(obj))
        return js::GetGlobalForObjectCrossCompartment(obj);
    return GetXBLScope(cx, obj);
}





JSObject*
GetScopeForXBLExecution(JSContext* cx, JS::HandleObject obj, JSAddonId* addonId);



bool
AllowContentXBLScope(JSCompartment* c);





bool
UseContentXBLScope(JSCompartment* c);



void
ClearContentXBLScope(JSObject* global);

bool
IsInAddonScope(JSObject* obj);

JSObject*
GetAddonScope(JSContext* cx, JS::HandleObject contentScope, JSAddonId* addonId);

bool
IsSandboxPrototypeProxy(JSObject* obj);

bool
IsReflector(JSObject* obj);

bool
IsXrayWrapper(JSObject* obj);






JSObject*
XrayAwareCalleeGlobal(JSObject* fun);
# 165 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h"
bool
XrayAwareCalleeGlobalForSpecializedGetters(JSContext* cx,
                                           JS::Handle<JSObject*> thisObj,
                                           JS::MutableHandle<JSObject*> global);


void
TraceXPCGlobal(JSTracer* trc, JSObject* obj);

}

namespace JS {

struct RuntimeStats;

}
# 193 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h"
inline JSObject*
xpc_FastGetCachedWrapper(JSContext* cx, nsWrapperCache* cache, JS::MutableHandleValue vp)
{
    if (cache) {
        JSObject* wrapper = cache->GetWrapper();
        if (wrapper &&
            js::GetObjectCompartment(wrapper) == js::GetContextCompartment(cx))
        {
            vp.setObject(*wrapper);
            return wrapper;
        }
    }

    return nullptr;
}



extern void
xpc_MarkInCCGeneration(nsISupports* aVariant, uint32_t aGeneration);


extern void
xpc_TryUnmarkWrappedGrayObject(nsISupports* aWrappedJS);

extern void
xpc_UnmarkSkippableJSHolders();


class XPCStringConvert
{
public:




    static bool ReadableToJSVal(JSContext* cx, const nsAString& readable,
                                nsStringBuffer** sharedBuffer,
                                JS::MutableHandleValue vp);


    static __attribute__((always_inline)) inline bool
    StringBufferToJSVal(JSContext* cx, nsStringBuffer* buf, uint32_t length,
                        JS::MutableHandleValue rval, bool* sharedBuffer)
    {
        JSString* str = JS_NewMaybeExternalString(cx,
                                                  static_cast<char16_t*>(buf->Data()),
                                                  length, &sDOMStringFinalizer, sharedBuffer);
        if (!str) {
            return false;
        }
        rval.setString(str);
        return true;
    }

    static __attribute__((always_inline)) inline bool IsLiteral(JSString* str)
    {
        return JS_IsExternalString(str) &&
               JS_GetExternalStringFinalizer(str) == &sLiteralFinalizer;
    }

    static __attribute__((always_inline)) inline bool IsDOMString(JSString* str)
    {
        return JS_IsExternalString(str) &&
               JS_GetExternalStringFinalizer(str) == &sDOMStringFinalizer;
    }

private:
    static const JSStringFinalizer sLiteralFinalizer, sDOMStringFinalizer;

    static void FinalizeLiteral(JS::Zone* zone, const JSStringFinalizer* fin, char16_t* chars);

    static void FinalizeDOMString(JS::Zone* zone, const JSStringFinalizer* fin, char16_t* chars);

    XPCStringConvert() = delete;
};

class nsIAddonInterposition;

namespace xpc {


bool Base64Encode(JSContext* cx, JS::HandleValue val, JS::MutableHandleValue out);
bool Base64Decode(JSContext* cx, JS::HandleValue val, JS::MutableHandleValue out);






bool NonVoidStringToJsval(JSContext* cx, nsAString& str, JS::MutableHandleValue rval);
inline bool StringToJsval(JSContext* cx, nsAString& str, JS::MutableHandleValue rval)
{

    if (str.IsVoid()) {
        rval.setNull();
        return true;
    }
    return NonVoidStringToJsval(cx, str, rval);
}

inline bool
NonVoidStringToJsval(JSContext* cx, const nsAString& str, JS::MutableHandleValue rval)
{
    nsString mutableCopy;
    if (!mutableCopy.Assign(str, mozilla::fallible)) {
        JS_ReportOutOfMemory(cx);
        return false;
    }
    return NonVoidStringToJsval(cx, mutableCopy, rval);
}

inline bool
StringToJsval(JSContext* cx, const nsAString& str, JS::MutableHandleValue rval)
{
    nsString mutableCopy;
    if (!mutableCopy.Assign(str, mozilla::fallible)) {
        JS_ReportOutOfMemory(cx);
        return false;
    }
    return StringToJsval(cx, mutableCopy, rval);
}




inline
bool NonVoidStringToJsval(JSContext* cx, mozilla::dom::DOMString& str,
                          JS::MutableHandleValue rval)
{
    if (!str.HasStringBuffer()) {

        return NonVoidStringToJsval(cx, str.AsAString(), rval);
    }

    uint32_t length = str.StringBufferLength();
    if (length == 0) {
        rval.set(JS_GetEmptyStringValue(cx));
        return true;
    }

    nsStringBuffer* buf = str.StringBuffer();
    bool shared;
    if (!XPCStringConvert::StringBufferToJSVal(cx, buf, length, rval,
                                               &shared)) {
        return false;
    }
    if (shared) {

        str.RelinquishBufferOwnership();
    }
    return true;
}

__attribute__((always_inline)) inline
bool StringToJsval(JSContext* cx, mozilla::dom::DOMString& str,
                   JS::MutableHandleValue rval)
{
    if (str.IsNull()) {
        rval.setNull();
        return true;
    }
    return NonVoidStringToJsval(cx, str, rval);
}

nsIPrincipal* GetCompartmentPrincipal(JSCompartment* compartment);

void NukeAllWrappersForCompartment(JSContext* cx, JSCompartment* compartment,
                                   js::NukeReferencesToWindow nukeReferencesToWindow = js::NukeWindowReferences);

void SetLocationForGlobal(JSObject* global, const nsACString& location);
void SetLocationForGlobal(JSObject* global, nsIURI* locationURI);



class ZoneStatsExtras {
public:
    ZoneStatsExtras() {}

    nsCString pathPrefix;

private:
    ZoneStatsExtras(const ZoneStatsExtras& other) = delete;
    ZoneStatsExtras& operator=(const ZoneStatsExtras& other) = delete;
};



class CompartmentStatsExtras {
public:
    CompartmentStatsExtras() {}

    nsCString jsPathPrefix;
    nsCString domPathPrefix;
    nsCOMPtr<nsIURI> location;

private:
    CompartmentStatsExtras(const CompartmentStatsExtras& other) = delete;
    CompartmentStatsExtras& operator=(const CompartmentStatsExtras& other) = delete;
};





void
ReportJSRuntimeExplicitTreeStats(const JS::RuntimeStats& rtStats,
                                 const nsACString& rtPath,
                                 nsIMemoryReporterCallback* handleReport,
                                 nsISupports* data,
                                 bool anonymize,
                                 size_t* rtTotal = nullptr);




bool
Throw(JSContext* cx, nsresult rv);





nsISupports*
UnwrapReflectorToISupports(JSObject* reflector);
# 426 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h"
JSObject*
UnprivilegedJunkScope();

JSObject*
PrivilegedJunkScope();






JSObject*
CompilationScope();




nsIGlobalObject*
NativeGlobal(JSObject* aObj);





nsGlobalWindow*
WindowOrNull(JSObject* aObj);





nsGlobalWindow*
WindowGlobalOrNull(JSObject* aObj);






nsGlobalWindow*
AddonWindowOrNull(JSObject* aObj);





nsGlobalWindow*
CurrentWindowOrNull(JSContext* cx);

void
SimulateActivityCallback(bool aActive);



bool
ShouldDiscardSystemSource();

bool
SharedMemoryEnabled();

bool
SetAddonInterposition(const nsACString& addonId, nsIAddonInterposition* interposition);

bool
AllowCPOWsInAddon(const nsACString& addonId, bool allow);

bool
ExtraWarningsForSystemJS();

class ErrorBase {
  public:
    nsString mErrorMsg;
    nsString mFileName;
    uint32_t mLineNumber;
    uint32_t mColumn;

    ErrorBase() : mLineNumber(0)
                , mColumn(0)
    {}

    void Init(JSErrorBase* aReport);

    void AppendErrorDetailsTo(nsCString& error);
};

class ErrorNote : public ErrorBase {
  public:
    void Init(JSErrorNotes::Note* aNote);




    static void ErrorNoteToMessageString(JSErrorNotes::Note* aNote,
                                         nsAString& aString);


    void LogToStderr();
};

class ErrorReport : public ErrorBase {
  public:
    public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<ErrorReport>::value, "Reference-counted class " "ErrorReport" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:;

    nsTArray<ErrorNote> mNotes;

    nsCString mCategory;
    nsString mSourceLine;
    nsString mErrorMsgName;
    uint64_t mWindowID;
    uint32_t mFlags;
    bool mIsMuted;

    ErrorReport() : mWindowID(0)
                  , mFlags(0)
                  , mIsMuted(false)
    {}

    void Init(JSErrorReport* aReport, const char* aToStringResult,
              bool aIsChrome, uint64_t aWindowID);
    void Init(JSContext* aCx, mozilla::dom::Exception* aException,
              bool aIsChrome, uint64_t aWindowID);



    void LogToConsole();



    void LogToConsoleWithStack(JS::HandleObject aStack);




    static void ErrorReportToMessageString(JSErrorReport* aReport,
                                           nsAString& aString);


    void LogToStderr();

  private:
    ~ErrorReport() {}
};

void
DispatchScriptErrorEvent(nsPIDOMWindowInner* win, JS::RootingContext* rootingCx,
                         xpc::ErrorReport* xpcReport, JS::Handle<JS::Value> exception);
# 584 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcpublic.h"
JSObject*
FindExceptionStackForConsoleReport(nsPIDOMWindowInner* win,
                                   JS::HandleValue exceptionValue);




extern void
GetCurrentCompartmentName(JSContext*, nsCString& name);

void AddGCCallback(xpcGCCallback cb);
void RemoveGCCallback(xpcGCCallback cb);

inline bool
AreNonLocalConnectionsDisabled()
{
    static int disabledForTest = -1;
    if (disabledForTest == -1) {
        char *s = getenv("MOZ_DISABLE_NONLOCAL_CONNECTIONS");
        if (s) {
            disabledForTest = *s != '0';
        } else {
            disabledForTest = 0;
        }
    }
    return disabledForTest;
}

inline bool
IsInAutomation()
{
    const char* prefName =
      "security.turn_off_all_security_so_that_viruses_can_take_over_this_computer";
    return mozilla::Preferences::GetBool(prefName) &&
        AreNonLocalConnectionsDisabled();
}

}

namespace mozilla {
namespace dom {





bool IsChromeOrXBL(JSContext* cx, JSObject* );




bool ThreadSafeIsChromeOrXBL(JSContext* cx, JSObject* obj);

}
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h" 2

class nsICycleCollectorListener;
class nsScriptNameSpaceManager;

namespace JS {
class AutoValueVector;
}

namespace mozilla {
template <class> class Maybe;
struct CycleCollectorResults;
}







class nsJSContext : public nsIScriptContext
{
public:
  nsJSContext(bool aGCOnDestruction, nsIScriptGlobalObject* aGlobalObject);

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "nsJSContext"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<nsJSContext>(p)->DeleteCycleCollectable(); } static nsJSContext* Downcast(nsISupports* s) { return static_cast<nsJSContext*>(static_cast<nsIScriptContext*>(s)); } static nsISupports* Upcast(nsJSContext *p) { return static_cast<nsISupports*>(static_cast<nsIScriptContext*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &nsJSContext::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;


  virtual nsIScriptGlobalObject *GetGlobalObject() override;
  inline nsIScriptGlobalObject *GetGlobalObjectRef() { return mGlobalObjectRef; }

  virtual nsresult InitContext() override;
  virtual bool IsContextInitialized() override;

  virtual nsresult SetProperty(JS::Handle<JSObject*> aTarget, const char* aPropName, nsISupports* aVal) override;

  virtual bool GetProcessingScriptTag() override;
  virtual void SetProcessingScriptTag(bool aResult) override;

  virtual nsresult InitClasses(JS::Handle<JSObject*> aGlobalObj) override;

  virtual void WillInitializeContext() override;
  virtual void DidInitializeContext() override;

  virtual void SetWindowProxy(JS::Handle<JSObject*> aWindowProxy) override;
  virtual JSObject* GetWindowProxy() override;

  static void LoadStart();
  static void LoadEnd();

  enum IsShrinking {
    ShrinkingGC,
    NonShrinkingGC
  };

  enum IsIncremental {
    IncrementalGC,
    NonIncrementalGC
  };


  void EnsureStatics();

  static void GarbageCollectNow(JS::gcreason::Reason reason,
                                IsIncremental aIncremental = NonIncrementalGC,
                                IsShrinking aShrinking = NonShrinkingGC,
                                int64_t aSliceMillis = 0);



  static void CycleCollectNow(nsICycleCollectorListener *aListener = nullptr,
                              int32_t aExtraForgetSkippableCalls = 0);


  static void RunCycleCollectorSlice();


  static void RunCycleCollectorWorkSlice(int64_t aWorkBudget);

  static void BeginCycleCollectionCallback();
  static void EndCycleCollectionCallback(mozilla::CycleCollectorResults &aResults);


  static uint32_t GetMaxCCSliceTimeSinceClear();
  static void ClearMaxCCSliceTime();

  static void RunNextCollectorTimer();


  static void PokeGC(JS::gcreason::Reason aReason, JSObject* aObj, int aDelay = 0);
  static void KillGCTimer();

  static void PokeShrinkingGC();
  static void KillShrinkingGCTimer();

  static void MaybePokeCC();
  static void KillCCTimer();
  static void KillICCTimer();
  static void KillFullGCTimer();
  static void KillInterSliceGCTimer();


  static void LikelyShortLivingObjectCreated();

  static uint32_t CleanupsSinceLastGC();

  nsIScriptGlobalObject* GetCachedGlobalObject()
  {


    JSObject* global = GetWindowProxy();
    return global ? mGlobalObjectRef.get() : nullptr;
  }

  static void NotifyDidPaint();
protected:
  virtual ~nsJSContext();


  nsresult ConvertSupportsTojsvals(nsISupports *aArgs,
                                   JS::Handle<JSObject*> aScope,
                                   JS::AutoValueVector &aArgsOut);

  nsresult AddSupportsPrimitiveTojsvals(nsISupports *aArg, JS::Value *aArgv);

private:
  void Destroy();

  JS::Heap<JSObject*> mWindowProxy;

  bool mIsInitialized;
  bool mGCOnDestruction;
  bool mProcessingScriptTag;

  PRTime mModalStateTime;
  uint32_t mModalStateDepth;



  nsCOMPtr<nsIScriptGlobalObject> mGlobalObjectRef;

  static bool DOMOperationCallback(JSContext *cx);
};

namespace mozilla {
namespace dom {

void StartupJSEnvironment();
void ShutdownJSEnvironment();


nsScriptNameSpaceManager* GetNameSpaceManager();


nsScriptNameSpaceManager* PeekNameSpaceManager();


class AsyncErrorReporter final : public mozilla::Runnable
{
public:

  explicit AsyncErrorReporter(xpc::ErrorReport* aReport)
    : mReport(aReport)
  {}

  virtual nsresult Run() override
  {
    mReport->LogToConsole();
    return NS_OK;
  }

protected:
  RefPtr<xpc::ErrorReport> mReport;
};

}
}
# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSEnvironment.h"
class nsIJSArgArray : public nsIArray
{
public:
  template<typename T, typename U> struct COMTypeInfo;



  virtual nsresult GetArgs(uint32_t *argc, void **argv) = 0;
};

template<typename T> struct nsIJSArgArray::COMTypeInfo<nsIJSArgArray, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIJSArgArray::COMTypeInfo<nsIJSArgArray, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xb6acdac8, 0xf5c6, 0x432c, { 0xa8, 0x6e, 0x33, 0xee, 0xb1, 0xb0, 0xcd, 0xdc } };
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h" 2




namespace mozilla {
namespace dom {





class CallbackObject : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = true) : nsXPCOMCycleCollectionParticipant(true) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "CallbackObject"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<CallbackObject>(p)->DeleteCycleCollectable(); } static CallbackObject* Downcast(nsISupports* s) { return static_cast<CallbackObject*>(static_cast<CallbackObject*>(s)); } static nsISupports* Upcast(CallbackObject *p) { return static_cast<nsISupports*>(static_cast<CallbackObject*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &CallbackObject::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;
# 58 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h"
  explicit CallbackObject(JSContext* aCx, JS::Handle<JSObject*> aCallback,
                          nsIGlobalObject* aIncumbentGlobal)
  {
    if (aCx && JS::ContextOptionsRef(aCx).asyncStack()) {
      JS::RootedObject stack(aCx);
      if (!JS::CaptureCurrentStack(aCx, &stack)) {
        JS_ClearPendingException(aCx);
      }
      Init(aCallback, stack, aIncumbentGlobal);
    } else {
      Init(aCallback, nullptr, aIncumbentGlobal);
    }
  }




  explicit CallbackObject(JS::Handle<JSObject*> aCallback,
                          JS::Handle<JSObject*> aAsyncStack,
                          nsIGlobalObject* aIncumbentGlobal)
  {
    Init(aCallback, aAsyncStack, aIncumbentGlobal);
  }
# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h"
  JS::Handle<JSObject*> CallbackOrNull() const
  {
    mCallback.exposeToActiveJS();
    return CallbackPreserveColor();
  }

  JSObject* GetCreationStack() const
  {
    return mCreationStack;
  }

  void MarkForCC()
  {
    mCallback.exposeToActiveJS();
    mCreationStack.exposeToActiveJS();
  }
# 115 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h"
  JS::Handle<JSObject*> CallbackPreserveColor() const
  {


    return JS::Handle<JSObject*>::fromMarkedLocation(mCallback.address());
  }






  JS::Handle<JSObject*> CallbackKnownNotGray() const
  {
    do { } while (0);
    return CallbackPreserveColor();
  }

  nsIGlobalObject* IncumbentGlobalOrNull() const
  {
    return mIncumbentGlobal;
  }

  enum ExceptionHandling {

    eReportExceptions,



    eRethrowContentExceptions,




    eRethrowExceptions
  };

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(this);
  }

protected:
  virtual ~CallbackObject()
  {
    DropJSObjects();
  }

  explicit CallbackObject(CallbackObject* aCallbackObject)
  {
    Init(aCallbackObject->mCallback, aCallbackObject->mCreationStack,
         aCallbackObject->mIncumbentGlobal);
  }

  bool operator==(const CallbackObject& aOther) const
  {
    JSObject* wrappedThis = CallbackPreserveColor();
    JSObject* wrappedOther = aOther.CallbackPreserveColor();
    if (!wrappedThis || !wrappedOther) {
      return this == &aOther;
    }

    JSObject* thisObj = js::UncheckedUnwrap(wrappedThis);
    JSObject* otherObj = js::UncheckedUnwrap(wrappedOther);
    return thisObj == otherObj;
  }

  class JSObjectsDropper final
  {
  public:
    explicit JSObjectsDropper(CallbackObject* aHolder)
      : mHolder(aHolder)
    {}

    ~JSObjectsDropper()
    {
      mHolder->DropJSObjects();
    }

  private:
    RefPtr<CallbackObject> mHolder;
  };

private:
  inline void InitNoHold(JSObject* aCallback, JSObject* aCreationStack,
                         nsIGlobalObject* aIncumbentGlobal)
  {
    do { } while (0);


    mCallback = aCallback;
    mCreationStack = aCreationStack;
    if (aIncumbentGlobal) {
      mIncumbentGlobal = aIncumbentGlobal;
      mIncumbentJSGlobal = aIncumbentGlobal->GetGlobalJSObject();
    }
  }

  inline void Init(JSObject* aCallback, JSObject* aCreationStack,
                   nsIGlobalObject* aIncumbentGlobal)
  {
    InitNoHold(aCallback, aCreationStack, aIncumbentGlobal);
    mozilla::HoldJSObjects(this);
  }

  inline void ClearJSReferences()
  {
    mCallback = nullptr;
    mCreationStack = nullptr;
    mIncumbentJSGlobal = nullptr;
  }

  CallbackObject(const CallbackObject&) = delete;
  CallbackObject& operator =(const CallbackObject&) = delete;

protected:
  void DropJSObjects()
  {
    do { } while (0);
    if (mCallback) {
      ClearJSReferences();
      mozilla::DropJSObjects(this);
    }
  }


  void Trace(JSTracer* aTracer);





  void FinishSlowJSInitIfMoreThanOneOwner(JSContext* aCx);







  struct FastCallbackConstructor {
  };






  CallbackObject(JS::Handle<JSObject*> aCallback,
                 const FastCallbackConstructor&)
  {
    InitNoHold(aCallback, nullptr, nullptr);
  }





  JS::Heap<JSObject*> mCallback;
  JS::Heap<JSObject*> mCreationStack;
# 283 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h"
  nsCOMPtr<nsIGlobalObject> mIncumbentGlobal;
  JS::TenuredHeap<JSObject*> mIncumbentJSGlobal;

  class CallSetup
  {






  public:







    CallSetup(CallbackObject* aCallback, ErrorResult& aRv,
              const char* aExecutionReason,
              ExceptionHandling aExceptionHandling,
              JSCompartment* aCompartment = nullptr,
              bool aIsJSImplementedWebIDL = false);
    ~CallSetup();

    JSContext* GetContext() const
    {
      return mCx;
    }

  private:

    CallSetup(const CallSetup&) = delete;

    bool ShouldRethrowException(JS::Handle<JS::Value> aException);


    JSContext* mCx;



    JSCompartment* mCompartment;


    Maybe<AutoEntryScript> mAutoEntryScript;
    Maybe<AutoIncumbentScript> mAutoIncumbentScript;

    Maybe<JS::Rooted<JSObject*> > mRootedCallable;


    Maybe<JS::Rooted<JSObject*>> mAsyncStack;
    Maybe<JS::AutoSetAsyncStackForNewCalls> mAsyncStackSetter;





    Maybe<JSAutoCompartment> mAc;



    ErrorResult& mErrorResult;
    const ExceptionHandling mExceptionHandling;
    const bool mIsMainThread;
  };
};

template<class WebIDLCallbackT, class XPCOMCallbackT>
class CallbackObjectHolder;

template<class T, class U>
void ImplCycleCollectionUnlink(CallbackObjectHolder<T, U>& aField);

class CallbackObjectHolderBase
{
protected:

  already_AddRefed<nsISupports> ToXPCOMCallback(CallbackObject* aCallback,
                                                const nsIID& aIID) const;
};

template<class WebIDLCallbackT, class XPCOMCallbackT>
class CallbackObjectHolder : CallbackObjectHolderBase
{
# 377 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackObject.h"
public:
  explicit CallbackObjectHolder(WebIDLCallbackT* aCallback)
    : mPtrBits(reinterpret_cast<uintptr_t>(aCallback))
  {
    ns_if_addref(aCallback);
  }

  explicit CallbackObjectHolder(XPCOMCallbackT* aCallback)
    : mPtrBits(reinterpret_cast<uintptr_t>(aCallback) | XPCOMCallbackFlag)
  {
    ns_if_addref(aCallback);
  }

  CallbackObjectHolder(CallbackObjectHolder&& aOther)
    : mPtrBits(aOther.mPtrBits)
  {
    aOther.mPtrBits = 0;
    static_assert(sizeof(CallbackObjectHolder) == sizeof(void*),
                  "This object is expected to be as small as a pointer, and it "
                  "is currently passed by value in various places. If it is "
                  "bloating, we may want to pass it by reference then.");
  }

  CallbackObjectHolder(const CallbackObjectHolder& aOther) = delete;

  CallbackObjectHolder()
    : mPtrBits(0)
  {}

  ~CallbackObjectHolder()
  {
    UnlinkSelf();
  }

  void operator=(WebIDLCallbackT* aCallback)
  {
    UnlinkSelf();
    mPtrBits = reinterpret_cast<uintptr_t>(aCallback);
    ns_if_addref(aCallback);
  }

  void operator=(XPCOMCallbackT* aCallback)
  {
    UnlinkSelf();
    mPtrBits = reinterpret_cast<uintptr_t>(aCallback) | XPCOMCallbackFlag;
    ns_if_addref(aCallback);
  }

  void operator=(CallbackObjectHolder&& aOther)
  {
    UnlinkSelf();
    mPtrBits = aOther.mPtrBits;
    aOther.mPtrBits = 0;
  }

  void operator=(const CallbackObjectHolder& aOther) = delete;

  nsISupports* GetISupports() const
  {
    return reinterpret_cast<nsISupports*>(mPtrBits & ~XPCOMCallbackFlag);
  }


  explicit operator bool() const
  {
    return GetISupports();
  }

  CallbackObjectHolder Clone() const
  {
    CallbackObjectHolder result;
    result.mPtrBits = mPtrBits;
    ns_if_addref(GetISupports());
    return result;
  }



  bool HasWebIDLCallback() const
  {
    return !(mPtrBits & XPCOMCallbackFlag);
  }

  WebIDLCallbackT* GetWebIDLCallback() const
  {
    do { } while (0);
    return reinterpret_cast<WebIDLCallbackT*>(mPtrBits);
  }

  XPCOMCallbackT* GetXPCOMCallback() const
  {
    do { } while (0);
    return reinterpret_cast<XPCOMCallbackT*>(mPtrBits & ~XPCOMCallbackFlag);
  }

  bool operator==(WebIDLCallbackT* aOtherCallback) const
  {
    if (!aOtherCallback) {

      return !GetISupports();
    }

    if (!HasWebIDLCallback() || !GetWebIDLCallback()) {


      return false;
    }

    return *GetWebIDLCallback() == *aOtherCallback;
  }

  bool operator==(XPCOMCallbackT* aOtherCallback) const
  {
    return (!aOtherCallback && !GetISupports()) ||
      (!HasWebIDLCallback() && GetXPCOMCallback() == aOtherCallback);
  }

  bool operator==(const CallbackObjectHolder& aOtherCallback) const
  {
    if (aOtherCallback.HasWebIDLCallback()) {
      return *this == aOtherCallback.GetWebIDLCallback();
    }

    return *this == aOtherCallback.GetXPCOMCallback();
  }


  already_AddRefed<XPCOMCallbackT> ToXPCOMCallback() const
  {
    if (!HasWebIDLCallback()) {
      RefPtr<XPCOMCallbackT> callback = GetXPCOMCallback();
      return callback.forget();
    }

    nsCOMPtr<nsISupports> supp =
      CallbackObjectHolderBase::ToXPCOMCallback(GetWebIDLCallback(),
                                                (XPCOMCallbackT::template COMTypeInfo<XPCOMCallbackT, void>::kIID));
    if (supp) {

      return supp.forget().downcast<XPCOMCallbackT>();
    }
    return nullptr;
  }


  already_AddRefed<WebIDLCallbackT> ToWebIDLCallback() const
  {
    if (HasWebIDLCallback()) {
      RefPtr<WebIDLCallbackT> callback = GetWebIDLCallback();
      return callback.forget();
    }
    return nullptr;
  }

private:
  static const uintptr_t XPCOMCallbackFlag = 1u;

  friend void
  ImplCycleCollectionUnlink<WebIDLCallbackT,
                            XPCOMCallbackT>(CallbackObjectHolder& aField);

  void UnlinkSelf()
  {

    nsISupports* ptr = GetISupports();
    do { if (ptr) { (ptr)->Release(); (ptr) = 0; } } while (0);
    mPtrBits = 0;
  }

  uintptr_t mPtrBits;
};

template<typename T> struct CallbackObject::COMTypeInfo<CallbackObject, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID CallbackObject::COMTypeInfo<CallbackObject, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xbe74c190, 0x6d76, 0x4991, { 0x84, 0xb9, 0x65, 0x06, 0x99, 0xe6, 0x93, 0x2b } };

template<class T, class U>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            CallbackObjectHolder<T, U>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  if (aField) {
    CycleCollectionNoteChild(aCallback, aField.GetISupports(), aName, aFlags);
  }
}

template<class T, class U>
void
ImplCycleCollectionUnlink(CallbackObjectHolder<T, U>& aField)
{
  aField.UnlinkSelf();
}





template<typename T>
class RootedCallback : public JS::Rooted<T>
{
public:
  explicit RootedCallback(JSContext* cx)
    : JS::Rooted<T>(cx)
    , mCx(cx)
  {}



  template<typename S>
  void operator=(S* arg)
  {
    this->get().operator=(arg);
  }



  void operator=(decltype(nullptr) arg)
  {
    this->get().operator=(arg);
  }


  JS::Handle<JSObject*> CallbackOrNull() const
  {
    return this->get()->CallbackOrNull();
  }

  ~RootedCallback()
  {




    if (IsInitialized(this->get())) {
      this->get()->FinishSlowJSInitIfMoreThanOneOwner(mCx);
    }
  }

private:
  template<typename U>
  static bool IsInitialized(U& aArg);

  template<typename U>
  static bool IsInitialized(RefPtr<U>& aRefPtr)
  {
    return aRefPtr;
  }

  template<typename U>
  static bool IsInitialized(OwningNonNull<U>& aOwningNonNull)
  {
    return aOwningNonNull.isInitialized();
  }

  JSContext* mCx;
};

}
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CallbackFunction.h" 2

namespace mozilla {
namespace dom {

class CallbackFunction : public CallbackObject
{
public:

  explicit CallbackFunction(JSContext* aCx, JS::Handle<JSObject*> aCallable,
                            nsIGlobalObject* aIncumbentGlobal)
    : CallbackObject(aCx, aCallable, aIncumbentGlobal)
  {
  }


  explicit CallbackFunction(JS::Handle<JSObject*> aCallable,
                            JS::Handle<JSObject*> aAsyncStack,
                            nsIGlobalObject* aIncumbentGlobal)
    : CallbackObject(aCallable, aAsyncStack, aIncumbentGlobal)
  {
  }

  JS::Handle<JSObject*> CallableOrNull() const
  {
    return CallbackOrNull();
  }

  JS::Handle<JSObject*> CallablePreserveColor() const
  {
    return CallbackPreserveColor();
  }

  bool HasGrayCallable() const
  {

    return mCallback && JS::ObjectIsMarkedGray(mCallback);
  }

protected:
  explicit CallbackFunction(CallbackFunction* aCallbackFunction)
    : CallbackObject(aCallbackFunction)
  {
  }


  CallbackFunction(JS::Handle<JSObject*> aCallable,
                   const FastCallbackConstructor&)
    : CallbackObject(aCallable, FastCallbackConstructor())
  {
  }
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventHandlerBinding.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FakeString.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FakeString.h"
namespace mozilla {
namespace dom {
namespace binding_detail {



struct FakeString {
  FakeString() :
    mFlags(nsString::F_TERMINATED)
  {
  }

  ~FakeString() {
    if (mFlags & nsString::F_SHARED) {
      nsStringBuffer::FromData(mData)->Release();
    }
  }

  void Rebind(const nsString::char_type* aData, nsString::size_type aLength) {
    do { } while (0);
    mData = const_cast<nsString::char_type*>(aData);
    mLength = aLength;
  }




  void ShareOrDependUpon(const nsAString& aString) {
    RefPtr<nsStringBuffer> sharedBuffer = nsStringBuffer::FromString(aString);
    if (!sharedBuffer) {
      Rebind(aString.Data(), aString.Length());
    } else {
      AssignFromStringBuffer(sharedBuffer.forget());
      mLength = aString.Length();
    }
  }

  void Truncate() {
    do { } while (0);
    mData = nsString::char_traits::sEmptyBuffer;
    mLength = 0;
  }

  void SetIsVoid(bool aValue) {
    do { } while (0);

    Truncate();
    mFlags |= nsString::F_VOIDED;
  }

  const nsString::char_type* Data() const
  {
    return mData;
  }

  nsString::char_type* BeginWriting()
  {
    return mData;
  }

  nsString::size_type Length() const
  {
    return mLength;
  }


  bool SetLength(nsString::size_type aLength, mozilla::fallible_t const&) {

    if (aLength < sInlineCapacity) {
      SetData(mInlineStorage);
    } else {
      RefPtr<nsStringBuffer> buf = nsStringBuffer::Alloc((aLength + 1) * sizeof(nsString::char_type));
      if ((__builtin_expect(!!(!buf), 0))) {
        return false;
      }

      AssignFromStringBuffer(buf.forget());
    }
    mLength = aLength;
    mData[mLength] = char16_t(0);
    return true;
  }



  const nsAString* ToAStringPtr() const {
    return reinterpret_cast<const nsString*>(this);
  }

operator const nsAString& () const {
    return *reinterpret_cast<const nsString*>(this);
  }

private:
  nsAString* ToAStringPtr() {
    return reinterpret_cast<nsString*>(this);
  }

  nsString::char_type* mData;
  nsString::size_type mLength;
  uint32_t mFlags;

  static const size_t sInlineCapacity = 64;
  nsString::char_type mInlineStorage[sInlineCapacity];

  FakeString(const FakeString& other) = delete;
  void operator=(const FakeString& other) = delete;

  void SetData(nsString::char_type* aData) {
    do { } while (0);
    mData = const_cast<nsString::char_type*>(aData);
  }
  void AssignFromStringBuffer(already_AddRefed<nsStringBuffer> aBuffer) {
    SetData(static_cast<nsString::char_type*>(aBuffer.take()->Data()));
    mFlags = nsString::F_SHARED | nsString::F_TERMINATED;
  }

  friend class NonNull<nsAString>;



  class StringAsserter;
  friend class StringAsserter;

  class StringAsserter : public nsString {
  public:
    static void StaticAsserts() {
      static_assert(__builtin_offsetof(FakeString, mInlineStorage) ==
                      sizeof(nsString),
                    "FakeString should include all nsString members");
      static_assert(__builtin_offsetof(FakeString, mData) ==
                      __builtin_offsetof(StringAsserter, mData),
                    "Offset of mData should match");
      static_assert(__builtin_offsetof(FakeString, mLength) ==
                      __builtin_offsetof(StringAsserter, mLength),
                    "Offset of mLength should match");
      static_assert(__builtin_offsetof(FakeString, mFlags) ==
                      __builtin_offsetof(StringAsserter, mFlags),
                    "Offset of mFlags should match");
    }
  };
};
}
}
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventHandlerBinding.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ToJSValue.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ToJSValue.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Conversions.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Conversions.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 1 3
# 36 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 2 3

using std::abs;
using std::acos;
using std::asin;
using std::atan;
using std::atan2;
using std::cos;
using std::sin;
using std::tan;
using std::cosh;
using std::sinh;
using std::tanh;
using std::exp;
using std::frexp;
using std::ldexp;
using std::log;
using std::log10;
using std::modf;
using std::pow;
using std::sqrt;
using std::ceil;
using std::fabs;
using std::floor;
using std::fmod;


using std::fpclassify;
using std::isfinite;
using std::isinf;
using std::isnan;
using std::isnormal;
using std::signbit;
using std::isgreater;
using std::isgreaterequal;
using std::isless;
using std::islessequal;
using std::islessgreater;
using std::isunordered;



using std::acosh;
using std::asinh;
using std::atanh;
using std::cbrt;
using std::copysign;
using std::erf;
using std::erfc;
using std::exp2;
using std::expm1;
using std::fdim;
using std::fma;
using std::fmax;
using std::fmin;
using std::hypot;
using std::ilogb;
using std::lgamma;
using std::llrint;
using std::llround;
using std::log1p;
using std::log2;
using std::logb;
using std::lrint;
using std::lround;
using std::nearbyint;
using std::nextafter;
using std::nexttoward;
using std::remainder;
using std::remquo;
using std::rint;
using std::round;
using std::scalbln;
using std::scalbn;
using std::tgamma;
using std::trunc;
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Conversions.h" 2






struct JSContext;

namespace js {


extern bool
ToBooleanSlow(JS::HandleValue v);


extern bool
ToNumberSlow(JSContext* cx, JS::HandleValue v, double* dp);


extern bool
ToInt8Slow(JSContext *cx, JS::HandleValue v, int8_t *out);


extern bool
ToUint8Slow(JSContext *cx, JS::HandleValue v, uint8_t *out);


extern bool
ToInt16Slow(JSContext *cx, JS::HandleValue v, int16_t *out);


extern bool
ToInt32Slow(JSContext* cx, JS::HandleValue v, int32_t* out);


extern bool
ToUint32Slow(JSContext* cx, JS::HandleValue v, uint32_t* out);


extern bool
ToUint16Slow(JSContext* cx, JS::HandleValue v, uint16_t* out);


extern bool
ToInt64Slow(JSContext* cx, JS::HandleValue v, int64_t* out);


extern bool
ToUint64Slow(JSContext* cx, JS::HandleValue v, uint64_t* out);


extern JSString*
ToStringSlow(JSContext* cx, JS::HandleValue v);


extern JSObject*
ToObjectSlow(JSContext* cx, JS::HandleValue v, bool reportScanStack);

}

namespace JS {

namespace detail {







extern void
AssertArgumentsAreSane(JSContext* cx, HandleValue v);





}
# 104 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Conversions.h"
extern bool
OrdinaryToPrimitive(JSContext* cx, HandleObject obj, JSType type, MutableHandleValue vp);


__attribute__((always_inline)) inline bool
ToBoolean(HandleValue v)
{
    if (v.isBoolean())
        return v.toBoolean();
    if (v.isInt32())
        return v.toInt32() != 0;
    if (v.isNullOrUndefined())
        return false;
    if (v.isDouble()) {
        double d = v.toDouble();
        return !mozilla::IsNaN(d) && d != 0;
    }
    if (v.isSymbol())
        return true;


    return js::ToBooleanSlow(v);
}


__attribute__((always_inline)) inline bool
ToNumber(JSContext* cx, HandleValue v, double* out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isNumber()) {
        *out = v.toNumber();
        return true;
    }
    return js::ToNumberSlow(cx, v, out);
}


inline double
ToInteger(double d)
{
    if (d == 0)
        return d;

    if (!mozilla::IsFinite(d)) {
        if (mozilla::IsNaN(d))
            return 0;
        return d;
    }

    return d < 0 ? ceil(d) : floor(d);
}


__attribute__((always_inline)) inline bool
ToInt32(JSContext* cx, JS::HandleValue v, int32_t* out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = v.toInt32();
        return true;
    }
    return js::ToInt32Slow(cx, v, out);
}


__attribute__((always_inline)) inline bool
ToUint32(JSContext* cx, HandleValue v, uint32_t* out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = uint32_t(v.toInt32());
        return true;
    }
    return js::ToUint32Slow(cx, v, out);
}


__attribute__((always_inline)) inline bool
ToInt16(JSContext *cx, JS::HandleValue v, int16_t *out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = int16_t(v.toInt32());
        return true;
    }
    return js::ToInt16Slow(cx, v, out);
}


__attribute__((always_inline)) inline bool
ToUint16(JSContext* cx, HandleValue v, uint16_t* out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = uint16_t(v.toInt32());
        return true;
    }
    return js::ToUint16Slow(cx, v, out);
}


__attribute__((always_inline)) inline bool
ToInt8(JSContext *cx, JS::HandleValue v, int8_t *out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = int8_t(v.toInt32());
        return true;
    }
    return js::ToInt8Slow(cx, v, out);
}


__attribute__((always_inline)) inline bool
ToUint8(JSContext *cx, JS::HandleValue v, uint8_t *out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = uint8_t(v.toInt32());
        return true;
    }
    return js::ToUint8Slow(cx, v, out);
}





__attribute__((always_inline)) inline bool
ToInt64(JSContext* cx, HandleValue v, int64_t* out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = int64_t(v.toInt32());
        return true;
    }
    return js::ToInt64Slow(cx, v, out);
}





__attribute__((always_inline)) inline bool
ToUint64(JSContext* cx, HandleValue v, uint64_t* out)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isInt32()) {
        *out = uint64_t(v.toInt32());
        return true;
    }
    return js::ToUint64Slow(cx, v, out);
}


__attribute__((always_inline)) inline JSString*
ToString(JSContext* cx, HandleValue v)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isString())
        return v.toString();
    return js::ToStringSlow(cx, v);
}


inline JSObject*
ToObject(JSContext* cx, HandleValue v)
{
    detail::AssertArgumentsAreSane(cx, v);

    if (v.isObject())
        return &v.toObject();
    return js::ToObjectSlow(cx, v, false);
}

namespace detail {
# 304 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Conversions.h"
template<typename ResultType>
inline ResultType
ToUintWidth(double d)
{
    static_assert(mozilla::IsUnsigned<ResultType>::value,
                  "ResultType must be an unsigned type");

    uint64_t bits = mozilla::BitwiseCast<uint64_t>(d);
    unsigned DoubleExponentShift = mozilla::FloatingPoint<double>::kExponentShift;



    int_fast16_t exp =
        int_fast16_t((bits & mozilla::FloatingPoint<double>::kExponentBits) >> DoubleExponentShift) -
        int_fast16_t(mozilla::FloatingPoint<double>::kExponentBias);



    if (exp < 0)
        return 0;

    uint_fast16_t exponent = mozilla::AssertedCast<uint_fast16_t>(exp);







    const size_t ResultWidth = 8 * sizeof(ResultType);
    if (exponent >= DoubleExponentShift + ResultWidth)
        return 0;




    static_assert(sizeof(ResultType) <= sizeof(uint64_t),
                  "Left-shifting below would lose upper bits");
    ResultType result = (exponent > DoubleExponentShift)
                        ? ResultType(bits << (exponent - DoubleExponentShift))
                        : ResultType(bits >> (DoubleExponentShift - exponent));
# 370 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Conversions.h"
    if (exponent < ResultWidth) {
        ResultType implicitOne = ResultType(1) << exponent;
        result &= implicitOne - 1;
        result += implicitOne;
    }


    return (bits & mozilla::FloatingPoint<double>::kSignBit) ? ~result + 1 : result;
}

template<typename ResultType>
inline ResultType
ToIntWidth(double d)
{
    static_assert(mozilla::IsSigned<ResultType>::value,
                  "ResultType must be a signed type");

    const ResultType MaxValue = (1ULL << (8 * sizeof(ResultType) - 1)) - 1;
    const ResultType MinValue = -MaxValue - 1;

    typedef typename mozilla::MakeUnsigned<ResultType>::Type UnsignedResult;
    UnsignedResult u = ToUintWidth<UnsignedResult>(d);
    if (u <= UnsignedResult(MaxValue))
        return static_cast<ResultType>(u);
    return (MinValue + static_cast<ResultType>(u - MaxValue)) - 1;
}

}


inline int32_t
ToInt32(double d)
{
# 527 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/Conversions.h"
    return detail::ToIntWidth<int32_t>(d);

}


inline uint32_t
ToUint32(double d)
{
    return detail::ToUintWidth<uint32_t>(d);
}


inline int8_t
ToInt8(double d)
{
    return detail::ToIntWidth<int8_t>(d);
}


inline int8_t
ToUint8(double d)
{
    return detail::ToUintWidth<uint8_t>(d);
}


inline int16_t
ToInt16(double d)
{
    return detail::ToIntWidth<int16_t>(d);
}

inline uint16_t
ToUint16(double d)
{
    return detail::ToUintWidth<uint16_t>(d);
}


inline int64_t
ToInt64(double d)
{
    return detail::ToIntWidth<int64_t>(d);
}


inline uint64_t
ToUint64(double d)
{
    return detail::ToUintWidth<uint64_t>(d);
}

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/queue" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/queue" 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/deque" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/deque" 3




# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_uninitialized.h" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_uninitialized.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  template<bool _TrivialValueTypes>
    struct __uninitialized_copy
    {
      template<typename _InputIterator, typename _ForwardIterator>
        static _ForwardIterator
        __uninit_copy(_InputIterator __first, _InputIterator __last,
        _ForwardIterator __result)
        {
   _ForwardIterator __cur = __result;
   try
     {
       for (; __first != __last; ++__first, (void)++__cur)
  std::_Construct(std::__addressof(*__cur), *__first);
       return __cur;
     }
   catch(...)
     {
       std::_Destroy(__result, __cur);
       throw;
     }
 }
    };

  template<>
    struct __uninitialized_copy<true>
    {
      template<typename _InputIterator, typename _ForwardIterator>
        static _ForwardIterator
        __uninit_copy(_InputIterator __first, _InputIterator __last,
        _ForwardIterator __result)
        { return std::copy(__first, __last, __result); }
    };
# 105 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_uninitialized.h" 3
  template<typename _InputIterator, typename _ForwardIterator>
    inline _ForwardIterator
    uninitialized_copy(_InputIterator __first, _InputIterator __last,
         _ForwardIterator __result)
    {
      typedef typename iterator_traits<_InputIterator>::value_type
 _ValueType1;
      typedef typename iterator_traits<_ForwardIterator>::value_type
 _ValueType2;




      typedef typename iterator_traits<_InputIterator>::reference _RefType1;
      typedef typename iterator_traits<_ForwardIterator>::reference _RefType2;
      const bool __assignable = is_assignable<_RefType2, _RefType1>::value;


      return std::__uninitialized_copy<__is_trivial(_ValueType1)
           && __is_trivial(_ValueType2)
           && __assignable>::
 __uninit_copy(__first, __last, __result);
    }


  template<bool _TrivialValueType>
    struct __uninitialized_fill
    {
      template<typename _ForwardIterator, typename _Tp>
        static void
        __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
        const _Tp& __x)
        {
   _ForwardIterator __cur = __first;
   try
     {
       for (; __cur != __last; ++__cur)
  std::_Construct(std::__addressof(*__cur), __x);
     }
   catch(...)
     {
       std::_Destroy(__first, __cur);
       throw;
     }
 }
    };

  template<>
    struct __uninitialized_fill<true>
    {
      template<typename _ForwardIterator, typename _Tp>
        static void
        __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
        const _Tp& __x)
        { std::fill(__first, __last, __x); }
    };
# 171 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_uninitialized.h" 3
  template<typename _ForwardIterator, typename _Tp>
    inline void
    uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
         const _Tp& __x)
    {
      typedef typename iterator_traits<_ForwardIterator>::value_type
 _ValueType;




      const bool __assignable = is_copy_assignable<_ValueType>::value;


      std::__uninitialized_fill<__is_trivial(_ValueType) && __assignable>::
 __uninit_fill(__first, __last, __x);
    }


  template<bool _TrivialValueType>
    struct __uninitialized_fill_n
    {
      template<typename _ForwardIterator, typename _Size, typename _Tp>
        static _ForwardIterator
        __uninit_fill_n(_ForwardIterator __first, _Size __n,
   const _Tp& __x)
        {
   _ForwardIterator __cur = __first;
   try
     {
       for (; __n > 0; --__n, ++__cur)
  std::_Construct(std::__addressof(*__cur), __x);
       return __cur;
     }
   catch(...)
     {
       std::_Destroy(__first, __cur);
       throw;
     }
 }
    };

  template<>
    struct __uninitialized_fill_n<true>
    {
      template<typename _ForwardIterator, typename _Size, typename _Tp>
        static _ForwardIterator
        __uninit_fill_n(_ForwardIterator __first, _Size __n,
   const _Tp& __x)
        { return std::fill_n(__first, __n, __x); }
    };
# 234 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_uninitialized.h" 3
  template<typename _ForwardIterator, typename _Size, typename _Tp>
    inline _ForwardIterator
    uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
    {
      typedef typename iterator_traits<_ForwardIterator>::value_type
 _ValueType;




      const bool __assignable = is_copy_assignable<_ValueType>::value;

      return __uninitialized_fill_n<__is_trivial(_ValueType) && __assignable>::
 __uninit_fill_n(__first, __n, __x);
    }







  template<typename _InputIterator, typename _ForwardIterator,
    typename _Allocator>
    _ForwardIterator
    __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
      _ForwardIterator __result, _Allocator& __alloc)
    {
      _ForwardIterator __cur = __result;
      try
 {
   typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
   for (; __first != __last; ++__first, (void)++__cur)
     __traits::construct(__alloc, std::__addressof(*__cur), *__first);
   return __cur;
 }
      catch(...)
 {
   std::_Destroy(__result, __cur, __alloc);
   throw;
 }
    }

  template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
    inline _ForwardIterator
    __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
      _ForwardIterator __result, allocator<_Tp>&)
    { return std::uninitialized_copy(__first, __last, __result); }

  template<typename _InputIterator, typename _ForwardIterator,
    typename _Allocator>
    inline _ForwardIterator
    __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
      _ForwardIterator __result, _Allocator& __alloc)
    {
      return std::__uninitialized_copy_a(std::make_move_iterator(__first),
      std::make_move_iterator(__last),
      __result, __alloc);
    }

  template<typename _InputIterator, typename _ForwardIterator,
    typename _Allocator>
    inline _ForwardIterator
    __uninitialized_move_if_noexcept_a(_InputIterator __first,
           _InputIterator __last,
           _ForwardIterator __result,
           _Allocator& __alloc)
    {
      return std::__uninitialized_copy_a
 (std::__make_move_if_noexcept_iterator(__first),
  std::__make_move_if_noexcept_iterator(__last), __result, __alloc);
    }

  template<typename _ForwardIterator, typename _Tp, typename _Allocator>
    void
    __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
      const _Tp& __x, _Allocator& __alloc)
    {
      _ForwardIterator __cur = __first;
      try
 {
   typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
   for (; __cur != __last; ++__cur)
     __traits::construct(__alloc, std::__addressof(*__cur), __x);
 }
      catch(...)
 {
   std::_Destroy(__first, __cur, __alloc);
   throw;
 }
    }

  template<typename _ForwardIterator, typename _Tp, typename _Tp2>
    inline void
    __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
      const _Tp& __x, allocator<_Tp2>&)
    { std::uninitialized_fill(__first, __last, __x); }

  template<typename _ForwardIterator, typename _Size, typename _Tp,
    typename _Allocator>
    _ForwardIterator
    __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
        const _Tp& __x, _Allocator& __alloc)
    {
      _ForwardIterator __cur = __first;
      try
 {
   typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
   for (; __n > 0; --__n, ++__cur)
     __traits::construct(__alloc, std::__addressof(*__cur), __x);
   return __cur;
 }
      catch(...)
 {
   std::_Destroy(__first, __cur, __alloc);
   throw;
 }
    }

  template<typename _ForwardIterator, typename _Size, typename _Tp,
    typename _Tp2>
    inline _ForwardIterator
    __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
        const _Tp& __x, allocator<_Tp2>&)
    { return std::uninitialized_fill_n(__first, __n, __x); }
# 370 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_uninitialized.h" 3
  template<typename _InputIterator1, typename _InputIterator2,
    typename _ForwardIterator, typename _Allocator>
    inline _ForwardIterator
    __uninitialized_copy_move(_InputIterator1 __first1,
         _InputIterator1 __last1,
         _InputIterator2 __first2,
         _InputIterator2 __last2,
         _ForwardIterator __result,
         _Allocator& __alloc)
    {
      _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
          __result,
          __alloc);
      try
 {
   return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
 }
      catch(...)
 {
   std::_Destroy(__result, __mid, __alloc);
   throw;
 }
    }





  template<typename _InputIterator1, typename _InputIterator2,
    typename _ForwardIterator, typename _Allocator>
    inline _ForwardIterator
    __uninitialized_move_copy(_InputIterator1 __first1,
         _InputIterator1 __last1,
         _InputIterator2 __first2,
         _InputIterator2 __last2,
         _ForwardIterator __result,
         _Allocator& __alloc)
    {
      _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
          __result,
          __alloc);
      try
 {
   return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
 }
      catch(...)
 {
   std::_Destroy(__result, __mid, __alloc);
   throw;
 }
    }




  template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
    typename _Allocator>
    inline _ForwardIterator
    __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
         const _Tp& __x, _InputIterator __first,
         _InputIterator __last, _Allocator& __alloc)
    {
      std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
      try
 {
   return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
 }
      catch(...)
 {
   std::_Destroy(__result, __mid, __alloc);
   throw;
 }
    }




  template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
    typename _Allocator>
    inline void
    __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
         _ForwardIterator __first2,
         _ForwardIterator __last2, const _Tp& __x,
         _Allocator& __alloc)
    {
      _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
           __first2,
           __alloc);
      try
 {
   std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
 }
      catch(...)
 {
   std::_Destroy(__first2, __mid2, __alloc);
   throw;
 }
    }





  template<bool _TrivialValueType>
    struct __uninitialized_default_1
    {
      template<typename _ForwardIterator>
        static void
        __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
        {
   _ForwardIterator __cur = __first;
   try
     {
       for (; __cur != __last; ++__cur)
  std::_Construct(std::__addressof(*__cur));
     }
   catch(...)
     {
       std::_Destroy(__first, __cur);
       throw;
     }
 }
    };

  template<>
    struct __uninitialized_default_1<true>
    {
      template<typename _ForwardIterator>
        static void
        __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
        {
   typedef typename iterator_traits<_ForwardIterator>::value_type
     _ValueType;

   std::fill(__first, __last, _ValueType());
 }
    };

  template<bool _TrivialValueType>
    struct __uninitialized_default_n_1
    {
      template<typename _ForwardIterator, typename _Size>
        static _ForwardIterator
        __uninit_default_n(_ForwardIterator __first, _Size __n)
        {
   _ForwardIterator __cur = __first;
   try
     {
       for (; __n > 0; --__n, ++__cur)
  std::_Construct(std::__addressof(*__cur));
       return __cur;
     }
   catch(...)
     {
       std::_Destroy(__first, __cur);
       throw;
     }
 }
    };

  template<>
    struct __uninitialized_default_n_1<true>
    {
      template<typename _ForwardIterator, typename _Size>
        static _ForwardIterator
        __uninit_default_n(_ForwardIterator __first, _Size __n)
        {
   typedef typename iterator_traits<_ForwardIterator>::value_type
     _ValueType;

   return std::fill_n(__first, __n, _ValueType());
 }
    };




  template<typename _ForwardIterator>
    inline void
    __uninitialized_default(_ForwardIterator __first,
       _ForwardIterator __last)
    {
      typedef typename iterator_traits<_ForwardIterator>::value_type
 _ValueType;

      const bool __assignable = is_copy_assignable<_ValueType>::value;

      std::__uninitialized_default_1<__is_trivial(_ValueType)
         && __assignable>::
 __uninit_default(__first, __last);
    }



  template<typename _ForwardIterator, typename _Size>
    inline _ForwardIterator
    __uninitialized_default_n(_ForwardIterator __first, _Size __n)
    {
      typedef typename iterator_traits<_ForwardIterator>::value_type
 _ValueType;

      const bool __assignable = is_copy_assignable<_ValueType>::value;

      return __uninitialized_default_n_1<__is_trivial(_ValueType)
           && __assignable>::
 __uninit_default_n(__first, __n);
    }





  template<typename _ForwardIterator, typename _Allocator>
    void
    __uninitialized_default_a(_ForwardIterator __first,
         _ForwardIterator __last,
         _Allocator& __alloc)
    {
      _ForwardIterator __cur = __first;
      try
 {
   typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
   for (; __cur != __last; ++__cur)
     __traits::construct(__alloc, std::__addressof(*__cur));
 }
      catch(...)
 {
   std::_Destroy(__first, __cur, __alloc);
   throw;
 }
    }

  template<typename _ForwardIterator, typename _Tp>
    inline void
    __uninitialized_default_a(_ForwardIterator __first,
         _ForwardIterator __last,
         allocator<_Tp>&)
    { std::__uninitialized_default(__first, __last); }





  template<typename _ForwardIterator, typename _Size, typename _Allocator>
    _ForwardIterator
    __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
    _Allocator& __alloc)
    {
      _ForwardIterator __cur = __first;
      try
 {
   typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
   for (; __n > 0; --__n, ++__cur)
     __traits::construct(__alloc, std::__addressof(*__cur));
   return __cur;
 }
      catch(...)
 {
   std::_Destroy(__first, __cur, __alloc);
   throw;
 }
    }

  template<typename _ForwardIterator, typename _Size, typename _Tp>
    inline _ForwardIterator
    __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
    allocator<_Tp>&)
    { return std::__uninitialized_default_n(__first, __n); }


  template<typename _InputIterator, typename _Size,
    typename _ForwardIterator>
    _ForwardIterator
    __uninitialized_copy_n(_InputIterator __first, _Size __n,
      _ForwardIterator __result, input_iterator_tag)
    {
      _ForwardIterator __cur = __result;
      try
 {
   for (; __n > 0; --__n, ++__first, ++__cur)
     std::_Construct(std::__addressof(*__cur), *__first);
   return __cur;
 }
      catch(...)
 {
   std::_Destroy(__result, __cur);
   throw;
 }
    }

  template<typename _RandomAccessIterator, typename _Size,
    typename _ForwardIterator>
    inline _ForwardIterator
    __uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
      _ForwardIterator __result,
      random_access_iterator_tag)
    { return std::uninitialized_copy(__first, __first + __n, __result); }
# 677 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_uninitialized.h" 3
  template<typename _InputIterator, typename _Size, typename _ForwardIterator>
    inline _ForwardIterator
    uninitialized_copy_n(_InputIterator __first, _Size __n,
    _ForwardIterator __result)
    { return std::__uninitialized_copy_n(__first, __n, __result,
      std::__iterator_category(__first)); }



}
# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/deque" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 1 3
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 88 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
  constexpr inline size_t
  __deque_buf_size(size_t __size)
  { return (__size < 512
     ? size_t(512 / __size) : size_t(1)); }
# 105 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
  template<typename _Tp, typename _Ref, typename _Ptr>
    struct _Deque_iterator
    {






    private:
      template<typename _Up>
 using __ptr_to = typename pointer_traits<_Ptr>::template rebind<_Up>;
      template<typename _CvTp>
 using __iter = _Deque_iterator<_Tp, _CvTp&, __ptr_to<_CvTp>>;
    public:
      typedef __iter<_Tp> iterator;
      typedef __iter<const _Tp> const_iterator;
      typedef __ptr_to<_Tp> _Elt_pointer;
      typedef __ptr_to<_Elt_pointer> _Map_pointer;


      static size_t _S_buffer_size() noexcept
      { return __deque_buf_size(sizeof(_Tp)); }

      typedef std::random_access_iterator_tag iterator_category;
      typedef _Tp value_type;
      typedef _Ptr pointer;
      typedef _Ref reference;
      typedef size_t size_type;
      typedef ptrdiff_t difference_type;
      typedef _Deque_iterator _Self;

      _Elt_pointer _M_cur;
      _Elt_pointer _M_first;
      _Elt_pointer _M_last;
      _Map_pointer _M_node;

      _Deque_iterator(_Elt_pointer __x, _Map_pointer __y) noexcept
      : _M_cur(__x), _M_first(*__y),
        _M_last(*__y + _S_buffer_size()), _M_node(__y) { }

      _Deque_iterator() noexcept
      : _M_cur(), _M_first(), _M_last(), _M_node() { }

      _Deque_iterator(const iterator& __x) noexcept
      : _M_cur(__x._M_cur), _M_first(__x._M_first),
        _M_last(__x._M_last), _M_node(__x._M_node) { }

      iterator
      _M_const_cast() const noexcept
      { return iterator(_M_cur, _M_node); }

      reference
      operator*() const noexcept
      { return *_M_cur; }

      pointer
      operator->() const noexcept
      { return _M_cur; }

      _Self&
      operator++() noexcept
      {
 ++_M_cur;
 if (_M_cur == _M_last)
   {
     _M_set_node(_M_node + 1);
     _M_cur = _M_first;
   }
 return *this;
      }

      _Self
      operator++(int) noexcept
      {
 _Self __tmp = *this;
 ++*this;
 return __tmp;
      }

      _Self&
      operator--() noexcept
      {
 if (_M_cur == _M_first)
   {
     _M_set_node(_M_node - 1);
     _M_cur = _M_last;
   }
 --_M_cur;
 return *this;
      }

      _Self
      operator--(int) noexcept
      {
 _Self __tmp = *this;
 --*this;
 return __tmp;
      }

      _Self&
      operator+=(difference_type __n) noexcept
      {
 const difference_type __offset = __n + (_M_cur - _M_first);
 if (__offset >= 0 && __offset < difference_type(_S_buffer_size()))
   _M_cur += __n;
 else
   {
     const difference_type __node_offset =
       __offset > 0 ? __offset / difference_type(_S_buffer_size())
                    : -difference_type((-__offset - 1)
           / _S_buffer_size()) - 1;
     _M_set_node(_M_node + __node_offset);
     _M_cur = _M_first + (__offset - __node_offset
     * difference_type(_S_buffer_size()));
   }
 return *this;
      }

      _Self
      operator+(difference_type __n) const noexcept
      {
 _Self __tmp = *this;
 return __tmp += __n;
      }

      _Self&
      operator-=(difference_type __n) noexcept
      { return *this += -__n; }

      _Self
      operator-(difference_type __n) const noexcept
      {
 _Self __tmp = *this;
 return __tmp -= __n;
      }

      reference
      operator[](difference_type __n) const noexcept
      { return *(*this + __n); }






      void
      _M_set_node(_Map_pointer __new_node) noexcept
      {
 _M_node = __new_node;
 _M_first = *__new_node;
 _M_last = _M_first + difference_type(_S_buffer_size());
      }
    };




  template<typename _Tp, typename _Ref, typename _Ptr>
    inline bool
    operator==(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
        const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) noexcept
    { return __x._M_cur == __y._M_cur; }

  template<typename _Tp, typename _RefL, typename _PtrL,
    typename _RefR, typename _PtrR>
    inline bool
    operator==(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
        const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) noexcept
    { return __x._M_cur == __y._M_cur; }

  template<typename _Tp, typename _Ref, typename _Ptr>
    inline bool
    operator!=(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
        const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) noexcept
    { return !(__x == __y); }

  template<typename _Tp, typename _RefL, typename _PtrL,
    typename _RefR, typename _PtrR>
    inline bool
    operator!=(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
        const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) noexcept
    { return !(__x == __y); }

  template<typename _Tp, typename _Ref, typename _Ptr>
    inline bool
    operator<(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
       const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) noexcept
    { return (__x._M_node == __y._M_node) ? (__x._M_cur < __y._M_cur)
                                          : (__x._M_node < __y._M_node); }

  template<typename _Tp, typename _RefL, typename _PtrL,
    typename _RefR, typename _PtrR>
    inline bool
    operator<(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
       const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) noexcept
    { return (__x._M_node == __y._M_node) ? (__x._M_cur < __y._M_cur)
                                   : (__x._M_node < __y._M_node); }

  template<typename _Tp, typename _Ref, typename _Ptr>
    inline bool
    operator>(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
       const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) noexcept
    { return __y < __x; }

  template<typename _Tp, typename _RefL, typename _PtrL,
    typename _RefR, typename _PtrR>
    inline bool
    operator>(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
       const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) noexcept
    { return __y < __x; }

  template<typename _Tp, typename _Ref, typename _Ptr>
    inline bool
    operator<=(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
        const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) noexcept
    { return !(__y < __x); }

  template<typename _Tp, typename _RefL, typename _PtrL,
    typename _RefR, typename _PtrR>
    inline bool
    operator<=(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
        const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) noexcept
    { return !(__y < __x); }

  template<typename _Tp, typename _Ref, typename _Ptr>
    inline bool
    operator>=(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
        const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) noexcept
    { return !(__x < __y); }

  template<typename _Tp, typename _RefL, typename _PtrL,
    typename _RefR, typename _PtrR>
    inline bool
    operator>=(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
        const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) noexcept
    { return !(__x < __y); }





  template<typename _Tp, typename _Ref, typename _Ptr>
    inline typename _Deque_iterator<_Tp, _Ref, _Ptr>::difference_type
    operator-(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
       const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) noexcept
    {
      return typename _Deque_iterator<_Tp, _Ref, _Ptr>::difference_type
 (_Deque_iterator<_Tp, _Ref, _Ptr>::_S_buffer_size())
 * (__x._M_node - __y._M_node - 1) + (__x._M_cur - __x._M_first)
 + (__y._M_last - __y._M_cur);
    }

  template<typename _Tp, typename _RefL, typename _PtrL,
    typename _RefR, typename _PtrR>
    inline typename _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type
    operator-(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
       const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) noexcept
    {
      return typename _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type
 (_Deque_iterator<_Tp, _RefL, _PtrL>::_S_buffer_size())
 * (__x._M_node - __y._M_node - 1) + (__x._M_cur - __x._M_first)
 + (__y._M_last - __y._M_cur);
    }

  template<typename _Tp, typename _Ref, typename _Ptr>
    inline _Deque_iterator<_Tp, _Ref, _Ptr>
    operator+(ptrdiff_t __n, const _Deque_iterator<_Tp, _Ref, _Ptr>& __x)
    noexcept
    { return __x + __n; }

  template<typename _Tp>
    void
    fill(const _Deque_iterator<_Tp, _Tp&, _Tp*>&,
  const _Deque_iterator<_Tp, _Tp&, _Tp*>&, const _Tp&);

  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    copy(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
  _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
  _Deque_iterator<_Tp, _Tp&, _Tp*>);

  template<typename _Tp>
    inline _Deque_iterator<_Tp, _Tp&, _Tp*>
    copy(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
  _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
  _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    { return std::copy(_Deque_iterator<_Tp, const _Tp&, const _Tp*>(__first),
         _Deque_iterator<_Tp, const _Tp&, const _Tp*>(__last),
         __result); }

  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    copy_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
    _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
    _Deque_iterator<_Tp, _Tp&, _Tp*>);

  template<typename _Tp>
    inline _Deque_iterator<_Tp, _Tp&, _Tp*>
    copy_backward(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
    _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
    _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    { return std::copy_backward(_Deque_iterator<_Tp,
    const _Tp&, const _Tp*>(__first),
    _Deque_iterator<_Tp,
    const _Tp&, const _Tp*>(__last),
    __result); }


  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    move(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
  _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
  _Deque_iterator<_Tp, _Tp&, _Tp*>);

  template<typename _Tp>
    inline _Deque_iterator<_Tp, _Tp&, _Tp*>
    move(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
  _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
  _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    { return std::move(_Deque_iterator<_Tp, const _Tp&, const _Tp*>(__first),
         _Deque_iterator<_Tp, const _Tp&, const _Tp*>(__last),
         __result); }

  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    move_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
    _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
    _Deque_iterator<_Tp, _Tp&, _Tp*>);

  template<typename _Tp>
    inline _Deque_iterator<_Tp, _Tp&, _Tp*>
    move_backward(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
    _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
    _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    { return std::move_backward(_Deque_iterator<_Tp,
    const _Tp&, const _Tp*>(__first),
    _Deque_iterator<_Tp,
    const _Tp&, const _Tp*>(__last),
    __result); }
# 457 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
  template<typename _Tp, typename _Alloc>
    class _Deque_base
    {
    protected:
      typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
 rebind<_Tp>::other _Tp_alloc_type;
      typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;





      typedef typename _Alloc_traits::pointer _Ptr;
      typedef typename _Alloc_traits::const_pointer _Ptr_const;


      typedef typename _Alloc_traits::template rebind<_Ptr>::other
 _Map_alloc_type;
      typedef __gnu_cxx::__alloc_traits<_Map_alloc_type> _Map_alloc_traits;

    public:
      typedef _Alloc allocator_type;
      typedef typename _Alloc_traits::size_type size_type;

      allocator_type
      get_allocator() const noexcept
      { return allocator_type(_M_get_Tp_allocator()); }

      typedef _Deque_iterator<_Tp, _Tp&, _Ptr> iterator;
      typedef _Deque_iterator<_Tp, const _Tp&, _Ptr_const> const_iterator;

      _Deque_base()
      : _M_impl()
      { _M_initialize_map(0); }

      _Deque_base(size_t __num_elements)
      : _M_impl()
      { _M_initialize_map(__num_elements); }

      _Deque_base(const allocator_type& __a, size_t __num_elements)
      : _M_impl(__a)
      { _M_initialize_map(__num_elements); }

      _Deque_base(const allocator_type& __a)
      : _M_impl(__a)
      { }


      _Deque_base(_Deque_base&& __x, false_type)
      : _M_impl(__x._M_move_impl())
      { }

      _Deque_base(_Deque_base&& __x, true_type)
      : _M_impl(std::move(__x._M_get_Tp_allocator()))
      {
 _M_initialize_map(0);
 if (__x._M_impl._M_map)
   this->_M_impl._M_swap_data(__x._M_impl);
      }

      _Deque_base(_Deque_base&& __x)
      : _Deque_base(std::move(__x), typename _Alloc_traits::is_always_equal{})
      { }

      _Deque_base(_Deque_base&& __x, const allocator_type& __a, size_type __n)
      : _M_impl(__a)
      {
 if (__x.get_allocator() == __a)
   {
     if (__x._M_impl._M_map)
       {
  _M_initialize_map(0);
  this->_M_impl._M_swap_data(__x._M_impl);
       }
   }
 else
   {
     _M_initialize_map(__n);
   }
      }


      ~_Deque_base() noexcept;

    protected:
      typedef typename iterator::_Map_pointer _Map_pointer;




      struct _Deque_impl
      : public _Tp_alloc_type
      {
 _Map_pointer _M_map;
 size_t _M_map_size;
 iterator _M_start;
 iterator _M_finish;

 _Deque_impl()
 : _Tp_alloc_type(), _M_map(), _M_map_size(0),
   _M_start(), _M_finish()
 { }

 _Deque_impl(const _Tp_alloc_type& __a) noexcept
 : _Tp_alloc_type(__a), _M_map(), _M_map_size(0),
   _M_start(), _M_finish()
 { }


 _Deque_impl(_Deque_impl&&) = default;

 _Deque_impl(_Tp_alloc_type&& __a) noexcept
 : _Tp_alloc_type(std::move(__a)), _M_map(), _M_map_size(0),
   _M_start(), _M_finish()
 { }


 void _M_swap_data(_Deque_impl& __x) noexcept
 {
   using std::swap;
   swap(this->_M_start, __x._M_start);
   swap(this->_M_finish, __x._M_finish);
   swap(this->_M_map, __x._M_map);
   swap(this->_M_map_size, __x._M_map_size);
 }
      };

      _Tp_alloc_type&
      _M_get_Tp_allocator() noexcept
      { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); }

      const _Tp_alloc_type&
      _M_get_Tp_allocator() const noexcept
      { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }

      _Map_alloc_type
      _M_get_map_allocator() const noexcept
      { return _Map_alloc_type(_M_get_Tp_allocator()); }

      _Ptr
      _M_allocate_node()
      {
 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Traits;
 return _Traits::allocate(_M_impl, __deque_buf_size(sizeof(_Tp)));
      }

      void
      _M_deallocate_node(_Ptr __p) noexcept
      {
 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Traits;
 _Traits::deallocate(_M_impl, __p, __deque_buf_size(sizeof(_Tp)));
      }

      _Map_pointer
      _M_allocate_map(size_t __n)
      {
 _Map_alloc_type __map_alloc = _M_get_map_allocator();
 return _Map_alloc_traits::allocate(__map_alloc, __n);
      }

      void
      _M_deallocate_map(_Map_pointer __p, size_t __n) noexcept
      {
 _Map_alloc_type __map_alloc = _M_get_map_allocator();
 _Map_alloc_traits::deallocate(__map_alloc, __p, __n);
      }

    protected:
      void _M_initialize_map(size_t);
      void _M_create_nodes(_Map_pointer __nstart, _Map_pointer __nfinish);
      void _M_destroy_nodes(_Map_pointer __nstart,
       _Map_pointer __nfinish) noexcept;
      enum { _S_initial_map_size = 8 };

      _Deque_impl _M_impl;


    private:
      _Deque_impl
      _M_move_impl()
      {
 if (!_M_impl._M_map)
   return std::move(_M_impl);


 _Tp_alloc_type __alloc{_M_get_Tp_allocator()};

 _Tp_alloc_type __sink __attribute((__unused__)) {std::move(__alloc)};

 _Deque_base __empty{__alloc};
 __empty._M_initialize_map(0);

 _Deque_impl __ret{std::move(_M_get_Tp_allocator())};
 _M_impl._M_swap_data(__ret);
 _M_impl._M_swap_data(__empty._M_impl);
 return __ret;
      }

    };

  template<typename _Tp, typename _Alloc>
    _Deque_base<_Tp, _Alloc>::
    ~_Deque_base() noexcept
    {
      if (this->_M_impl._M_map)
 {
   _M_destroy_nodes(this->_M_impl._M_start._M_node,
      this->_M_impl._M_finish._M_node + 1);
   _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
 }
    }
# 677 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
  template<typename _Tp, typename _Alloc>
    void
    _Deque_base<_Tp, _Alloc>::
    _M_initialize_map(size_t __num_elements)
    {
      const size_t __num_nodes = (__num_elements/ __deque_buf_size(sizeof(_Tp))
      + 1);

      this->_M_impl._M_map_size = std::max((size_t) _S_initial_map_size,
        size_t(__num_nodes + 2));
      this->_M_impl._M_map = _M_allocate_map(this->_M_impl._M_map_size);






      _Map_pointer __nstart = (this->_M_impl._M_map
          + (this->_M_impl._M_map_size - __num_nodes) / 2);
      _Map_pointer __nfinish = __nstart + __num_nodes;

      try
 { _M_create_nodes(__nstart, __nfinish); }
      catch(...)
 {
   _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
   this->_M_impl._M_map = _Map_pointer();
   this->_M_impl._M_map_size = 0;
   throw;
 }

      this->_M_impl._M_start._M_set_node(__nstart);
      this->_M_impl._M_finish._M_set_node(__nfinish - 1);
      this->_M_impl._M_start._M_cur = _M_impl._M_start._M_first;
      this->_M_impl._M_finish._M_cur = (this->_M_impl._M_finish._M_first
     + __num_elements
     % __deque_buf_size(sizeof(_Tp)));
    }

  template<typename _Tp, typename _Alloc>
    void
    _Deque_base<_Tp, _Alloc>::
    _M_create_nodes(_Map_pointer __nstart, _Map_pointer __nfinish)
    {
      _Map_pointer __cur;
      try
 {
   for (__cur = __nstart; __cur < __nfinish; ++__cur)
     *__cur = this->_M_allocate_node();
 }
      catch(...)
 {
   _M_destroy_nodes(__nstart, __cur);
   throw;
 }
    }

  template<typename _Tp, typename _Alloc>
    void
    _Deque_base<_Tp, _Alloc>::
    _M_destroy_nodes(_Map_pointer __nstart,
       _Map_pointer __nfinish) noexcept
    {
      for (_Map_pointer __n = __nstart; __n < __nfinish; ++__n)
 _M_deallocate_node(*__n);
    }
# 828 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
  template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
    class deque : protected _Deque_base<_Tp, _Alloc>
    {

      typedef typename _Alloc::value_type _Alloc_value_type;





      typedef _Deque_base<_Tp, _Alloc> _Base;
      typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
      typedef typename _Base::_Alloc_traits _Alloc_traits;
      typedef typename _Base::_Map_pointer _Map_pointer;

    public:
      typedef _Tp value_type;
      typedef typename _Alloc_traits::pointer pointer;
      typedef typename _Alloc_traits::const_pointer const_pointer;
      typedef typename _Alloc_traits::reference reference;
      typedef typename _Alloc_traits::const_reference const_reference;
      typedef typename _Base::iterator iterator;
      typedef typename _Base::const_iterator const_iterator;
      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
      typedef std::reverse_iterator<iterator> reverse_iterator;
      typedef size_t size_type;
      typedef ptrdiff_t difference_type;
      typedef _Alloc allocator_type;

    protected:
      static size_t _S_buffer_size() noexcept
      { return __deque_buf_size(sizeof(_Tp)); }


      using _Base::_M_initialize_map;
      using _Base::_M_create_nodes;
      using _Base::_M_destroy_nodes;
      using _Base::_M_allocate_node;
      using _Base::_M_deallocate_node;
      using _Base::_M_allocate_map;
      using _Base::_M_deallocate_map;
      using _Base::_M_get_Tp_allocator;





      using _Base::_M_impl;

    public:






      deque() : _Base() { }





      explicit
      deque(const allocator_type& __a)
      : _Base(__a, 0) { }
# 903 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      explicit
      deque(size_type __n, const allocator_type& __a = allocator_type())
      : _Base(__a, __n)
      { _M_default_initialize(); }
# 916 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      deque(size_type __n, const value_type& __value,
     const allocator_type& __a = allocator_type())
      : _Base(__a, __n)
      { _M_fill_initialize(__value); }
# 943 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      deque(const deque& __x)
      : _Base(_Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()),
       __x.size())
      { std::__uninitialized_copy_a(__x.begin(), __x.end(),
        this->_M_impl._M_start,
        _M_get_Tp_allocator()); }
# 958 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      deque(deque&& __x)
      : _Base(std::move(__x)) { }


      deque(const deque& __x, const allocator_type& __a)
      : _Base(__a, __x.size())
      { std::__uninitialized_copy_a(__x.begin(), __x.end(),
        this->_M_impl._M_start,
        _M_get_Tp_allocator()); }


      deque(deque&& __x, const allocator_type& __a)
      : _Base(std::move(__x), __a, __x.size())
      {
 if (__x.get_allocator() != __a)
   {
     std::__uninitialized_move_a(__x.begin(), __x.end(),
     this->_M_impl._M_start,
     _M_get_Tp_allocator());
     __x.clear();
   }
      }
# 992 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      deque(initializer_list<value_type> __l,
     const allocator_type& __a = allocator_type())
      : _Base(__a)
      {
 _M_range_initialize(__l.begin(), __l.end(),
       random_access_iterator_tag());
      }
# 1017 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
        deque(_InputIterator __first, _InputIterator __last,
       const allocator_type& __a = allocator_type())
 : _Base(__a)
        { _M_initialize_dispatch(__first, __last, __false_type()); }
# 1040 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      ~deque()
      { _M_destroy_data(begin(), end(), _M_get_Tp_allocator()); }
# 1050 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      deque&
      operator=(const deque& __x);
# 1062 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      deque&
      operator=(deque&& __x) noexcept(_Alloc_traits::_S_always_equal())
      {
 using __always_equal = typename _Alloc_traits::is_always_equal;
 _M_move_assign1(std::move(__x), __always_equal{});
 return *this;
      }
# 1081 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      deque&
      operator=(initializer_list<value_type> __l)
      {
 this->assign(__l.begin(), __l.end());
 return *this;
      }
# 1099 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      assign(size_type __n, const value_type& __val)
      { _M_fill_assign(__n, __val); }
# 1116 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
        void
        assign(_InputIterator __first, _InputIterator __last)
        { _M_assign_dispatch(__first, __last, __false_type()); }
# 1143 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      assign(initializer_list<value_type> __l)
      { this->assign(__l.begin(), __l.end()); }



      allocator_type
      get_allocator() const noexcept
      { return _Base::get_allocator(); }






      iterator
      begin() noexcept
      { return this->_M_impl._M_start; }





      const_iterator
      begin() const noexcept
      { return this->_M_impl._M_start; }






      iterator
      end() noexcept
      { return this->_M_impl._M_finish; }






      const_iterator
      end() const noexcept
      { return this->_M_impl._M_finish; }






      reverse_iterator
      rbegin() noexcept
      { return reverse_iterator(this->_M_impl._M_finish); }






      const_reverse_iterator
      rbegin() const noexcept
      { return const_reverse_iterator(this->_M_impl._M_finish); }






      reverse_iterator
      rend() noexcept
      { return reverse_iterator(this->_M_impl._M_start); }






      const_reverse_iterator
      rend() const noexcept
      { return const_reverse_iterator(this->_M_impl._M_start); }






      const_iterator
      cbegin() const noexcept
      { return this->_M_impl._M_start; }






      const_iterator
      cend() const noexcept
      { return this->_M_impl._M_finish; }






      const_reverse_iterator
      crbegin() const noexcept
      { return const_reverse_iterator(this->_M_impl._M_finish); }






      const_reverse_iterator
      crend() const noexcept
      { return const_reverse_iterator(this->_M_impl._M_start); }




      size_type
      size() const noexcept
      { return this->_M_impl._M_finish - this->_M_impl._M_start; }


      size_type
      max_size() const noexcept
      { return _Alloc_traits::max_size(_M_get_Tp_allocator()); }
# 1282 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      resize(size_type __new_size)
      {
 const size_type __len = size();
 if (__new_size > __len)
   _M_default_append(__new_size - __len);
 else if (__new_size < __len)
   _M_erase_at_end(this->_M_impl._M_start
     + difference_type(__new_size));
      }
# 1304 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      resize(size_type __new_size, const value_type& __x)
      {
 const size_type __len = size();
 if (__new_size > __len)
   insert(this->_M_impl._M_finish, __new_size - __len, __x);
 else if (__new_size < __len)
   _M_erase_at_end(this->_M_impl._M_start
     + difference_type(__new_size));
      }
# 1340 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      shrink_to_fit() noexcept
      { _M_shrink_to_fit(); }






      bool
      empty() const noexcept
      { return this->_M_impl._M_finish == this->_M_impl._M_start; }
# 1365 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      reference
      operator[](size_type __n) noexcept
      { return this->_M_impl._M_start[difference_type(__n)]; }
# 1380 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      const_reference
      operator[](size_type __n) const noexcept
      { return this->_M_impl._M_start[difference_type(__n)]; }

    protected:

      void
      _M_range_check(size_type __n) const
      {
 if (__n >= this->size())
   __throw_out_of_range_fmt(("deque::_M_range_check: __n " "(which is %zu)>= this->size() " "(which is %zu)"),


       __n, this->size());
      }

    public:
# 1408 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      reference
      at(size_type __n)
      {
 _M_range_check(__n);
 return (*this)[__n];
      }
# 1426 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      const_reference
      at(size_type __n) const
      {
 _M_range_check(__n);
 return (*this)[__n];
      }





      reference
      front() noexcept
      { return *begin(); }





      const_reference
      front() const noexcept
      { return *begin(); }





      reference
      back() noexcept
      {
 iterator __tmp = end();
 --__tmp;
 return *__tmp;
      }





      const_reference
      back() const noexcept
      {
 const_iterator __tmp = end();
 --__tmp;
 return *__tmp;
      }
# 1483 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      push_front(const value_type& __x)
      {
 if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_first)
   {
     _Alloc_traits::construct(this->_M_impl,
                              this->_M_impl._M_start._M_cur - 1,
                              __x);
     --this->_M_impl._M_start._M_cur;
   }
 else
   _M_push_front_aux(__x);
      }


      void
      push_front(value_type&& __x)
      { emplace_front(std::move(__x)); }

      template<typename... _Args>
        void
        emplace_front(_Args&&... __args);
# 1516 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      push_back(const value_type& __x)
      {
 if (this->_M_impl._M_finish._M_cur
     != this->_M_impl._M_finish._M_last - 1)
   {
     _Alloc_traits::construct(this->_M_impl,
                              this->_M_impl._M_finish._M_cur, __x);
     ++this->_M_impl._M_finish._M_cur;
   }
 else
   _M_push_back_aux(__x);
      }


      void
      push_back(value_type&& __x)
      { emplace_back(std::move(__x)); }

      template<typename... _Args>
        void
        emplace_back(_Args&&... __args);
# 1548 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      pop_front() noexcept
      {
 if (this->_M_impl._M_start._M_cur
     != this->_M_impl._M_start._M_last - 1)
   {
     _Alloc_traits::destroy(this->_M_impl,
                            this->_M_impl._M_start._M_cur);
     ++this->_M_impl._M_start._M_cur;
   }
 else
   _M_pop_front_aux();
      }
# 1570 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      pop_back() noexcept
      {
 if (this->_M_impl._M_finish._M_cur
     != this->_M_impl._M_finish._M_first)
   {
     --this->_M_impl._M_finish._M_cur;
     _Alloc_traits::destroy(this->_M_impl,
                            this->_M_impl._M_finish._M_cur);
   }
 else
   _M_pop_back_aux();
      }
# 1594 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename... _Args>
        iterator
        emplace(const_iterator __position, _Args&&... __args);
# 1607 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      iterator
      insert(const_iterator __position, const value_type& __x);
# 1633 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      iterator
      insert(const_iterator __position, value_type&& __x)
      { return emplace(__position, std::move(__x)); }
# 1646 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      iterator
      insert(const_iterator __p, initializer_list<value_type> __l)
      { return this->insert(__p, __l.begin(), __l.end()); }
# 1662 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      iterator
      insert(const_iterator __position, size_type __n, const value_type& __x)
      {
 difference_type __offset = __position - cbegin();
 _M_fill_insert(__position._M_const_cast(), __n, __x);
 return begin() + __offset;
      }
# 1696 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
        iterator
        insert(const_iterator __position, _InputIterator __first,
        _InputIterator __last)
        {
   difference_type __offset = __position - cbegin();
   _M_insert_dispatch(__position._M_const_cast(),
        __first, __last, __false_type());
   return begin() + __offset;
 }
# 1742 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      iterator

      erase(const_iterator __position)



      { return _M_erase(__position._M_const_cast()); }
# 1766 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      iterator

      erase(const_iterator __first, const_iterator __last)



      { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
# 1783 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      swap(deque& __x) noexcept
      {
 _M_impl._M_swap_data(__x._M_impl);
 _Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
      __x._M_get_Tp_allocator());
      }







      void
      clear() noexcept
      { _M_erase_at_end(begin()); }

    protected:






      template<typename _Integer>
        void
        _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
        {
   _M_initialize_map(static_cast<size_type>(__n));
   _M_fill_initialize(__x);
 }


      template<typename _InputIterator>
        void
        _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
          __false_type)
        {
   typedef typename std::iterator_traits<_InputIterator>::
     iterator_category _IterCategory;
   _M_range_initialize(__first, __last, _IterCategory());
 }
# 1839 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename _InputIterator>
        void
        _M_range_initialize(_InputIterator __first, _InputIterator __last,
       std::input_iterator_tag);


      template<typename _ForwardIterator>
        void
        _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
       std::forward_iterator_tag);
# 1861 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      _M_fill_initialize(const value_type& __value);



      void
      _M_default_initialize();
# 1877 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename _Integer>
        void
        _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
        { _M_fill_assign(__n, __val); }


      template<typename _InputIterator>
        void
        _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
      __false_type)
        {
   typedef typename std::iterator_traits<_InputIterator>::
     iterator_category _IterCategory;
   _M_assign_aux(__first, __last, _IterCategory());
 }


      template<typename _InputIterator>
        void
        _M_assign_aux(_InputIterator __first, _InputIterator __last,
        std::input_iterator_tag);


      template<typename _ForwardIterator>
        void
        _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
        std::forward_iterator_tag)
        {
   const size_type __len = std::distance(__first, __last);
   if (__len > size())
     {
       _ForwardIterator __mid = __first;
       std::advance(__mid, size());
       std::copy(__first, __mid, begin());
       insert(end(), __mid, __last);
     }
   else
     _M_erase_at_end(std::copy(__first, __last, begin()));
 }



      void
      _M_fill_assign(size_type __n, const value_type& __val)
      {
 if (__n > size())
   {
     std::fill(begin(), end(), __val);
     insert(end(), __n - size(), __val);
   }
 else
   {
     _M_erase_at_end(begin() + difference_type(__n));
     std::fill(begin(), end(), __val);
   }
      }
# 1941 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename... _Args>
        void _M_push_back_aux(_Args&&... __args);

      template<typename... _Args>
        void _M_push_front_aux(_Args&&... __args);


      void _M_pop_back_aux();

      void _M_pop_front_aux();
# 1960 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      template<typename _Integer>
        void
        _M_insert_dispatch(iterator __pos,
      _Integer __n, _Integer __x, __true_type)
        { _M_fill_insert(__pos, __n, __x); }


      template<typename _InputIterator>
        void
        _M_insert_dispatch(iterator __pos,
      _InputIterator __first, _InputIterator __last,
      __false_type)
        {
   typedef typename std::iterator_traits<_InputIterator>::
     iterator_category _IterCategory;
          _M_range_insert_aux(__pos, __first, __last, _IterCategory());
 }


      template<typename _InputIterator>
        void
        _M_range_insert_aux(iterator __pos, _InputIterator __first,
       _InputIterator __last, std::input_iterator_tag);


      template<typename _ForwardIterator>
        void
        _M_range_insert_aux(iterator __pos, _ForwardIterator __first,
       _ForwardIterator __last, std::forward_iterator_tag);




      void
      _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);






      template<typename... _Args>
        iterator
        _M_insert_aux(iterator __pos, _Args&&... __args);



      void
      _M_insert_aux(iterator __pos, size_type __n, const value_type& __x);


      template<typename _ForwardIterator>
        void
        _M_insert_aux(iterator __pos,
        _ForwardIterator __first, _ForwardIterator __last,
        size_type __n);




      void
      _M_destroy_data_aux(iterator __first, iterator __last);



      template<typename _Alloc1>
        void
        _M_destroy_data(iterator __first, iterator __last, const _Alloc1&)
        { _M_destroy_data_aux(__first, __last); }

      void
      _M_destroy_data(iterator __first, iterator __last,
        const std::allocator<_Tp>&)
      {
 if (!__has_trivial_destructor(value_type))
   _M_destroy_data_aux(__first, __last);
      }


      void
      _M_erase_at_begin(iterator __pos)
      {
 _M_destroy_data(begin(), __pos, _M_get_Tp_allocator());
 _M_destroy_nodes(this->_M_impl._M_start._M_node, __pos._M_node);
 this->_M_impl._M_start = __pos;
      }



      void
      _M_erase_at_end(iterator __pos)
      {
 _M_destroy_data(__pos, end(), _M_get_Tp_allocator());
 _M_destroy_nodes(__pos._M_node + 1,
    this->_M_impl._M_finish._M_node + 1);
 this->_M_impl._M_finish = __pos;
      }

      iterator
      _M_erase(iterator __pos);

      iterator
      _M_erase(iterator __first, iterator __last);



      void
      _M_default_append(size_type __n);

      bool
      _M_shrink_to_fit();




      iterator
      _M_reserve_elements_at_front(size_type __n)
      {
 const size_type __vacancies = this->_M_impl._M_start._M_cur
                               - this->_M_impl._M_start._M_first;
 if (__n > __vacancies)
   _M_new_elements_at_front(__n - __vacancies);
 return this->_M_impl._M_start - difference_type(__n);
      }

      iterator
      _M_reserve_elements_at_back(size_type __n)
      {
 const size_type __vacancies = (this->_M_impl._M_finish._M_last
           - this->_M_impl._M_finish._M_cur) - 1;
 if (__n > __vacancies)
   _M_new_elements_at_back(__n - __vacancies);
 return this->_M_impl._M_finish + difference_type(__n);
      }

      void
      _M_new_elements_at_front(size_type __new_elements);

      void
      _M_new_elements_at_back(size_type __new_elements);
# 2111 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
      void
      _M_reserve_map_at_back(size_type __nodes_to_add = 1)
      {
 if (__nodes_to_add + 1 > this->_M_impl._M_map_size
     - (this->_M_impl._M_finish._M_node - this->_M_impl._M_map))
   _M_reallocate_map(__nodes_to_add, false);
      }

      void
      _M_reserve_map_at_front(size_type __nodes_to_add = 1)
      {
 if (__nodes_to_add > size_type(this->_M_impl._M_start._M_node
           - this->_M_impl._M_map))
   _M_reallocate_map(__nodes_to_add, true);
      }

      void
      _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);





      void
      _M_move_assign1(deque&& __x, true_type) noexcept
      {
 this->_M_impl._M_swap_data(__x._M_impl);
 __x.clear();
 std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
      }




      void
      _M_move_assign1(deque&& __x, false_type)
      {
 constexpr bool __move_storage =
   _Alloc_traits::_S_propagate_on_move_assign();
 _M_move_assign2(std::move(__x), __bool_constant<__move_storage>());
      }



      template<typename... _Args>
      void
      _M_replace_map(_Args&&... __args)
      {

 deque __newobj(std::forward<_Args>(__args)...);

 clear();
 _M_deallocate_node(*begin()._M_node);
 _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
 this->_M_impl._M_map = nullptr;
 this->_M_impl._M_map_size = 0;

 this->_M_impl._M_swap_data(__newobj._M_impl);
      }


      void
      _M_move_assign2(deque&& __x, true_type)
      {

 auto __alloc = __x._M_get_Tp_allocator();


 _M_replace_map(std::move(__x));

 _M_get_Tp_allocator() = std::move(__alloc);
      }



      void
      _M_move_assign2(deque&& __x, false_type)
      {
 if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
   {


     _M_replace_map(std::move(__x), __x.get_allocator());
   }
 else
   {


     this->assign(std::__make_move_if_noexcept_iterator(__x.begin()),
    std::__make_move_if_noexcept_iterator(__x.end()));
     __x.clear();
   }
      }

    };
# 2218 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
  template<typename _Tp, typename _Alloc>
    inline bool
    operator==(const deque<_Tp, _Alloc>& __x,
                         const deque<_Tp, _Alloc>& __y)
    { return __x.size() == __y.size()
             && std::equal(__x.begin(), __x.end(), __y.begin()); }
# 2236 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_deque.h" 3
  template<typename _Tp, typename _Alloc>
    inline bool
    operator<(const deque<_Tp, _Alloc>& __x,
       const deque<_Tp, _Alloc>& __y)
    { return std::lexicographical_compare(__x.begin(), __x.end(),
       __y.begin(), __y.end()); }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator!=(const deque<_Tp, _Alloc>& __x,
        const deque<_Tp, _Alloc>& __y)
    { return !(__x == __y); }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator>(const deque<_Tp, _Alloc>& __x,
       const deque<_Tp, _Alloc>& __y)
    { return __y < __x; }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator<=(const deque<_Tp, _Alloc>& __x,
        const deque<_Tp, _Alloc>& __y)
    { return !(__y < __x); }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator>=(const deque<_Tp, _Alloc>& __x,
        const deque<_Tp, _Alloc>& __y)
    { return !(__x < __y); }


  template<typename _Tp, typename _Alloc>
    inline void
    swap(deque<_Tp,_Alloc>& __x, deque<_Tp,_Alloc>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }




}
# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/deque" 2 3

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/deque.tcc" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/deque.tcc" 3
namespace std __attribute__ ((__visibility__ ("default")))
{



  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_default_initialize()
    {
      _Map_pointer __cur;
      try
        {
          for (__cur = this->_M_impl._M_start._M_node;
        __cur < this->_M_impl._M_finish._M_node;
        ++__cur)
            std::__uninitialized_default_a(*__cur, *__cur + _S_buffer_size(),
        _M_get_Tp_allocator());
          std::__uninitialized_default_a(this->_M_impl._M_finish._M_first,
      this->_M_impl._M_finish._M_cur,
      _M_get_Tp_allocator());
        }
      catch(...)
        {
          std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur),
   _M_get_Tp_allocator());
          throw;
        }
    }


  template <typename _Tp, typename _Alloc>
    deque<_Tp, _Alloc>&
    deque<_Tp, _Alloc>::
    operator=(const deque& __x)
    {
      if (&__x != this)
 {

   if (_Alloc_traits::_S_propagate_on_copy_assign())
     {
       if (!_Alloc_traits::_S_always_equal()
           && _M_get_Tp_allocator() != __x._M_get_Tp_allocator())
         {


    _M_replace_map(__x, __x.get_allocator());
    std::__alloc_on_copy(_M_get_Tp_allocator(),
           __x._M_get_Tp_allocator());
    return *this;
  }
       std::__alloc_on_copy(_M_get_Tp_allocator(),
       __x._M_get_Tp_allocator());
     }

   const size_type __len = size();
   if (__len >= __x.size())
     _M_erase_at_end(std::copy(__x.begin(), __x.end(),
          this->_M_impl._M_start));
   else
     {
       const_iterator __mid = __x.begin() + difference_type(__len);
       std::copy(__x.begin(), __mid, this->_M_impl._M_start);
       insert(this->_M_impl._M_finish, __mid, __x.end());
     }
 }
      return *this;
    }


  template<typename _Tp, typename _Alloc>
    template<typename... _Args>
      void
      deque<_Tp, _Alloc>::
      emplace_front(_Args&&... __args)
      {
 if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_first)
   {
     _Alloc_traits::construct(this->_M_impl,
                              this->_M_impl._M_start._M_cur - 1,
                std::forward<_Args>(__args)...);
     --this->_M_impl._M_start._M_cur;
   }
 else
   _M_push_front_aux(std::forward<_Args>(__args)...);
      }

  template<typename _Tp, typename _Alloc>
    template<typename... _Args>
      void
      deque<_Tp, _Alloc>::
      emplace_back(_Args&&... __args)
      {
 if (this->_M_impl._M_finish._M_cur
     != this->_M_impl._M_finish._M_last - 1)
   {
     _Alloc_traits::construct(this->_M_impl,
                              this->_M_impl._M_finish._M_cur,
                std::forward<_Args>(__args)...);
     ++this->_M_impl._M_finish._M_cur;
   }
 else
   _M_push_back_aux(std::forward<_Args>(__args)...);
      }



  template<typename _Tp, typename _Alloc>
    template<typename... _Args>
      typename deque<_Tp, _Alloc>::iterator
      deque<_Tp, _Alloc>::
      emplace(const_iterator __position, _Args&&... __args)
      {
 if (__position._M_cur == this->_M_impl._M_start._M_cur)
   {
     emplace_front(std::forward<_Args>(__args)...);
     return this->_M_impl._M_start;
   }
 else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
   {
     emplace_back(std::forward<_Args>(__args)...);
     iterator __tmp = this->_M_impl._M_finish;
     --__tmp;
     return __tmp;
   }
 else
   return _M_insert_aux(__position._M_const_cast(),
          std::forward<_Args>(__args)...);
      }


  template <typename _Tp, typename _Alloc>
    typename deque<_Tp, _Alloc>::iterator
    deque<_Tp, _Alloc>::

    insert(const_iterator __position, const value_type& __x)



    {
      if (__position._M_cur == this->_M_impl._M_start._M_cur)
 {
   push_front(__x);
   return this->_M_impl._M_start;
 }
      else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
 {
   push_back(__x);
   iterator __tmp = this->_M_impl._M_finish;
   --__tmp;
   return __tmp;
 }
      else
 return _M_insert_aux(__position._M_const_cast(), __x);
   }

  template <typename _Tp, typename _Alloc>
    typename deque<_Tp, _Alloc>::iterator
    deque<_Tp, _Alloc>::
    _M_erase(iterator __position)
    {
      iterator __next = __position;
      ++__next;
      const difference_type __index = __position - begin();
      if (static_cast<size_type>(__index) < (size() >> 1))
 {
   if (__position != begin())
     std::move_backward(begin(), __position, __next);
   pop_front();
 }
      else
 {
   if (__next != end())
     std::move(__next, end(), __position);
   pop_back();
 }
      return begin() + __index;
    }

  template <typename _Tp, typename _Alloc>
    typename deque<_Tp, _Alloc>::iterator
    deque<_Tp, _Alloc>::
    _M_erase(iterator __first, iterator __last)
    {
      if (__first == __last)
 return __first;
      else if (__first == begin() && __last == end())
 {
   clear();
   return end();
 }
      else
 {
   const difference_type __n = __last - __first;
   const difference_type __elems_before = __first - begin();
   if (static_cast<size_type>(__elems_before) <= (size() - __n) / 2)
     {
       if (__first != begin())
  std::move_backward(begin(), __first, __last);
       _M_erase_at_begin(begin() + __n);
     }
   else
     {
       if (__last != end())
  std::move(__last, end(), __first);
       _M_erase_at_end(end() - __n);
     }
   return begin() + __elems_before;
 }
    }

  template <typename _Tp, class _Alloc>
    template <typename _InputIterator>
      void
      deque<_Tp, _Alloc>::
      _M_assign_aux(_InputIterator __first, _InputIterator __last,
      std::input_iterator_tag)
      {
        iterator __cur = begin();
        for (; __first != __last && __cur != end(); ++__cur, ++__first)
          *__cur = *__first;
        if (__first == __last)
          _M_erase_at_end(__cur);
        else
          insert(end(), __first, __last);
      }

  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_fill_insert(iterator __pos, size_type __n, const value_type& __x)
    {
      if (__pos._M_cur == this->_M_impl._M_start._M_cur)
 {
   iterator __new_start = _M_reserve_elements_at_front(__n);
   try
     {
       std::__uninitialized_fill_a(__new_start, this->_M_impl._M_start,
       __x, _M_get_Tp_allocator());
       this->_M_impl._M_start = __new_start;
     }
   catch(...)
     {
       _M_destroy_nodes(__new_start._M_node,
          this->_M_impl._M_start._M_node);
       throw;
     }
 }
      else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
 {
   iterator __new_finish = _M_reserve_elements_at_back(__n);
   try
     {
       std::__uninitialized_fill_a(this->_M_impl._M_finish,
       __new_finish, __x,
       _M_get_Tp_allocator());
       this->_M_impl._M_finish = __new_finish;
     }
   catch(...)
     {
       _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
          __new_finish._M_node + 1);
       throw;
     }
 }
      else
        _M_insert_aux(__pos, __n, __x);
    }


  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_default_append(size_type __n)
    {
      if (__n)
 {
   iterator __new_finish = _M_reserve_elements_at_back(__n);
   try
     {
       std::__uninitialized_default_a(this->_M_impl._M_finish,
          __new_finish,
          _M_get_Tp_allocator());
       this->_M_impl._M_finish = __new_finish;
     }
   catch(...)
     {
       _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
          __new_finish._M_node + 1);
       throw;
     }
 }
    }

  template <typename _Tp, typename _Alloc>
    bool
    deque<_Tp, _Alloc>::
    _M_shrink_to_fit()
    {
      const difference_type __front_capacity
 = (this->_M_impl._M_start._M_cur - this->_M_impl._M_start._M_first);
      if (__front_capacity == 0)
 return false;

      const difference_type __back_capacity
 = (this->_M_impl._M_finish._M_last - this->_M_impl._M_finish._M_cur);
      if (__front_capacity + __back_capacity < _S_buffer_size())
 return false;

      return std::__shrink_to_fit_aux<deque>::_S_do_it(*this);
    }


  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_fill_initialize(const value_type& __value)
    {
      _Map_pointer __cur;
      try
        {
          for (__cur = this->_M_impl._M_start._M_node;
        __cur < this->_M_impl._M_finish._M_node;
        ++__cur)
            std::__uninitialized_fill_a(*__cur, *__cur + _S_buffer_size(),
     __value, _M_get_Tp_allocator());
          std::__uninitialized_fill_a(this->_M_impl._M_finish._M_first,
          this->_M_impl._M_finish._M_cur,
          __value, _M_get_Tp_allocator());
        }
      catch(...)
        {
          std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur),
   _M_get_Tp_allocator());
          throw;
        }
    }

  template <typename _Tp, typename _Alloc>
    template <typename _InputIterator>
      void
      deque<_Tp, _Alloc>::
      _M_range_initialize(_InputIterator __first, _InputIterator __last,
                          std::input_iterator_tag)
      {
        this->_M_initialize_map(0);
        try
          {
            for (; __first != __last; ++__first)

       emplace_back(*__first);



          }
        catch(...)
          {
            clear();
            throw;
          }
      }

  template <typename _Tp, typename _Alloc>
    template <typename _ForwardIterator>
      void
      deque<_Tp, _Alloc>::
      _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
                          std::forward_iterator_tag)
      {
        const size_type __n = std::distance(__first, __last);
        this->_M_initialize_map(__n);

        _Map_pointer __cur_node;
        try
          {
            for (__cur_node = this->_M_impl._M_start._M_node;
                 __cur_node < this->_M_impl._M_finish._M_node;
                 ++__cur_node)
       {
  _ForwardIterator __mid = __first;
  std::advance(__mid, _S_buffer_size());
  std::__uninitialized_copy_a(__first, __mid, *__cur_node,
         _M_get_Tp_allocator());
  __first = __mid;
       }
            std::__uninitialized_copy_a(__first, __last,
     this->_M_impl._M_finish._M_first,
     _M_get_Tp_allocator());
          }
        catch(...)
          {
            std::_Destroy(this->_M_impl._M_start,
     iterator(*__cur_node, __cur_node),
     _M_get_Tp_allocator());
            throw;
          }
      }


  template<typename _Tp, typename _Alloc>

    template<typename... _Args>
      void
      deque<_Tp, _Alloc>::
      _M_push_back_aux(_Args&&... __args)





      {
 _M_reserve_map_at_back();
 *(this->_M_impl._M_finish._M_node + 1) = this->_M_allocate_node();
 try
   {

     _Alloc_traits::construct(this->_M_impl,
                              this->_M_impl._M_finish._M_cur,
                std::forward<_Args>(__args)...);



     this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node
      + 1);
     this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first;
   }
 catch(...)
   {
     _M_deallocate_node(*(this->_M_impl._M_finish._M_node + 1));
     throw;
   }
      }


  template<typename _Tp, typename _Alloc>

    template<typename... _Args>
      void
      deque<_Tp, _Alloc>::
      _M_push_front_aux(_Args&&... __args)





      {
 _M_reserve_map_at_front();
 *(this->_M_impl._M_start._M_node - 1) = this->_M_allocate_node();
 try
   {
     this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node
            - 1);
     this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_last - 1;

     _Alloc_traits::construct(this->_M_impl,
                              this->_M_impl._M_start._M_cur,
                std::forward<_Args>(__args)...);



   }
 catch(...)
   {
     ++this->_M_impl._M_start;
     _M_deallocate_node(*(this->_M_impl._M_start._M_node - 1));
     throw;
   }
      }


  template <typename _Tp, typename _Alloc>
    void deque<_Tp, _Alloc>::
    _M_pop_back_aux()
    {
      _M_deallocate_node(this->_M_impl._M_finish._M_first);
      this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1);
      this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1;
      _Alloc_traits::destroy(_M_get_Tp_allocator(),
        this->_M_impl._M_finish._M_cur);
    }






  template <typename _Tp, typename _Alloc>
    void deque<_Tp, _Alloc>::
    _M_pop_front_aux()
    {
      _Alloc_traits::destroy(_M_get_Tp_allocator(),
        this->_M_impl._M_start._M_cur);
      _M_deallocate_node(this->_M_impl._M_start._M_first);
      this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1);
      this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first;
    }

  template <typename _Tp, typename _Alloc>
    template <typename _InputIterator>
      void
      deque<_Tp, _Alloc>::
      _M_range_insert_aux(iterator __pos,
                          _InputIterator __first, _InputIterator __last,
                          std::input_iterator_tag)
      { std::copy(__first, __last, std::inserter(*this, __pos)); }

  template <typename _Tp, typename _Alloc>
    template <typename _ForwardIterator>
      void
      deque<_Tp, _Alloc>::
      _M_range_insert_aux(iterator __pos,
                          _ForwardIterator __first, _ForwardIterator __last,
                          std::forward_iterator_tag)
      {
        const size_type __n = std::distance(__first, __last);
        if (__pos._M_cur == this->_M_impl._M_start._M_cur)
   {
     iterator __new_start = _M_reserve_elements_at_front(__n);
     try
       {
  std::__uninitialized_copy_a(__first, __last, __new_start,
         _M_get_Tp_allocator());
  this->_M_impl._M_start = __new_start;
       }
     catch(...)
       {
  _M_destroy_nodes(__new_start._M_node,
     this->_M_impl._M_start._M_node);
  throw;
       }
   }
        else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
   {
     iterator __new_finish = _M_reserve_elements_at_back(__n);
     try
       {
  std::__uninitialized_copy_a(__first, __last,
         this->_M_impl._M_finish,
         _M_get_Tp_allocator());
  this->_M_impl._M_finish = __new_finish;
       }
     catch(...)
       {
  _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
     __new_finish._M_node + 1);
  throw;
       }
   }
        else
          _M_insert_aux(__pos, __first, __last, __n);
      }

  template<typename _Tp, typename _Alloc>

    template<typename... _Args>
      typename deque<_Tp, _Alloc>::iterator
      deque<_Tp, _Alloc>::
      _M_insert_aux(iterator __pos, _Args&&... __args)
      {
 value_type __x_copy(std::forward<_Args>(__args)...);







 difference_type __index = __pos - this->_M_impl._M_start;
 if (static_cast<size_type>(__index) < size() / 2)
   {
     push_front(std::move(front()));
     iterator __front1 = this->_M_impl._M_start;
     ++__front1;
     iterator __front2 = __front1;
     ++__front2;
     __pos = this->_M_impl._M_start + __index;
     iterator __pos1 = __pos;
     ++__pos1;
     std::move(__front2, __pos1, __front1);
   }
 else
   {
     push_back(std::move(back()));
     iterator __back1 = this->_M_impl._M_finish;
     --__back1;
     iterator __back2 = __back1;
     --__back2;
     __pos = this->_M_impl._M_start + __index;
     std::move_backward(__pos, __back2, __back1);
   }
 *__pos = std::move(__x_copy);
 return __pos;
      }

  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_insert_aux(iterator __pos, size_type __n, const value_type& __x)
    {
      const difference_type __elems_before = __pos - this->_M_impl._M_start;
      const size_type __length = this->size();
      value_type __x_copy = __x;
      if (__elems_before < difference_type(__length / 2))
 {
   iterator __new_start = _M_reserve_elements_at_front(__n);
   iterator __old_start = this->_M_impl._M_start;
   __pos = this->_M_impl._M_start + __elems_before;
   try
     {
       if (__elems_before >= difference_type(__n))
  {
    iterator __start_n = (this->_M_impl._M_start
     + difference_type(__n));
    std::__uninitialized_move_a(this->_M_impl._M_start,
           __start_n, __new_start,
           _M_get_Tp_allocator());
    this->_M_impl._M_start = __new_start;
    std::move(__start_n, __pos, __old_start);
    std::fill(__pos - difference_type(__n), __pos, __x_copy);
  }
       else
  {
    std::__uninitialized_move_fill(this->_M_impl._M_start,
       __pos, __new_start,
       this->_M_impl._M_start,
       __x_copy,
       _M_get_Tp_allocator());
    this->_M_impl._M_start = __new_start;
    std::fill(__old_start, __pos, __x_copy);
  }
     }
   catch(...)
     {
       _M_destroy_nodes(__new_start._M_node,
          this->_M_impl._M_start._M_node);
       throw;
     }
 }
      else
 {
   iterator __new_finish = _M_reserve_elements_at_back(__n);
   iterator __old_finish = this->_M_impl._M_finish;
   const difference_type __elems_after =
     difference_type(__length) - __elems_before;
   __pos = this->_M_impl._M_finish - __elems_after;
   try
     {
       if (__elems_after > difference_type(__n))
  {
    iterator __finish_n = (this->_M_impl._M_finish
      - difference_type(__n));
    std::__uninitialized_move_a(__finish_n,
           this->_M_impl._M_finish,
           this->_M_impl._M_finish,
           _M_get_Tp_allocator());
    this->_M_impl._M_finish = __new_finish;
    std::move_backward(__pos, __finish_n, __old_finish);
    std::fill(__pos, __pos + difference_type(__n), __x_copy);
  }
       else
  {
    std::__uninitialized_fill_move(this->_M_impl._M_finish,
       __pos + difference_type(__n),
       __x_copy, __pos,
       this->_M_impl._M_finish,
       _M_get_Tp_allocator());
    this->_M_impl._M_finish = __new_finish;
    std::fill(__pos, __old_finish, __x_copy);
  }
     }
   catch(...)
     {
       _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
          __new_finish._M_node + 1);
       throw;
     }
 }
    }

  template <typename _Tp, typename _Alloc>
    template <typename _ForwardIterator>
      void
      deque<_Tp, _Alloc>::
      _M_insert_aux(iterator __pos,
                    _ForwardIterator __first, _ForwardIterator __last,
                    size_type __n)
      {
        const difference_type __elemsbefore = __pos - this->_M_impl._M_start;
        const size_type __length = size();
        if (static_cast<size_type>(__elemsbefore) < __length / 2)
   {
     iterator __new_start = _M_reserve_elements_at_front(__n);
     iterator __old_start = this->_M_impl._M_start;
     __pos = this->_M_impl._M_start + __elemsbefore;
     try
       {
  if (__elemsbefore >= difference_type(__n))
    {
      iterator __start_n = (this->_M_impl._M_start
       + difference_type(__n));
      std::__uninitialized_move_a(this->_M_impl._M_start,
      __start_n, __new_start,
      _M_get_Tp_allocator());
      this->_M_impl._M_start = __new_start;
      std::move(__start_n, __pos, __old_start);
      std::copy(__first, __last, __pos - difference_type(__n));
    }
  else
    {
      _ForwardIterator __mid = __first;
      std::advance(__mid, difference_type(__n) - __elemsbefore);
      std::__uninitialized_move_copy(this->_M_impl._M_start,
         __pos, __first, __mid,
         __new_start,
         _M_get_Tp_allocator());
      this->_M_impl._M_start = __new_start;
      std::copy(__mid, __last, __old_start);
    }
       }
     catch(...)
       {
  _M_destroy_nodes(__new_start._M_node,
     this->_M_impl._M_start._M_node);
  throw;
       }
   }
        else
        {
          iterator __new_finish = _M_reserve_elements_at_back(__n);
          iterator __old_finish = this->_M_impl._M_finish;
          const difference_type __elemsafter =
            difference_type(__length) - __elemsbefore;
          __pos = this->_M_impl._M_finish - __elemsafter;
          try
            {
              if (__elemsafter > difference_type(__n))
  {
    iterator __finish_n = (this->_M_impl._M_finish
      - difference_type(__n));
    std::__uninitialized_move_a(__finish_n,
           this->_M_impl._M_finish,
           this->_M_impl._M_finish,
           _M_get_Tp_allocator());
    this->_M_impl._M_finish = __new_finish;
    std::move_backward(__pos, __finish_n, __old_finish);
    std::copy(__first, __last, __pos);
  }
              else
  {
    _ForwardIterator __mid = __first;
    std::advance(__mid, __elemsafter);
    std::__uninitialized_copy_move(__mid, __last, __pos,
       this->_M_impl._M_finish,
       this->_M_impl._M_finish,
       _M_get_Tp_allocator());
    this->_M_impl._M_finish = __new_finish;
    std::copy(__first, __mid, __pos);
  }
            }
          catch(...)
            {
              _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
          __new_finish._M_node + 1);
              throw;
            }
        }
      }

   template<typename _Tp, typename _Alloc>
     void
     deque<_Tp, _Alloc>::
     _M_destroy_data_aux(iterator __first, iterator __last)
     {
       for (_Map_pointer __node = __first._M_node + 1;
     __node < __last._M_node; ++__node)
  std::_Destroy(*__node, *__node + _S_buffer_size(),
         _M_get_Tp_allocator());

       if (__first._M_node != __last._M_node)
  {
    std::_Destroy(__first._M_cur, __first._M_last,
    _M_get_Tp_allocator());
    std::_Destroy(__last._M_first, __last._M_cur,
    _M_get_Tp_allocator());
  }
       else
  std::_Destroy(__first._M_cur, __last._M_cur,
         _M_get_Tp_allocator());
     }

  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_new_elements_at_front(size_type __new_elems)
    {
      if (this->max_size() - this->size() < __new_elems)
 __throw_length_error(("deque::_M_new_elements_at_front"));

      const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
         / _S_buffer_size());
      _M_reserve_map_at_front(__new_nodes);
      size_type __i;
      try
        {
          for (__i = 1; __i <= __new_nodes; ++__i)
            *(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node();
        }
      catch(...)
        {
          for (size_type __j = 1; __j < __i; ++__j)
            _M_deallocate_node(*(this->_M_impl._M_start._M_node - __j));
          throw;
        }
    }

  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_new_elements_at_back(size_type __new_elems)
    {
      if (this->max_size() - this->size() < __new_elems)
 __throw_length_error(("deque::_M_new_elements_at_back"));

      const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
         / _S_buffer_size());
      _M_reserve_map_at_back(__new_nodes);
      size_type __i;
      try
        {
          for (__i = 1; __i <= __new_nodes; ++__i)
            *(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node();
        }
      catch(...)
        {
          for (size_type __j = 1; __j < __i; ++__j)
            _M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j));
          throw;
        }
    }

  template <typename _Tp, typename _Alloc>
    void
    deque<_Tp, _Alloc>::
    _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)
    {
      const size_type __old_num_nodes
 = this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1;
      const size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;

      _Map_pointer __new_nstart;
      if (this->_M_impl._M_map_size > 2 * __new_num_nodes)
 {
   __new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size
      - __new_num_nodes) / 2
                  + (__add_at_front ? __nodes_to_add : 0);
   if (__new_nstart < this->_M_impl._M_start._M_node)
     std::copy(this->_M_impl._M_start._M_node,
        this->_M_impl._M_finish._M_node + 1,
        __new_nstart);
   else
     std::copy_backward(this->_M_impl._M_start._M_node,
          this->_M_impl._M_finish._M_node + 1,
          __new_nstart + __old_num_nodes);
 }
      else
 {
   size_type __new_map_size = this->_M_impl._M_map_size
                              + std::max(this->_M_impl._M_map_size,
      __nodes_to_add) + 2;

   _Map_pointer __new_map = this->_M_allocate_map(__new_map_size);
   __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
                  + (__add_at_front ? __nodes_to_add : 0);
   std::copy(this->_M_impl._M_start._M_node,
      this->_M_impl._M_finish._M_node + 1,
      __new_nstart);
   _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);

   this->_M_impl._M_map = __new_map;
   this->_M_impl._M_map_size = __new_map_size;
 }

      this->_M_impl._M_start._M_set_node(__new_nstart);
      this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
    }



  template<typename _Tp>
    void
    fill(const _Deque_iterator<_Tp, _Tp&, _Tp*>& __first,
  const _Deque_iterator<_Tp, _Tp&, _Tp*>& __last, const _Tp& __value)
    {
      typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;

      for (typename _Self::_Map_pointer __node = __first._M_node + 1;
           __node < __last._M_node; ++__node)
 std::fill(*__node, *__node + _Self::_S_buffer_size(), __value);

      if (__first._M_node != __last._M_node)
 {
   std::fill(__first._M_cur, __first._M_last, __value);
   std::fill(__last._M_first, __last._M_cur, __value);
 }
      else
 std::fill(__first._M_cur, __last._M_cur, __value);
    }

  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    copy(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
  _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
  _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    {
      typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
      typedef typename _Self::difference_type difference_type;

      difference_type __len = __last - __first;
      while (__len > 0)
 {
   const difference_type __clen
     = std::min(__len, std::min(__first._M_last - __first._M_cur,
           __result._M_last - __result._M_cur));
   std::copy(__first._M_cur, __first._M_cur + __clen, __result._M_cur);
   __first += __clen;
   __result += __clen;
   __len -= __clen;
 }
      return __result;
    }

  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    copy_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
    _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
    _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    {
      typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
      typedef typename _Self::difference_type difference_type;

      difference_type __len = __last - __first;
      while (__len > 0)
 {
   difference_type __llen = __last._M_cur - __last._M_first;
   _Tp* __lend = __last._M_cur;

   difference_type __rlen = __result._M_cur - __result._M_first;
   _Tp* __rend = __result._M_cur;

   if (!__llen)
     {
       __llen = _Self::_S_buffer_size();
       __lend = *(__last._M_node - 1) + __llen;
     }
   if (!__rlen)
     {
       __rlen = _Self::_S_buffer_size();
       __rend = *(__result._M_node - 1) + __rlen;
     }

   const difference_type __clen = std::min(__len,
        std::min(__llen, __rlen));
   std::copy_backward(__lend - __clen, __lend, __rend);
   __last -= __clen;
   __result -= __clen;
   __len -= __clen;
 }
      return __result;
    }


  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    move(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
  _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
  _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    {
      typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
      typedef typename _Self::difference_type difference_type;

      difference_type __len = __last - __first;
      while (__len > 0)
 {
   const difference_type __clen
     = std::min(__len, std::min(__first._M_last - __first._M_cur,
           __result._M_last - __result._M_cur));
   std::move(__first._M_cur, __first._M_cur + __clen, __result._M_cur);
   __first += __clen;
   __result += __clen;
   __len -= __clen;
 }
      return __result;
    }

  template<typename _Tp>
    _Deque_iterator<_Tp, _Tp&, _Tp*>
    move_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
    _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
    _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
    {
      typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
      typedef typename _Self::difference_type difference_type;

      difference_type __len = __last - __first;
      while (__len > 0)
 {
   difference_type __llen = __last._M_cur - __last._M_first;
   _Tp* __lend = __last._M_cur;

   difference_type __rlen = __result._M_cur - __result._M_first;
   _Tp* __rend = __result._M_cur;

   if (!__llen)
     {
       __llen = _Self::_S_buffer_size();
       __lend = *(__last._M_node - 1) + __llen;
     }
   if (!__rlen)
     {
       __rlen = _Self::_S_buffer_size();
       __rend = *(__result._M_node - 1) + __rlen;
     }

   const difference_type __clen = std::min(__len,
        std::min(__llen, __rlen));
   std::move_backward(__lend - __clen, __lend, __rend);
   __last -= __clen;
   __result -= __clen;
   __len -= __clen;
 }
      return __result;
    }



}
# 67 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/deque" 2 3
# 61 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/queue" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/vector" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/vector" 3





# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 1 3
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{



  template<typename _Tp, typename _Alloc>
    struct _Vector_base
    {
      typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
        rebind<_Tp>::other _Tp_alloc_type;
      typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer
        pointer;

      struct _Vector_impl
      : public _Tp_alloc_type
      {
 pointer _M_start;
 pointer _M_finish;
 pointer _M_end_of_storage;

 _Vector_impl()
 : _Tp_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage()
 { }

 _Vector_impl(_Tp_alloc_type const& __a) noexcept
 : _Tp_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage()
 { }


 _Vector_impl(_Tp_alloc_type&& __a) noexcept
 : _Tp_alloc_type(std::move(__a)),
   _M_start(), _M_finish(), _M_end_of_storage()
 { }


 void _M_swap_data(_Vector_impl& __x) noexcept
 {
   std::swap(_M_start, __x._M_start);
   std::swap(_M_finish, __x._M_finish);
   std::swap(_M_end_of_storage, __x._M_end_of_storage);
 }
      };

    public:
      typedef _Alloc allocator_type;

      _Tp_alloc_type&
      _M_get_Tp_allocator() noexcept
      { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); }

      const _Tp_alloc_type&
      _M_get_Tp_allocator() const noexcept
      { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }

      allocator_type
      get_allocator() const noexcept
      { return allocator_type(_M_get_Tp_allocator()); }

      _Vector_base()
      : _M_impl() { }

      _Vector_base(const allocator_type& __a) noexcept
      : _M_impl(__a) { }

      _Vector_base(size_t __n)
      : _M_impl()
      { _M_create_storage(__n); }

      _Vector_base(size_t __n, const allocator_type& __a)
      : _M_impl(__a)
      { _M_create_storage(__n); }


      _Vector_base(_Tp_alloc_type&& __a) noexcept
      : _M_impl(std::move(__a)) { }

      _Vector_base(_Vector_base&& __x) noexcept
      : _M_impl(std::move(__x._M_get_Tp_allocator()))
      { this->_M_impl._M_swap_data(__x._M_impl); }

      _Vector_base(_Vector_base&& __x, const allocator_type& __a)
      : _M_impl(__a)
      {
 if (__x.get_allocator() == __a)
   this->_M_impl._M_swap_data(__x._M_impl);
 else
   {
     size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
     _M_create_storage(__n);
   }
      }


      ~_Vector_base() noexcept
      { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
        - this->_M_impl._M_start); }

    public:
      _Vector_impl _M_impl;

      pointer
      _M_allocate(size_t __n)
      {
 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
 return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
      }

      void
      _M_deallocate(pointer __p, size_t __n)
      {
 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
 if (__p)
   _Tr::deallocate(_M_impl, __p, __n);
      }

    private:
      void
      _M_create_storage(size_t __n)
      {
 this->_M_impl._M_start = this->_M_allocate(__n);
 this->_M_impl._M_finish = this->_M_impl._M_start;
 this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
      }
    };
# 213 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
  template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
    class vector : protected _Vector_base<_Tp, _Alloc>
    {

      typedef typename _Alloc::value_type _Alloc_value_type;





      typedef _Vector_base<_Tp, _Alloc> _Base;
      typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
      typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;

    public:
      typedef _Tp value_type;
      typedef typename _Base::pointer pointer;
      typedef typename _Alloc_traits::const_pointer const_pointer;
      typedef typename _Alloc_traits::reference reference;
      typedef typename _Alloc_traits::const_reference const_reference;
      typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
      typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
      const_iterator;
      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
      typedef std::reverse_iterator<iterator> reverse_iterator;
      typedef size_t size_type;
      typedef ptrdiff_t difference_type;
      typedef _Alloc allocator_type;

    protected:
      using _Base::_M_allocate;
      using _Base::_M_deallocate;
      using _Base::_M_impl;
      using _Base::_M_get_Tp_allocator;

    public:






      vector()

      noexcept(is_nothrow_default_constructible<_Alloc>::value)

      : _Base() { }





      explicit
      vector(const allocator_type& __a) noexcept
      : _Base(__a) { }
# 278 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      explicit
      vector(size_type __n, const allocator_type& __a = allocator_type())
      : _Base(__n, __a)
      { _M_default_initialize(__n); }
# 291 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      vector(size_type __n, const value_type& __value,
      const allocator_type& __a = allocator_type())
      : _Base(__n, __a)
      { _M_fill_initialize(__n, __value); }
# 320 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      vector(const vector& __x)
      : _Base(__x.size(),
        _Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
      { this->_M_impl._M_finish =
   std::__uninitialized_copy_a(__x.begin(), __x.end(),
          this->_M_impl._M_start,
          _M_get_Tp_allocator());
      }
# 337 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      vector(vector&& __x) noexcept
      : _Base(std::move(__x)) { }


      vector(const vector& __x, const allocator_type& __a)
      : _Base(__x.size(), __a)
      { this->_M_impl._M_finish =
   std::__uninitialized_copy_a(__x.begin(), __x.end(),
          this->_M_impl._M_start,
          _M_get_Tp_allocator());
      }


      vector(vector&& __rv, const allocator_type& __m)
      noexcept(_Alloc_traits::_S_always_equal())
      : _Base(std::move(__rv), __m)
      {
 if (__rv.get_allocator() != __m)
   {
     this->_M_impl._M_finish =
       std::__uninitialized_move_a(__rv.begin(), __rv.end(),
       this->_M_impl._M_start,
       _M_get_Tp_allocator());
     __rv.clear();
   }
      }
# 375 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      vector(initializer_list<value_type> __l,
      const allocator_type& __a = allocator_type())
      : _Base(__a)
      {
 _M_range_initialize(__l.begin(), __l.end(),
       random_access_iterator_tag());
      }
# 401 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
        vector(_InputIterator __first, _InputIterator __last,
        const allocator_type& __a = allocator_type())
 : _Base(__a)
        { _M_initialize_dispatch(__first, __last, __false_type()); }
# 425 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      ~vector() noexcept
      { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
        _M_get_Tp_allocator()); }
# 437 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      vector&
      operator=(const vector& __x);
# 449 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      vector&
      operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
      {
        constexpr bool __move_storage =
          _Alloc_traits::_S_propagate_on_move_assign()
          || _Alloc_traits::_S_always_equal();
        _M_move_assign(std::move(__x), __bool_constant<__move_storage>());
 return *this;
      }
# 470 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      vector&
      operator=(initializer_list<value_type> __l)
      {
 this->assign(__l.begin(), __l.end());
 return *this;
      }
# 488 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      assign(size_type __n, const value_type& __val)
      { _M_fill_assign(__n, __val); }
# 505 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
        void
        assign(_InputIterator __first, _InputIterator __last)
        { _M_assign_dispatch(__first, __last, __false_type()); }
# 533 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      assign(initializer_list<value_type> __l)
      { this->assign(__l.begin(), __l.end()); }



      using _Base::get_allocator;







      iterator
      begin() noexcept
      { return iterator(this->_M_impl._M_start); }






      const_iterator
      begin() const noexcept
      { return const_iterator(this->_M_impl._M_start); }






      iterator
      end() noexcept
      { return iterator(this->_M_impl._M_finish); }






      const_iterator
      end() const noexcept
      { return const_iterator(this->_M_impl._M_finish); }






      reverse_iterator
      rbegin() noexcept
      { return reverse_iterator(end()); }






      const_reverse_iterator
      rbegin() const noexcept
      { return const_reverse_iterator(end()); }






      reverse_iterator
      rend() noexcept
      { return reverse_iterator(begin()); }






      const_reverse_iterator
      rend() const noexcept
      { return const_reverse_iterator(begin()); }







      const_iterator
      cbegin() const noexcept
      { return const_iterator(this->_M_impl._M_start); }






      const_iterator
      cend() const noexcept
      { return const_iterator(this->_M_impl._M_finish); }






      const_reverse_iterator
      crbegin() const noexcept
      { return const_reverse_iterator(end()); }






      const_reverse_iterator
      crend() const noexcept
      { return const_reverse_iterator(begin()); }




      size_type
      size() const noexcept
      { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }


      size_type
      max_size() const noexcept
      { return _Alloc_traits::max_size(_M_get_Tp_allocator()); }
# 673 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      resize(size_type __new_size)
      {
 if (__new_size > size())
   _M_default_append(__new_size - size());
 else if (__new_size < size())
   _M_erase_at_end(this->_M_impl._M_start + __new_size);
      }
# 693 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      resize(size_type __new_size, const value_type& __x)
      {
 if (__new_size > size())
   insert(end(), __new_size - size(), __x);
 else if (__new_size < size())
   _M_erase_at_end(this->_M_impl._M_start + __new_size);
      }
# 725 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      shrink_to_fit()
      { _M_shrink_to_fit(); }






      size_type
      capacity() const noexcept
      { return size_type(this->_M_impl._M_end_of_storage
    - this->_M_impl._M_start); }





      bool
      empty() const noexcept
      { return begin() == end(); }
# 764 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      reserve(size_type __n);
# 779 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      reference
      operator[](size_type __n) noexcept
      { return *(this->_M_impl._M_start + __n); }
# 794 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      const_reference
      operator[](size_type __n) const noexcept
      { return *(this->_M_impl._M_start + __n); }

    protected:

      void
      _M_range_check(size_type __n) const
      {
 if (__n >= this->size())
   __throw_out_of_range_fmt(("vector::_M_range_check: __n " "(which is %zu) >= this->size() " "(which is %zu)"),


       __n, this->size());
      }

    public:
# 822 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      reference
      at(size_type __n)
      {
 _M_range_check(__n);
 return (*this)[__n];
      }
# 840 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      const_reference
      at(size_type __n) const
      {
 _M_range_check(__n);
 return (*this)[__n];
      }





      reference
      front() noexcept
      { return *begin(); }





      const_reference
      front() const noexcept
      { return *begin(); }





      reference
      back() noexcept
      { return *(end() - 1); }





      const_reference
      back() const noexcept
      { return *(end() - 1); }
# 887 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      _Tp*



      data() noexcept
      { return _M_data_ptr(this->_M_impl._M_start); }


      const _Tp*



      data() const noexcept
      { return _M_data_ptr(this->_M_impl._M_start); }
# 913 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      push_back(const value_type& __x)
      {
 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
   {
     _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                              __x);
     ++this->_M_impl._M_finish;
   }
 else

   _M_emplace_back_aux(__x);



      }


      void
      push_back(value_type&& __x)
      { emplace_back(std::move(__x)); }

      template<typename... _Args>
        void
        emplace_back(_Args&&... __args);
# 949 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      pop_back() noexcept
      {
 --this->_M_impl._M_finish;
 _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
      }
# 969 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      template<typename... _Args>
        iterator
        emplace(const_iterator __position, _Args&&... __args);
# 984 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      iterator
      insert(const_iterator __position, const value_type& __x);
# 1014 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      iterator
      insert(const_iterator __position, value_type&& __x)
      { return emplace(__position, std::move(__x)); }
# 1031 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      iterator
      insert(const_iterator __position, initializer_list<value_type> __l)
      { return this->insert(__position, __l.begin(), __l.end()); }
# 1051 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      iterator
      insert(const_iterator __position, size_type __n, const value_type& __x)
      {
 difference_type __offset = __position - cbegin();
 _M_fill_insert(begin() + __offset, __n, __x);
 return begin() + __offset;
      }
# 1093 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      template<typename _InputIterator,
        typename = std::_RequireInputIter<_InputIterator>>
        iterator
        insert(const_iterator __position, _InputIterator __first,
        _InputIterator __last)
        {
   difference_type __offset = __position - cbegin();
   _M_insert_dispatch(begin() + __offset,
        __first, __last, __false_type());
   return begin() + __offset;
 }
# 1145 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      iterator

      erase(const_iterator __position)
      { return _M_erase(begin() + (__position - cbegin())); }
# 1172 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      iterator

      erase(const_iterator __first, const_iterator __last)
      {
 const auto __beg = begin();
 const auto __cbeg = cbegin();
 return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
      }
# 1194 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      void
      swap(vector& __x) noexcept
      {
 this->_M_impl._M_swap_data(__x._M_impl);
 _Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
                           __x._M_get_Tp_allocator());
      }







      void
      clear() noexcept
      { _M_erase_at_end(this->_M_impl._M_start); }

    protected:




      template<typename _ForwardIterator>
        pointer
        _M_allocate_and_copy(size_type __n,
        _ForwardIterator __first, _ForwardIterator __last)
        {
   pointer __result = this->_M_allocate(__n);
   try
     {
       std::__uninitialized_copy_a(__first, __last, __result,
       _M_get_Tp_allocator());
       return __result;
     }
   catch(...)
     {
       _M_deallocate(__result, __n);
       throw;
     }
 }
# 1243 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      template<typename _Integer>
        void
        _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
        {
   this->_M_impl._M_start = _M_allocate(static_cast<size_type>(__n));
   this->_M_impl._M_end_of_storage =
     this->_M_impl._M_start + static_cast<size_type>(__n);
   _M_fill_initialize(static_cast<size_type>(__n), __value);
 }


      template<typename _InputIterator>
        void
        _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
          __false_type)
        {
   typedef typename std::iterator_traits<_InputIterator>::
     iterator_category _IterCategory;
   _M_range_initialize(__first, __last, _IterCategory());
 }


      template<typename _InputIterator>
        void
        _M_range_initialize(_InputIterator __first,
       _InputIterator __last, std::input_iterator_tag)
        {
   for (; __first != __last; ++__first)

     emplace_back(*__first);



 }


      template<typename _ForwardIterator>
        void
        _M_range_initialize(_ForwardIterator __first,
       _ForwardIterator __last, std::forward_iterator_tag)
        {
   const size_type __n = std::distance(__first, __last);
   this->_M_impl._M_start = this->_M_allocate(__n);
   this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
   this->_M_impl._M_finish =
     std::__uninitialized_copy_a(__first, __last,
     this->_M_impl._M_start,
     _M_get_Tp_allocator());
 }



      void
      _M_fill_initialize(size_type __n, const value_type& __value)
      {
 this->_M_impl._M_finish =
   std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
     _M_get_Tp_allocator());
      }



      void
      _M_default_initialize(size_type __n)
      {
 this->_M_impl._M_finish =
   std::__uninitialized_default_n_a(this->_M_impl._M_start, __n,
        _M_get_Tp_allocator());
      }
# 1321 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      template<typename _Integer>
        void
        _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
        { _M_fill_assign(__n, __val); }


      template<typename _InputIterator>
        void
        _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
      __false_type)
        {
   typedef typename std::iterator_traits<_InputIterator>::
     iterator_category _IterCategory;
   _M_assign_aux(__first, __last, _IterCategory());
 }


      template<typename _InputIterator>
        void
        _M_assign_aux(_InputIterator __first, _InputIterator __last,
        std::input_iterator_tag);


      template<typename _ForwardIterator>
        void
        _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
        std::forward_iterator_tag);



      void
      _M_fill_assign(size_type __n, const value_type& __val);
# 1361 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
      template<typename _Integer>
        void
        _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
      __true_type)
        { _M_fill_insert(__pos, __n, __val); }


      template<typename _InputIterator>
        void
        _M_insert_dispatch(iterator __pos, _InputIterator __first,
      _InputIterator __last, __false_type)
        {
   typedef typename std::iterator_traits<_InputIterator>::
     iterator_category _IterCategory;
   _M_range_insert(__pos, __first, __last, _IterCategory());
 }


      template<typename _InputIterator>
        void
        _M_range_insert(iterator __pos, _InputIterator __first,
   _InputIterator __last, std::input_iterator_tag);


      template<typename _ForwardIterator>
        void
        _M_range_insert(iterator __pos, _ForwardIterator __first,
   _ForwardIterator __last, std::forward_iterator_tag);



      void
      _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);



      void
      _M_default_append(size_type __n);

      bool
      _M_shrink_to_fit();







      template<typename... _Args>
        void
        _M_insert_aux(iterator __position, _Args&&... __args);

      template<typename... _Args>
        void
        _M_emplace_back_aux(_Args&&... __args);



      size_type
      _M_check_len(size_type __n, const char* __s) const
      {
 if (max_size() - size() < __n)
   __throw_length_error((__s));

 const size_type __len = size() + std::max(size(), __n);
 return (__len < size() || __len > max_size()) ? max_size() : __len;
      }





      void
      _M_erase_at_end(pointer __pos) noexcept
      {
 std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator());
 this->_M_impl._M_finish = __pos;
      }

      iterator
      _M_erase(iterator __position);

      iterator
      _M_erase(iterator __first, iterator __last);


    private:



      void
      _M_move_assign(vector&& __x, std::true_type) noexcept
      {
 vector __tmp(get_allocator());
 this->_M_impl._M_swap_data(__tmp._M_impl);
 this->_M_impl._M_swap_data(__x._M_impl);
 std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
      }



      void
      _M_move_assign(vector&& __x, std::false_type)
      {
 if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
   _M_move_assign(std::move(__x), std::true_type());
 else
   {


     this->assign(std::__make_move_if_noexcept_iterator(__x.begin()),
    std::__make_move_if_noexcept_iterator(__x.end()));
     __x.clear();
   }
      }



      template<typename _Up>
 _Up*
 _M_data_ptr(_Up* __ptr) const
 { return __ptr; }

      template<typename _Ptr>
 typename std::pointer_traits<_Ptr>::element_type*
 _M_data_ptr(_Ptr __ptr) const
 { return empty() ? nullptr : std::__addressof(*__ptr); }






    };
# 1507 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
  template<typename _Tp, typename _Alloc>
    inline bool
    operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    { return (__x.size() == __y.size()
       && std::equal(__x.begin(), __x.end(), __y.begin())); }
# 1524 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_vector.h" 3
  template<typename _Tp, typename _Alloc>
    inline bool
    operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    { return std::lexicographical_compare(__x.begin(), __x.end(),
       __y.begin(), __y.end()); }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    { return !(__x == __y); }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    { return __y < __x; }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    { return !(__y < __x); }


  template<typename _Tp, typename _Alloc>
    inline bool
    operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    { return !(__x < __y); }


  template<typename _Tp, typename _Alloc>
    inline void
    swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }


}
# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/vector" 2 3
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_bvector.h" 1 3
# 63 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_bvector.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  typedef unsigned long _Bit_type;
  enum { _S_word_bit = int(8 * sizeof(_Bit_type)) };

  struct _Bit_reference
  {
    _Bit_type * _M_p;
    _Bit_type _M_mask;

    _Bit_reference(_Bit_type * __x, _Bit_type __y)
    : _M_p(__x), _M_mask(__y) { }

    _Bit_reference() noexcept : _M_p(0), _M_mask(0) { }

    operator bool() const noexcept
    { return !!(*_M_p & _M_mask); }

    _Bit_reference&
    operator=(bool __x) noexcept
    {
      if (__x)
 *_M_p |= _M_mask;
      else
 *_M_p &= ~_M_mask;
      return *this;
    }

    _Bit_reference&
    operator=(const _Bit_reference& __x) noexcept
    { return *this = bool(__x); }

    bool
    operator==(const _Bit_reference& __x) const
    { return bool(*this) == bool(__x); }

    bool
    operator<(const _Bit_reference& __x) const
    { return !bool(*this) && bool(__x); }

    void
    flip() noexcept
    { *_M_p ^= _M_mask; }
  };


  inline void
  swap(_Bit_reference __x, _Bit_reference __y) noexcept
  {
    bool __tmp = __x;
    __x = __y;
    __y = __tmp;
  }

  inline void
  swap(_Bit_reference __x, bool& __y) noexcept
  {
    bool __tmp = __x;
    __x = __y;
    __y = __tmp;
  }

  inline void
  swap(bool& __x, _Bit_reference __y) noexcept
  {
    bool __tmp = __x;
    __x = __y;
    __y = __tmp;
  }


  struct _Bit_iterator_base
  : public std::iterator<std::random_access_iterator_tag, bool>
  {
    _Bit_type * _M_p;
    unsigned int _M_offset;

    _Bit_iterator_base(_Bit_type * __x, unsigned int __y)
    : _M_p(__x), _M_offset(__y) { }

    void
    _M_bump_up()
    {
      if (_M_offset++ == int(_S_word_bit) - 1)
 {
   _M_offset = 0;
   ++_M_p;
 }
    }

    void
    _M_bump_down()
    {
      if (_M_offset-- == 0)
 {
   _M_offset = int(_S_word_bit) - 1;
   --_M_p;
 }
    }

    void
    _M_incr(ptrdiff_t __i)
    {
      difference_type __n = __i + _M_offset;
      _M_p += __n / int(_S_word_bit);
      __n = __n % int(_S_word_bit);
      if (__n < 0)
 {
   __n += int(_S_word_bit);
   --_M_p;
 }
      _M_offset = static_cast<unsigned int>(__n);
    }

    bool
    operator==(const _Bit_iterator_base& __i) const
    { return _M_p == __i._M_p && _M_offset == __i._M_offset; }

    bool
    operator<(const _Bit_iterator_base& __i) const
    {
      return _M_p < __i._M_p
      || (_M_p == __i._M_p && _M_offset < __i._M_offset);
    }

    bool
    operator!=(const _Bit_iterator_base& __i) const
    { return !(*this == __i); }

    bool
    operator>(const _Bit_iterator_base& __i) const
    { return __i < *this; }

    bool
    operator<=(const _Bit_iterator_base& __i) const
    { return !(__i < *this); }

    bool
    operator>=(const _Bit_iterator_base& __i) const
    { return !(*this < __i); }
  };

  inline ptrdiff_t
  operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
  {
    return (int(_S_word_bit) * (__x._M_p - __y._M_p)
     + __x._M_offset - __y._M_offset);
  }

  struct _Bit_iterator : public _Bit_iterator_base
  {
    typedef _Bit_reference reference;
    typedef _Bit_reference* pointer;
    typedef _Bit_iterator iterator;

    _Bit_iterator() : _Bit_iterator_base(0, 0) { }

    _Bit_iterator(_Bit_type * __x, unsigned int __y)
    : _Bit_iterator_base(__x, __y) { }

    iterator
    _M_const_cast() const
    { return *this; }

    reference
    operator*() const
    { return reference(_M_p, 1UL << _M_offset); }

    iterator&
    operator++()
    {
      _M_bump_up();
      return *this;
    }

    iterator
    operator++(int)
    {
      iterator __tmp = *this;
      _M_bump_up();
      return __tmp;
    }

    iterator&
    operator--()
    {
      _M_bump_down();
      return *this;
    }

    iterator
    operator--(int)
    {
      iterator __tmp = *this;
      _M_bump_down();
      return __tmp;
    }

    iterator&
    operator+=(difference_type __i)
    {
      _M_incr(__i);
      return *this;
    }

    iterator&
    operator-=(difference_type __i)
    {
      *this += -__i;
      return *this;
    }

    iterator
    operator+(difference_type __i) const
    {
      iterator __tmp = *this;
      return __tmp += __i;
    }

    iterator
    operator-(difference_type __i) const
    {
      iterator __tmp = *this;
      return __tmp -= __i;
    }

    reference
    operator[](difference_type __i) const
    { return *(*this + __i); }
  };

  inline _Bit_iterator
  operator+(ptrdiff_t __n, const _Bit_iterator& __x)
  { return __x + __n; }

  struct _Bit_const_iterator : public _Bit_iterator_base
  {
    typedef bool reference;
    typedef bool const_reference;
    typedef const bool* pointer;
    typedef _Bit_const_iterator const_iterator;

    _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }

    _Bit_const_iterator(_Bit_type * __x, unsigned int __y)
    : _Bit_iterator_base(__x, __y) { }

    _Bit_const_iterator(const _Bit_iterator& __x)
    : _Bit_iterator_base(__x._M_p, __x._M_offset) { }

    _Bit_iterator
    _M_const_cast() const
    { return _Bit_iterator(_M_p, _M_offset); }

    const_reference
    operator*() const
    { return _Bit_reference(_M_p, 1UL << _M_offset); }

    const_iterator&
    operator++()
    {
      _M_bump_up();
      return *this;
    }

    const_iterator
    operator++(int)
    {
      const_iterator __tmp = *this;
      _M_bump_up();
      return __tmp;
    }

    const_iterator&
    operator--()
    {
      _M_bump_down();
      return *this;
    }

    const_iterator
    operator--(int)
    {
      const_iterator __tmp = *this;
      _M_bump_down();
      return __tmp;
    }

    const_iterator&
    operator+=(difference_type __i)
    {
      _M_incr(__i);
      return *this;
    }

    const_iterator&
    operator-=(difference_type __i)
    {
      *this += -__i;
      return *this;
    }

    const_iterator
    operator+(difference_type __i) const
    {
      const_iterator __tmp = *this;
      return __tmp += __i;
    }

    const_iterator
    operator-(difference_type __i) const
    {
      const_iterator __tmp = *this;
      return __tmp -= __i;
    }

    const_reference
    operator[](difference_type __i) const
    { return *(*this + __i); }
  };

  inline _Bit_const_iterator
  operator+(ptrdiff_t __n, const _Bit_const_iterator& __x)
  { return __x + __n; }

  inline void
  __fill_bvector(_Bit_iterator __first, _Bit_iterator __last, bool __x)
  {
    for (; __first != __last; ++__first)
      *__first = __x;
  }

  inline void
  fill(_Bit_iterator __first, _Bit_iterator __last, const bool& __x)
  {
    if (__first._M_p != __last._M_p)
      {
 std::fill(__first._M_p + 1, __last._M_p, __x ? ~0 : 0);
 __fill_bvector(__first, _Bit_iterator(__first._M_p + 1, 0), __x);
 __fill_bvector(_Bit_iterator(__last._M_p, 0), __last, __x);
      }
    else
      __fill_bvector(__first, __last, __x);
  }

  template<typename _Alloc>
    struct _Bvector_base
    {
      typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
        rebind<_Bit_type>::other _Bit_alloc_type;
      typedef typename __gnu_cxx::__alloc_traits<_Bit_alloc_type>
 _Bit_alloc_traits;
      typedef typename _Bit_alloc_traits::pointer _Bit_pointer;

      struct _Bvector_impl
      : public _Bit_alloc_type
      {
 _Bit_iterator _M_start;
 _Bit_iterator _M_finish;
 _Bit_pointer _M_end_of_storage;

 _Bvector_impl()
 : _Bit_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage()
 { }

 _Bvector_impl(const _Bit_alloc_type& __a)
 : _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage()
 { }


 _Bvector_impl(_Bit_alloc_type&& __a)
 : _Bit_alloc_type(std::move(__a)), _M_start(), _M_finish(),
   _M_end_of_storage()
 { }


 _Bit_type*
 _M_end_addr() const noexcept
 {
   if (_M_end_of_storage)
     return std::__addressof(_M_end_of_storage[-1]) + 1;
   return 0;
 }
      };

    public:
      typedef _Alloc allocator_type;

      _Bit_alloc_type&
      _M_get_Bit_allocator() noexcept
      { return *static_cast<_Bit_alloc_type*>(&this->_M_impl); }

      const _Bit_alloc_type&
      _M_get_Bit_allocator() const noexcept
      { return *static_cast<const _Bit_alloc_type*>(&this->_M_impl); }

      allocator_type
      get_allocator() const noexcept
      { return allocator_type(_M_get_Bit_allocator()); }

      _Bvector_base()
      : _M_impl() { }

      _Bvector_base(const allocator_type& __a)
      : _M_impl(__a) { }


      _Bvector_base(_Bvector_base&& __x) noexcept
      : _M_impl(std::move(__x._M_get_Bit_allocator()))
      {
 this->_M_impl._M_start = __x._M_impl._M_start;
 this->_M_impl._M_finish = __x._M_impl._M_finish;
 this->_M_impl._M_end_of_storage = __x._M_impl._M_end_of_storage;
 __x._M_impl._M_start = _Bit_iterator();
 __x._M_impl._M_finish = _Bit_iterator();
 __x._M_impl._M_end_of_storage = nullptr;
      }


      ~_Bvector_base()
      { this->_M_deallocate(); }

    protected:
      _Bvector_impl _M_impl;

      _Bit_pointer
      _M_allocate(size_t __n)
      { return _Bit_alloc_traits::allocate(_M_impl, _S_nword(__n)); }

      void
      _M_deallocate()
      {
 if (_M_impl._M_start._M_p)
   {
     const size_t __n = _M_impl._M_end_addr() - _M_impl._M_start._M_p;
     _Bit_alloc_traits::deallocate(_M_impl,
       _M_impl._M_end_of_storage - __n,
       __n);
   }
      }

      static size_t
      _S_nword(size_t __n)
      { return (__n + int(_S_word_bit) - 1) / int(_S_word_bit); }
    };


}




namespace std __attribute__ ((__visibility__ ("default")))
{
# 540 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_bvector.h" 3
template<typename _Alloc>
  class vector<bool, _Alloc> : protected _Bvector_base<_Alloc>
  {
    typedef _Bvector_base<_Alloc> _Base;
    typedef typename _Base::_Bit_pointer _Bit_pointer;
    typedef typename _Base::_Bit_alloc_traits _Bit_alloc_traits;


    template<typename> friend struct hash;


  public:
    typedef bool value_type;
    typedef size_t size_type;
    typedef ptrdiff_t difference_type;
    typedef _Bit_reference reference;
    typedef bool const_reference;
    typedef _Bit_reference* pointer;
    typedef const bool* const_pointer;
    typedef _Bit_iterator iterator;
    typedef _Bit_const_iterator const_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef _Alloc allocator_type;

    allocator_type get_allocator() const
    { return _Base::get_allocator(); }

  protected:
    using _Base::_M_allocate;
    using _Base::_M_deallocate;
    using _Base::_S_nword;
    using _Base::_M_get_Bit_allocator;

  public:
    vector()

      noexcept(is_nothrow_default_constructible<allocator_type>::value)

    : _Base() { }

    explicit
    vector(const allocator_type& __a)
    : _Base(__a) { }


    explicit
    vector(size_type __n, const allocator_type& __a = allocator_type())
    : vector(__n, false, __a)
    { }

    vector(size_type __n, const bool& __value,
    const allocator_type& __a = allocator_type())
    : _Base(__a)
    {
      _M_initialize(__n);
      std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_addr(),
  __value ? ~0 : 0);
    }
# 611 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_bvector.h" 3
    vector(const vector& __x)
    : _Base(_Bit_alloc_traits::_S_select_on_copy(__x._M_get_Bit_allocator()))
    {
      _M_initialize(__x.size());
      _M_copy_aligned(__x.begin(), __x.end(), this->_M_impl._M_start);
    }


    vector(vector&& __x) noexcept
    : _Base(std::move(__x)) { }

    vector(vector&& __x, const allocator_type& __a)
    noexcept(_Bit_alloc_traits::_S_always_equal())
    : _Base(__a)
    {
      if (__x.get_allocator() == __a)
 {
   this->_M_impl._M_start = __x._M_impl._M_start;
   this->_M_impl._M_finish = __x._M_impl._M_finish;
   this->_M_impl._M_end_of_storage = __x._M_impl._M_end_of_storage;
   __x._M_impl._M_start = _Bit_iterator();
   __x._M_impl._M_finish = _Bit_iterator();
   __x._M_impl._M_end_of_storage = nullptr;
 }
      else
 {
   _M_initialize(__x.size());
   _M_copy_aligned(__x.begin(), __x.end(), begin());
   __x.clear();
 }
    }

    vector(const vector& __x, const allocator_type& __a)
    : _Base(__a)
    {
      _M_initialize(__x.size());
      _M_copy_aligned(__x.begin(), __x.end(), this->_M_impl._M_start);
    }

    vector(initializer_list<bool> __l,
    const allocator_type& __a = allocator_type())
    : _Base(__a)
    {
      _M_initialize_range(__l.begin(), __l.end(),
     random_access_iterator_tag());
    }



    template<typename _InputIterator,
      typename = std::_RequireInputIter<_InputIterator>>
      vector(_InputIterator __first, _InputIterator __last,
      const allocator_type& __a = allocator_type())
      : _Base(__a)
      { _M_initialize_dispatch(__first, __last, __false_type()); }
# 677 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_bvector.h" 3
    ~vector() noexcept { }

    vector&
    operator=(const vector& __x)
    {
      if (&__x == this)
 return *this;

      if (_Bit_alloc_traits::_S_propagate_on_copy_assign())
 {
   if (this->_M_get_Bit_allocator() != __x._M_get_Bit_allocator())
     {
       this->_M_deallocate();
       std::__alloc_on_copy(_M_get_Bit_allocator(),
       __x._M_get_Bit_allocator());
       _M_initialize(__x.size());
     }
   else
     std::__alloc_on_copy(_M_get_Bit_allocator(),
     __x._M_get_Bit_allocator());
 }

      if (__x.size() > capacity())
 {
   this->_M_deallocate();
   _M_initialize(__x.size());
 }
      this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
      begin());
      return *this;
    }


    vector&
    operator=(vector&& __x) noexcept(_Bit_alloc_traits::_S_nothrow_move())
    {
      if (_Bit_alloc_traits::_S_propagate_on_move_assign()
   || this->_M_get_Bit_allocator() == __x._M_get_Bit_allocator())
 {
   this->_M_deallocate();
   this->_M_impl._M_start = __x._M_impl._M_start;
   this->_M_impl._M_finish = __x._M_impl._M_finish;
   this->_M_impl._M_end_of_storage = __x._M_impl._M_end_of_storage;
   __x._M_impl._M_start = _Bit_iterator();
   __x._M_impl._M_finish = _Bit_iterator();
   __x._M_impl._M_end_of_storage = nullptr;
   std::__alloc_on_move(_M_get_Bit_allocator(),
          __x._M_get_Bit_allocator());
 }
      else
 {
   if (__x.size() > capacity())
     {
       this->_M_deallocate();
       _M_initialize(__x.size());
     }
   this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
          begin());
   __x.clear();
 }
      return *this;
    }

    vector&
    operator=(initializer_list<bool> __l)
    {
      this->assign (__l.begin(), __l.end());
      return *this;
    }






    void
    assign(size_type __n, const bool& __x)
    { _M_fill_assign(__n, __x); }


    template<typename _InputIterator,
      typename = std::_RequireInputIter<_InputIterator>>
      void
      assign(_InputIterator __first, _InputIterator __last)
      { _M_assign_dispatch(__first, __last, __false_type()); }
# 773 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_bvector.h" 3
    void
    assign(initializer_list<bool> __l)
    { this->assign(__l.begin(), __l.end()); }


    iterator
    begin() noexcept
    { return this->_M_impl._M_start; }

    const_iterator
    begin() const noexcept
    { return this->_M_impl._M_start; }

    iterator
    end() noexcept
    { return this->_M_impl._M_finish; }

    const_iterator
    end() const noexcept
    { return this->_M_impl._M_finish; }

    reverse_iterator
    rbegin() noexcept
    { return reverse_iterator(end()); }

    const_reverse_iterator
    rbegin() const noexcept
    { return const_reverse_iterator(end()); }

    reverse_iterator
    rend() noexcept
    { return reverse_iterator(begin()); }

    const_reverse_iterator
    rend() const noexcept
    { return const_reverse_iterator(begin()); }


    const_iterator
    cbegin() const noexcept
    { return this->_M_impl._M_start; }

    const_iterator
    cend() const noexcept
    { return this->_M_impl._M_finish; }

    const_reverse_iterator
    crbegin() const noexcept
    { return const_reverse_iterator(end()); }

    const_reverse_iterator
    crend() const noexcept
    { return const_reverse_iterator(begin()); }


    size_type
    size() const noexcept
    { return size_type(end() - begin()); }

    size_type
    max_size() const noexcept
    {
      const size_type __isize =
 __gnu_cxx::__numeric_traits<difference_type>::__max
 - int(_S_word_bit) + 1;
      const size_type __asize
 = _Bit_alloc_traits::max_size(_M_get_Bit_allocator());
      return (__asize <= __isize / int(_S_word_bit)
       ? __asize * int(_S_word_bit) : __isize);
    }

    size_type
    capacity() const noexcept
    { return size_type(const_iterator(this->_M_impl._M_end_addr(), 0)
         - begin()); }

    bool
    empty() const noexcept
    { return begin() == end(); }

    reference
    operator[](size_type __n)
    {
      return *iterator(this->_M_impl._M_start._M_p
         + __n / int(_S_word_bit), __n % int(_S_word_bit));
    }

    const_reference
    operator[](size_type __n) const
    {
      return *const_iterator(this->_M_impl._M_start._M_p
        + __n / int(_S_word_bit), __n % int(_S_word_bit));
    }

  protected:
    void
    _M_range_check(size_type __n) const
    {
      if (__n >= this->size())
 __throw_out_of_range_fmt(("vector<bool>::_M_range_check: __n " "(which is %zu) >= this->size() " "(which is %zu)"),


     __n, this->size());
    }

  public:
    reference
    at(size_type __n)
    { _M_range_check(__n); return (*this)[__n]; }

    const_reference
    at(size_type __n) const
    { _M_range_check(__n); return (*this)[__n]; }

    void
    reserve(size_type __n)
    {
      if (__n > max_size())
 __throw_length_error(("vector::reserve"));
      if (capacity() < __n)
 _M_reallocate(__n);
    }

    reference
    front()
    { return *begin(); }

    const_reference
    front() const
    { return *begin(); }

    reference
    back()
    { return *(end() - 1); }

    const_reference
    back() const
    { return *(end() - 1); }






    void
    data() noexcept { }

    void
    push_back(bool __x)
    {
      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
        *this->_M_impl._M_finish++ = __x;
      else
        _M_insert_aux(end(), __x);
    }

    void
    swap(vector& __x) noexcept
    {
      std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
      std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
      std::swap(this->_M_impl._M_end_of_storage,
  __x._M_impl._M_end_of_storage);
      _Bit_alloc_traits::_S_on_swap(_M_get_Bit_allocator(),
        __x._M_get_Bit_allocator());
    }


    static void
    swap(reference __x, reference __y) noexcept
    {
      bool __tmp = __x;
      __x = __y;
      __y = __tmp;
    }

    iterator

    insert(const_iterator __position, const bool& __x = bool())



    {
      const difference_type __n = __position - begin();
      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr()
   && __position == end())
        *this->_M_impl._M_finish++ = __x;
      else
        _M_insert_aux(__position._M_const_cast(), __x);
      return begin() + __n;
    }


    template<typename _InputIterator,
      typename = std::_RequireInputIter<_InputIterator>>
      iterator
      insert(const_iterator __position,
      _InputIterator __first, _InputIterator __last)
      {
 difference_type __offset = __position - cbegin();
 _M_insert_dispatch(__position._M_const_cast(),
      __first, __last, __false_type());
 return begin() + __offset;
      }
# 989 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_bvector.h" 3
    iterator
    insert(const_iterator __position, size_type __n, const bool& __x)
    {
      difference_type __offset = __position - cbegin();
      _M_fill_insert(__position._M_const_cast(), __n, __x);
      return begin() + __offset;
    }







    iterator
    insert(const_iterator __p, initializer_list<bool> __l)
    { return this->insert(__p, __l.begin(), __l.end()); }


    void
    pop_back()
    { --this->_M_impl._M_finish; }

    iterator

    erase(const_iterator __position)



    { return _M_erase(__position._M_const_cast()); }

    iterator

    erase(const_iterator __first, const_iterator __last)



    { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }

    void
    resize(size_type __new_size, bool __x = bool())
    {
      if (__new_size < size())
        _M_erase_at_end(begin() + difference_type(__new_size));
      else
        insert(end(), __new_size - size(), __x);
    }


    void
    shrink_to_fit()
    { _M_shrink_to_fit(); }


    void
    flip() noexcept
    {
      _Bit_type * const __end = this->_M_impl._M_end_addr();
      for (_Bit_type * __p = this->_M_impl._M_start._M_p; __p != __end; ++__p)
        *__p = ~*__p;
    }

    void
    clear() noexcept
    { _M_erase_at_end(begin()); }


    template<typename... _Args>
      void
      emplace_back(_Args&&... __args)
      { push_back(bool(__args...)); }

    template<typename... _Args>
      iterator
      emplace(const_iterator __pos, _Args&&... __args)
      { return insert(__pos, bool(__args...)); }


  protected:

    iterator
    _M_copy_aligned(const_iterator __first, const_iterator __last,
      iterator __result)
    {
      _Bit_type* __q = std::copy(__first._M_p, __last._M_p, __result._M_p);
      return std::copy(const_iterator(__last._M_p, 0), __last,
         iterator(__q, 0));
    }

    void
    _M_initialize(size_type __n)
    {
      _Bit_pointer __q = this->_M_allocate(__n);
      this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
      this->_M_impl._M_start = iterator(std::__addressof(*__q), 0);
      this->_M_impl._M_finish = this->_M_impl._M_start + difference_type(__n);
    }

    void
    _M_reallocate(size_type __n);


    bool
    _M_shrink_to_fit();






    template<typename _Integer>
      void
      _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
      {
 _M_initialize(static_cast<size_type>(__n));
 std::fill(this->_M_impl._M_start._M_p,
    this->_M_impl._M_end_addr(), __x ? ~0 : 0);
      }

    template<typename _InputIterator>
      void
      _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
        __false_type)
      { _M_initialize_range(__first, __last,
       std::__iterator_category(__first)); }

    template<typename _InputIterator>
      void
      _M_initialize_range(_InputIterator __first, _InputIterator __last,
     std::input_iterator_tag)
      {
 for (; __first != __last; ++__first)
   push_back(*__first);
      }

    template<typename _ForwardIterator>
      void
      _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
     std::forward_iterator_tag)
      {
 const size_type __n = std::distance(__first, __last);
 _M_initialize(__n);
 std::copy(__first, __last, this->_M_impl._M_start);
      }



    template<typename _Integer>
      void
      _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
      { _M_fill_assign(__n, __val); }

    template<class _InputIterator>
      void
      _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
    __false_type)
      { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }

    void
    _M_fill_assign(size_t __n, bool __x)
    {
      if (__n > size())
 {
   std::fill(this->_M_impl._M_start._M_p,
      this->_M_impl._M_end_addr(), __x ? ~0 : 0);
   insert(end(), __n - size(), __x);
 }
      else
 {
   _M_erase_at_end(begin() + __n);
   std::fill(this->_M_impl._M_start._M_p,
      this->_M_impl._M_end_addr(), __x ? ~0 : 0);
 }
    }

    template<typename _InputIterator>
      void
      _M_assign_aux(_InputIterator __first, _InputIterator __last,
      std::input_iterator_tag)
      {
 iterator __cur = begin();
 for (; __first != __last && __cur != end(); ++__cur, ++__first)
   *__cur = *__first;
 if (__first == __last)
   _M_erase_at_end(__cur);
 else
   insert(end(), __first, __last);
      }

    template<typename _ForwardIterator>
      void
      _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
      std::forward_iterator_tag)
      {
 const size_type __len = std::distance(__first, __last);
 if (__len < size())
   _M_erase_at_end(std::copy(__first, __last, begin()));
 else
   {
     _ForwardIterator __mid = __first;
     std::advance(__mid, size());
     std::copy(__first, __mid, begin());
     insert(end(), __mid, __last);
   }
      }





    template<typename _Integer>
      void
      _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
    __true_type)
      { _M_fill_insert(__pos, __n, __x); }

    template<typename _InputIterator>
      void
      _M_insert_dispatch(iterator __pos,
    _InputIterator __first, _InputIterator __last,
    __false_type)
      { _M_insert_range(__pos, __first, __last,
   std::__iterator_category(__first)); }

    void
    _M_fill_insert(iterator __position, size_type __n, bool __x);

    template<typename _InputIterator>
      void
      _M_insert_range(iterator __pos, _InputIterator __first,
        _InputIterator __last, std::input_iterator_tag)
      {
 for (; __first != __last; ++__first)
   {
     __pos = insert(__pos, *__first);
     ++__pos;
   }
      }

    template<typename _ForwardIterator>
      void
      _M_insert_range(iterator __position, _ForwardIterator __first,
        _ForwardIterator __last, std::forward_iterator_tag);

    void
    _M_insert_aux(iterator __position, bool __x);

    size_type
    _M_check_len(size_type __n, const char* __s) const
    {
      if (max_size() - size() < __n)
 __throw_length_error((__s));

      const size_type __len = size() + std::max(size(), __n);
      return (__len < size() || __len > max_size()) ? max_size() : __len;
    }

    void
    _M_erase_at_end(iterator __pos)
    { this->_M_impl._M_finish = __pos; }

    iterator
    _M_erase(iterator __pos);

    iterator
    _M_erase(iterator __first, iterator __last);
  };


}





namespace std __attribute__ ((__visibility__ ("default")))
{




  template<typename _Alloc>
    struct hash<std::vector<bool, _Alloc>>
    : public __hash_base<size_t, std::vector<bool, _Alloc>>
    {
      size_t
      operator()(const std::vector<bool, _Alloc>&) const noexcept;
    };


}
# 66 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/vector" 2 3



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/vector.tcc" 1 3
# 59 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/vector.tcc" 3
namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
    reserve(size_type __n)
    {
      if (__n > this->max_size())
 __throw_length_error(("vector::reserve"));
      if (this->capacity() < __n)
 {
   const size_type __old_size = size();
   pointer __tmp = _M_allocate_and_copy(__n,
     std::__make_move_if_noexcept_iterator(this->_M_impl._M_start),
     std::__make_move_if_noexcept_iterator(this->_M_impl._M_finish));
   std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
   _M_get_Tp_allocator());
   _M_deallocate(this->_M_impl._M_start,
   this->_M_impl._M_end_of_storage
   - this->_M_impl._M_start);
   this->_M_impl._M_start = __tmp;
   this->_M_impl._M_finish = __tmp + __old_size;
   this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
 }
    }


  template<typename _Tp, typename _Alloc>
    template<typename... _Args>
      void
      vector<_Tp, _Alloc>::
      emplace_back(_Args&&... __args)
      {
 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
   {
     _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
         std::forward<_Args>(__args)...);
     ++this->_M_impl._M_finish;
   }
 else
   _M_emplace_back_aux(std::forward<_Args>(__args)...);
      }


  template<typename _Tp, typename _Alloc>
    typename vector<_Tp, _Alloc>::iterator
    vector<_Tp, _Alloc>::

    insert(const_iterator __position, const value_type& __x)



    {
      const size_type __n = __position - begin();
      if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
   && __position == end())
 {
   _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, __x);
   ++this->_M_impl._M_finish;
 }
      else
 {

   const auto __pos = begin() + (__position - cbegin());
   if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
     {
       _Tp __x_copy = __x;
       _M_insert_aux(__pos, std::move(__x_copy));
     }
   else
     _M_insert_aux(__pos, __x);



 }
      return iterator(this->_M_impl._M_start + __n);
    }

  template<typename _Tp, typename _Alloc>
    typename vector<_Tp, _Alloc>::iterator
    vector<_Tp, _Alloc>::
    _M_erase(iterator __position)
    {
      if (__position + 1 != end())
 std::move(__position + 1, end(), __position);
      --this->_M_impl._M_finish;
      _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
      return __position;
    }

  template<typename _Tp, typename _Alloc>
    typename vector<_Tp, _Alloc>::iterator
    vector<_Tp, _Alloc>::
    _M_erase(iterator __first, iterator __last)
    {
      if (__first != __last)
 {
   if (__last != end())
     std::move(__last, end(), __first);
   _M_erase_at_end(__first.base() + (end() - __last));
 }
      return __first;
    }

  template<typename _Tp, typename _Alloc>
    vector<_Tp, _Alloc>&
    vector<_Tp, _Alloc>::
    operator=(const vector<_Tp, _Alloc>& __x)
    {
      if (&__x != this)
 {

   if (_Alloc_traits::_S_propagate_on_copy_assign())
     {
       if (!_Alloc_traits::_S_always_equal()
           && _M_get_Tp_allocator() != __x._M_get_Tp_allocator())
         {

    this->clear();
    _M_deallocate(this->_M_impl._M_start,
    this->_M_impl._M_end_of_storage
    - this->_M_impl._M_start);
    this->_M_impl._M_start = nullptr;
    this->_M_impl._M_finish = nullptr;
    this->_M_impl._M_end_of_storage = nullptr;
  }
       std::__alloc_on_copy(_M_get_Tp_allocator(),
       __x._M_get_Tp_allocator());
     }

   const size_type __xlen = __x.size();
   if (__xlen > capacity())
     {
       pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(),
         __x.end());
       std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
       _M_get_Tp_allocator());
       _M_deallocate(this->_M_impl._M_start,
       this->_M_impl._M_end_of_storage
       - this->_M_impl._M_start);
       this->_M_impl._M_start = __tmp;
       this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __xlen;
     }
   else if (size() >= __xlen)
     {
       std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),
       end(), _M_get_Tp_allocator());
     }
   else
     {
       std::copy(__x._M_impl._M_start, __x._M_impl._M_start + size(),
   this->_M_impl._M_start);
       std::__uninitialized_copy_a(__x._M_impl._M_start + size(),
       __x._M_impl._M_finish,
       this->_M_impl._M_finish,
       _M_get_Tp_allocator());
     }
   this->_M_impl._M_finish = this->_M_impl._M_start + __xlen;
 }
      return *this;
    }

  template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
    _M_fill_assign(size_t __n, const value_type& __val)
    {
      if (__n > capacity())
 {
   vector __tmp(__n, __val, _M_get_Tp_allocator());
   __tmp._M_impl._M_swap_data(this->_M_impl);
 }
      else if (__n > size())
 {
   std::fill(begin(), end(), __val);
   this->_M_impl._M_finish =
     std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
       __n - size(), __val,
       _M_get_Tp_allocator());
 }
      else
        _M_erase_at_end(std::fill_n(this->_M_impl._M_start, __n, __val));
    }

  template<typename _Tp, typename _Alloc>
    template<typename _InputIterator>
      void
      vector<_Tp, _Alloc>::
      _M_assign_aux(_InputIterator __first, _InputIterator __last,
      std::input_iterator_tag)
      {
 pointer __cur(this->_M_impl._M_start);
 for (; __first != __last && __cur != this->_M_impl._M_finish;
      ++__cur, ++__first)
   *__cur = *__first;
 if (__first == __last)
   _M_erase_at_end(__cur);
 else
   insert(end(), __first, __last);
      }

  template<typename _Tp, typename _Alloc>
    template<typename _ForwardIterator>
      void
      vector<_Tp, _Alloc>::
      _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
      std::forward_iterator_tag)
      {
 const size_type __len = std::distance(__first, __last);

 if (__len > capacity())
   {
     pointer __tmp(_M_allocate_and_copy(__len, __first, __last));
     std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
     _M_get_Tp_allocator());
     _M_deallocate(this->_M_impl._M_start,
     this->_M_impl._M_end_of_storage
     - this->_M_impl._M_start);
     this->_M_impl._M_start = __tmp;
     this->_M_impl._M_finish = this->_M_impl._M_start + __len;
     this->_M_impl._M_end_of_storage = this->_M_impl._M_finish;
   }
 else if (size() >= __len)
   _M_erase_at_end(std::copy(__first, __last, this->_M_impl._M_start));
 else
   {
     _ForwardIterator __mid = __first;
     std::advance(__mid, size());
     std::copy(__first, __mid, this->_M_impl._M_start);
     this->_M_impl._M_finish =
       std::__uninitialized_copy_a(__mid, __last,
       this->_M_impl._M_finish,
       _M_get_Tp_allocator());
   }
      }


  template<typename _Tp, typename _Alloc>
    template<typename... _Args>
      typename vector<_Tp, _Alloc>::iterator
      vector<_Tp, _Alloc>::
      emplace(const_iterator __position, _Args&&... __args)
      {
 const size_type __n = __position - begin();
 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
     && __position == end())
   {
     _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
         std::forward<_Args>(__args)...);
     ++this->_M_impl._M_finish;
   }
 else
   _M_insert_aux(begin() + (__position - cbegin()),
   std::forward<_Args>(__args)...);
 return iterator(this->_M_impl._M_start + __n);
      }

  template<typename _Tp, typename _Alloc>
    template<typename... _Args>
      void
      vector<_Tp, _Alloc>::
      _M_insert_aux(iterator __position, _Args&&... __args)






    {
      if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
 {
   _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
              std::move(*(this->_M_impl._M_finish - 1)));

   ++this->_M_impl._M_finish;



   std::move_backward(__position.base(), this->_M_impl._M_finish - 2, this->_M_impl._M_finish - 1);





   *__position = _Tp(std::forward<_Args>(__args)...);

 }
      else
 {
   const size_type __len =
     _M_check_len(size_type(1), "vector::_M_insert_aux");
   const size_type __elems_before = __position - begin();
   pointer __new_start(this->_M_allocate(__len));
   pointer __new_finish(__new_start);
   try
     {




       _Alloc_traits::construct(this->_M_impl,
                         __new_start + __elems_before,

           std::forward<_Args>(__args)...);



       __new_finish = pointer();

       __new_finish
  = std::__uninitialized_move_if_noexcept_a
  (this->_M_impl._M_start, __position.base(),
   __new_start, _M_get_Tp_allocator());

       ++__new_finish;

       __new_finish
  = std::__uninitialized_move_if_noexcept_a
  (__position.base(), this->_M_impl._M_finish,
   __new_finish, _M_get_Tp_allocator());
     }
          catch(...)
     {
       if (!__new_finish)
  _Alloc_traits::destroy(this->_M_impl,
                         __new_start + __elems_before);
       else
  std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
       _M_deallocate(__new_start, __len);
       throw;
     }
   std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
   _M_get_Tp_allocator());
   _M_deallocate(this->_M_impl._M_start,
   this->_M_impl._M_end_of_storage
   - this->_M_impl._M_start);
   this->_M_impl._M_start = __new_start;
   this->_M_impl._M_finish = __new_finish;
   this->_M_impl._M_end_of_storage = __new_start + __len;
 }
    }


  template<typename _Tp, typename _Alloc>
    template<typename... _Args>
      void
      vector<_Tp, _Alloc>::
      _M_emplace_back_aux(_Args&&... __args)
      {
 const size_type __len =
   _M_check_len(size_type(1), "vector::_M_emplace_back_aux");
 pointer __new_start(this->_M_allocate(__len));
 pointer __new_finish(__new_start);
 try
   {
     _Alloc_traits::construct(this->_M_impl, __new_start + size(),
         std::forward<_Args>(__args)...);
     __new_finish = pointer();

     __new_finish
       = std::__uninitialized_move_if_noexcept_a
       (this->_M_impl._M_start, this->_M_impl._M_finish,
        __new_start, _M_get_Tp_allocator());

     ++__new_finish;
   }
 catch(...)
   {
     if (!__new_finish)
       _Alloc_traits::destroy(this->_M_impl, __new_start + size());
     else
       std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
     _M_deallocate(__new_start, __len);
     throw;
   }
 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
        _M_get_Tp_allocator());
 _M_deallocate(this->_M_impl._M_start,
        this->_M_impl._M_end_of_storage
        - this->_M_impl._M_start);
 this->_M_impl._M_start = __new_start;
 this->_M_impl._M_finish = __new_finish;
 this->_M_impl._M_end_of_storage = __new_start + __len;
      }


  template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
    _M_fill_insert(iterator __position, size_type __n, const value_type& __x)
    {
      if (__n != 0)
 {
   if (size_type(this->_M_impl._M_end_of_storage
   - this->_M_impl._M_finish) >= __n)
     {
       value_type __x_copy = __x;
       const size_type __elems_after = end() - __position;
       pointer __old_finish(this->_M_impl._M_finish);
       if (__elems_after > __n)
  {
    std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
           this->_M_impl._M_finish,
           this->_M_impl._M_finish,
           _M_get_Tp_allocator());
    this->_M_impl._M_finish += __n;
    std::move_backward(__position.base(), __old_finish - __n, __old_finish);

    std::fill(__position.base(), __position.base() + __n,
       __x_copy);
  }
       else
  {
    this->_M_impl._M_finish =
      std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
        __n - __elems_after,
        __x_copy,
        _M_get_Tp_allocator());
    std::__uninitialized_move_a(__position.base(), __old_finish,
           this->_M_impl._M_finish,
           _M_get_Tp_allocator());
    this->_M_impl._M_finish += __elems_after;
    std::fill(__position.base(), __old_finish, __x_copy);
  }
     }
   else
     {
       const size_type __len =
  _M_check_len(__n, "vector::_M_fill_insert");
       const size_type __elems_before = __position - begin();
       pointer __new_start(this->_M_allocate(__len));
       pointer __new_finish(__new_start);
       try
  {

    std::__uninitialized_fill_n_a(__new_start + __elems_before,
      __n, __x,
      _M_get_Tp_allocator());
    __new_finish = pointer();

    __new_finish
      = std::__uninitialized_move_if_noexcept_a
      (this->_M_impl._M_start, __position.base(),
       __new_start, _M_get_Tp_allocator());

    __new_finish += __n;

    __new_finish
      = std::__uninitialized_move_if_noexcept_a
      (__position.base(), this->_M_impl._M_finish,
       __new_finish, _M_get_Tp_allocator());
  }
       catch(...)
  {
    if (!__new_finish)
      std::_Destroy(__new_start + __elems_before,
      __new_start + __elems_before + __n,
      _M_get_Tp_allocator());
    else
      std::_Destroy(__new_start, __new_finish,
      _M_get_Tp_allocator());
    _M_deallocate(__new_start, __len);
    throw;
  }
       std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
       _M_get_Tp_allocator());
       _M_deallocate(this->_M_impl._M_start,
       this->_M_impl._M_end_of_storage
       - this->_M_impl._M_start);
       this->_M_impl._M_start = __new_start;
       this->_M_impl._M_finish = __new_finish;
       this->_M_impl._M_end_of_storage = __new_start + __len;
     }
 }
    }


  template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
    _M_default_append(size_type __n)
    {
      if (__n != 0)
 {
   if (size_type(this->_M_impl._M_end_of_storage
   - this->_M_impl._M_finish) >= __n)
     {
       this->_M_impl._M_finish =
  std::__uninitialized_default_n_a(this->_M_impl._M_finish,
       __n, _M_get_Tp_allocator());
     }
   else
     {
       const size_type __len =
  _M_check_len(__n, "vector::_M_default_append");
       const size_type __old_size = this->size();
       pointer __new_start(this->_M_allocate(__len));
       pointer __new_finish(__new_start);
       try
  {
    __new_finish
      = std::__uninitialized_move_if_noexcept_a
      (this->_M_impl._M_start, this->_M_impl._M_finish,
       __new_start, _M_get_Tp_allocator());
    __new_finish =
      std::__uninitialized_default_n_a(__new_finish, __n,
           _M_get_Tp_allocator());
  }
       catch(...)
  {
    std::_Destroy(__new_start, __new_finish,
    _M_get_Tp_allocator());
    _M_deallocate(__new_start, __len);
    throw;
  }
       std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
       _M_get_Tp_allocator());
       _M_deallocate(this->_M_impl._M_start,
       this->_M_impl._M_end_of_storage
       - this->_M_impl._M_start);
       this->_M_impl._M_start = __new_start;
       this->_M_impl._M_finish = __new_finish;
       this->_M_impl._M_end_of_storage = __new_start + __len;
     }
 }
    }

  template<typename _Tp, typename _Alloc>
    bool
    vector<_Tp, _Alloc>::
    _M_shrink_to_fit()
    {
      if (capacity() == size())
 return false;
      return std::__shrink_to_fit_aux<vector>::_S_do_it(*this);
    }


  template<typename _Tp, typename _Alloc>
    template<typename _InputIterator>
      void
      vector<_Tp, _Alloc>::
      _M_range_insert(iterator __pos, _InputIterator __first,
        _InputIterator __last, std::input_iterator_tag)
      {
 for (; __first != __last; ++__first)
   {
     __pos = insert(__pos, *__first);
     ++__pos;
   }
      }

  template<typename _Tp, typename _Alloc>
    template<typename _ForwardIterator>
      void
      vector<_Tp, _Alloc>::
      _M_range_insert(iterator __position, _ForwardIterator __first,
        _ForwardIterator __last, std::forward_iterator_tag)
      {
 if (__first != __last)
   {
     const size_type __n = std::distance(__first, __last);
     if (size_type(this->_M_impl._M_end_of_storage
     - this->_M_impl._M_finish) >= __n)
       {
  const size_type __elems_after = end() - __position;
  pointer __old_finish(this->_M_impl._M_finish);
  if (__elems_after > __n)
    {
      std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
      this->_M_impl._M_finish,
      this->_M_impl._M_finish,
      _M_get_Tp_allocator());
      this->_M_impl._M_finish += __n;
      std::move_backward(__position.base(), __old_finish - __n, __old_finish);

      std::copy(__first, __last, __position);
    }
  else
    {
      _ForwardIterator __mid = __first;
      std::advance(__mid, __elems_after);
      std::__uninitialized_copy_a(__mid, __last,
      this->_M_impl._M_finish,
      _M_get_Tp_allocator());
      this->_M_impl._M_finish += __n - __elems_after;
      std::__uninitialized_move_a(__position.base(),
      __old_finish,
      this->_M_impl._M_finish,
      _M_get_Tp_allocator());
      this->_M_impl._M_finish += __elems_after;
      std::copy(__first, __mid, __position);
    }
       }
     else
       {
  const size_type __len =
    _M_check_len(__n, "vector::_M_range_insert");
  pointer __new_start(this->_M_allocate(__len));
  pointer __new_finish(__new_start);
  try
    {
      __new_finish
        = std::__uninitialized_move_if_noexcept_a
        (this->_M_impl._M_start, __position.base(),
         __new_start, _M_get_Tp_allocator());
      __new_finish
        = std::__uninitialized_copy_a(__first, __last,
          __new_finish,
          _M_get_Tp_allocator());
      __new_finish
        = std::__uninitialized_move_if_noexcept_a
        (__position.base(), this->_M_impl._M_finish,
         __new_finish, _M_get_Tp_allocator());
    }
  catch(...)
    {
      std::_Destroy(__new_start, __new_finish,
      _M_get_Tp_allocator());
      _M_deallocate(__new_start, __len);
      throw;
    }
  std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
         _M_get_Tp_allocator());
  _M_deallocate(this->_M_impl._M_start,
         this->_M_impl._M_end_of_storage
         - this->_M_impl._M_start);
  this->_M_impl._M_start = __new_start;
  this->_M_impl._M_finish = __new_finish;
  this->_M_impl._M_end_of_storage = __new_start + __len;
       }
   }
      }



  template<typename _Alloc>
    void
    vector<bool, _Alloc>::
    _M_reallocate(size_type __n)
    {
      _Bit_pointer __q = this->_M_allocate(__n);
      iterator __start(std::__addressof(*__q), 0);
      this->_M_impl._M_finish = _M_copy_aligned(begin(), end(), __start);
      this->_M_deallocate();
      this->_M_impl._M_start = __start;
      this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
    }

  template<typename _Alloc>
    void
    vector<bool, _Alloc>::
    _M_fill_insert(iterator __position, size_type __n, bool __x)
    {
      if (__n == 0)
 return;
      if (capacity() - size() >= __n)
 {
   std::copy_backward(__position, end(),
        this->_M_impl._M_finish + difference_type(__n));
   std::fill(__position, __position + difference_type(__n), __x);
   this->_M_impl._M_finish += difference_type(__n);
 }
      else
 {
   const size_type __len =
     _M_check_len(__n, "vector<bool>::_M_fill_insert");
   _Bit_pointer __q = this->_M_allocate(__len);
   iterator __start(std::__addressof(*__q), 0);
   iterator __i = _M_copy_aligned(begin(), __position, __start);
   std::fill(__i, __i + difference_type(__n), __x);
   this->_M_impl._M_finish = std::copy(__position, end(),
           __i + difference_type(__n));
   this->_M_deallocate();
   this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
   this->_M_impl._M_start = __start;
 }
    }

  template<typename _Alloc>
    template<typename _ForwardIterator>
      void
      vector<bool, _Alloc>::
      _M_insert_range(iterator __position, _ForwardIterator __first,
        _ForwardIterator __last, std::forward_iterator_tag)
      {
 if (__first != __last)
   {
     size_type __n = std::distance(__first, __last);
     if (capacity() - size() >= __n)
       {
  std::copy_backward(__position, end(),
       this->_M_impl._M_finish
       + difference_type(__n));
  std::copy(__first, __last, __position);
  this->_M_impl._M_finish += difference_type(__n);
       }
     else
       {
  const size_type __len =
    _M_check_len(__n, "vector<bool>::_M_insert_range");
  _Bit_pointer __q = this->_M_allocate(__len);
  iterator __start(std::__addressof(*__q), 0);
  iterator __i = _M_copy_aligned(begin(), __position, __start);
  __i = std::copy(__first, __last, __i);
  this->_M_impl._M_finish = std::copy(__position, end(), __i);
  this->_M_deallocate();
  this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
  this->_M_impl._M_start = __start;
       }
   }
      }

  template<typename _Alloc>
    void
    vector<bool, _Alloc>::
    _M_insert_aux(iterator __position, bool __x)
    {
      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
 {
   std::copy_backward(__position, this->_M_impl._M_finish,
        this->_M_impl._M_finish + 1);
   *__position = __x;
   ++this->_M_impl._M_finish;
 }
      else
 {
   const size_type __len =
     _M_check_len(size_type(1), "vector<bool>::_M_insert_aux");
   _Bit_pointer __q = this->_M_allocate(__len);
   iterator __start(std::__addressof(*__q), 0);
   iterator __i = _M_copy_aligned(begin(), __position, __start);
   *__i++ = __x;
   this->_M_impl._M_finish = std::copy(__position, end(), __i);
   this->_M_deallocate();
   this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
   this->_M_impl._M_start = __start;
 }
    }

  template<typename _Alloc>
    typename vector<bool, _Alloc>::iterator
    vector<bool, _Alloc>::
    _M_erase(iterator __position)
    {
      if (__position + 1 != end())
        std::copy(__position + 1, end(), __position);
      --this->_M_impl._M_finish;
      return __position;
    }

  template<typename _Alloc>
    typename vector<bool, _Alloc>::iterator
    vector<bool, _Alloc>::
    _M_erase(iterator __first, iterator __last)
    {
      if (__first != __last)
 _M_erase_at_end(std::copy(__last, end(), __first));
      return __first;
    }


  template<typename _Alloc>
    bool
    vector<bool, _Alloc>::
    _M_shrink_to_fit()
    {
      if (capacity() - size() < int(_S_word_bit))
 return false;
      try
 {
   _M_reallocate(size());
   return true;
 }
      catch(...)
 { return false; }
    }



}



namespace std __attribute__ ((__visibility__ ("default")))
{


  template<typename _Alloc>
    size_t
    hash<std::vector<bool, _Alloc>>::
    operator()(const std::vector<bool, _Alloc>& __b) const noexcept
    {
      size_t __hash = 0;
      using std::_S_word_bit;
      using std::_Bit_type;

      const size_t __words = __b.size() / _S_word_bit;
      if (__words)
 {
   const size_t __clength = __words * sizeof(_Bit_type);
   __hash = std::_Hash_impl::hash(__b._M_impl._M_start._M_p, __clength);
 }

      const size_t __extrabits = __b.size() % _S_word_bit;
      if (__extrabits)
 {
   _Bit_type __hiword = *__b._M_impl._M_finish._M_p;
   __hiword &= ~((~static_cast<_Bit_type>(0)) << __extrabits);

   const size_t __clength
     = (__extrabits + 8 - 1) / 8;
   if (__words)
     __hash = std::_Hash_impl::hash(&__hiword, __clength, __hash);
   else
     __hash = std::_Hash_impl::hash(&__hiword, __clength);
 }

      return __hash;
    }


}
# 70 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/vector" 2 3
# 62 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/queue" 2 3


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 1 3
# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 95 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
  template<typename _Tp, typename _Sequence = deque<_Tp> >
    class queue
    {

      typedef typename _Sequence::value_type _Sequence_value_type;





      template<typename _Tp1, typename _Seq1>
        friend bool
        operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

      template<typename _Tp1, typename _Seq1>
        friend bool
        operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);


      template<typename _Alloc>
 using _Uses = typename
   enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;


    public:
      typedef typename _Sequence::value_type value_type;
      typedef typename _Sequence::reference reference;
      typedef typename _Sequence::const_reference const_reference;
      typedef typename _Sequence::size_type size_type;
      typedef _Sequence container_type;

    protected:
# 135 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      _Sequence c;

    public:
# 146 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      explicit
      queue(const _Sequence& __c)
      : c(__c) { }

      explicit
      queue(_Sequence&& __c = _Sequence())
      : c(std::move(__c)) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 explicit
 queue(const _Alloc& __a)
 : c(__a) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 queue(const _Sequence& __c, const _Alloc& __a)
 : c(__c, __a) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 queue(_Sequence&& __c, const _Alloc& __a)
 : c(std::move(__c), __a) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 queue(const queue& __q, const _Alloc& __a)
 : c(__q.c, __a) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 queue(queue&& __q, const _Alloc& __a)
 : c(std::move(__q.c), __a) { }





      bool
      empty() const
      { return c.empty(); }


      size_type
      size() const
      { return c.size(); }





      reference
      front()
      {
                              ;
 return c.front();
      }





      const_reference
      front() const
      {
                              ;
 return c.front();
      }





      reference
      back()
      {
                              ;
 return c.back();
      }





      const_reference
      back() const
      {
                              ;
 return c.back();
      }
# 241 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      void
      push(const value_type& __x)
      { c.push_back(__x); }


      void
      push(value_type&& __x)
      { c.push_back(std::move(__x)); }

      template<typename... _Args>
        void
        emplace(_Args&&... __args)
 { c.emplace_back(std::forward<_Args>(__args)...); }
# 267 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      void
      pop()
      {
                              ;
 c.pop_front();
      }


      void
      swap(queue& __q)
      noexcept(__is_nothrow_swappable<_Tp>::value)
      {
 using std::swap;
 swap(c, __q.c);
      }

    };
# 296 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
  template<typename _Tp, typename _Seq>
    inline bool
    operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
    { return __x.c == __y.c; }
# 314 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
  template<typename _Tp, typename _Seq>
    inline bool
    operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
    { return __x.c < __y.c; }


  template<typename _Tp, typename _Seq>
    inline bool
    operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
    { return !(__x == __y); }


  template<typename _Tp, typename _Seq>
    inline bool
    operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
    { return __y < __x; }


  template<typename _Tp, typename _Seq>
    inline bool
    operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
    { return !(__y < __x); }


  template<typename _Tp, typename _Seq>
    inline bool
    operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
    { return !(__x < __y); }


  template<typename _Tp, typename _Seq>
    inline void
    swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }

  template<typename _Tp, typename _Seq, typename _Alloc>
    struct uses_allocator<queue<_Tp, _Seq>, _Alloc>
    : public uses_allocator<_Seq, _Alloc>::type { };
# 395 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
  template<typename _Tp, typename _Sequence = vector<_Tp>,
    typename _Compare = less<typename _Sequence::value_type> >
    class priority_queue
    {

      typedef typename _Sequence::value_type _Sequence_value_type;
# 409 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      template<typename _Alloc>
 using _Uses = typename
   enable_if<uses_allocator<_Sequence, _Alloc>::value>::type;


    public:
      typedef typename _Sequence::value_type value_type;
      typedef typename _Sequence::reference reference;
      typedef typename _Sequence::const_reference const_reference;
      typedef typename _Sequence::size_type size_type;
      typedef _Sequence container_type;

    protected:

      _Sequence c;
      _Compare comp;

    public:
# 437 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      explicit
      priority_queue(const _Compare& __x,
       const _Sequence& __s)
      : c(__s), comp(__x)
      { std::make_heap(c.begin(), c.end(), comp); }

      explicit
      priority_queue(const _Compare& __x = _Compare(),
       _Sequence&& __s = _Sequence())
      : c(std::move(__s)), comp(__x)
      { std::make_heap(c.begin(), c.end(), comp); }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 explicit
 priority_queue(const _Alloc& __a)
 : c(__a), comp() { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 priority_queue(const _Compare& __x, const _Alloc& __a)
 : c(__a), comp(__x) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 priority_queue(const _Compare& __x, const _Sequence& __c,
         const _Alloc& __a)
 : c(__c, __a), comp(__x) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 priority_queue(const _Compare& __x, _Sequence&& __c, const _Alloc& __a)
 : c(std::move(__c), __a), comp(__x) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 priority_queue(const priority_queue& __q, const _Alloc& __a)
 : c(__q.c, __a), comp(__q.comp) { }

      template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
 priority_queue(priority_queue&& __q, const _Alloc& __a)
 : c(std::move(__q.c), __a), comp(std::move(__q.comp)) { }
# 503 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      template<typename _InputIterator>
        priority_queue(_InputIterator __first, _InputIterator __last,
         const _Compare& __x,
         const _Sequence& __s)
 : c(__s), comp(__x)
        {
                                                  ;
   c.insert(c.end(), __first, __last);
   std::make_heap(c.begin(), c.end(), comp);
 }

      template<typename _InputIterator>
        priority_queue(_InputIterator __first, _InputIterator __last,
         const _Compare& __x = _Compare(),
         _Sequence&& __s = _Sequence())
 : c(std::move(__s)), comp(__x)
        {
                                                  ;
   c.insert(c.end(), __first, __last);
   std::make_heap(c.begin(), c.end(), comp);
 }





      bool
      empty() const
      { return c.empty(); }


      size_type
      size() const
      { return c.size(); }





      const_reference
      top() const
      {
                              ;
 return c.front();
      }
# 557 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      void
      push(const value_type& __x)
      {
 c.push_back(__x);
 std::push_heap(c.begin(), c.end(), comp);
      }


      void
      push(value_type&& __x)
      {
 c.push_back(std::move(__x));
 std::push_heap(c.begin(), c.end(), comp);
      }

      template<typename... _Args>
        void
        emplace(_Args&&... __args)
 {
   c.emplace_back(std::forward<_Args>(__args)...);
   std::push_heap(c.begin(), c.end(), comp);
 }
# 592 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/stl_queue.h" 3
      void
      pop()
      {
                              ;
 std::pop_heap(c.begin(), c.end(), comp);
 c.pop_back();
      }


      void
      swap(priority_queue& __pq)
      noexcept(__is_nothrow_swappable<_Tp>::value
               && __is_nothrow_swappable<_Compare>::value)
      {
 using std::swap;
 swap(c, __pq.c);
 swap(comp, __pq.comp);
      }

    };




  template<typename _Tp, typename _Sequence, typename _Compare>
    inline void
    swap(priority_queue<_Tp, _Sequence, _Compare>& __x,
  priority_queue<_Tp, _Sequence, _Compare>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }

  template<typename _Tp, typename _Sequence, typename _Compare,
    typename _Alloc>
    struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc>
    : public uses_allocator<_Sequence, _Alloc>::type { };



}
# 65 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/queue" 2 3
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DeferredFinalize.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/DeferredFinalize.h"
class nsISupports;

namespace mozilla {




typedef void* (*DeferredFinalizeAppendFunction)(void* aPointers, void* aThing);





typedef bool (*DeferredFinalizeFunction)(uint32_t aSlice, void* aData);

void DeferredFinalize(DeferredFinalizeAppendFunction aAppendFunc,
                      DeferredFinalizeFunction aFunc,
                      void* aThing);

void DeferredFinalize(nsISupports* aSupports);

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SegmentedVector.h" 1
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SegmentedVector.h"
namespace mozilla {
# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SegmentedVector.h"
template<typename T,
         size_t IdealSegmentSize = 4096,
         typename AllocPolicy = MallocAllocPolicy>
class SegmentedVector : private AllocPolicy
{
  template<size_t SegmentCapacity>
  struct SegmentImpl
    : public mozilla::LinkedListElement<SegmentImpl<SegmentCapacity>>
  {
    SegmentImpl() : mLength(0) {}

    ~SegmentImpl()
    {
      for (uint32_t i = 0; i < mLength; i++) {
        (*this)[i].~T();
      }
    }

    uint32_t Length() const { return mLength; }

    T* Elems() { return reinterpret_cast<T*>(&mStorage.mBuf); }

    T& operator[](size_t aIndex)
    {
      do { } while (0);
      return Elems()[aIndex];
    }

    const T& operator[](size_t aIndex) const
    {
      do { } while (0);
      return Elems()[aIndex];
    }

    template<typename U>
    void Append(U&& aU)
    {
      do { } while (0);

      mLength++;
      T* elem = &(*this)[mLength - 1];
      new (elem) T(mozilla::Forward<U>(aU));
    }

    void PopLast()
    {
      do { } while (0);
      (*this)[mLength - 1].~T();
      mLength--;
    }

    uint32_t mLength;


    union Storage
    {
      char mBuf[sizeof(T) * SegmentCapacity];
      mozilla::AlignedElem<mozilla::AlignmentFinder<T>::alignment> mAlign;
    } mStorage;

    static_assert(mozilla::AlignmentFinder<T>::alignment == mozilla::AlignmentFinder<Storage>::alignment,
                  "SegmentedVector provides incorrect alignment");
  };




  static const size_t kSingleElementSegmentSize = sizeof(SegmentImpl<1>);
  static const size_t kSegmentCapacity =
    kSingleElementSegmentSize <= IdealSegmentSize
    ? (IdealSegmentSize - kSingleElementSegmentSize) / sizeof(T) + 1
    : 1;

  typedef SegmentImpl<kSegmentCapacity> Segment;

public:




  explicit SegmentedVector(size_t aIdealSegmentSize = 0)
  {



    do { } while (0);



  }

  ~SegmentedVector() { Clear(); }

  bool IsEmpty() const { return !mSegments.getFirst(); }



  size_t Length() const
  {
    size_t n = 0;
    for (auto segment = mSegments.getFirst();
         segment;
         segment = segment->getNext()) {
      n += segment->Length();
    }
    return n;
  }



  template<typename U>
  __attribute__ ((warn_unused_result)) bool Append(U&& aU)
  {
    Segment* last = mSegments.getLast();
    if (!last || last->Length() == kSegmentCapacity) {
      last = this->template pod_malloc<Segment>(1);
      if (!last) {
        return false;
      }
      new (last) Segment();
      mSegments.insertBack(last);
    }
    last->Append(mozilla::Forward<U>(aU));
    return true;
  }



  template<typename U>
  void InfallibleAppend(U&& aU)
  {
    bool ok = Append(mozilla::Forward<U>(aU));
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(ok)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(ok))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "ok" ")"); do { *((volatile int*) __null) = 183; ::abort(); } while (0); } } while (0);
  }

  void Clear()
  {
    Segment* segment;
    while ((segment = mSegments.popFirst())) {
      segment->~Segment();
      this->free_(segment);
    }
  }

  T& GetLast()
  {
    do { } while (0);
    Segment* last = mSegments.getLast();
    return (*last)[last->Length() - 1];
  }

  const T& GetLast() const
  {
    do { } while (0);
    Segment* last = mSegments.getLast();
    return (*last)[last->Length() - 1];
  }

  void PopLast()
  {
    do { } while (0);
    Segment* last = mSegments.getLast();
    last->PopLast();
    if (!last->Length()) {
      mSegments.popLast();
      last->~Segment();
      this->free_(last);
    }
  }



  void PopLastN(uint32_t aNumElements)
  {
    do { } while (0);

    Segment* last;




    do {
      last = mSegments.getLast();


      if (!last) {
        return;
      }



      uint32_t segmentLen = last->Length();
      if (segmentLen > aNumElements) {
        break;
      }


      mSegments.popLast();
      last->~Segment();
      this->free_(last);

      do { } while (0);
      aNumElements -= segmentLen;
      if (aNumElements == 0) {
        return;
      }
    } while (true);



    do { } while (0);
    do { } while (0);
    do { } while (0);
    do { } while (0);
    for (uint32_t i = 0; i < aNumElements; ++i) {
      last->PopLast();
    }
    do { } while (0);
  }
# 278 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SegmentedVector.h"
  class IterImpl
  {
    friend class SegmentedVector;

    Segment* mSegment;
    size_t mIndex;

    explicit IterImpl(SegmentedVector* aVector)
      : mSegment(aVector->mSegments.getFirst())
      , mIndex(0)
    {}

  public:
    bool Done() const { return !mSegment; }

    T& Get()
    {
      do { } while (0);
      return (*mSegment)[mIndex];
    }

    const T& Get() const
    {
      do { } while (0);
      return (*mSegment)[mIndex];
    }

    void Next()
    {
      do { } while (0);
      mIndex++;
      if (mIndex == mSegment->Length()) {
        mSegment = mSegment->getNext();
        mIndex = 0;
      }
    }
  };

  IterImpl Iter() { return IterImpl(this); }





  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return mSegments.sizeOfExcludingThis(aMallocSizeOf);
  }


  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
  }

private:
  mozilla::LinkedList<Segment> mSegments;
};

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDataHashtable.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDataHashtable.h"
template<class KeyClass, class DataType>
class nsDataHashtable
  : public nsBaseHashtable<KeyClass, DataType, DataType>
{
private:
  typedef nsBaseHashtable<KeyClass, DataType, DataType> BaseClass;

public:
  using typename BaseClass::KeyType;
  using typename BaseClass::EntryType;

  nsDataHashtable() {}
  explicit nsDataHashtable(uint32_t aInitLength)
    : BaseClass(aInitLength)
  {
  }
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDataHashtable.h"
  mozilla::Maybe<DataType> GetAndRemove(KeyType aKey)
  {
    mozilla::Maybe<DataType> value;
    if (EntryType* ent = this->GetEntry(aKey)) {
      value.emplace(mozilla::Move(ent->mData));
      this->RemoveEntry(ent);
    }
    return value;
  }
};
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h" 2




class nsCycleCollectionNoteRootCallback;
class nsIException;
class nsIRunnable;
class nsThread;
class nsWrapperCache;

namespace js {
struct Class;
}

namespace mozilla {

class JSGCThingParticipant: public nsCycleCollectionParticipant
{
public:
  constexpr JSGCThingParticipant()
    : nsCycleCollectionParticipant(false) {}

  virtual void Root(void*) override
  {
    do { } while (0);
  }

  virtual void Unlink(void*) override
  {
    do { } while (0);
  }

  virtual void Unroot(void*) override
  {
    do { } while (0);
  }

  virtual void DeleteCycleCollectable(void* aPtr) override
  {
    do { } while (0);
  }

  virtual nsresult TraverseNative(void* aPtr, nsCycleCollectionTraversalCallback& aCb)
    override;

  virtual const char* ClassName() override { return "JSGCThingParticipant"; };
};

class JSZoneParticipant : public nsCycleCollectionParticipant
{
public:
  constexpr JSZoneParticipant(): nsCycleCollectionParticipant(false)
  {
  }

  virtual void Root(void*) override
  {
    do { } while (0);
  }

  virtual void Unlink(void*) override
  {
    do { } while (0);
  }

  virtual void Unroot(void*) override
  {
    do { } while (0);
  }

  virtual void DeleteCycleCollectable(void*) override
  {
    do { } while (0);
  }

  virtual nsresult TraverseNative(void* aPtr, nsCycleCollectionTraversalCallback& aCb)
    override;

  virtual const char* ClassName() override { return "JSZoneParticipant"; };
};

class IncrementalFinalizeRunnable;


struct CycleCollectorResults
{
  CycleCollectorResults()
  {


    Init();
  }

  void Init()
  {
    mForcedGC = false;
    mMergedZones = false;
    mAnyManual = false;
    mVisitedRefCounted = 0;
    mVisitedGCed = 0;
    mFreedRefCounted = 0;
    mFreedGCed = 0;
    mFreedJSZones = 0;
    mNumSlices = 1;


  }

  bool mForcedGC;
  bool mMergedZones;
  bool mAnyManual;
  uint32_t mVisitedRefCounted;
  uint32_t mVisitedGCed;
  uint32_t mFreedRefCounted;
  uint32_t mFreedGCed;
  uint32_t mFreedJSZones;
  uint32_t mNumSlices;
};

class CycleCollectedJSContext
{
  friend class JSGCThingParticipant;
  friend class JSZoneParticipant;
  friend class IncrementalFinalizeRunnable;
protected:
  CycleCollectedJSContext();
  virtual ~CycleCollectedJSContext();


  nsresult Initialize(JSRuntime* aParentRuntime,
                      uint32_t aMaxBytes,
                      uint32_t aMaxNurseryBytes);

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
  void UnmarkSkippableJSHolders();

  virtual void
  TraverseAdditionalNativeRoots(nsCycleCollectionNoteRootCallback& aCb) {}
  virtual void TraceAdditionalNativeGrayRoots(JSTracer* aTracer) {}

  virtual void CustomGCCallback(JSGCStatus aStatus) {}
  virtual void CustomOutOfMemoryCallback() {}
  virtual void CustomLargeAllocationFailureCallback() {}

  std::queue<nsCOMPtr<nsIRunnable>> mPromiseMicroTaskQueue;
  std::queue<nsCOMPtr<nsIRunnable>> mDebuggerPromiseMicroTaskQueue;

private:
  void
  DescribeGCThing(bool aIsMarked, JS::GCCellPtr aThing,
                  nsCycleCollectionTraversalCallback& aCb) const;

  virtual bool
  DescribeCustomObjects(JSObject* aObject, const js::Class* aClasp,
                        char (&aName)[72]) const
  {
    return false;
  }

  void
  NoteGCThingJSChildren(JS::GCCellPtr aThing,
                        nsCycleCollectionTraversalCallback& aCb) const;

  void
  NoteGCThingXPCOMChildren(const js::Class* aClasp, JSObject* aObj,
                           nsCycleCollectionTraversalCallback& aCb) const;

  virtual bool
  NoteCustomGCThingXPCOMChildren(const js::Class* aClasp, JSObject* aObj,
                                 nsCycleCollectionTraversalCallback& aCb) const
  {
    return false;
  }

  enum TraverseSelect {
    TRAVERSE_CPP,
    TRAVERSE_FULL
  };

  void
  TraverseGCThing(TraverseSelect aTs, JS::GCCellPtr aThing,
                  nsCycleCollectionTraversalCallback& aCb);

  void
  TraverseZone(JS::Zone* aZone, nsCycleCollectionTraversalCallback& aCb);

  static void
  TraverseObjectShim(void* aData, JS::GCCellPtr aThing);

  void TraverseNativeRoots(nsCycleCollectionNoteRootCallback& aCb);

  static void TraceBlackJS(JSTracer* aTracer, void* aData);
  static void TraceGrayJS(JSTracer* aTracer, void* aData);
  static void GCCallback(JSContext* aContext, JSGCStatus aStatus, void* aData);
  static void GCSliceCallback(JSContext* aContext, JS::GCProgress aProgress,
                              const JS::GCDescription& aDesc);
  static void GCNurseryCollectionCallback(JSContext* aContext,
                                          JS::GCNurseryProgress aProgress,
                                          JS::gcreason::Reason aReason);
  static void OutOfMemoryCallback(JSContext* aContext, void* aData);
  static void LargeAllocationFailureCallback(void* aData);



  static size_t SizeofExternalStringCallback(JSString* aStr,
                                             mozilla::MallocSizeOf aMallocSizeOf);

  static bool ContextCallback(JSContext* aCx, unsigned aOperation,
                              void* aData);
  static JSObject* GetIncumbentGlobalCallback(JSContext* aCx);
  static bool EnqueuePromiseJobCallback(JSContext* aCx,
                                        JS::HandleObject aJob,
                                        JS::HandleObject aAllocationSite,
                                        JS::HandleObject aIncumbentGlobal,
                                        void* aData);
  static void PromiseRejectionTrackerCallback(JSContext* aCx,
                                              JS::HandleObject aPromise,
                                              PromiseRejectionHandlingState state,
                                              void* aData);

  virtual void TraceNativeBlackRoots(JSTracer* aTracer) { };
  void TraceNativeGrayRoots(JSTracer* aTracer);

  void AfterProcessMicrotask(uint32_t aRecursionDepth);
public:
  void ProcessStableStateQueue();
private:
  void ProcessMetastableStateQueue(uint32_t aRecursionDepth);

public:
  enum DeferredFinalizeType {
    FinalizeIncrementally,
    FinalizeNow,
  };

  void FinalizeDeferredThings(DeferredFinalizeType aType);



  enum class OOMState : uint32_t {

    OK,
# 271 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h"
    Reporting,
# 281 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CycleCollectedJSContext.h"
    Reported,





    Recovered
  };

private:
  void AnnotateAndSetOutOfMemory(OOMState* aStatePtr, OOMState aNewState);
  void OnGC(JSGCStatus aStatus);
  void OnOutOfMemory();
  void OnLargeAllocationFailure();

public:
  void AddJSHolder(void* aHolder, nsScriptObjectTracer* aTracer);
  void RemoveJSHolder(void* aHolder);





  already_AddRefed<nsIException> GetPendingException() const;
  void SetPendingException(nsIException* aException);

  std::queue<nsCOMPtr<nsIRunnable>>& GetPromiseMicroTaskQueue();
  std::queue<nsCOMPtr<nsIRunnable>>& GetDebuggerPromiseMicroTaskQueue();

  nsCycleCollectionParticipant* GCThingParticipant();
  nsCycleCollectionParticipant* ZoneParticipant();

  nsresult TraverseRoots(nsCycleCollectionNoteRootCallback& aCb);
  virtual bool UsefulToMergeZones() const;
  void FixWeakMappingGrayBits() const;
  void CheckGrayBits() const;
  bool AreGCGrayBitsValid() const;
  void GarbageCollect(uint32_t aReason) const;

  void NurseryWrapperAdded(nsWrapperCache* aCache);
  void NurseryWrapperPreserved(JSObject* aWrapper);
  void JSObjectsTenured();

  void DeferredFinalize(DeferredFinalizeAppendFunction aAppendFunc,
                        DeferredFinalizeFunction aFunc,
                        void* aThing);
  void DeferredFinalize(nsISupports* aSupports);

  void DumpJSHeap(FILE* aFile);

  virtual void PrepareForForgetSkippable() = 0;
  virtual void BeginCycleCollectionCallback() = 0;
  virtual void EndCycleCollectionCallback(CycleCollectorResults& aResults) = 0;
  virtual void DispatchDeferredDeletion(bool aContinuation, bool aPurge = false) = 0;

  JSContext* Context() const
  {
    do { } while (0);
    return mJSContext;
  }

  JS::RootingContext* RootingCx() const
  {
    do { } while (0);
    return JS::RootingContext::get(mJSContext);
  }

  bool MicroTaskCheckpointDisabled() const
  {
    return mDisableMicroTaskCheckpoint;
  }

  void DisableMicroTaskCheckpoint(bool aDisable)
  {
    mDisableMicroTaskCheckpoint = aDisable;
  }

  class AutoDisableMicroTaskCheckpoint
  {
    public:
    AutoDisableMicroTaskCheckpoint()
    : mCCJSCX(CycleCollectedJSContext::Get())
    {
      mOldValue = mCCJSCX->MicroTaskCheckpointDisabled();
      mCCJSCX->DisableMicroTaskCheckpoint(true);
    }

    ~AutoDisableMicroTaskCheckpoint()
    {
      mCCJSCX->DisableMicroTaskCheckpoint(mOldValue);
    }

    CycleCollectedJSContext* mCCJSCX;
    bool mOldValue;
  };

protected:
  JSContext* MaybeContext() const { return mJSContext; }

public:

  virtual void BeforeProcessTask(bool aMightBlock) { };
  virtual void AfterProcessTask(uint32_t aRecursionDepth);


  void AfterProcessMicrotask();

  uint32_t RecursionDepth();


  void RunInStableState(already_AddRefed<nsIRunnable>&& aRunnable);


  void RunInMetastableState(already_AddRefed<nsIRunnable>&& aRunnable);



  static CycleCollectedJSContext* Get();


  void AddZoneWaitingForGC(JS::Zone* aZone)
  {
    mZonesWaitingForGC.PutEntry(aZone);
  }





  void PrepareWaitingZonesForGC();


  virtual void DispatchToMicroTask(already_AddRefed<nsIRunnable> aRunnable);







  JS::PersistentRooted<JS::GCVector<JSObject*, 0, js::SystemAllocPolicy>> mUncaughtRejections;




  JS::PersistentRooted<JS::GCVector<JSObject*, 0, js::SystemAllocPolicy>> mConsumedRejections;
  nsTArray<nsCOMPtr<nsISupports >> mUncaughtRejectionObservers;

private:
  JSGCThingParticipant mGCThingCycleCollectorGlobal;

  JSZoneParticipant mJSZoneCycleCollectorGlobal;

  JSContext* mJSContext;

  JS::GCSliceCallback mPrevGCSliceCallback;
  JS::GCNurseryCollectionCallback mPrevGCNurseryCollectionCallback;

  nsDataHashtable<nsPtrHashKey<void>, nsScriptObjectTracer*> mJSHolders;

  typedef nsDataHashtable<nsFuncPtrHashKey<DeferredFinalizeFunction>, void*>
    DeferredFinalizerTable;
  DeferredFinalizerTable mDeferredFinalizerTable;

  RefPtr<IncrementalFinalizeRunnable> mFinalizeRunnable;

  nsCOMPtr<nsIException> mPendingException;
  nsThread* mOwningThread;

  struct RunInMetastableStateData
  {
    nsCOMPtr<nsIRunnable> mRunnable;
    uint32_t mRecursionDepth;
  };

  nsTArray<nsCOMPtr<nsIRunnable>> mStableStateEvents;
  nsTArray<RunInMetastableStateData> mMetastableStateEvents;
  uint32_t mBaseRecursionDepth;
  bool mDoingStableStates;

  bool mDisableMicroTaskCheckpoint;

  OOMState mOutOfMemoryState;
  OOMState mLargeAllocationFailureState;

  static const size_t kSegmentSize = 512;
  SegmentedVector<nsWrapperCache*, kSegmentSize, InfallibleAllocPolicy>
    mNurseryObjects;
  SegmentedVector<JS::PersistentRooted<JSObject*>, kSegmentSize,
                  InfallibleAllocPolicy>
    mPreservedNurseryObjects;

  nsTHashtable<nsPtrHashKey<JS::Zone>> mZonesWaitingForGC;

  struct EnvironmentPreparer : public js::ScriptEnvironmentPreparer {
    void invoke(JS::HandleObject scope, Closure& closure) override;
  };
  EnvironmentPreparer mEnvironmentPreparer;
};

void TraceScriptHolder(nsISupports* aHolder, JSTracer* aTracer);


inline bool AddToCCKind(JS::TraceKind aKind)
{
  return aKind == JS::TraceKind::Object ||
         aKind == JS::TraceKind::Script ||
         aKind == JS::TraceKind::Scope ||
         aKind == JS::TraceKind::RegExpShared;
}

bool
GetBuildId(JS::BuildIdCharVector* aBuildID);

}
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/PrototypeList.h" 1





namespace mozilla {
namespace dom {
namespace prototypes {

namespace id {

enum ID : uint16_t
{
  _ID_Start = 0,
  ANGLE_instanced_arrays = _ID_Start,
  AccessibleNode,
  Addon,
  AddonEvent,
  AddonInstall,
  AddonManager,
  AnalyserNode,
  Animation,
  AnimationEffectReadOnly,
  AnimationEffectTiming,
  AnimationEffectTimingReadOnly,
  AnimationEvent,
  AnimationPlaybackEvent,
  AnimationTimeline,
  AnonymousContent,
  Attr,
  AudioBuffer,
  AudioBufferSourceNode,
  AudioContext,
  AudioDestinationNode,
  AudioListener,
  AudioNode,
  AudioParam,
  AudioProcessingEvent,
  AudioScheduledSourceNode,
  AudioStreamTrack,
  AudioTrack,
  AudioTrackList,
  AudioWorkletGlobalScope,
  AutocompleteErrorEvent,
  BarProp,
  BaseAudioContext,
  BatteryManager,
  BeforeUnloadEvent,
  BiquadFilterNode,
  Blob,
  BlobEvent,
  BoxObject,
  BroadcastChannel,
  BrowserElementAudioChannel,
  BrowserFeedWriter,
  CDATASection,
  CSS2Properties,
  CSSAnimation,
  CSSConditionRule,
  CSSCounterStyleRule,
  CSSFontFaceRule,
  CSSFontFeatureValuesRule,
  CSSGroupingRule,
  CSSImportRule,
  CSSKeyframeRule,
  CSSKeyframesRule,
  CSSLexer,
  CSSMediaRule,
  CSSMozDocumentRule,
  CSSNamespaceRule,
  CSSPageRule,
  CSSPrimitiveValue,
  CSSPseudoElement,
  CSSRule,
  CSSRuleList,
  CSSStyleDeclaration,
  CSSStyleRule,
  CSSStyleSheet,
  CSSSupportsRule,
  CSSTransition,
  CSSValue,
  CSSValueList,
  Cache,
  CacheStorage,
  CanvasCaptureMediaStream,
  CanvasGradient,
  CanvasPattern,
  CanvasRenderingContext2D,
  CaretPosition,
  CaretStateChangedEvent,
  ChannelMergerNode,
  ChannelSplitterNode,
  CharacterData,
  CheckerboardReportService,
  ChromeNodeList,
  ChromeWorker,
  Client,
  Clients,
  ClipboardEvent,
  CloseEvent,
  CommandEvent,
  Comment,
  CompositionEvent,
  ConstantSourceNode,
  ContainerBoxObject,
  ConvolverNode,
  Coordinates,
  CreateOfferRequest,
  Crypto,
  CryptoKey,
  CustomElementRegistry,
  CustomEvent,
  DOMCursor,
  DOMError,
  DOMException,
  DOMImplementation,
  DOMMatrix,
  DOMMatrixReadOnly,
  DOMParser,
  DOMPoint,
  DOMPointReadOnly,
  DOMQuad,
  DOMRect,
  DOMRectList,
  DOMRectReadOnly,
  DOMRequest,
  DOMStringList,
  DOMStringMap,
  DOMTokenList,
  DataChannel,
  DataContainerEvent,
  DataTransfer,
  DataTransferItem,
  DataTransferItemList,
  DedicatedWorkerGlobalScope,
  DelayNode,
  DesktopNotification,
  DesktopNotificationCenter,
  DeviceAcceleration,
  DeviceLightEvent,
  DeviceMotionEvent,
  DeviceOrientationEvent,
  DeviceProximityEvent,
  DeviceRotationRate,
  Directory,
  Document,
  DocumentFragment,
  DocumentTimeline,
  DocumentType,
  DominatorTree,
  DragEvent,
  DynamicsCompressorNode,
  EXT_blend_minmax,
  EXT_color_buffer_float,
  EXT_color_buffer_half_float,
  EXT_disjoint_timer_query,
  EXT_frag_depth,
  EXT_sRGB,
  EXT_shader_texture_lod,
  EXT_texture_filter_anisotropic,
  Element,
  ErrorEvent,
  Event,
  EventSource,
  EventTarget,
  Exception,
  ExtendableEvent,
  ExtendableMessageEvent,
  External,
  FetchController,
  FetchEvent,
  FetchObserver,
  FetchSignal,
  File,
  FileList,
  FileReader,
  FileReaderSync,
  FileSystem,
  FileSystemDirectoryEntry,
  FileSystemDirectoryReader,
  FileSystemEntry,
  FileSystemFileEntry,
  FlyWebDiscoveryManager,
  FlyWebFetchEvent,
  FlyWebPublishedServer,
  FlyWebWebSocketEvent,
  FocusEvent,
  FontFace,
  FontFaceSet,
  FontFaceSetIterator,
  FontFaceSetLoadEvent,
  FormData,
  FormDataIterator,
  GainNode,
  Gamepad,
  GamepadAxisMoveEvent,
  GamepadButton,
  GamepadButtonEvent,
  GamepadEvent,
  GamepadHapticActuator,
  GamepadPose,
  GamepadServiceTest,
  Geolocation,
  GetUserMediaRequest,
  Grid,
  GridArea,
  GridDimension,
  GridLine,
  GridLines,
  GridTrack,
  GridTracks,
  GroupedHistoryEvent,
  HTMLAllCollection,
  HTMLAnchorElement,
  HTMLAppletElement,
  HTMLAreaElement,
  HTMLAudioElement,
  HTMLBRElement,
  HTMLBaseElement,
  HTMLBodyElement,
  HTMLButtonElement,
  HTMLCanvasElement,
  HTMLCollection,
  HTMLContentElement,
  HTMLDListElement,
  HTMLDataElement,
  HTMLDataListElement,
  HTMLDetailsElement,
  HTMLDialogElement,
  HTMLDirectoryElement,
  HTMLDivElement,
  HTMLDocument,
  HTMLElement,
  HTMLEmbedElement,
  HTMLFieldSetElement,
  HTMLFontElement,
  HTMLFormControlsCollection,
  HTMLFormElement,
  HTMLFrameElement,
  HTMLFrameSetElement,
  HTMLHRElement,
  HTMLHeadElement,
  HTMLHeadingElement,
  HTMLHtmlElement,
  HTMLIFrameElement,
  HTMLImageElement,
  HTMLInputElement,
  HTMLLIElement,
  HTMLLabelElement,
  HTMLLegendElement,
  HTMLLinkElement,
  HTMLMapElement,
  HTMLMediaElement,
  HTMLMenuElement,
  HTMLMenuItemElement,
  HTMLMetaElement,
  HTMLMeterElement,
  HTMLModElement,
  HTMLOListElement,
  HTMLObjectElement,
  HTMLOptGroupElement,
  HTMLOptionElement,
  HTMLOptionsCollection,
  HTMLOutputElement,
  HTMLParagraphElement,
  HTMLParamElement,
  HTMLPictureElement,
  HTMLPreElement,
  HTMLProgressElement,
  HTMLQuoteElement,
  HTMLScriptElement,
  HTMLSelectElement,
  HTMLShadowElement,
  HTMLSourceElement,
  HTMLSpanElement,
  HTMLStyleElement,
  HTMLTableCaptionElement,
  HTMLTableCellElement,
  HTMLTableColElement,
  HTMLTableElement,
  HTMLTableRowElement,
  HTMLTableSectionElement,
  HTMLTemplateElement,
  HTMLTextAreaElement,
  HTMLTimeElement,
  HTMLTitleElement,
  HTMLTrackElement,
  HTMLUListElement,
  HTMLUnknownElement,
  HTMLVideoElement,
  HashChangeEvent,
  Headers,
  HeadersIterator,
  HeapSnapshot,
  HiddenPluginEvent,
  History,
  IDBCursor,
  IDBCursorWithValue,
  IDBDatabase,
  IDBFactory,
  IDBFileHandle,
  IDBFileRequest,
  IDBIndex,
  IDBKeyRange,
  IDBLocaleAwareKeyRange,
  IDBMutableFile,
  IDBObjectStore,
  IDBOpenDBRequest,
  IDBRequest,
  IDBTransaction,
  IDBVersionChangeEvent,
  IIRFilterNode,
  IdleDeadline,
  ImageBitmap,
  ImageBitmapRenderingContext,
  ImageCapture,
  ImageCaptureError,
  ImageCaptureErrorEvent,
  ImageData,
  ImageDocument,
  InputEvent,
  InstallTriggerImpl,
  IntersectionObserver,
  IntersectionObserverEntry,
  IntlUtils,
  KeyboardEvent,
  KeyframeEffect,
  KeyframeEffectReadOnly,
  LegacyMozTCPSocket,
  ListBoxObject,
  LocalMediaStream,
  Location,
  MOZ_debug_get,
  MediaDeviceInfo,
  MediaDevices,
  MediaElementAudioSourceNode,
  MediaEncryptedEvent,
  MediaError,
  MediaKeyError,
  MediaKeyMessageEvent,
  MediaKeySession,
  MediaKeyStatusMap,
  MediaKeyStatusMapIterator,
  MediaKeySystemAccess,
  MediaKeys,
  MediaList,
  MediaQueryList,
  MediaQueryListEvent,
  MediaRecorder,
  MediaSource,
  MediaStream,
  MediaStreamAudioDestinationNode,
  MediaStreamAudioSourceNode,
  MediaStreamError,
  MediaStreamEvent,
  MediaStreamList,
  MediaStreamTrack,
  MediaStreamTrackEvent,
  MenuBoxObject,
  MessageChannel,
  MessageEvent,
  MessagePort,
  MimeType,
  MimeTypeArray,
  MouseEvent,
  MouseScrollEvent,
  MozCanvasPrintState,
  MozPowerManager,
  MozSelfSupport,
  MozTimeManager,
  MozWakeLock,
  MutationEvent,
  MutationObserver,
  MutationRecord,
  NamedNodeMap,
  Navigator,
  NetworkInformation,
  Node,
  NodeIterator,
  NodeList,
  Notification,
  NotificationEvent,
  NotifyPaintEvent,
  OES_element_index_uint,
  OES_standard_derivatives,
  OES_texture_float,
  OES_texture_float_linear,
  OES_texture_half_float,
  OES_texture_half_float_linear,
  OES_vertex_array_object,
  OfflineAudioCompletionEvent,
  OfflineAudioContext,
  OfflineResourceList,
  OffscreenCanvas,
  OnlyForUseInConstructor,
  OscillatorNode,
  PageTransitionEvent,
  PaintRequest,
  PaintRequestList,
  PaintWorkletGlobalScope,
  PannerNode,
  Path2D,
  PeerConnectionImpl,
  PeerConnectionObserver,
  Performance,
  PerformanceEntry,
  PerformanceEntryEvent,
  PerformanceMark,
  PerformanceMeasure,
  PerformanceNavigation,
  PerformanceObserver,
  PerformanceObserverEntryList,
  PerformanceResourceTiming,
  PerformanceTiming,
  PeriodicWave,
  PermissionStatus,
  Permissions,
  Plugin,
  PluginArray,
  PluginCrashedEvent,
  PointerEvent,
  PopStateEvent,
  PopupBlockedEvent,
  PopupBoxObject,
  Position,
  PositionError,
  PrecompiledScript,
  Presentation,
  PresentationAvailability,
  PresentationConnection,
  PresentationConnectionAvailableEvent,
  PresentationConnectionCloseEvent,
  PresentationConnectionList,
  PresentationDeviceInfoManager,
  PresentationReceiver,
  PresentationRequest,
  ProcessingInstruction,
  ProgressEvent,
  PromiseNativeHandler,
  PushEvent,
  PushManager,
  PushManagerImpl,
  PushMessageData,
  PushSubscription,
  PushSubscriptionOptions,
  RGBColor,
  RTCCertificate,
  RTCDTMFSender,
  RTCDTMFToneChangeEvent,
  RTCDataChannelEvent,
  RTCIceCandidate,
  RTCIdentityProviderRegistrar,
  RTCPeerConnection,
  RTCPeerConnectionIceEvent,
  RTCPeerConnectionStatic,
  RTCRtpReceiver,
  RTCRtpSender,
  RTCSessionDescription,
  RTCStatsReport,
  RTCTrackEvent,
  RadioNodeList,
  Range,
  RecordErrorEvent,
  Rect,
  Request,
  Response,
  SEChannel,
  SEManager,
  SEReader,
  SEResponse,
  SESession,
  SVGAElement,
  SVGAngle,
  SVGAnimateElement,
  SVGAnimateMotionElement,
  SVGAnimateTransformElement,
  SVGAnimatedAngle,
  SVGAnimatedBoolean,
  SVGAnimatedEnumeration,
  SVGAnimatedInteger,
  SVGAnimatedLength,
  SVGAnimatedLengthList,
  SVGAnimatedNumber,
  SVGAnimatedNumberList,
  SVGAnimatedPreserveAspectRatio,
  SVGAnimatedRect,
  SVGAnimatedString,
  SVGAnimatedTransformList,
  SVGAnimationElement,
  SVGCircleElement,
  SVGClipPathElement,
  SVGComponentTransferFunctionElement,
  SVGDefsElement,
  SVGDescElement,
  SVGElement,
  SVGEllipseElement,
  SVGFEBlendElement,
  SVGFEColorMatrixElement,
  SVGFEComponentTransferElement,
  SVGFECompositeElement,
  SVGFEConvolveMatrixElement,
  SVGFEDiffuseLightingElement,
  SVGFEDisplacementMapElement,
  SVGFEDistantLightElement,
  SVGFEDropShadowElement,
  SVGFEFloodElement,
  SVGFEFuncAElement,
  SVGFEFuncBElement,
  SVGFEFuncGElement,
  SVGFEFuncRElement,
  SVGFEGaussianBlurElement,
  SVGFEImageElement,
  SVGFEMergeElement,
  SVGFEMergeNodeElement,
  SVGFEMorphologyElement,
  SVGFEOffsetElement,
  SVGFEPointLightElement,
  SVGFESpecularLightingElement,
  SVGFESpotLightElement,
  SVGFETileElement,
  SVGFETurbulenceElement,
  SVGFilterElement,
  SVGForeignObjectElement,
  SVGGElement,
  SVGGeometryElement,
  SVGGradientElement,
  SVGGraphicsElement,
  SVGImageElement,
  SVGLength,
  SVGLengthList,
  SVGLineElement,
  SVGLinearGradientElement,
  SVGMPathElement,
  SVGMarkerElement,
  SVGMaskElement,
  SVGMatrix,
  SVGMetadataElement,
  SVGNumber,
  SVGNumberList,
  SVGPathElement,
  SVGPathSeg,
  SVGPathSegArcAbs,
  SVGPathSegArcRel,
  SVGPathSegClosePath,
  SVGPathSegCurvetoCubicAbs,
  SVGPathSegCurvetoCubicRel,
  SVGPathSegCurvetoCubicSmoothAbs,
  SVGPathSegCurvetoCubicSmoothRel,
  SVGPathSegCurvetoQuadraticAbs,
  SVGPathSegCurvetoQuadraticRel,
  SVGPathSegCurvetoQuadraticSmoothAbs,
  SVGPathSegCurvetoQuadraticSmoothRel,
  SVGPathSegLinetoAbs,
  SVGPathSegLinetoHorizontalAbs,
  SVGPathSegLinetoHorizontalRel,
  SVGPathSegLinetoRel,
  SVGPathSegLinetoVerticalAbs,
  SVGPathSegLinetoVerticalRel,
  SVGPathSegList,
  SVGPathSegMovetoAbs,
  SVGPathSegMovetoRel,
  SVGPatternElement,
  SVGPoint,
  SVGPointList,
  SVGPolygonElement,
  SVGPolylineElement,
  SVGPreserveAspectRatio,
  SVGRadialGradientElement,
  SVGRect,
  SVGRectElement,
  SVGSVGElement,
  SVGScriptElement,
  SVGSetElement,
  SVGStopElement,
  SVGStringList,
  SVGStyleElement,
  SVGSwitchElement,
  SVGSymbolElement,
  SVGTSpanElement,
  SVGTextContentElement,
  SVGTextElement,
  SVGTextPathElement,
  SVGTextPositioningElement,
  SVGTitleElement,
  SVGTransform,
  SVGTransformList,
  SVGUseElement,
  SVGViewElement,
  ScopedCredential,
  ScopedCredentialInfo,
  Screen,
  ScreenOrientation,
  ScriptProcessorNode,
  ScrollAreaEvent,
  ScrollBoxObject,
  ScrollViewChangeEvent,
  Selection,
  ServiceWorker,
  ServiceWorkerContainer,
  ServiceWorkerGlobalScope,
  ServiceWorkerRegistration,
  ShadowRoot,
  SharedWorker,
  SharedWorkerGlobalScope,
  SimpleGestureEvent,
  SourceBuffer,
  SourceBufferList,
  SpeechGrammar,
  SpeechGrammarList,
  SpeechRecognition,
  SpeechRecognitionAlternative,
  SpeechRecognitionError,
  SpeechRecognitionEvent,
  SpeechRecognitionResult,
  SpeechRecognitionResultList,
  SpeechSynthesis,
  SpeechSynthesisErrorEvent,
  SpeechSynthesisEvent,
  SpeechSynthesisUtterance,
  SpeechSynthesisVoice,
  StereoPannerNode,
  Storage,
  StorageEvent,
  StorageManager,
  StyleRuleChangeEvent,
  StyleSheet,
  StyleSheetApplicableStateChangeEvent,
  StyleSheetChangeEvent,
  StyleSheetList,
  SubtleCrypto,
  TCPServerSocket,
  TCPServerSocketEvent,
  TCPSocket,
  TCPSocketErrorEvent,
  TCPSocketEvent,
  TestCImplementedInterface,
  TestCImplementedInterface2,
  TestChildInterface,
  TestCppKeywordNamedMethodsInterface,
  TestDeprecatedInterface,
  TestExampleInterface,
  TestExampleProxyInterface,
  TestExampleWorkerInterface,
  TestFunctions,
  TestHTMLConstructorInterface,
  TestIndexedAndNamedGetterAndSetterInterface,
  TestIndexedAndNamedGetterInterface,
  TestIndexedAndNamedSetterInterface,
  TestIndexedGetterAndSetterAndNamedGetterInterface,
  TestIndexedGetterInterface,
  TestIndexedSetterInterface,
  TestInterface,
  TestInterfaceIterableDouble,
  TestInterfaceIterableDoubleIterator,
  TestInterfaceIterableDoubleUnion,
  TestInterfaceIterableDoubleUnionIterator,
  TestInterfaceIterableSingle,
  TestInterfaceJS,
  TestInterfaceJSMaplike,
  TestInterfaceMaplike,
  TestInterfaceMaplikeObject,
  TestInterfaceSetlike,
  TestInterfaceSetlikeNode,
  TestInterfaceWithPromiseConstructorArg,
  TestJSImplInterface,
  TestJSImplInterface2,
  TestJSImplInterface3,
  TestJSImplInterface4,
  TestJSImplInterface5,
  TestJSImplInterface6,
  TestJSImplNoInterfaceObject,
  TestNamedDeleterInterface,
  TestNamedDeleterWithRetvalInterface,
  TestNamedGetterInterface,
  TestNamedSetterInterface,
  TestNavigator,
  TestNavigatorWithConstructor,
  TestNonWrapperCacheInterface,
  TestParentInterface,
  TestRenamedInterface,
  TestSecureContextInterface,
  TestWorkerExposedInterface,
  Text,
  TextClause,
  TextDecoder,
  TextEncoder,
  TextMetrics,
  TextTrack,
  TextTrackCue,
  TextTrackCueList,
  TextTrackList,
  TimeEvent,
  TimeRanges,
  Touch,
  TouchEvent,
  TouchList,
  TrackEvent,
  TransitionEvent,
  TreeBoxObject,
  TreeColumn,
  TreeColumns,
  TreeWalker,
  U2F,
  UDPMessageEvent,
  UDPSocket,
  UIEvent,
  URL,
  URLSearchParams,
  URLSearchParamsIterator,
  UserProximityEvent,
  VRDisplay,
  VRDisplayCapabilities,
  VRDisplayEvent,
  VREyeParameters,
  VRFieldOfView,
  VRFrameData,
  VRMockController,
  VRMockDisplay,
  VRPose,
  VRServiceTest,
  VRStageParameters,
  VTTCue,
  VTTRegion,
  ValidityState,
  VideoPlaybackQuality,
  VideoStreamTrack,
  VideoTrack,
  VideoTrackList,
  WEBGL_color_buffer_float,
  WEBGL_compressed_texture_astc,
  WEBGL_compressed_texture_atc,
  WEBGL_compressed_texture_etc,
  WEBGL_compressed_texture_etc1,
  WEBGL_compressed_texture_pvrtc,
  WEBGL_compressed_texture_s3tc,
  WEBGL_debug_renderer_info,
  WEBGL_debug_shaders,
  WEBGL_depth_texture,
  WEBGL_draw_buffers,
  WEBGL_lose_context,
  WaveShaperNode,
  WebAuthentication,
  WebAuthnAssertion,
  WebAuthnAttestation,
  WebGL2RenderingContext,
  WebGLActiveInfo,
  WebGLBuffer,
  WebGLContextEvent,
  WebGLFramebuffer,
  WebGLProgram,
  WebGLQuery,
  WebGLRenderbuffer,
  WebGLRenderingContext,
  WebGLSampler,
  WebGLShader,
  WebGLShaderPrecisionFormat,
  WebGLSync,
  WebGLTexture,
  WebGLTransformFeedback,
  WebGLUniformLocation,
  WebGLVertexArrayObject,
  WebKitCSSMatrix,
  WebSocket,
  WheelEvent,
  Window,
  WindowClient,
  WindowRoot,
  Worker,
  WorkerDebuggerGlobalScope,
  WorkerGlobalScope,
  WorkerLocation,
  WorkerNavigator,
  Worklet,
  WorkletGlobalScope,
  XMLDocument,
  XMLHttpRequest,
  XMLHttpRequestEventTarget,
  XMLHttpRequestUpload,
  XMLSerializer,
  XMLStylesheetProcessingInstruction,
  XPathEvaluator,
  XPathExpression,
  XPathResult,
  XSLTProcessor,
  XULCommandEvent,
  XULDocument,
  XULElement,
  mozRTCIceCandidate,
  mozRTCPeerConnection,
  mozRTCSessionDescription,
  _ID_Count
};

}

typedef id::ID ID;

static_assert(id::_ID_Count < (uint64_t(1) << (sizeof(((JSJitInfo*)nullptr)->protoID) * 8)), "Too many prototypes!");

}
}
}



static_assert(8 < (uint64_t(1) << (sizeof(((JSJitInfo*)nullptr)->depth) * 8)), "Some inheritance chain is too long!");

namespace mozilla {
namespace dom {
namespace constructors {

namespace id {

enum ID : uint16_t
{
  _ID_Start = prototypes::id::_ID_Count,
  AccessibleNode = _ID_Start,
  Addon,
  AddonEvent,
  AddonInstall,
  AddonManager,
  AddonManagerPermissions,
  AnalyserNode,
  Animation,
  AnimationEffectReadOnly,
  AnimationEffectTiming,
  AnimationEffectTimingReadOnly,
  AnimationEvent,
  AnimationPlaybackEvent,
  AnimationTimeline,
  AnonymousContent,
  Attr,
  AudioBuffer,
  AudioBufferSourceNode,
  AudioContext,
  AudioDestinationNode,
  AudioListener,
  AudioNode,
  AudioParam,
  AudioProcessingEvent,
  AudioScheduledSourceNode,
  AudioStreamTrack,
  AudioTrack,
  AudioTrackList,
  AudioWorkletGlobalScope,
  AutocompleteErrorEvent,
  BarProp,
  BaseAudioContext,
  BatteryManager,
  BeforeUnloadEvent,
  BiquadFilterNode,
  Blob,
  BlobEvent,
  BoxObject,
  BroadcastChannel,
  BrowserElementAudioChannel,
  BrowserFeedWriter,
  CDATASection,
  CSS,
  CSS2Properties,
  CSSAnimation,
  CSSConditionRule,
  CSSCounterStyleRule,
  CSSFontFaceRule,
  CSSFontFeatureValuesRule,
  CSSGroupingRule,
  CSSImportRule,
  CSSKeyframeRule,
  CSSKeyframesRule,
  CSSLexer,
  CSSMediaRule,
  CSSMozDocumentRule,
  CSSNamespaceRule,
  CSSPageRule,
  CSSPrimitiveValue,
  CSSPseudoElement,
  CSSRule,
  CSSRuleList,
  CSSStyleDeclaration,
  CSSStyleRule,
  CSSStyleSheet,
  CSSSupportsRule,
  CSSTransition,
  CSSValue,
  CSSValueList,
  Cache,
  CacheStorage,
  CanvasCaptureMediaStream,
  CanvasGradient,
  CanvasPattern,
  CanvasRenderingContext2D,
  CaretPosition,
  CaretStateChangedEvent,
  ChannelMergerNode,
  ChannelSplitterNode,
  CharacterData,
  CheckerboardReportService,
  ChromeNodeList,
  ChromeUtils,
  ChromeWindow,
  ChromeWorker,
  Client,
  Clients,
  ClipboardEvent,
  CloseEvent,
  CommandEvent,
  Comment,
  CompositionEvent,
  ConstantSourceNode,
  ConvolverNode,
  CreateOfferRequest,
  Crypto,
  CryptoKey,
  CustomElementRegistry,
  CustomEvent,
  DOMCursor,
  DOMError,
  DOMException,
  DOMImplementation,
  DOMMatrix,
  DOMMatrixReadOnly,
  DOMParser,
  DOMPoint,
  DOMPointReadOnly,
  DOMQuad,
  DOMRect,
  DOMRectList,
  DOMRectReadOnly,
  DOMRequest,
  DOMStringList,
  DOMStringMap,
  DOMTokenList,
  DataChannel,
  DataContainerEvent,
  DataTransfer,
  DataTransferItem,
  DataTransferItemList,
  DedicatedWorkerGlobalScope,
  DelayNode,
  DesktopNotification,
  DesktopNotificationCenter,
  DeviceLightEvent,
  DeviceMotionEvent,
  DeviceOrientationEvent,
  DeviceProximityEvent,
  Directory,
  Document,
  DocumentFragment,
  DocumentTimeline,
  DocumentType,
  DominatorTree,
  DragEvent,
  DynamicsCompressorNode,
  Element,
  ErrorEvent,
  Event,
  EventSource,
  EventTarget,
  ExtendableEvent,
  ExtendableMessageEvent,
  External,
  FetchController,
  FetchEvent,
  FetchObserver,
  FetchSignal,
  File,
  FileList,
  FileReader,
  FileReaderSync,
  FileSystem,
  FileSystemDirectoryEntry,
  FileSystemDirectoryReader,
  FileSystemEntry,
  FileSystemFileEntry,
  FlyWebDiscoveryManager,
  FlyWebFetchEvent,
  FlyWebPublishedServer,
  FlyWebWebSocketEvent,
  FocusEvent,
  FontFace,
  FontFaceSet,
  FontFaceSetLoadEvent,
  FormData,
  GainNode,
  Gamepad,
  GamepadAxisMoveEvent,
  GamepadButton,
  GamepadButtonEvent,
  GamepadEvent,
  GamepadHapticActuator,
  GamepadPose,
  GamepadServiceTest,
  Grid,
  GridArea,
  GridDimension,
  GridLine,
  GridLines,
  GridTrack,
  GridTracks,
  GroupedHistoryEvent,
  HTMLAllCollection,
  HTMLAnchorElement,
  HTMLAppletElement,
  HTMLAreaElement,
  HTMLAudioElement,
  HTMLBRElement,
  HTMLBaseElement,
  HTMLBodyElement,
  HTMLButtonElement,
  HTMLCanvasElement,
  HTMLCollection,
  HTMLContentElement,
  HTMLDListElement,
  HTMLDataElement,
  HTMLDataListElement,
  HTMLDetailsElement,
  HTMLDialogElement,
  HTMLDirectoryElement,
  HTMLDivElement,
  HTMLDocument,
  HTMLElement,
  HTMLEmbedElement,
  HTMLFieldSetElement,
  HTMLFontElement,
  HTMLFormControlsCollection,
  HTMLFormElement,
  HTMLFrameElement,
  HTMLFrameSetElement,
  HTMLHRElement,
  HTMLHeadElement,
  HTMLHeadingElement,
  HTMLHtmlElement,
  HTMLIFrameElement,
  HTMLImageElement,
  HTMLInputElement,
  HTMLLIElement,
  HTMLLabelElement,
  HTMLLegendElement,
  HTMLLinkElement,
  HTMLMapElement,
  HTMLMediaElement,
  HTMLMenuElement,
  HTMLMenuItemElement,
  HTMLMetaElement,
  HTMLMeterElement,
  HTMLModElement,
  HTMLOListElement,
  HTMLObjectElement,
  HTMLOptGroupElement,
  HTMLOptionElement,
  HTMLOptionsCollection,
  HTMLOutputElement,
  HTMLParagraphElement,
  HTMLParamElement,
  HTMLPictureElement,
  HTMLPreElement,
  HTMLProgressElement,
  HTMLQuoteElement,
  HTMLScriptElement,
  HTMLSelectElement,
  HTMLShadowElement,
  HTMLSourceElement,
  HTMLSpanElement,
  HTMLStyleElement,
  HTMLTableCaptionElement,
  HTMLTableCellElement,
  HTMLTableColElement,
  HTMLTableElement,
  HTMLTableRowElement,
  HTMLTableSectionElement,
  HTMLTemplateElement,
  HTMLTextAreaElement,
  HTMLTimeElement,
  HTMLTitleElement,
  HTMLTrackElement,
  HTMLUListElement,
  HTMLUnknownElement,
  HTMLVideoElement,
  HashChangeEvent,
  Headers,
  HeapSnapshot,
  HiddenPluginEvent,
  History,
  IDBCursor,
  IDBCursorWithValue,
  IDBDatabase,
  IDBFactory,
  IDBFileHandle,
  IDBFileRequest,
  IDBIndex,
  IDBKeyRange,
  IDBLocaleAwareKeyRange,
  IDBMutableFile,
  IDBObjectStore,
  IDBOpenDBRequest,
  IDBRequest,
  IDBTransaction,
  IDBVersionChangeEvent,
  IIRFilterNode,
  IdleDeadline,
  ImageBitmap,
  ImageBitmapRenderingContext,
  ImageCapture,
  ImageCaptureErrorEvent,
  ImageData,
  ImageDocument,
  InputEvent,
  InstallTriggerImpl,
  IntersectionObserver,
  IntersectionObserverEntry,
  KeyEvent,
  KeyboardEvent,
  KeyframeEffect,
  KeyframeEffectReadOnly,
  LocalMediaStream,
  Location,
  MediaDeviceInfo,
  MediaDevices,
  MediaElementAudioSourceNode,
  MediaEncryptedEvent,
  MediaError,
  MediaKeyError,
  MediaKeyMessageEvent,
  MediaKeySession,
  MediaKeyStatusMap,
  MediaKeySystemAccess,
  MediaKeys,
  MediaList,
  MediaQueryList,
  MediaQueryListEvent,
  MediaRecorder,
  MediaSource,
  MediaStream,
  MediaStreamAudioDestinationNode,
  MediaStreamAudioSourceNode,
  MediaStreamEvent,
  MediaStreamList,
  MediaStreamTrack,
  MediaStreamTrackEvent,
  MenuBoxObject,
  MessageChannel,
  MessageEvent,
  MessagePort,
  MimeType,
  MimeTypeArray,
  MouseEvent,
  MouseScrollEvent,
  MozCanvasPrintState,
  MozPowerManager,
  MozSelfSupport,
  MozTimeManager,
  MozWakeLock,
  MutationEvent,
  MutationObserver,
  MutationRecord,
  NamedNodeMap,
  Navigator,
  NetworkInformation,
  Node,
  NodeFilter,
  NodeIterator,
  NodeList,
  Notification,
  NotificationEvent,
  NotifyPaintEvent,
  OfflineAudioCompletionEvent,
  OfflineAudioContext,
  OfflineResourceList,
  OffscreenCanvas,
  OnlyForUseInConstructor,
  OscillatorNode,
  PageTransitionEvent,
  PaintRequest,
  PaintRequestList,
  PaintWorkletGlobalScope,
  PannerNode,
  Path2D,
  PeerConnectionImpl,
  PeerConnectionObserver,
  Performance,
  PerformanceEntry,
  PerformanceEntryEvent,
  PerformanceMark,
  PerformanceMeasure,
  PerformanceNavigation,
  PerformanceObserver,
  PerformanceObserverEntryList,
  PerformanceResourceTiming,
  PerformanceTiming,
  PeriodicWave,
  PermissionStatus,
  Permissions,
  Plugin,
  PluginArray,
  PluginCrashedEvent,
  PointerEvent,
  PopStateEvent,
  PopupBlockedEvent,
  PopupBoxObject,
  PrecompiledScript,
  Presentation,
  PresentationAvailability,
  PresentationConnection,
  PresentationConnectionAvailableEvent,
  PresentationConnectionCloseEvent,
  PresentationConnectionList,
  PresentationDeviceInfoManager,
  PresentationReceiver,
  PresentationRequest,
  ProcessingInstruction,
  ProgressEvent,
  PromiseDebugging,
  PushEvent,
  PushManager,
  PushManagerImpl,
  PushMessageData,
  PushSubscription,
  PushSubscriptionOptions,
  RGBColor,
  RTCCertificate,
  RTCDTMFSender,
  RTCDTMFToneChangeEvent,
  RTCDataChannelEvent,
  RTCIceCandidate,
  RTCPeerConnection,
  RTCPeerConnectionIceEvent,
  RTCPeerConnectionStatic,
  RTCRtpReceiver,
  RTCRtpSender,
  RTCSessionDescription,
  RTCStatsReport,
  RTCTrackEvent,
  RadioNodeList,
  Range,
  RecordErrorEvent,
  Rect,
  Request,
  Response,
  SEChannel,
  SEReader,
  SEResponse,
  SESession,
  SVGAElement,
  SVGAngle,
  SVGAnimateElement,
  SVGAnimateMotionElement,
  SVGAnimateTransformElement,
  SVGAnimatedAngle,
  SVGAnimatedBoolean,
  SVGAnimatedEnumeration,
  SVGAnimatedInteger,
  SVGAnimatedLength,
  SVGAnimatedLengthList,
  SVGAnimatedNumber,
  SVGAnimatedNumberList,
  SVGAnimatedPreserveAspectRatio,
  SVGAnimatedRect,
  SVGAnimatedString,
  SVGAnimatedTransformList,
  SVGAnimationElement,
  SVGCircleElement,
  SVGClipPathElement,
  SVGComponentTransferFunctionElement,
  SVGDefsElement,
  SVGDescElement,
  SVGElement,
  SVGEllipseElement,
  SVGFEBlendElement,
  SVGFEColorMatrixElement,
  SVGFEComponentTransferElement,
  SVGFECompositeElement,
  SVGFEConvolveMatrixElement,
  SVGFEDiffuseLightingElement,
  SVGFEDisplacementMapElement,
  SVGFEDistantLightElement,
  SVGFEDropShadowElement,
  SVGFEFloodElement,
  SVGFEFuncAElement,
  SVGFEFuncBElement,
  SVGFEFuncGElement,
  SVGFEFuncRElement,
  SVGFEGaussianBlurElement,
  SVGFEImageElement,
  SVGFEMergeElement,
  SVGFEMergeNodeElement,
  SVGFEMorphologyElement,
  SVGFEOffsetElement,
  SVGFEPointLightElement,
  SVGFESpecularLightingElement,
  SVGFESpotLightElement,
  SVGFETileElement,
  SVGFETurbulenceElement,
  SVGFilterElement,
  SVGForeignObjectElement,
  SVGGElement,
  SVGGeometryElement,
  SVGGradientElement,
  SVGGraphicsElement,
  SVGImageElement,
  SVGLength,
  SVGLengthList,
  SVGLineElement,
  SVGLinearGradientElement,
  SVGMPathElement,
  SVGMarkerElement,
  SVGMaskElement,
  SVGMatrix,
  SVGMetadataElement,
  SVGNumber,
  SVGNumberList,
  SVGPathElement,
  SVGPathSeg,
  SVGPathSegArcAbs,
  SVGPathSegArcRel,
  SVGPathSegClosePath,
  SVGPathSegCurvetoCubicAbs,
  SVGPathSegCurvetoCubicRel,
  SVGPathSegCurvetoCubicSmoothAbs,
  SVGPathSegCurvetoCubicSmoothRel,
  SVGPathSegCurvetoQuadraticAbs,
  SVGPathSegCurvetoQuadraticRel,
  SVGPathSegCurvetoQuadraticSmoothAbs,
  SVGPathSegCurvetoQuadraticSmoothRel,
  SVGPathSegLinetoAbs,
  SVGPathSegLinetoHorizontalAbs,
  SVGPathSegLinetoHorizontalRel,
  SVGPathSegLinetoRel,
  SVGPathSegLinetoVerticalAbs,
  SVGPathSegLinetoVerticalRel,
  SVGPathSegList,
  SVGPathSegMovetoAbs,
  SVGPathSegMovetoRel,
  SVGPatternElement,
  SVGPoint,
  SVGPointList,
  SVGPolygonElement,
  SVGPolylineElement,
  SVGPreserveAspectRatio,
  SVGRadialGradientElement,
  SVGRect,
  SVGRectElement,
  SVGSVGElement,
  SVGScriptElement,
  SVGSetElement,
  SVGStopElement,
  SVGStringList,
  SVGStyleElement,
  SVGSwitchElement,
  SVGSymbolElement,
  SVGTSpanElement,
  SVGTextContentElement,
  SVGTextElement,
  SVGTextPathElement,
  SVGTextPositioningElement,
  SVGTitleElement,
  SVGTransform,
  SVGTransformList,
  SVGUnitTypes,
  SVGUseElement,
  SVGViewElement,
  SVGZoomAndPan,
  ScopedCredential,
  ScopedCredentialInfo,
  Screen,
  ScreenOrientation,
  ScriptProcessorNode,
  ScrollAreaEvent,
  ScrollViewChangeEvent,
  Selection,
  ServiceWorker,
  ServiceWorkerContainer,
  ServiceWorkerGlobalScope,
  ServiceWorkerRegistration,
  ShadowRoot,
  SharedWorker,
  SharedWorkerGlobalScope,
  SimpleGestureEvent,
  SourceBuffer,
  SourceBufferList,
  SpeechGrammar,
  SpeechGrammarList,
  SpeechRecognition,
  SpeechRecognitionAlternative,
  SpeechRecognitionError,
  SpeechRecognitionEvent,
  SpeechRecognitionResult,
  SpeechRecognitionResultList,
  SpeechSynthesis,
  SpeechSynthesisErrorEvent,
  SpeechSynthesisEvent,
  SpeechSynthesisUtterance,
  SpeechSynthesisVoice,
  StereoPannerNode,
  Storage,
  StorageEvent,
  StorageManager,
  StyleRuleChangeEvent,
  StyleSheet,
  StyleSheetApplicableStateChangeEvent,
  StyleSheetChangeEvent,
  StyleSheetList,
  SubtleCrypto,
  TCPServerSocket,
  TCPServerSocketEvent,
  TCPSocket,
  TCPSocketErrorEvent,
  TCPSocketEvent,
  TestCImplementedInterface,
  TestCImplementedInterface2,
  TestChildInterface,
  TestCppKeywordNamedMethodsInterface,
  TestDeprecatedInterface,
  TestExampleInterface,
  TestExampleProxyInterface,
  TestExampleWorkerInterface,
  TestFunctions,
  TestHTMLConstructorInterface,
  TestIndexedAndNamedGetterAndSetterInterface,
  TestIndexedAndNamedGetterInterface,
  TestIndexedAndNamedSetterInterface,
  TestIndexedGetterAndSetterAndNamedGetterInterface,
  TestIndexedGetterInterface,
  TestIndexedSetterInterface,
  TestInterface,
  TestInterfaceIterableDouble,
  TestInterfaceIterableDoubleUnion,
  TestInterfaceIterableSingle,
  TestInterfaceJS,
  TestInterfaceJSMaplike,
  TestInterfaceMaplike,
  TestInterfaceMaplikeObject,
  TestInterfaceSetlike,
  TestInterfaceSetlikeNode,
  TestInterfaceWithPromiseConstructorArg,
  TestJSImplInterface,
  TestJSImplInterface2,
  TestJSImplInterface3,
  TestJSImplInterface4,
  TestJSImplInterface5,
  TestJSImplInterface6,
  TestNamedDeleterInterface,
  TestNamedDeleterWithRetvalInterface,
  TestNamedGetterInterface,
  TestNamedSetterInterface,
  TestNamespace,
  TestNavigator,
  TestNavigatorWithConstructor,
  TestNonWrapperCacheInterface,
  TestParentInterface,
  TestProtoObjectHackedNamespace,
  TestRenamedInterface,
  TestRenamedNamespace,
  TestSecureContextInterface,
  TestWorkerExposedInterface,
  Text,
  TextClause,
  TextDecoder,
  TextEncoder,
  TextMetrics,
  TextTrack,
  TextTrackCue,
  TextTrackCueList,
  TextTrackList,
  ThreadSafeChromeUtils,
  TimeEvent,
  TimeRanges,
  Touch,
  TouchEvent,
  TouchList,
  TrackEvent,
  TransitionEvent,
  TreeColumn,
  TreeColumns,
  TreeWalker,
  U2F,
  UDPMessageEvent,
  UDPSocket,
  UIEvent,
  URL,
  URLSearchParams,
  UserProximityEvent,
  VRDisplay,
  VRDisplayCapabilities,
  VRDisplayEvent,
  VREyeParameters,
  VRFieldOfView,
  VRFrameData,
  VRMockController,
  VRMockDisplay,
  VRPose,
  VRServiceTest,
  VRStageParameters,
  VTTCue,
  VTTRegion,
  ValidityState,
  VideoPlaybackQuality,
  VideoStreamTrack,
  VideoTrack,
  VideoTrackList,
  WaveShaperNode,
  WebAuthentication,
  WebAuthnAssertion,
  WebAuthnAttestation,
  WebGL2RenderingContext,
  WebGLActiveInfo,
  WebGLBuffer,
  WebGLContextEvent,
  WebGLFramebuffer,
  WebGLProgram,
  WebGLQuery,
  WebGLRenderbuffer,
  WebGLRenderingContext,
  WebGLSampler,
  WebGLShader,
  WebGLShaderPrecisionFormat,
  WebGLSync,
  WebGLTexture,
  WebGLTransformFeedback,
  WebGLUniformLocation,
  WebGLVertexArrayObject,
  WebKitCSSMatrix,
  WebSocket,
  WebrtcGlobalInformation,
  WheelEvent,
  Window,
  WindowClient,
  WindowRoot,
  Worker,
  WorkerDebuggerGlobalScope,
  WorkerGlobalScope,
  WorkerLocation,
  WorkerNavigator,
  Worklet,
  WorkletGlobalScope,
  XMLDocument,
  XMLHttpRequest,
  XMLHttpRequestEventTarget,
  XMLHttpRequestUpload,
  XMLSerializer,
  XMLStylesheetProcessingInstruction,
  XPathEvaluator,
  XPathExpression,
  XPathResult,
  XSLTProcessor,
  XULCommandEvent,
  XULDocument,
  XULElement,
  console,
  mozRTCIceCandidate,
  mozRTCPeerConnection,
  mozRTCSessionDescription,
  _ID_Count
};

}

typedef id::ID ID;

}
}
}

namespace mozilla {
namespace dom {
namespace namedpropertiesobjects {

namespace id {

enum ID : uint16_t
{
  _ID_Start = constructors::id::_ID_Count,
  Window = _ID_Start,
  _ID_Count
};

}

typedef id::ID ID;

}
}
}

namespace mozilla {
namespace dom {
template <prototypes::ID PrototypeID>
struct PrototypeTraits;
template <>
struct PrototypeTraits<prototypes::id::ANGLE_instanced_arrays>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AccessibleNode>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Addon>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AddonEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AddonInstall>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AddonManager>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnalyserNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Animation>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnimationEffectReadOnly>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnimationEffectTiming>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnimationEffectTimingReadOnly>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnimationEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnimationPlaybackEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnimationTimeline>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AnonymousContent>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Attr>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioBuffer>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioBufferSourceNode>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioContext>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioDestinationNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioListener>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioNode>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioParam>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioProcessingEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioScheduledSourceNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioStreamTrack>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioTrack>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioTrackList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AudioWorkletGlobalScope>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::AutocompleteErrorEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::BarProp>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::BaseAudioContext>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::BatteryManager>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::BeforeUnloadEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::BiquadFilterNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Blob>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::BlobEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::BoxObject>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::BroadcastChannel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::BrowserElementAudioChannel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::BrowserFeedWriter>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CDATASection>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSS2Properties>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSAnimation>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSConditionRule>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSCounterStyleRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSFontFaceRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSFontFeatureValuesRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSGroupingRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSImportRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSKeyframeRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSKeyframesRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSLexer>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSMediaRule>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSMozDocumentRule>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSNamespaceRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSPageRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSPrimitiveValue>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSPseudoElement>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSRule>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSRuleList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSStyleDeclaration>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSStyleRule>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSStyleSheet>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSSupportsRule>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSTransition>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSValue>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CSSValueList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Cache>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CacheStorage>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CanvasCaptureMediaStream>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::CanvasGradient>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CanvasPattern>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CanvasRenderingContext2D>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CaretPosition>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CaretStateChangedEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ChannelMergerNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::ChannelSplitterNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::CharacterData>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::CheckerboardReportService>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ChromeNodeList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ChromeWorker>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Client>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Clients>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ClipboardEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CloseEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::CommandEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Comment>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::CompositionEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::ConstantSourceNode>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::ContainerBoxObject>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ConvolverNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Coordinates>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CreateOfferRequest>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Crypto>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CryptoKey>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CustomElementRegistry>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::CustomEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMCursor>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMError>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMException>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMImplementation>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMMatrix>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMMatrixReadOnly>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMParser>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMPoint>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMPointReadOnly>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMQuad>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMRect>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMRectList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMRectReadOnly>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMRequest>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMStringList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMStringMap>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DOMTokenList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DataChannel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DataContainerEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DataTransfer>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DataTransferItem>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DataTransferItemList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DedicatedWorkerGlobalScope>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::DelayNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::DesktopNotification>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DesktopNotificationCenter>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DeviceAcceleration>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DeviceLightEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DeviceMotionEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DeviceOrientationEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DeviceProximityEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DeviceRotationRate>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Directory>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Document>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::DocumentFragment>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::DocumentTimeline>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::DocumentType>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::DominatorTree>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::DragEvent>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::DynamicsCompressorNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_blend_minmax>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_color_buffer_float>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_color_buffer_half_float>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_disjoint_timer_query>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_frag_depth>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_sRGB>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_shader_texture_lod>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EXT_texture_filter_anisotropic>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Element>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::ErrorEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Event>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::EventSource>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::EventTarget>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Exception>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ExtendableEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ExtendableMessageEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::External>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FetchController>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FetchEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::FetchObserver>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FetchSignal>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::File>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileReader>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileReaderSync>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileSystem>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileSystemDirectoryEntry>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileSystemDirectoryReader>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileSystemEntry>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FileSystemFileEntry>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FlyWebDiscoveryManager>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FlyWebFetchEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FlyWebPublishedServer>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FlyWebWebSocketEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FocusEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::FontFace>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FontFaceSet>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FontFaceSetIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FontFaceSetLoadEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::FormData>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::FormDataIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GainNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Gamepad>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GamepadAxisMoveEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::GamepadButton>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GamepadButtonEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::GamepadEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::GamepadHapticActuator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GamepadPose>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GamepadServiceTest>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Geolocation>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GetUserMediaRequest>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Grid>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GridArea>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GridDimension>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GridLine>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GridLines>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GridTrack>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GridTracks>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::GroupedHistoryEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLAllCollection>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLAnchorElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLAppletElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLAreaElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLAudioElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLBRElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLBaseElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLBodyElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLButtonElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLCanvasElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLCollection>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLContentElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDListElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDataElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDataListElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDetailsElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDialogElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDirectoryElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDivElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLDocument>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLElement>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLEmbedElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLFieldSetElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLFontElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLFormControlsCollection>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLFormElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLFrameElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLFrameSetElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLHRElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLHeadElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLHeadingElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLHtmlElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLIFrameElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLImageElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLInputElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLLIElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLLabelElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLLegendElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLLinkElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLMapElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLMediaElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLMenuElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLMenuItemElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLMetaElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLMeterElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLModElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLOListElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLObjectElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLOptGroupElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLOptionElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLOptionsCollection>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLOutputElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLParagraphElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLParamElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLPictureElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLPreElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLProgressElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLQuoteElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLScriptElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLSelectElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLShadowElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLSourceElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLSpanElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLStyleElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTableCaptionElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTableCellElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTableColElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTableElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTableRowElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTableSectionElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTemplateElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTextAreaElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTimeElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTitleElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLTrackElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLUListElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLUnknownElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::HTMLVideoElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::HashChangeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Headers>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::HeadersIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::HeapSnapshot>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::HiddenPluginEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::History>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBCursor>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBCursorWithValue>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBDatabase>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBFactory>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBFileHandle>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBFileRequest>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBIndex>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBKeyRange>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBLocaleAwareKeyRange>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBMutableFile>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBObjectStore>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBOpenDBRequest>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBRequest>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBTransaction>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IDBVersionChangeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::IIRFilterNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::IdleDeadline>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ImageBitmap>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ImageBitmapRenderingContext>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ImageCapture>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ImageCaptureError>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ImageCaptureErrorEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ImageData>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ImageDocument>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::InputEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::InstallTriggerImpl>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IntersectionObserver>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IntersectionObserverEntry>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::IntlUtils>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::KeyboardEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::KeyframeEffect>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::KeyframeEffectReadOnly>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::LegacyMozTCPSocket>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ListBoxObject>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::LocalMediaStream>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Location>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MOZ_debug_get>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaDeviceInfo>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaDevices>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaElementAudioSourceNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaEncryptedEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaError>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaKeyError>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaKeyMessageEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaKeySession>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaKeyStatusMap>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaKeyStatusMapIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaKeySystemAccess>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaKeys>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaQueryList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaQueryListEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaRecorder>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaSource>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStream>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStreamAudioDestinationNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStreamAudioSourceNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStreamError>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStreamEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStreamList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStreamTrack>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MediaStreamTrackEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MenuBoxObject>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MessageChannel>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MessageEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MessagePort>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MimeType>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MimeTypeArray>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MouseEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::MouseScrollEvent>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::MozCanvasPrintState>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MozPowerManager>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MozSelfSupport>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MozTimeManager>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MozWakeLock>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MutationEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::MutationObserver>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::MutationRecord>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::NamedNodeMap>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Navigator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::NetworkInformation>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Node>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::NodeIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::NodeList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Notification>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::NotificationEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::NotifyPaintEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::OES_element_index_uint>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OES_standard_derivatives>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OES_texture_float>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OES_texture_float_linear>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OES_texture_half_float>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OES_texture_half_float_linear>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OES_vertex_array_object>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OfflineAudioCompletionEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::OfflineAudioContext>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::OfflineResourceList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::OffscreenCanvas>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::OnlyForUseInConstructor>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::OscillatorNode>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::PageTransitionEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PaintRequest>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PaintRequestList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PaintWorkletGlobalScope>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PannerNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Path2D>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PeerConnectionImpl>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PeerConnectionObserver>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Performance>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceEntry>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceEntryEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceMark>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceMeasure>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceNavigation>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceObserver>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceObserverEntryList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceResourceTiming>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PerformanceTiming>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PeriodicWave>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PermissionStatus>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Permissions>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Plugin>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PluginArray>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PluginCrashedEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PointerEvent>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::PopStateEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PopupBlockedEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PopupBoxObject>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Position>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PositionError>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PrecompiledScript>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Presentation>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationAvailability>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationConnection>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationConnectionAvailableEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationConnectionCloseEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationConnectionList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationDeviceInfoManager>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationReceiver>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PresentationRequest>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ProcessingInstruction>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::ProgressEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::PromiseNativeHandler>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PushEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::PushManager>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PushManagerImpl>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PushMessageData>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PushSubscription>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::PushSubscriptionOptions>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RGBColor>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCCertificate>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCDTMFSender>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCDTMFToneChangeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCDataChannelEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCIceCandidate>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCIdentityProviderRegistrar>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCPeerConnection>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCPeerConnectionIceEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCPeerConnectionStatic>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCRtpReceiver>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCRtpSender>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCSessionDescription>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCStatsReport>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RTCTrackEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::RadioNodeList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Range>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::RecordErrorEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Rect>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Request>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Response>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SEChannel>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SEManager>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SEReader>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SEResponse>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SESession>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAngle>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimateElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimateMotionElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimateTransformElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedAngle>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedBoolean>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedEnumeration>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedInteger>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedLength>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedLengthList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedNumber>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedNumberList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedPreserveAspectRatio>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedRect>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedString>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimatedTransformList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGAnimationElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGCircleElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGClipPathElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGComponentTransferFunctionElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGDefsElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGDescElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGElement>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGEllipseElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEBlendElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEColorMatrixElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEComponentTransferElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFECompositeElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEConvolveMatrixElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEDiffuseLightingElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEDisplacementMapElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEDistantLightElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEDropShadowElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEFloodElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEFuncAElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEFuncBElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEFuncGElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEFuncRElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEGaussianBlurElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEImageElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEMergeElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEMergeNodeElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEMorphologyElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEOffsetElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFEPointLightElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFESpecularLightingElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFESpotLightElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFETileElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFETurbulenceElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGFilterElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGForeignObjectElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGGElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGGeometryElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGGradientElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGGraphicsElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGImageElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGLength>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGLengthList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGLineElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGLinearGradientElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGMPathElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGMarkerElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGMaskElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGMatrix>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGMetadataElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGNumber>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGNumberList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathElement>
{
  enum
  {
    Depth = 6
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSeg>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegArcAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegArcRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegClosePath>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoCubicAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoCubicRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoCubicSmoothAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoCubicSmoothRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoQuadraticAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoQuadraticRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoQuadraticSmoothAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegCurvetoQuadraticSmoothRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegLinetoAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegLinetoHorizontalAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegLinetoHorizontalRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegLinetoRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegLinetoVerticalAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegLinetoVerticalRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegMovetoAbs>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPathSegMovetoRel>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPatternElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPoint>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPointList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPolygonElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPolylineElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGPreserveAspectRatio>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGRadialGradientElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGRect>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGRectElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGSVGElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGScriptElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGSetElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGStopElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGStringList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGStyleElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGSwitchElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGSymbolElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTSpanElement>
{
  enum
  {
    Depth = 7
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTextContentElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTextElement>
{
  enum
  {
    Depth = 7
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTextPathElement>
{
  enum
  {
    Depth = 6
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTextPositioningElement>
{
  enum
  {
    Depth = 6
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTitleElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTransform>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGTransformList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGUseElement>
{
  enum
  {
    Depth = 5
  };
};
template <>
struct PrototypeTraits<prototypes::id::SVGViewElement>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::ScopedCredential>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ScopedCredentialInfo>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Screen>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ScreenOrientation>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ScriptProcessorNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::ScrollAreaEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::ScrollBoxObject>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ScrollViewChangeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Selection>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ServiceWorker>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ServiceWorkerContainer>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ServiceWorkerGlobalScope>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::ServiceWorkerRegistration>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::ShadowRoot>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::SharedWorker>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SharedWorkerGlobalScope>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::SimpleGestureEvent>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::SourceBuffer>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SourceBufferList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechGrammar>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechGrammarList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechRecognition>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechRecognitionAlternative>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechRecognitionError>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechRecognitionEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechRecognitionResult>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechRecognitionResultList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechSynthesis>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechSynthesisErrorEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechSynthesisEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechSynthesisUtterance>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::SpeechSynthesisVoice>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::StereoPannerNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::Storage>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::StorageEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::StorageManager>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::StyleRuleChangeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::StyleSheet>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::StyleSheetApplicableStateChangeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::StyleSheetChangeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::StyleSheetList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::SubtleCrypto>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TCPServerSocket>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TCPServerSocketEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TCPSocket>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TCPSocketErrorEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TCPSocketEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestCImplementedInterface>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestCImplementedInterface2>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestChildInterface>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestCppKeywordNamedMethodsInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestDeprecatedInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestExampleInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestExampleProxyInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestExampleWorkerInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestFunctions>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestHTMLConstructorInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestIndexedAndNamedGetterAndSetterInterface>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestIndexedAndNamedGetterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestIndexedAndNamedSetterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestIndexedGetterAndSetterAndNamedGetterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestIndexedGetterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestIndexedSetterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceIterableDouble>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceIterableDoubleIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceIterableDoubleUnion>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceIterableDoubleUnionIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceIterableSingle>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceJS>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceJSMaplike>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceMaplike>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceMaplikeObject>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceSetlike>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceSetlikeNode>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestInterfaceWithPromiseConstructorArg>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestJSImplInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestJSImplInterface2>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestJSImplInterface3>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestJSImplInterface4>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestJSImplInterface5>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestJSImplInterface6>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestJSImplNoInterfaceObject>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestNamedDeleterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestNamedDeleterWithRetvalInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestNamedGetterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestNamedSetterInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestNavigator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestNavigatorWithConstructor>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestNonWrapperCacheInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestParentInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestRenamedInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestSecureContextInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TestWorkerExposedInterface>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Text>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextClause>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextDecoder>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextEncoder>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextMetrics>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextTrack>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextTrackCue>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextTrackCueList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TextTrackList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TimeEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TimeRanges>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Touch>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TouchEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::TouchList>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TrackEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TransitionEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TreeBoxObject>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::TreeColumn>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TreeColumns>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::TreeWalker>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::U2F>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::UDPMessageEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::UDPSocket>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::UIEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::URL>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::URLSearchParams>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::URLSearchParamsIterator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::UserProximityEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRDisplay>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRDisplayCapabilities>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRDisplayEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::VREyeParameters>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRFieldOfView>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRFrameData>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRMockController>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRMockDisplay>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRPose>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRServiceTest>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VRStageParameters>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VTTCue>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::VTTRegion>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::ValidityState>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VideoPlaybackQuality>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VideoStreamTrack>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::VideoTrack>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::VideoTrackList>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_color_buffer_float>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_compressed_texture_astc>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_compressed_texture_atc>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_compressed_texture_etc>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_compressed_texture_etc1>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_compressed_texture_pvrtc>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_compressed_texture_s3tc>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_debug_renderer_info>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_debug_shaders>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_depth_texture>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_draw_buffers>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WEBGL_lose_context>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WaveShaperNode>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebAuthentication>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebAuthnAssertion>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebAuthnAttestation>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGL2RenderingContext>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLActiveInfo>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLBuffer>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLContextEvent>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLFramebuffer>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLProgram>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLQuery>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLRenderbuffer>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLRenderingContext>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLSampler>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLShader>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLShaderPrecisionFormat>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLSync>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLTexture>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLTransformFeedback>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLUniformLocation>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebGLVertexArrayObject>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebKitCSSMatrix>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::WebSocket>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WheelEvent>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::Window>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WindowClient>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WindowRoot>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::Worker>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WorkerDebuggerGlobalScope>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WorkerGlobalScope>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::WorkerLocation>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WorkerNavigator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::Worklet>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::WorkletGlobalScope>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::XMLDocument>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::XMLHttpRequest>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::XMLHttpRequestEventTarget>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::XMLHttpRequestUpload>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::XMLSerializer>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::XMLStylesheetProcessingInstruction>
{
  enum
  {
    Depth = 4
  };
};
template <>
struct PrototypeTraits<prototypes::id::XPathEvaluator>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::XPathExpression>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::XPathResult>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::XSLTProcessor>
{
  enum
  {
    Depth = 0
  };
};
template <>
struct PrototypeTraits<prototypes::id::XULCommandEvent>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::XULDocument>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::XULElement>
{
  enum
  {
    Depth = 3
  };
};
template <>
struct PrototypeTraits<prototypes::id::mozRTCIceCandidate>
{
  enum
  {
    Depth = 1
  };
};
template <>
struct PrototypeTraits<prototypes::id::mozRTCPeerConnection>
{
  enum
  {
    Depth = 2
  };
};
template <>
struct PrototypeTraits<prototypes::id::mozRTCSessionDescription>
{
  enum
  {
    Depth = 1
  };
};
extern const char *NamesOfInterfacesWithProtos(unsigned int aIndex);
}
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h" 2



class nsCycleCollectionParticipant;
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
namespace mozilla {
namespace dom {
# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
inline bool
IsSecureContextOrObjectIsFromSecureContext(JSContext* aCx, JSObject* aObj)
{
  return JS::CompartmentCreationOptionsRef(js::GetContextCompartment(aCx)).secureContext() ||
         JS::CompartmentCreationOptionsRef(js::GetObjectCompartment(aObj)).secureContext();
}

typedef bool
(* ResolveOwnProperty)(JSContext* cx, JS::Handle<JSObject*> wrapper,
                       JS::Handle<JSObject*> obj, JS::Handle<jsid> id,
                       JS::MutableHandle<JS::PropertyDescriptor> desc);

typedef bool
(* EnumerateOwnProperties)(JSContext* cx, JS::Handle<JSObject*> wrapper,
                           JS::Handle<JSObject*> obj,
                           JS::AutoIdVector& props);

typedef bool
(* DeleteNamedProperty)(JSContext* cx, JS::Handle<JSObject*> wrapper,
                        JS::Handle<JSObject*> obj, JS::Handle<jsid> id,
                        JS::ObjectOpResult& opresult);



bool
IsNonExposedGlobal(JSContext* aCx, JSObject* aGlobal,
                   uint32_t aNonExposedGlobals);

struct ConstantSpec
{
  const char* name;
  JS::Value value;
};

typedef bool (*PropertyEnabled)(JSContext* cx, JSObject* global);

namespace GlobalNames {



static const uint32_t Window = 1u << 0;
static const uint32_t BackstagePass = 1u << 1;
static const uint32_t DedicatedWorkerGlobalScope = 1u << 2;
static const uint32_t SharedWorkerGlobalScope = 1u << 3;
static const uint32_t ServiceWorkerGlobalScope = 1u << 4;
static const uint32_t WorkerDebuggerGlobalScope = 1u << 5;
static const uint32_t WorkletGlobalScope = 1u << 6;
}

struct PrefableDisablers {
  inline bool isEnabled(JSContext* cx, JS::Handle<JSObject*> obj) const {
# 120 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
    if (nonExposedGlobals &&
        IsNonExposedGlobal(cx, js::GetGlobalForObjectCrossCompartment(obj),
                           nonExposedGlobals)) {
      return false;
    }
    if (!enabled) {
      return false;
    }
    if (secureContext && !IsSecureContextOrObjectIsFromSecureContext(cx, obj)) {
      return false;
    }
    if (enabledFunc &&
        !enabledFunc(cx, js::GetGlobalForObjectCrossCompartment(obj))) {
      return false;
    }
    return true;
  }



  bool enabled;


  const bool secureContext;


  const uint16_t nonExposedGlobals;




  const PropertyEnabled enabledFunc;
};

template<typename T>
struct Prefable {
  inline bool isEnabled(JSContext* cx, JS::Handle<JSObject*> obj) const {
    if ((__builtin_expect(!!(!disablers), 1))) {
      return true;
    }
    return disablers->isEnabled(cx, obj);
  }



  PrefableDisablers* const disablers;




  const T* const specs;
};
# 199 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
template <int N>
struct NativePropertiesN {




  struct Trio {
    const void* const mPrefables;
    const jsid* const mIds;
    const void* const mSpecs;
  };

  const int32_t iteratorAliasMethodIndex;

  constexpr const NativePropertiesN<7>* Upcast() const {
    return reinterpret_cast<const NativePropertiesN<7>*>(this);
  }
# 242 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
  public: const uint32_t mHasStaticMethods:1; const uint32_t mStaticMethodsOffset:3; private: const Trio* StaticMethodsTrio() const { do { } while (0); return &trios[mStaticMethodsOffset]; } public: bool HasStaticMethods() const { return mHasStaticMethods; } const Prefable<const JSFunctionSpec>* StaticMethods() const { return static_cast<const Prefable<const JSFunctionSpec>*> ( StaticMethodsTrio()->mPrefables); } const jsid* StaticMethodIds() const { return StaticMethodsTrio()->mIds; } const JSFunctionSpec* StaticMethodSpecs() const { return static_cast<const JSFunctionSpec*>( StaticMethodsTrio()->mSpecs); }
  public: const uint32_t mHasStaticAttributes:1; const uint32_t mStaticAttributesOffset:3; private: const Trio* StaticAttributesTrio() const { do { } while (0); return &trios[mStaticAttributesOffset]; } public: bool HasStaticAttributes() const { return mHasStaticAttributes; } const Prefable<const JSPropertySpec>* StaticAttributes() const { return static_cast<const Prefable<const JSPropertySpec>*> ( StaticAttributesTrio()->mPrefables); } const jsid* StaticAttributeIds() const { return StaticAttributesTrio()->mIds; } const JSPropertySpec* StaticAttributeSpecs() const { return static_cast<const JSPropertySpec*>( StaticAttributesTrio()->mSpecs); }
  public: const uint32_t mHasMethods:1; const uint32_t mMethodsOffset:3; private: const Trio* MethodsTrio() const { do { } while (0); return &trios[mMethodsOffset]; } public: bool HasMethods() const { return mHasMethods; } const Prefable<const JSFunctionSpec>* Methods() const { return static_cast<const Prefable<const JSFunctionSpec>*> ( MethodsTrio()->mPrefables); } const jsid* MethodIds() const { return MethodsTrio()->mIds; } const JSFunctionSpec* MethodSpecs() const { return static_cast<const JSFunctionSpec*>( MethodsTrio()->mSpecs); }
  public: const uint32_t mHasAttributes:1; const uint32_t mAttributesOffset:3; private: const Trio* AttributesTrio() const { do { } while (0); return &trios[mAttributesOffset]; } public: bool HasAttributes() const { return mHasAttributes; } const Prefable<const JSPropertySpec>* Attributes() const { return static_cast<const Prefable<const JSPropertySpec>*> ( AttributesTrio()->mPrefables); } const jsid* AttributeIds() const { return AttributesTrio()->mIds; } const JSPropertySpec* AttributeSpecs() const { return static_cast<const JSPropertySpec*>( AttributesTrio()->mSpecs); }
  public: const uint32_t mHasUnforgeableMethods:1; const uint32_t mUnforgeableMethodsOffset:3; private: const Trio* UnforgeableMethodsTrio() const { do { } while (0); return &trios[mUnforgeableMethodsOffset]; } public: bool HasUnforgeableMethods() const { return mHasUnforgeableMethods; } const Prefable<const JSFunctionSpec>* UnforgeableMethods() const { return static_cast<const Prefable<const JSFunctionSpec>*> ( UnforgeableMethodsTrio()->mPrefables); } const jsid* UnforgeableMethodIds() const { return UnforgeableMethodsTrio()->mIds; } const JSFunctionSpec* UnforgeableMethodSpecs() const { return static_cast<const JSFunctionSpec*>( UnforgeableMethodsTrio()->mSpecs); }
  public: const uint32_t mHasUnforgeableAttributes:1; const uint32_t mUnforgeableAttributesOffset:3; private: const Trio* UnforgeableAttributesTrio() const { do { } while (0); return &trios[mUnforgeableAttributesOffset]; } public: bool HasUnforgeableAttributes() const { return mHasUnforgeableAttributes; } const Prefable<const JSPropertySpec>* UnforgeableAttributes() const { return static_cast<const Prefable<const JSPropertySpec>*> ( UnforgeableAttributesTrio()->mPrefables); } const jsid* UnforgeableAttributeIds() const { return UnforgeableAttributesTrio()->mIds; } const JSPropertySpec* UnforgeableAttributeSpecs() const { return static_cast<const JSPropertySpec*>( UnforgeableAttributesTrio()->mSpecs); }
  public: const uint32_t mHasConstants:1; const uint32_t mConstantsOffset:3; private: const Trio* ConstantsTrio() const { do { } while (0); return &trios[mConstantsOffset]; } public: bool HasConstants() const { return mHasConstants; } const Prefable<const ConstantSpec>* Constants() const { return static_cast<const Prefable<const ConstantSpec>*> ( ConstantsTrio()->mPrefables); } const jsid* ConstantIds() const { return ConstantsTrio()->mIds; } const ConstantSpec* ConstantSpecs() const { return static_cast<const ConstantSpec*>( ConstantsTrio()->mSpecs); }



  const Trio trios[N];
};



static_assert(sizeof(NativePropertiesN<1>) == 8 + 3*sizeof(void*), "1 size");
static_assert(sizeof(NativePropertiesN<2>) == 8 + 6*sizeof(void*), "2 size");
static_assert(sizeof(NativePropertiesN<3>) == 8 + 9*sizeof(void*), "3 size");
static_assert(sizeof(NativePropertiesN<4>) == 8 + 12*sizeof(void*), "4 size");
static_assert(sizeof(NativePropertiesN<5>) == 8 + 15*sizeof(void*), "5 size");
static_assert(sizeof(NativePropertiesN<6>) == 8 + 18*sizeof(void*), "6 size");
static_assert(sizeof(NativePropertiesN<7>) == 8 + 21*sizeof(void*), "7 size");


typedef NativePropertiesN<7> NativeProperties;

struct NativePropertiesHolder
{
  const NativeProperties* regular;
  const NativeProperties* chromeOnly;
};




struct NativePropertyHooks
{


  ResolveOwnProperty mResolveOwnProperty;


  EnumerateOwnProperties mEnumerateOwnProperties;
# 293 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
  DeleteNamedProperty mDeleteNamedProperty;


  NativePropertiesHolder mNativeProperties;




  prototypes::ID mPrototypeID;




  constructors::ID mConstructorID;



  const NativePropertyHooks* mProtoHooks;



  const JSClass* mXrayExpandoClass;
};

enum DOMObjectType : uint8_t {
  eInstance,
  eGlobalInstance,
  eInterface,
  eInterfacePrototype,
  eGlobalInterfacePrototype,
  eNamedPropertiesObject
};

inline
bool
IsInstance(DOMObjectType type)
{
  return type == eInstance || type == eGlobalInstance;
}

inline
bool
IsInterfacePrototype(DOMObjectType type)
{
  return type == eInterfacePrototype || type == eGlobalInterfacePrototype;
}

typedef JSObject* (*AssociatedGlobalGetter)(JSContext* aCx,
                                            JS::Handle<JSObject*> aObj);

typedef JSObject* (*ProtoGetter)(JSContext* aCx);
# 352 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSClass.h"
typedef JS::Handle<JSObject*> (*ProtoHandleGetter)(JSContext* aCx);


struct DOMJSClass
{



  const js::Class mBase;



  const prototypes::ID mInterfaceChain[8];





  const bool mDOMObjectIsISupports;

  const NativePropertyHooks* mNativeHooks;




  AssociatedGlobalGetter mGetAssociatedGlobal;
  ProtoHandleGetter mGetProto;




  nsCycleCollectionParticipant* mParticipant;

  static const DOMJSClass* FromJSClass(const JSClass* base) {
    do { } while (0);
    return reinterpret_cast<const DOMJSClass*>(base);
  }

  static const DOMJSClass* FromJSClass(const js::Class* base) {
    return FromJSClass(Jsvalify(base));
  }

  const JSClass* ToJSClass() const { return Jsvalify(&mBase); }
};


struct DOMIfaceAndProtoJSClass
{




  const js::Class mBase;



  DOMObjectType mType;




  bool wantsInterfaceHasInstance;

  const prototypes::ID mPrototypeID;
  const uint32_t mDepth;

  const NativePropertyHooks* mNativeHooks;



  const char* mToString;

  ProtoGetter mGetParentProto;

  static const DOMIfaceAndProtoJSClass* FromJSClass(const JSClass* base) {
    do { } while (0);
    return reinterpret_cast<const DOMIfaceAndProtoJSClass*>(base);
  }
  static const DOMIfaceAndProtoJSClass* FromJSClass(const js::Class* base) {
    return FromJSClass(Jsvalify(base));
  }

  const JSClass* ToJSClass() const { return Jsvalify(&mBase); }
};

class ProtoAndIfaceCache;

inline bool
DOMGlobalHasProtoAndIFaceCache(JSObject* global)
{
  do { } while (0);

  return !js::GetReservedSlot(global, JSCLASS_GLOBAL_SLOT_COUNT).isUndefined();
}

inline bool
HasProtoAndIfaceCache(JSObject* global)
{
  if (!(js::GetObjectClass(global)->flags & JSCLASS_USERBIT1)) {
    return false;
  }
  return DOMGlobalHasProtoAndIFaceCache(global);
}

inline ProtoAndIfaceCache*
GetProtoAndIfaceCache(JSObject* global)
{
  do { } while (0);
  return static_cast<ProtoAndIfaceCache*>(
    js::GetReservedSlot(global, JSCLASS_GLOBAL_SLOT_COUNT).toPrivate());
}

}
}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSProxyHandler.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSProxyHandler.h"
namespace mozilla {
namespace dom {

enum {
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSProxyHandler.h"
  JSPROXYSLOT_EXPANDO = 0
};

template<typename T> struct Prefable;

class BaseDOMProxyHandler : public js::BaseProxyHandler
{
public:
  explicit constexpr BaseDOMProxyHandler(const void* aProxyFamily, bool aHasPrototype = false)
    : js::BaseProxyHandler(aProxyFamily, aHasPrototype)
  {}



  bool getOwnPropertyDescriptor(JSContext* cx, JS::Handle<JSObject*> proxy,
                                JS::Handle<jsid> id,
                                JS::MutableHandle<JS::PropertyDescriptor> desc) const override;
  virtual bool ownPropertyKeys(JSContext* cx, JS::Handle<JSObject*> proxy,
                               JS::AutoIdVector &props) const override;

  virtual bool getPrototypeIfOrdinary(JSContext* cx, JS::Handle<JSObject*> proxy,
                                      bool* isOrdinary,
                                      JS::MutableHandle<JSObject*> proto) const override;





  virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, JS::Handle<JSObject*> proxy,
                                            JS::AutoIdVector &props) const override;

  bool watch(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id,
             JS::Handle<JSObject*> callable) const override;
  bool unwatch(JSContext* cx, JS::Handle<JSObject*> proxy,
               JS::Handle<jsid> id) const override;

protected:




  virtual bool ownPropNames(JSContext* cx, JS::Handle<JSObject*> proxy,
                            unsigned flags,
                            JS::AutoIdVector& props) const = 0;





  virtual bool getOwnPropDescriptor(JSContext* cx,
                                    JS::Handle<JSObject*> proxy,
                                    JS::Handle<jsid> id,
                                    bool ignoreNamedProps,
                                    JS::MutableHandle<JS::PropertyDescriptor> desc) const = 0;
};

class DOMProxyHandler : public BaseDOMProxyHandler
{
public:
  constexpr DOMProxyHandler()
    : BaseDOMProxyHandler(&family)
  {}

  bool defineProperty(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id,
                      JS::Handle<JS::PropertyDescriptor> desc,
                      JS::ObjectOpResult &result) const override
  {
    bool unused;
    return defineProperty(cx, proxy, id, desc, result, &unused);
  }
  virtual bool defineProperty(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id,
                              JS::Handle<JS::PropertyDescriptor> desc,
                              JS::ObjectOpResult &result, bool *defined) const;
  bool delete_(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id,
               JS::ObjectOpResult &result) const override;
  bool preventExtensions(JSContext* cx, JS::Handle<JSObject*> proxy,
                         JS::ObjectOpResult& result) const override;
  bool isExtensible(JSContext *cx, JS::Handle<JSObject*> proxy, bool *extensible)
                    const override;
  bool set(JSContext *cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id,
           JS::Handle<JS::Value> v, JS::Handle<JS::Value> receiver, JS::ObjectOpResult &result)
           const override;






  virtual bool setCustom(JSContext* cx, JS::Handle<JSObject*> proxy, JS::Handle<jsid> id,
                         JS::Handle<JS::Value> v, bool *done) const;




  static JSObject* GetExpandoObject(JSObject* obj);
# 148 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSProxyHandler.h"
  static void ClearExternalRefsForWrapperRelease(JSObject* obj);
# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMJSProxyHandler.h"
  static JSObject* GetAndClearExpandoObject(JSObject* obj);





  static JSObject* EnsureExpandoObject(JSContext* cx,
                                       JS::Handle<JSObject*> obj);

  static const char family;
};



class ShadowingDOMProxyHandler : public DOMProxyHandler
{
  virtual void trace(JSTracer* trc, JSObject* proxy) const override;
};

inline bool IsDOMProxy(JSObject *obj)
{
    const js::Class* clasp = js::GetObjectClass(obj);
    return clasp->isProxy() &&
           js::GetProxyHandler(obj)->family() == &DOMProxyHandler::family;
}

inline const DOMProxyHandler*
GetDOMProxyHandler(JSObject* obj)
{
  do { } while (0);
  return static_cast<const DOMProxyHandler*>(js::GetProxyHandler(obj));
}

extern jsid s_length_id;



inline uint32_t
GetArrayIndexFromId(JSContext* cx, JS::Handle<jsid> id)
{



  if ((__builtin_expect(!!(JSID_IS_INT(id)), 1))) {
    return JSID_TO_INT(id);
  }
  if ((__builtin_expect(!!(id == s_length_id), 1))) {
    return (4294967295U);
  }
  if ((__builtin_expect(!!(!JSID_IS_ATOM(id)), 0))) {
    return (4294967295U);
  }

  JSLinearString* str = js::AtomToLinearString(JSID_TO_ATOM(id));
  char16_t s;
  {
    JS::AutoCheckCannotGC nogc;
    if (js::LinearStringHasLatin1Chars(str)) {
      s = *js::GetLatin1LinearStringChars(nogc, str);
    } else {
      s = *js::GetTwoByteLinearStringChars(nogc, str);
    }
  }
  if ((__builtin_expect(!!((unsigned)s >= 'a' && (unsigned)s <= 'z'), 1)))
    return (4294967295U);

  uint32_t i;
  return js::StringIsArrayIndex(str, &i) ? i : (4294967295U);
}

inline bool
IsArrayIndex(uint32_t index)
{
  return index < (4294967295U);
}

inline void
FillPropertyDescriptor(JS::MutableHandle<JS::PropertyDescriptor> desc,
                       JSObject* obj, bool readonly, bool enumerable = true)
{
  desc.object().set(obj);
  desc.setAttributes((readonly ? JSPROP_READONLY : 0) |
                     (enumerable ? JSPROP_ENUMERATE : 0));
  desc.setGetter(nullptr);
  desc.setSetter(nullptr);
}

inline void
FillPropertyDescriptor(JS::MutableHandle<JS::PropertyDescriptor> desc,
                       JSObject* obj, const JS::Value& v,
                       bool readonly, bool enumerable = true)
{
  desc.value().set(v);
  FillPropertyDescriptor(desc, obj, readonly, enumerable);
}

inline void
FillPropertyDescriptor(JS::MutableHandle<JS::PropertyDescriptor> desc,
                       JSObject* obj, unsigned attributes, const JS::Value& v)
{
  desc.object().set(obj);
  desc.value().set(v);
  desc.setAttributes(attributes);
  desc.setGetter(nullptr);
  desc.setSetter(nullptr);
}

}
}
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Exceptions.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Exceptions.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIException.h" 1
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIException.h"
class nsIStackFrame : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetLanguage(uint32_t *aLanguage) = 0;


  virtual nsresult GetLanguageName(nsACString & aLanguageName) = 0;


  virtual nsresult GetFilename(JSContext* cx, nsAString & aFilename) = 0;


  virtual nsresult GetName(JSContext* cx, nsAString & aName) = 0;


  virtual nsresult GetLineNumber(JSContext* cx, int32_t *aLineNumber) = 0;


  virtual nsresult GetColumnNumber(JSContext* cx, int32_t *aColumnNumber) = 0;


  virtual nsresult GetSourceLine(nsACString & aSourceLine) = 0;


  virtual nsresult GetAsyncCause(JSContext* cx, nsAString & aAsyncCause) = 0;


  virtual nsresult GetAsyncCaller(JSContext* cx, nsIStackFrame * *aAsyncCaller) = 0;


  virtual nsresult GetCaller(JSContext* cx, nsIStackFrame * *aCaller) = 0;


  virtual nsresult GetFormattedStack(JSContext* cx, nsAString & aFormattedStack) = 0;


  virtual nsresult GetNativeSavedFrame(JS::MutableHandleValue aNativeSavedFrame) = 0;


  virtual nsresult ToString(JSContext* cx, nsACString & _retval) = 0;

};

  template<typename T> struct nsIStackFrame::COMTypeInfo<nsIStackFrame, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIStackFrame::COMTypeInfo<nsIStackFrame, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x28bfb2a2, 0x5ea6, 0x4738, { 0x91, 0x8b, 0x04, 0x9d, 0xc4, 0xd5, 0x1f, 0x0b }};
# 261 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIException.h"
class nsIException : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetMessageMoz(nsACString & aMessage) = 0;


  virtual nsresult GetResult(nsresult *aResult) = 0;


  virtual nsresult GetName(nsACString & aName) = 0;


  virtual nsresult GetFilename(JSContext* cx, nsAString & aFilename) = 0;


  virtual nsresult GetLineNumber(JSContext* cx, uint32_t *aLineNumber) = 0;


  virtual nsresult GetColumnNumber(uint32_t *aColumnNumber) = 0;


  virtual nsresult GetLocation(nsIStackFrame * *aLocation) = 0;


  virtual nsresult GetData(nsISupports * *aData) = 0;


  virtual nsresult ToString(JSContext* cx, nsACString & _retval) = 0;

};

  template<typename T> struct nsIException::COMTypeInfo<nsIException, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIException::COMTypeInfo<nsIException, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x4371b5bf, 0x6845, 0x487f, { 0x8d, 0x9d, 0x3f, 0x1e, 0x4a, 0x9b, 0xad, 0xd2 }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Exceptions.h" 2



class nsIStackFrame;
class nsPIDOMWindowInner;
template <class T>
struct already_AddRefed;

namespace mozilla {
namespace dom {

class Exception;



bool
Throw(JSContext* cx, nsresult rv, const nsACString& message = EmptyCString());


void
ThrowAndReport(nsPIDOMWindowInner* aWindow, nsresult aRv);



void
ThrowExceptionObject(JSContext* aCx, Exception* aException);
void
ThrowExceptionObject(JSContext* aCx, nsIException* aException);






already_AddRefed<Exception>
CreateException(nsresult aRv, const nsACString& aMessage = EmptyCString());




already_AddRefed<nsIStackFrame>
GetCurrentJSStack(int32_t aMaxDepth = -1);


namespace exceptions {

already_AddRefed<nsIStackFrame>
CreateStack(JSContext* aCx, JS::StackCapture&& aCaptureMode);

}
}
}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NonRefcountedDOMObject.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NonRefcountedDOMObject.h"
namespace mozilla {
namespace dom {







class NonRefcountedDOMObject
{
protected:
  NonRefcountedDOMObject()
  {
                                          ;
  }
  ~NonRefcountedDOMObject()
  {
                                          ;
  }
};

}
}
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/RootedDictionary.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/RootedDictionary.h"
namespace mozilla {
namespace dom {

template<typename T>
class RootedDictionary final : public T,
                                         private JS::CustomAutoRooter
{
public:
  template <typename CX>
  explicit RootedDictionary(const CX& cx ) :
    T(),
    JS::CustomAutoRooter(cx )
  {
  }

  virtual void trace(JSTracer *trc) override
  {
    this->TraceDictionary(trc);
  }
};

template<typename T>
class NullableRootedDictionary final : public Nullable<T>,
                                                 private JS::CustomAutoRooter
{
public:
  template <typename CX>
  explicit NullableRootedDictionary(const CX& cx ) :
    Nullable<T>(),
    JS::CustomAutoRooter(cx )
  {
  }

  virtual void trace(JSTracer *trc) override
  {
    if (!this->IsNull()) {
      this->Value().TraceDictionary(trc);
    }
  }
};

}
}
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FlushType.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FlushType.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/X11UndefineNone.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FlushType.h" 2

namespace mozilla {
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/FlushType.h"
enum class FlushType : uint8_t {
  None = 0,
  Content = 1,
  ContentAndNotify = 2,


  Style = 3,
  Frames = Style,
  InterruptibleLayout = 4,


  Layout = 5,

  Display = 6,

  Count
};

struct ChangesToFlush {
  ChangesToFlush(FlushType aFlushType, bool aFlushAnimations)
    : mFlushType(aFlushType)
    , mFlushAnimations(aFlushAnimations)
  {}

  FlushType mFlushType;
  bool mFlushAnimations;
};

}
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMArray.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMArray.h"
class nsCOMArray_base
{
  friend class nsArrayBase;
protected:
  nsCOMArray_base() {}
  explicit nsCOMArray_base(int32_t aCount) : mArray(aCount) {}
  nsCOMArray_base(const nsCOMArray_base& aOther);
  ~nsCOMArray_base();

  int32_t IndexOf(nsISupports* aObject, uint32_t aStartIndex = 0) const;
  bool Contains(nsISupports* aObject) const
  {
    return IndexOf(aObject) != -1;
  }

  int32_t IndexOfObject(nsISupports* aObject) const;
  bool ContainsObject(nsISupports* aObject) const
  {
    return IndexOfObject(aObject) != -1;
  }

  typedef bool (*nsBaseArrayEnumFunc)(void* aElement, void* aData);


  bool EnumerateForwards(nsBaseArrayEnumFunc aFunc, void* aData) const;

  bool EnumerateBackwards(nsBaseArrayEnumFunc aFunc, void* aData) const;

  typedef int (*nsBaseArrayComparatorFunc)(nsISupports* aElement1,
                                           nsISupports* aElement2,
                                           void* aData);

  struct nsCOMArrayComparatorContext
  {
    nsBaseArrayComparatorFunc mComparatorFunc;
    void* mData;
  };

  static int nsCOMArrayComparator(const void* aElement1, const void* aElement2,
                                  void* aData);
  void Sort(nsBaseArrayComparatorFunc aFunc, void* aData);

  bool InsertObjectAt(nsISupports* aObject, int32_t aIndex);
  void InsertElementAt(uint32_t aIndex, nsISupports* aElement);
  void InsertElementAt(uint32_t aIndex, already_AddRefed<nsISupports> aElement);
  bool InsertObjectsAt(const nsCOMArray_base& aObjects, int32_t aIndex);
  void InsertElementsAt(uint32_t aIndex, const nsCOMArray_base& aElements);
  void InsertElementsAt(uint32_t aIndex, nsISupports* const* aElements,
                        uint32_t aCount);
  void ReplaceObjectAt(nsISupports* aObject, int32_t aIndex);
  void ReplaceElementAt(uint32_t aIndex, nsISupports* aElement)
  {
    nsISupports* oldElement = mArray[aIndex];
    ns_if_addref(mArray[aIndex] = aElement);
    do { if (oldElement) { (oldElement)->Release(); (oldElement) = 0; } } while (0);
  }
  bool AppendObject(nsISupports* aObject)
  {
    return InsertObjectAt(aObject, Count());
  }
  void AppendElement(nsISupports* aElement)
  {
    InsertElementAt(Length(), aElement);
  }
  void AppendElement(already_AddRefed<nsISupports> aElement)
  {
    InsertElementAt(Length(), mozilla::Move(aElement));
  }

  bool AppendObjects(const nsCOMArray_base& aObjects)
  {
    return InsertObjectsAt(aObjects, Count());
  }
  void AppendElements(const nsCOMArray_base& aElements)
  {
    return InsertElementsAt(Length(), aElements);
  }
  void AppendElements(nsISupports* const* aElements, uint32_t aCount)
  {
    return InsertElementsAt(Length(), aElements, aCount);
  }
  bool RemoveObject(nsISupports* aObject);
  nsISupports** Elements() { return mArray.Elements(); }
  void SwapElements(nsCOMArray_base& aOther)
  {
    mArray.SwapElements(aOther.mArray);
  }

  void Adopt(nsISupports** aElements, uint32_t aCount);
  uint32_t Forget(nsISupports*** aElements);
public:

  int32_t Count() const { return mArray.Length(); }

  uint32_t Length() const { return mArray.Length(); }
  bool IsEmpty() const { return mArray.IsEmpty(); }



  bool SetCount(int32_t aNewCount);

  void TruncateLength(uint32_t aNewLength)
  {
    if (mArray.Length() > aNewLength) {
      RemoveElementsAt(aNewLength, mArray.Length() - aNewLength);
    }
  }


  void Clear();

  nsISupports* ObjectAt(int32_t aIndex) const { return mArray[aIndex]; }

  nsISupports* ElementAt(uint32_t aIndex) const { return mArray[aIndex]; }

  nsISupports* SafeObjectAt(int32_t aIndex) const
  {
    return mArray.SafeElementAt(aIndex, nullptr);
  }

  nsISupports* SafeElementAt(uint32_t aIndex) const
  {
    return mArray.SafeElementAt(aIndex, nullptr);
  }

  nsISupports* operator[](int32_t aIndex) const { return mArray[aIndex]; }



  bool RemoveObjectAt(int32_t aIndex);

  void RemoveElementAt(uint32_t aIndex);



  bool RemoveObjectsAt(int32_t aIndex, int32_t aCount);

  void RemoveElementsAt(uint32_t aIndex, uint32_t aCount);

  void SwapElementsAt(uint32_t aIndex1, uint32_t aIndex2)
  {
    nsISupports* tmp = mArray[aIndex1];
    mArray[aIndex1] = mArray[aIndex2];
    mArray[aIndex2] = tmp;
  }



  void SetCapacity(uint32_t aCapacity) { mArray.SetCapacity(aCapacity); }
  uint32_t Capacity() { return mArray.Capacity(); }
# 181 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMArray.h"
  size_t ShallowSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return mArray.ShallowSizeOfExcludingThis(aMallocSizeOf);
  }

private:


  nsTArray<nsISupports*> mArray;


  nsCOMArray_base& operator=(const nsCOMArray_base& aOther) = delete;
};

inline void
ImplCycleCollectionUnlink(nsCOMArray_base& aField)
{
  aField.Clear();
}

inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsCOMArray_base& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  aFlags |= CycleCollectionEdgeNameArrayFlag;
  int32_t length = aField.Count();
  for (int32_t i = 0; i < length; ++i) {
    CycleCollectionNoteChild(aCallback, aField[i], aName, aFlags);
  }
}
# 232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMArray.h"
template<class T>
class nsCOMArray : public nsCOMArray_base
{
public:
  typedef int32_t index_type;
  typedef mozilla::ArrayIterator<T*, nsCOMArray> iterator;
  typedef mozilla::ArrayIterator<const T*, nsCOMArray> const_iterator;
  typedef mozilla::ReverseIterator<iterator> reverse_iterator;
  typedef mozilla::ReverseIterator<const_iterator> const_reverse_iterator;

  nsCOMArray() {}
  explicit nsCOMArray(int32_t aCount) : nsCOMArray_base(aCount) {}
  explicit nsCOMArray(const nsCOMArray<T>& aOther) : nsCOMArray_base(aOther) {}
  nsCOMArray(nsCOMArray<T>&& aOther) { SwapElements(aOther); }
  ~nsCOMArray() {}


  nsCOMArray<T>& operator=(nsCOMArray<T> && aOther)
  {
    SwapElements(aOther);
    return *this;
  }


  T* ObjectAt(int32_t aIndex) const
  {
    return static_cast<T*>(nsCOMArray_base::ObjectAt(aIndex));
  }

  T* ElementAt(uint32_t aIndex) const
  {
    return static_cast<T*>(nsCOMArray_base::ElementAt(aIndex));
  }


  T* SafeObjectAt(int32_t aIndex) const
  {
    return static_cast<T*>(nsCOMArray_base::SafeObjectAt(aIndex));
  }

  T* SafeElementAt(uint32_t aIndex) const
  {
    return static_cast<T*>(nsCOMArray_base::SafeElementAt(aIndex));
  }


  T* operator[](int32_t aIndex) const { return ObjectAt(aIndex); }




  int32_t IndexOf(T* aObject, uint32_t aStartIndex = 0) const
  {
    return nsCOMArray_base::IndexOf(aObject, aStartIndex);
  }
  bool Contains(T* aObject) const
  {
    return nsCOMArray_base::Contains(aObject);
  }






  int32_t IndexOfObject(T* aObject) const
  {
    return nsCOMArray_base::IndexOfObject(aObject);
  }
  bool ContainsObject(nsISupports* aObject) const
  {
    return nsCOMArray_base::ContainsObject(aObject);
  }



  bool InsertObjectAt(T* aObject, int32_t aIndex)
  {
    return nsCOMArray_base::InsertObjectAt(aObject, aIndex);
  }

  void InsertElementAt(uint32_t aIndex, T* aElement)
  {
    nsCOMArray_base::InsertElementAt(aIndex, aElement);
  }



  bool InsertObjectsAt(const nsCOMArray<T>& aObjects, int32_t aIndex)
  {
    return nsCOMArray_base::InsertObjectsAt(aObjects, aIndex);
  }

  void InsertElementsAt(uint32_t aIndex, const nsCOMArray<T>& aElements)
  {
    nsCOMArray_base::InsertElementsAt(aIndex, aElements);
  }
  void InsertElementsAt(uint32_t aIndex, T* const* aElements, uint32_t aCount)
  {
    nsCOMArray_base::InsertElementsAt(
      aIndex, reinterpret_cast<nsISupports* const*>(aElements), aCount);
  }



  void ReplaceObjectAt(T* aObject, int32_t aIndex)
  {
    nsCOMArray_base::ReplaceObjectAt(aObject, aIndex);
  }

  void ReplaceElementAt(uint32_t aIndex, T* aElement)
  {
    nsCOMArray_base::ReplaceElementAt(aIndex, aElement);
  }

  typedef int (*nsCOMArrayComparatorFunc)(T* aElement1, T* aElement2,
                                          void* aData);

  void Sort(nsCOMArrayComparatorFunc aFunc, void* aData)
  {
    nsCOMArray_base::Sort(nsBaseArrayComparatorFunc(aFunc), aData);
  }


  bool AppendObject(T* aObject)
  {
    return nsCOMArray_base::AppendObject(aObject);
  }

  void AppendElement(T* aElement)
  {
    nsCOMArray_base::AppendElement(aElement);
  }
  void AppendElement(already_AddRefed<T> aElement)
  {
    nsCOMArray_base::AppendElement(mozilla::Move(aElement));
  }


  bool AppendObjects(const nsCOMArray<T>& aObjects)
  {
    return nsCOMArray_base::AppendObjects(aObjects);
  }

  void AppendElements(const nsCOMArray<T>& aElements)
  {
    return nsCOMArray_base::AppendElements(aElements);
  }
  void AppendElements(T* const* aElements, uint32_t aCount)
  {
    InsertElementsAt(Length(), aElements, aCount);
  }




  bool RemoveObject(T* aObject)
  {
    return nsCOMArray_base::RemoveObject(aObject);
  }

  bool RemoveElement(T* aElement)
  {
    return nsCOMArray_base::RemoveObject(aElement);
  }

  T** Elements()
  {
    return reinterpret_cast<T**>(nsCOMArray_base::Elements());
  }
  void SwapElements(nsCOMArray<T>& aOther)
  {
    nsCOMArray_base::SwapElements(aOther);
  }
# 418 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMArray.h"
  void Adopt(T** aElements, uint32_t aSize)
  {
    nsCOMArray_base::Adopt(reinterpret_cast<nsISupports**>(aElements), aSize);
  }
# 431 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCOMArray.h"
  uint32_t Forget(T*** aElements)
  {
    return nsCOMArray_base::Forget(reinterpret_cast<nsISupports***>(aElements));
  }


  iterator begin() { return iterator(*this, 0); }
  const_iterator begin() const { return const_iterator(*this, 0); }
  const_iterator cbegin() const { return begin(); }
  iterator end() { return iterator(*this, Length()); }
  const_iterator end() const { return const_iterator(*this, Length()); }
  const_iterator cend() const { return end(); }


  reverse_iterator rbegin() { return reverse_iterator(end()); }
  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
  const_reverse_iterator crbegin() const { return rbegin(); }
  reverse_iterator rend() { return reverse_iterator(begin()); }
  const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
  const_reverse_iterator crend() const { return rend(); }

private:


  nsCOMArray<T>& operator=(const nsCOMArray<T>& aOther) = delete;
};

template<typename T>
inline void
ImplCycleCollectionUnlink(nsCOMArray<T>& aField)
{
  aField.Clear();
}

template<typename E>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsCOMArray<E>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  aFlags |= CycleCollectionEdgeNameArrayFlag;
  int32_t length = aField.Count();
  for (int32_t i = 0; i < length; ++i) {
    CycleCollectionNoteChild(aCallback, aField[i], aName, aFlags);
  }
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCompatibility.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCompatibility.h"
enum nsCompatibility {
  eCompatibility_FullStandards = 1,
  eCompatibility_AlmostStandards = 2,
  eCompatibility_NavQuirks = 3
};
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsGkAtoms.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsGkAtoms.h"
class nsIAtom;

class nsGkAtoms {
public:

  static void AddRefAtoms();
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsGkAtoms.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsGkAtomList.h" 1
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsGkAtomList.h"
static nsIAtom* _empty;
static nsIAtom* moz;
static nsIAtom* mozframetype;
static nsIAtom* _moz_abspos;
static nsIAtom* _moz_activated;
static nsIAtom* _moz_anonclass;
static nsIAtom* _moz_resizing;
static nsIAtom* mozallowfullscreen;
static nsIAtom* moztype;
static nsIAtom* mozdirty;
static nsIAtom* mozdisallowselectionprint;
static nsIAtom* mozdonotsend;
static nsIAtom* mozeditorbogusnode;
static nsIAtom* mozgeneratedcontentbefore;
static nsIAtom* mozgeneratedcontentafter;
static nsIAtom* mozgeneratedcontentimage;
static nsIAtom* mozquote;
static nsIAtom* mozsignature;
static nsIAtom* _moz_is_glyph;
static nsIAtom* _moz_original_size;
static nsIAtom* _moz_target;
static nsIAtom* menuactive;
static nsIAtom* _poundDefault;
static nsIAtom* _asterisk;
static nsIAtom* a;
static nsIAtom* abbr;
static nsIAtom* abort;
static nsIAtom* above;
static nsIAtom* acceltext;
static nsIAtom* accept;
static nsIAtom* acceptcharset;
static nsIAtom* accesskey;
static nsIAtom* acronym;
static nsIAtom* action;
static nsIAtom* active;
static nsIAtom* activetitlebarcolor;
static nsIAtom* activateontab;
static nsIAtom* actuate;
static nsIAtom* address;
static nsIAtom* after;
static nsIAtom* after_end;
static nsIAtom* after_start;
static nsIAtom* align;
static nsIAtom* alink;
static nsIAtom* all;
static nsIAtom* allowdirs;
static nsIAtom* allowevents;
static nsIAtom* allownegativeassertions;
static nsIAtom* allowforms;
static nsIAtom* allowfullscreen;
static nsIAtom* allowmodals;
static nsIAtom* alloworientationlock;
static nsIAtom* allowpointerlock;
static nsIAtom* allowpopupstoescapesandbox;
static nsIAtom* allowpopups;
static nsIAtom* allowpresentation;
static nsIAtom* allowsameorigin;
static nsIAtom* allowscripts;
static nsIAtom* allowtopnavigation;
static nsIAtom* allowuntrusted;
static nsIAtom* alt;
static nsIAtom* alternate;
static nsIAtom* always;
static nsIAtom* ancestor;
static nsIAtom* ancestorOrSelf;
static nsIAtom* anchor;
static nsIAtom* _and;
static nsIAtom* animations;
static nsIAtom* anonid;
static nsIAtom* anonlocation;
static nsIAtom* any;
static nsIAtom* applet;
static nsIAtom* applyImports;
static nsIAtom* applyTemplates;
static nsIAtom* mozapptype;
static nsIAtom* archive;
static nsIAtom* area;
static nsIAtom* arrow;
static nsIAtom* article;
static nsIAtom* ascending;
static nsIAtom* aside;
static nsIAtom* aspectRatio;
static nsIAtom* assign;
static nsIAtom* async;
static nsIAtom* attribute;
static nsIAtom* attributes;
static nsIAtom* attributeSet;
static nsIAtom* aural;
static nsIAtom* _auto;
static nsIAtom* autocheck;
static nsIAtom* autocomplete;
static nsIAtom* autofocus;
static nsIAtom* autoplay;
static nsIAtom* autorepeatbutton;
static nsIAtom* axis;
static nsIAtom* b;
static nsIAtom* backdropFrame;
static nsIAtom* background;
static nsIAtom* base;
static nsIAtom* basefont;
static nsIAtom* baseline;
static nsIAtom* bdi;
static nsIAtom* bdo;
static nsIAtom* before;
static nsIAtom* before_end;
static nsIAtom* before_start;
static nsIAtom* below;
static nsIAtom* bgcolor;
static nsIAtom* bgsound;
static nsIAtom* big;
static nsIAtom* binding;
static nsIAtom* bindings;
static nsIAtom* bindToUntrustedContent;
static nsIAtom* blankrow;
static nsIAtom* block;
static nsIAtom* blockquote;
static nsIAtom* blur;
static nsIAtom* body;
static nsIAtom* boolean;
static nsIAtom* border;
static nsIAtom* bordercolor;
static nsIAtom* both;
static nsIAtom* bottom;
static nsIAtom* bottomend;
static nsIAtom* bottomstart;
static nsIAtom* bottomleft;
static nsIAtom* bottommargin;
static nsIAtom* bottompadding;
static nsIAtom* bottomright;
static nsIAtom* box;
static nsIAtom* br;
static nsIAtom* braille;
static nsIAtom* broadcast;
static nsIAtom* broadcaster;
static nsIAtom* broadcasterset;
static nsIAtom* browser;
static nsIAtom* mozbrowser;
static nsIAtom* bulletinboard;
static nsIAtom* button;
static nsIAtom* brighttitlebarforeground;
static nsIAtom* callTemplate;
static nsIAtom* cancel;
static nsIAtom* canvas;
static nsIAtom* caption;
static nsIAtom* capture;
static nsIAtom* caseOrder;
static nsIAtom* cdataSectionElements;
static nsIAtom* ceiling;
static nsIAtom* cell;
static nsIAtom* cellpadding;
static nsIAtom* cellspacing;
static nsIAtom* center;
static nsIAtom* ch;
static nsIAtom* change;
static nsIAtom* _char;
static nsIAtom* characterData;
static nsIAtom* charcode;
static nsIAtom* charoff;
static nsIAtom* charset;
static nsIAtom* checkbox;
static nsIAtom* checked;
static nsIAtom* child;
static nsIAtom* children;
static nsIAtom* childList;
static nsIAtom* choose;
static nsIAtom* chromemargin;
static nsIAtom* chromeOnlyContent;
static nsIAtom* exposeToUntrustedContent;
static nsIAtom* circ;
static nsIAtom* circle;
static nsIAtom* cite;
static nsIAtom* _class;
static nsIAtom* classid;
static nsIAtom* clear;
static nsIAtom* click;
static nsIAtom* clickcount;
static nsIAtom* clickthrough;
static nsIAtom* movetoclick;
static nsIAtom* clip;
static nsIAtom* close;
static nsIAtom* closed;
static nsIAtom* closemenu;
static nsIAtom* coalesceduplicatearcs;
static nsIAtom* code;
static nsIAtom* codebase;
static nsIAtom* codetype;
static nsIAtom* col;
static nsIAtom* colgroup;
static nsIAtom* collapse;
static nsIAtom* collapsed;
static nsIAtom* color;
static nsIAtom* colorIndex;
static nsIAtom* cols;
static nsIAtom* colspan;
static nsIAtom* column;
static nsIAtom* columns;
static nsIAtom* combobox;
static nsIAtom* command;
static nsIAtom* commands;
static nsIAtom* commandset;
static nsIAtom* commandupdate;
static nsIAtom* commandupdater;
static nsIAtom* comment;
static nsIAtom* compact;
static nsIAtom* concat;
static nsIAtom* conditions;
static nsIAtom* constructor;
static nsIAtom* consumeoutsideclicks;
static nsIAtom* container;
static nsIAtom* containment;
static nsIAtom* contains;
static nsIAtom* content;
static nsIAtom* contenteditable;
static nsIAtom* headerContentDisposition;
static nsIAtom* headerContentLanguage;
static nsIAtom* contentLocation;
static nsIAtom* headerContentScriptType;
static nsIAtom* headerContentStyleType;
static nsIAtom* headerContentType;
static nsIAtom* consumeanchor;
static nsIAtom* context;
static nsIAtom* contextmenu;
static nsIAtom* control;
static nsIAtom* controls;
static nsIAtom* coords;
static nsIAtom* copy;
static nsIAtom* copyOf;
static nsIAtom* count;
static nsIAtom* crop;
static nsIAtom* crossorigin;
static nsIAtom* curpos;
static nsIAtom* current;
static nsIAtom* cutoutregion;
static nsIAtom* cycler;
static nsIAtom* data;
static nsIAtom* datalist;
static nsIAtom* dataType;
static nsIAtom* dateTime;
static nsIAtom* datasources;
static nsIAtom* datetime;
static nsIAtom* datetimebox;
static nsIAtom* dblclick;
static nsIAtom* dd;
static nsIAtom* debug;
static nsIAtom* decimalFormat;
static nsIAtom* decimalSeparator;
static nsIAtom* deck;
static nsIAtom* declare;
static nsIAtom* decoderDoctor;
static nsIAtom* decrement;
static nsIAtom* _default;
static nsIAtom* headerDefaultStyle;
static nsIAtom* defaultAction;
static nsIAtom* defaultchecked;
static nsIAtom* defaultLabel;
static nsIAtom* defaultselected;
static nsIAtom* defaultvalue;
static nsIAtom* defaultplaybackrate;
static nsIAtom* defer;
static nsIAtom* del;
static nsIAtom* descendant;
static nsIAtom* descendantOrSelf;
static nsIAtom* descending;
static nsIAtom* description;
static nsIAtom* destructor;
static nsIAtom* details;
static nsIAtom* deviceAspectRatio;
static nsIAtom* deviceHeight;
static nsIAtom* devicePixelRatio;
static nsIAtom* deviceWidth;
static nsIAtom* dfn;
static nsIAtom* dialog;
static nsIAtom* difference;
static nsIAtom* digit;
static nsIAtom* dir;
static nsIAtom* dirAutoSetBy;
static nsIAtom* directionality;
static nsIAtom* directory;
static nsIAtom* disableOutputEscaping;
static nsIAtom* disabled;
static nsIAtom* disableglobalhistory;
static nsIAtom* disablehistory;
static nsIAtom* disablefullscreen;
static nsIAtom* display;
static nsIAtom* displayMode;
static nsIAtom* distinct;
static nsIAtom* div;
static nsIAtom* dl;
static nsIAtom* doctypePublic;
static nsIAtom* doctypeSystem;
static nsIAtom* document;
static nsIAtom* download;
static nsIAtom* DOMAttrModified;
static nsIAtom* DOMCharacterDataModified;
static nsIAtom* DOMNodeInserted;
static nsIAtom* DOMNodeInsertedIntoDocument;
static nsIAtom* DOMNodeRemoved;
static nsIAtom* DOMNodeRemovedFromDocument;
static nsIAtom* DOMSubtreeModified;
static nsIAtom* double_;
static nsIAtom* drag;
static nsIAtom* dragend;
static nsIAtom* dragenter;
static nsIAtom* dragevent;
static nsIAtom* dragexit;
static nsIAtom* draggable;
static nsIAtom* dragging;
static nsIAtom* dragleave;
static nsIAtom* dragover;
static nsIAtom* dragSession;
static nsIAtom* dragstart;
static nsIAtom* drawintitlebar;
static nsIAtom* drawtitle;
static nsIAtom* drop;
static nsIAtom* dropAfter;
static nsIAtom* dropBefore;
static nsIAtom* dropOn;
static nsIAtom* dropMarker;
static nsIAtom* dt;
static nsIAtom* editable;
static nsIAtom* editing;
static nsIAtom* editor;
static nsIAtom* editorDisplayList;
static nsIAtom* element;
static nsIAtom* elementAvailable;
static nsIAtom* elements;
static nsIAtom* em;
static nsIAtom* embed;
static nsIAtom* embossed;
static nsIAtom* empty;
static nsIAtom* encoding;
static nsIAtom* enctype;
static nsIAtom* end;
static nsIAtom* endEvent;
static nsIAtom* end_after;
static nsIAtom* end_before;
static nsIAtom* equalsize;
static nsIAtom* error;
static nsIAtom* even;
static nsIAtom* event;
static nsIAtom* events;
static nsIAtom* excludeResultPrefixes;
static nsIAtom* excludes;
static nsIAtom* expr;
static nsIAtom* extends;
static nsIAtom* extensionElementPrefixes;
static nsIAtom* face;
static nsIAtom* fallback;
static nsIAtom* _false;
static nsIAtom* farthest;
static nsIAtom* field;
static nsIAtom* fieldset;
static nsIAtom* figcaption;
static nsIAtom* figure;
static nsIAtom* fixed;
static nsIAtom* flags;
static nsIAtom* flex;
static nsIAtom* flexgroup;
static nsIAtom* flip;
static nsIAtom* floating;
static nsIAtom* floor;
static nsIAtom* flowlength;
static nsIAtom* focus;
static nsIAtom* focused;
static nsIAtom* followanchor;
static nsIAtom* following;
static nsIAtom* followingSibling;
static nsIAtom* font;
static nsIAtom* fontWeight;
static nsIAtom* fontpicker;
static nsIAtom* footer;
static nsIAtom* _for;
static nsIAtom* forEach;
static nsIAtom* forceOwnRefreshDriver;
static nsIAtom* form;
static nsIAtom* formaction;
static nsIAtom* format;
static nsIAtom* formatNumber;
static nsIAtom* formenctype;
static nsIAtom* formmethod;
static nsIAtom* formnovalidate;
static nsIAtom* formtarget;
static nsIAtom* frame;
static nsIAtom* frameborder;
static nsIAtom* frameset;
static nsIAtom* from;
static nsIAtom* fullscreenchange;
static nsIAtom* fullscreenerror;
static nsIAtom* functionAvailable;
static nsIAtom* freshProcess;
static nsIAtom* generateId;
static nsIAtom* getter;
static nsIAtom* glyphchar;
static nsIAtom* glyphid;
static nsIAtom* grid;
static nsIAtom* grippy;
static nsIAtom* group;
static nsIAtom* groupingSeparator;
static nsIAtom* groupingSize;
static nsIAtom* grow;
static nsIAtom* gutter;
static nsIAtom* h1;
static nsIAtom* h2;
static nsIAtom* h3;
static nsIAtom* h4;
static nsIAtom* h5;
static nsIAtom* h6;
static nsIAtom* handheld;
static nsIAtom* handheldFriendly;
static nsIAtom* handler;
static nsIAtom* handlers;
static nsIAtom* HARD;
static nsIAtom* hasSameNode;
static nsIAtom* hbox;
static nsIAtom* head;
static nsIAtom* header;
static nsIAtom* headers;
static nsIAtom* height;
static nsIAtom* hgroup;
static nsIAtom* hidden;
static nsIAtom* hidechrome;
static nsIAtom* hidecolumnpicker;
static nsIAtom* high;
static nsIAtom* highest;
static nsIAtom* horizontal;
static nsIAtom* hover;
static nsIAtom* hr;
static nsIAtom* href;
static nsIAtom* hreflang;
static nsIAtom* hspace;
static nsIAtom* html;
static nsIAtom* httpEquiv;
static nsIAtom* i;
static nsIAtom* icon;
static nsIAtom* id;
static nsIAtom* _if;
static nsIAtom* iframe;
static nsIAtom* ignorecase;
static nsIAtom* ignorekeys;
static nsIAtom* ignoreuserfocus;
static nsIAtom* ilayer;
static nsIAtom* image;
static nsIAtom* imageClickedPoint;
static nsIAtom* img;
static nsIAtom* implementation;
static nsIAtom* implements;
static nsIAtom* import;
static nsIAtom* inactivetitlebarcolor;
static nsIAtom* include;
static nsIAtom* includes;
static nsIAtom* increment;
static nsIAtom* indent;
static nsIAtom* indeterminate;
static nsIAtom* index;
static nsIAtom* infer;
static nsIAtom* infinity;
static nsIAtom* inherit;
static nsIAtom* inherits;
static nsIAtom* inheritstyle;
static nsIAtom* initial_scale;
static nsIAtom* input;
static nsIAtom* inputmode;
static nsIAtom* ins;
static nsIAtom* insertafter;
static nsIAtom* insertbefore;
static nsIAtom* install;
static nsIAtom* instanceOf;
static nsIAtom* int32;
static nsIAtom* int64;
static nsIAtom* integer;
static nsIAtom* integrity;
static nsIAtom* intersection;
static nsIAtom* is;
static nsIAtom* iscontainer;
static nsIAtom* isempty;
static nsIAtom* ismap;
static nsIAtom* itemid;
static nsIAtom* itemprop;
static nsIAtom* itemref;
static nsIAtom* itemscope;
static nsIAtom* itemtype;
static nsIAtom* kbd;
static nsIAtom* keepcurrentinview;
static nsIAtom* keepobjectsalive;
static nsIAtom* key;
static nsIAtom* keycode;
static nsIAtom* keystatuseschange;
static nsIAtom* keydown;
static nsIAtom* keygen;
static nsIAtom* keypress;
static nsIAtom* keyset;
static nsIAtom* keysystem;
static nsIAtom* keytext;
static nsIAtom* keyup;
static nsIAtom* kind;
static nsIAtom* label;
static nsIAtom* lang;
static nsIAtom* language;
static nsIAtom* last;
static nsIAtom* layer;
static nsIAtom* LayerActivity;
static nsIAtom* layout;
static nsIAtom* leading;
static nsIAtom* leaf;
static nsIAtom* left;
static nsIAtom* leftmargin;
static nsIAtom* leftpadding;
static nsIAtom* legend;
static nsIAtom* length;
static nsIAtom* letterValue;
static nsIAtom* level;
static nsIAtom* li;
static nsIAtom* line;
static nsIAtom* link;
static nsIAtom* list;
static nsIAtom* listbox;
static nsIAtom* listboxbody;
static nsIAtom* listcell;
static nsIAtom* listcol;
static nsIAtom* listcols;
static nsIAtom* listener;
static nsIAtom* listhead;
static nsIAtom* listheader;
static nsIAtom* listing;
static nsIAtom* listitem;
static nsIAtom* listrows;
static nsIAtom* load;
static nsIAtom* loadingprincipal;
static nsIAtom* localedir;
static nsIAtom* localName;
static nsIAtom* longdesc;
static nsIAtom* loop;
static nsIAtom* low;
static nsIAtom* lowerFirst;
static nsIAtom* lowest;
static nsIAtom* lowsrc;
static nsIAtom* ltr;
static nsIAtom* lwtheme;
static nsIAtom* lwthemetextcolor;
static nsIAtom* main;
static nsIAtom* map;
static nsIAtom* manifest;
static nsIAtom* marginBottom;
static nsIAtom* marginLeft;
static nsIAtom* marginRight;
static nsIAtom* marginTop;
static nsIAtom* marginheight;
static nsIAtom* marginwidth;
static nsIAtom* mark;
static nsIAtom* marquee;
static nsIAtom* match;
static nsIAtom* max;
static nsIAtom* maxheight;
static nsIAtom* maximum_scale;
static nsIAtom* maxlength;
static nsIAtom* maxpos;
static nsIAtom* maxwidth;
static nsIAtom* mayscript;
static nsIAtom* media;
static nsIAtom* mediaType;
static nsIAtom* member;
static nsIAtom* menu;
static nsIAtom* menubar;
static nsIAtom* menubutton;
static nsIAtom* menuButton;
static nsIAtom* menugroup;
static nsIAtom* menuitem;
static nsIAtom* menulist;
static nsIAtom* menupopup;
static nsIAtom* menuseparator;
static nsIAtom* message;
static nsIAtom* meta;
static nsIAtom* referrer;
static nsIAtom* referrerpolicy;
static nsIAtom* headerReferrerPolicy;
static nsIAtom* meter;
static nsIAtom* method;
static nsIAtom* middle;
static nsIAtom* min;
static nsIAtom* minheight;
static nsIAtom* minimum_scale;
static nsIAtom* minlength;
static nsIAtom* minpos;
static nsIAtom* minusSign;
static nsIAtom* minwidth;
static nsIAtom* _mixed;
static nsIAtom* messagemanagergroup;
static nsIAtom* mod;
static nsIAtom* mode;
static nsIAtom* modifiers;
static nsIAtom* monochrome;
static nsIAtom* mousedown;
static nsIAtom* mousemove;
static nsIAtom* mouseout;
static nsIAtom* mouseover;
static nsIAtom* mousethrough;
static nsIAtom* mouseup;
static nsIAtom* mozaudiochannel;
static nsIAtom* mozfullscreenchange;
static nsIAtom* mozfullscreenerror;
static nsIAtom* mozpointerlockchange;
static nsIAtom* mozpointerlockerror;
static nsIAtom* mozprivatebrowsing;
static nsIAtom* moz_opaque;
static nsIAtom* moz_action_hint;
static nsIAtom* x_moz_errormessage;
static nsIAtom* msthemecompatible;
static nsIAtom* multicol;
static nsIAtom* multiple;
static nsIAtom* muted;
static nsIAtom* name;
static nsIAtom* _namespace;
static nsIAtom* namespaceAlias;
static nsIAtom* namespaceUri;
static nsIAtom* NaN;
static nsIAtom* nativeAnonymousChildList;
static nsIAtom* nav;
static nsIAtom* negate;
static nsIAtom* never;
static nsIAtom* _new;
static nsIAtom* newline;
static nsIAtom* nextBidi;
static nsIAtom* no;
static nsIAtom* noautofocus;
static nsIAtom* noautohide;
static nsIAtom* norolluponanchor;
static nsIAtom* nobr;
static nsIAtom* node;
static nsIAtom* nodefaultsrc;
static nsIAtom* nodeSet;
static nsIAtom* noembed;
static nsIAtom* noframes;
static nsIAtom* nohref;
static nsIAtom* noisolation;
static nsIAtom* nonce;
static nsIAtom* none;
static nsIAtom* noresize;
static nsIAtom* normal;
static nsIAtom* normalizeSpace;
static nsIAtom* noscript;
static nsIAtom* noshade;
static nsIAtom* novalidate;
static nsIAtom* _not;
static nsIAtom* nowrap;
static nsIAtom* number;
static nsIAtom* null;
static nsIAtom* object;
static nsIAtom* objectType;
static nsIAtom* observer;
static nsIAtom* observes;
static nsIAtom* odd;
static nsIAtom* OFF;
static nsIAtom* ol;
static nsIAtom* omitXmlDeclaration;
static nsIAtom* ona2dpstatuschanged;
static nsIAtom* onabort;
static nsIAtom* onmozaccesskeynotfound;
static nsIAtom* onactivate;
static nsIAtom* onadapteradded;
static nsIAtom* onadapterremoved;
static nsIAtom* onafterprint;
static nsIAtom* onafterscriptexecute;
static nsIAtom* onalerting;
static nsIAtom* onanimationcancel;
static nsIAtom* onanimationend;
static nsIAtom* onanimationiteration;
static nsIAtom* onanimationstart;
static nsIAtom* onantennaavailablechange;
static nsIAtom* onAppCommand;
static nsIAtom* onappinstalled;
static nsIAtom* onattributechanged;
static nsIAtom* onattributereadreq;
static nsIAtom* onattributewritereq;
static nsIAtom* onaudioprocess;
static nsIAtom* onauxclick;
static nsIAtom* onbeforecopy;
static nsIAtom* onbeforecut;
static nsIAtom* onbeforepaste;
static nsIAtom* onbeforeevicted;
static nsIAtom* onbeforeprint;
static nsIAtom* onbeforescriptexecute;
static nsIAtom* onbeforeunload;
static nsIAtom* onblocked;
static nsIAtom* onblur;
static nsIAtom* onbroadcast;
static nsIAtom* onbusy;
static nsIAtom* onbufferedamountlow;
static nsIAtom* oncached;
static nsIAtom* oncallschanged;
static nsIAtom* oncancel;
static nsIAtom* oncardstatechange;
static nsIAtom* oncfstatechange;
static nsIAtom* onchange;
static nsIAtom* oncharacteristicchanged;
static nsIAtom* onchargingchange;
static nsIAtom* onchargingtimechange;
static nsIAtom* onchecking;
static nsIAtom* onclick;
static nsIAtom* onclirmodechange;
static nsIAtom* onclose;
static nsIAtom* oncommand;
static nsIAtom* oncommandupdate;
static nsIAtom* oncomplete;
static nsIAtom* oncompositionend;
static nsIAtom* oncompositionstart;
static nsIAtom* oncompositionupdate;
static nsIAtom* onconnect;
static nsIAtom* onconnected;
static nsIAtom* onconnecting;
static nsIAtom* onconnectionavailable;
static nsIAtom* onconnectionstatechanged;
static nsIAtom* oncontextmenu;
static nsIAtom* oncopy;
static nsIAtom* oncurrentchannelchanged;
static nsIAtom* oncurrentsourcechanged;
static nsIAtom* oncut;
static nsIAtom* ondatachange;
static nsIAtom* ondataerror;
static nsIAtom* ondblclick;
static nsIAtom* ondeleted;
static nsIAtom* ondeliverysuccess;
static nsIAtom* ondeliveryerror;
static nsIAtom* ondevicefound;
static nsIAtom* ondevicepaired;
static nsIAtom* ondeviceunpaired;
static nsIAtom* ondialing;
static nsIAtom* ondisabled;
static nsIAtom* ondischargingtimechange;
static nsIAtom* ondisconnect;
static nsIAtom* ondisconnected;
static nsIAtom* ondisconnecting;
static nsIAtom* ondisplaypasskeyreq;
static nsIAtom* ondownloading;
static nsIAtom* onDOMActivate;
static nsIAtom* onDOMAttrModified;
static nsIAtom* onDOMCharacterDataModified;
static nsIAtom* onDOMFocusIn;
static nsIAtom* onDOMFocusOut;
static nsIAtom* onDOMMouseScroll;
static nsIAtom* onDOMNodeInserted;
static nsIAtom* onDOMNodeInsertedIntoDocument;
static nsIAtom* onDOMNodeRemoved;
static nsIAtom* onDOMNodeRemovedFromDocument;
static nsIAtom* onDOMSubtreeModified;
static nsIAtom* ondata;
static nsIAtom* ondrag;
static nsIAtom* ondragdrop;
static nsIAtom* ondragend;
static nsIAtom* ondragenter;
static nsIAtom* ondragexit;
static nsIAtom* ondraggesture;
static nsIAtom* ondragleave;
static nsIAtom* ondragover;
static nsIAtom* ondragstart;
static nsIAtom* ondrain;
static nsIAtom* ondrop;
static nsIAtom* oneitbroadcasted;
static nsIAtom* onenabled;
static nsIAtom* onenterpincodereq;
static nsIAtom* onemergencycbmodechange;
static nsIAtom* onerror;
static nsIAtom* onevicted;
static nsIAtom* onfailed;
static nsIAtom* onfetch;
static nsIAtom* onfinish;
static nsIAtom* onfocus;
static nsIAtom* onfocusin;
static nsIAtom* onfocusout;
static nsIAtom* onfrequencychange;
static nsIAtom* onfullscreenchange;
static nsIAtom* onfullscreenerror;
static nsIAtom* onspeakerforcedchange;
static nsIAtom* onget;
static nsIAtom* ongroupchange;
static nsIAtom* onhashchange;
static nsIAtom* onheadphoneschange;
static nsIAtom* onheld;
static nsIAtom* onhfpstatuschanged;
static nsIAtom* onhidstatuschanged;
static nsIAtom* onholding;
static nsIAtom* oniccchange;
static nsIAtom* oniccdetected;
static nsIAtom* oniccinfochange;
static nsIAtom* oniccundetected;
static nsIAtom* onincoming;
static nsIAtom* oninput;
static nsIAtom* oninstall;
static nsIAtom* oninvalid;
static nsIAtom* onkeydown;
static nsIAtom* onkeypress;
static nsIAtom* onkeyup;
static nsIAtom* onlanguagechange;
static nsIAtom* onlevelchange;
static nsIAtom* onLoad;
static nsIAtom* onload;
static nsIAtom* onloading;
static nsIAtom* onloadingdone;
static nsIAtom* onloadingerror;
static nsIAtom* onpopstate;
static nsIAtom* only;
static nsIAtom* onmessage;
static nsIAtom* onmousedown;
static nsIAtom* onmouseenter;
static nsIAtom* onmouseleave;
static nsIAtom* onmouselongtap;
static nsIAtom* onmousemove;
static nsIAtom* onmouseout;
static nsIAtom* onmouseover;
static nsIAtom* onMozMouseHittest;
static nsIAtom* onmouseup;
static nsIAtom* onMozAfterPaint;
static nsIAtom* onmozfullscreenchange;
static nsIAtom* onmozfullscreenerror;
static nsIAtom* onmozkeydownonplugin;
static nsIAtom* onmozkeyuponplugin;
static nsIAtom* onmozpointerlockchange;
static nsIAtom* onmozpointerlockerror;
static nsIAtom* onmoztimechange;
static nsIAtom* onMozMousePixelScroll;
static nsIAtom* onMozScrolledAreaChanged;
static nsIAtom* onmoznetworkupload;
static nsIAtom* onmoznetworkdownload;
static nsIAtom* onmapfolderlistingreq;
static nsIAtom* onmapmessageslistingreq;
static nsIAtom* onmapgetmessagereq;
static nsIAtom* onmapsetmessagestatusreq;
static nsIAtom* onmapsendmessagereq;
static nsIAtom* onmapmessageupdatereq;
static nsIAtom* onnewrdsgroup;
static nsIAtom* onnotificationclick;
static nsIAtom* onnotificationclose;
static nsIAtom* onnoupdate;
static nsIAtom* onobexpasswordreq;
static nsIAtom* onobsolete;
static nsIAtom* ononline;
static nsIAtom* onoffline;
static nsIAtom* onopen;
static nsIAtom* onorientationchange;
static nsIAtom* onotastatuschange;
static nsIAtom* onoverflow;
static nsIAtom* onoverflowchanged;
static nsIAtom* onpagehide;
static nsIAtom* onpageshow;
static nsIAtom* onpaint;
static nsIAtom* onpairingaborted;
static nsIAtom* onpairingconfirmationreq;
static nsIAtom* onpairingconsentreq;
static nsIAtom* onpaste;
static nsIAtom* onpendingchange;
static nsIAtom* onpichange;
static nsIAtom* onpointerlockchange;
static nsIAtom* onpointerlockerror;
static nsIAtom* onpopuphidden;
static nsIAtom* onpopuphiding;
static nsIAtom* onpopuppositioned;
static nsIAtom* onpopupshowing;
static nsIAtom* onpopupshown;
static nsIAtom* onpullphonebookreq;
static nsIAtom* onpullvcardentryreq;
static nsIAtom* onpullvcardlistingreq;
static nsIAtom* onpush;
static nsIAtom* onpushsubscriptionchange;
static nsIAtom* onpschange;
static nsIAtom* onptychange;
static nsIAtom* onradiostatechange;
static nsIAtom* onrdsdisabled;
static nsIAtom* onrdsenabled;
static nsIAtom* onreaderror;
static nsIAtom* onreadsuccess;
static nsIAtom* onready;
static nsIAtom* onreadystatechange;
static nsIAtom* onreceived;
static nsIAtom* onremoteheld;
static nsIAtom* onremoteresumed;
static nsIAtom* onrequestprogress;
static nsIAtom* onresourcetimingbufferfull;
static nsIAtom* onresponseprogress;
static nsIAtom* onretrieving;
static nsIAtom* onRequest;
static nsIAtom* onrequestmediaplaystatus;
static nsIAtom* onreset;
static nsIAtom* onresuming;
static nsIAtom* onresize;
static nsIAtom* onrtchange;
static nsIAtom* onscanningstatechanged;
static nsIAtom* onscostatuschanged;
static nsIAtom* onscroll;
static nsIAtom* onselect;
static nsIAtom* onselectionchange;
static nsIAtom* onselectstart;
static nsIAtom* onsending;
static nsIAtom* onsent;
static nsIAtom* onset;
static nsIAtom* onshow;
static nsIAtom* onstatechange;
static nsIAtom* onstatuschanged;
static nsIAtom* onstkcommand;
static nsIAtom* onstksessionend;
static nsIAtom* onstorage;
static nsIAtom* onstorageareachanged;
static nsIAtom* onsubmit;
static nsIAtom* onsuccess;
static nsIAtom* ontypechange;
static nsIAtom* onterminate;
static nsIAtom* ontext;
static nsIAtom* ontoggle;
static nsIAtom* ontouchstart;
static nsIAtom* ontouchend;
static nsIAtom* ontouchmove;
static nsIAtom* ontouchcancel;
static nsIAtom* ontransitioncancel;
static nsIAtom* ontransitionend;
static nsIAtom* ontransitionrun;
static nsIAtom* ontransitionstart;
static nsIAtom* onunderflow;
static nsIAtom* onunload;
static nsIAtom* onupdatefound;
static nsIAtom* onupdateready;
static nsIAtom* onupgradeneeded;
static nsIAtom* onussdreceived;
static nsIAtom* onversionchange;
static nsIAtom* onvoicechange;
static nsIAtom* onvoiceschanged;
static nsIAtom* onvrdisplayactivate;
static nsIAtom* onvrdisplayconnect;
static nsIAtom* onvrdisplaydeactivate;
static nsIAtom* onvrdisplaydisconnect;
static nsIAtom* onvrdisplaypresentchange;
static nsIAtom* onwebkitAnimationEnd;
static nsIAtom* onwebkitAnimationIteration;
static nsIAtom* onwebkitAnimationStart;
static nsIAtom* onwebkitTransitionEnd;
static nsIAtom* onwebkitanimationend;
static nsIAtom* onwebkitanimationiteration;
static nsIAtom* onwebkitanimationstart;
static nsIAtom* onwebkittransitionend;
static nsIAtom* onwebsocket;
static nsIAtom* onwheel;
static nsIAtom* open;
static nsIAtom* optgroup;
static nsIAtom* optimum;
static nsIAtom* option;
static nsIAtom* _or;
static nsIAtom* order;
static nsIAtom* ordinal;
static nsIAtom* orient;
static nsIAtom* orientation;
static nsIAtom* otherwise;
static nsIAtom* output;
static nsIAtom* overflow;
static nsIAtom* overflowchanged;
static nsIAtom* overlay;
static nsIAtom* overlap;
static nsIAtom* p;
static nsIAtom* pack;
static nsIAtom* page;
static nsIAtom* pageincrement;
static nsIAtom* pagex;
static nsIAtom* pagey;
static nsIAtom* paint_order;
static nsIAtom* palettename;
static nsIAtom* panel;
static nsIAtom* param;
static nsIAtom* parameter;
static nsIAtom* parent;
static nsIAtom* parentfocused;
static nsIAtom* parsetype;
static nsIAtom* password;
static nsIAtom* pattern;
static nsIAtom* patternSeparator;
static nsIAtom* perMille;
static nsIAtom* percent;
static nsIAtom* persist;
static nsIAtom* phase;
static nsIAtom* picture;
static nsIAtom* ping;
static nsIAtom* pinned;
static nsIAtom* placeholder;
static nsIAtom* plaintext;
static nsIAtom* playbackrate;
static nsIAtom* pointSize;
static nsIAtom* pointerlockchange;
static nsIAtom* pointerlockerror;
static nsIAtom* poly;
static nsIAtom* polygon;
static nsIAtom* popup;
static nsIAtom* popupalign;
static nsIAtom* popupanchor;
static nsIAtom* popupgroup;
static nsIAtom* popuphidden;
static nsIAtom* popuphiding;
static nsIAtom* popupset;
static nsIAtom* popupshowing;
static nsIAtom* popupshown;
static nsIAtom* popupsinherittooltip;
static nsIAtom* position;
static nsIAtom* poster;
static nsIAtom* pre;
static nsIAtom* preceding;
static nsIAtom* precedingSibling;
static nsIAtom* predicate;
static nsIAtom* prefix;
static nsIAtom* preload;
static nsIAtom* prerendered;
static nsIAtom* mozpresentation;
static nsIAtom* preserve;
static nsIAtom* preserveSpace;
static nsIAtom* preventdefault;
static nsIAtom* primary;
static nsIAtom* print;
static nsIAtom* priority;
static nsIAtom* processingInstruction;
static nsIAtom* profile;
static nsIAtom* progress;
static nsIAtom* progressmeter;
static nsIAtom* progressNormal;
static nsIAtom* progressUndetermined;
static nsIAtom* projection;
static nsIAtom* prompt;
static nsIAtom* propagate;
static nsIAtom* properties;
static nsIAtom* property;
static nsIAtom* pubdate;
static nsIAtom* q;
static nsIAtom* query;
static nsIAtom* queryset;
static nsIAtom* querytype;
static nsIAtom* radio;
static nsIAtom* radiogroup;
static nsIAtom* range;
static nsIAtom* readonly;
static nsIAtom* rect;
static nsIAtom* rectangle;
static nsIAtom* ref;
static nsIAtom* refresh;
static nsIAtom* rel;
static nsIAtom* onreloadpage;
static nsIAtom* rem;
static nsIAtom* removeelement;
static nsIAtom* renderingobserverlist;
static nsIAtom* repeat;
static nsIAtom* replace;
static nsIAtom* required;
static nsIAtom* reserved;
static nsIAtom* reset;
static nsIAtom* resizeafter;
static nsIAtom* resizebefore;
static nsIAtom* resizer;
static nsIAtom* resolution;
static nsIAtom* resource;
static nsIAtom* resources;
static nsIAtom* result;
static nsIAtom* resultPrefix;
static nsIAtom* retargetdocumentfocus;
static nsIAtom* rev;
static nsIAtom* reverse;
static nsIAtom* reversed;
static nsIAtom* richlistbox;
static nsIAtom* richlistitem;
static nsIAtom* right;
static nsIAtom* rightmargin;
static nsIAtom* rightpadding;
static nsIAtom* role;
static nsIAtom* rolluponmousewheel;
static nsIAtom* round;
static nsIAtom* row;
static nsIAtom* rows;
static nsIAtom* rowspan;
static nsIAtom* rb;
static nsIAtom* rp;
static nsIAtom* rt;
static nsIAtom* rtc;
static nsIAtom* rtl;
static nsIAtom* ruby;
static nsIAtom* rubyBase;
static nsIAtom* rubyBaseContainer;
static nsIAtom* rubyText;
static nsIAtom* rubyTextContainer;
static nsIAtom* rule;
static nsIAtom* rules;
static nsIAtom* s;
static nsIAtom* samp;
static nsIAtom* sandbox;
static nsIAtom* sbattr;
static nsIAtom* scale;
static nsIAtom* scan;
static nsIAtom* scheme;
static nsIAtom* scope;
static nsIAtom* scoped;
static nsIAtom* screen;
static nsIAtom* screenX;
static nsIAtom* screenY;
static nsIAtom* script;
static nsIAtom* scriptEnabledBeforePrintOrPreview;
static nsIAtom* scrollbar;
static nsIAtom* scrollbarbutton;
static nsIAtom* scrollbarDownBottom;
static nsIAtom* scrollbarDownTop;
static nsIAtom* scrollbarUpBottom;
static nsIAtom* scrollbarUpTop;
static nsIAtom* scrollbox;
static nsIAtom* scrollcorner;
static nsIAtom* scrolling;
static nsIAtom* scrollPosition;
static nsIAtom* section;
static nsIAtom* select;
static nsIAtom* selectable;
static nsIAtom* selected;
static nsIAtom* selectedIndex;
static nsIAtom* selectedindex;
static nsIAtom* self;
static nsIAtom* seltype;
static nsIAtom* setcookie;
static nsIAtom* setter;
static nsIAtom* shape;
static nsIAtom* show;
static nsIAtom* showcaret;
static nsIAtom* showresizer;
static nsIAtom* simple;
static nsIAtom* single;
static nsIAtom* size;
static nsIAtom* sizes;
static nsIAtom* sizemode;
static nsIAtom* sizetopopup;
static nsIAtom* slider;
static nsIAtom* small;
static nsIAtom* smooth;
static nsIAtom* snap;
static nsIAtom* sort;
static nsIAtom* sortActive;
static nsIAtom* sortDirection;
static nsIAtom* sorted;
static nsIAtom* sorthints;
static nsIAtom* sortLocked;
static nsIAtom* sortResource;
static nsIAtom* sortResource2;
static nsIAtom* sortSeparators;
static nsIAtom* sortStaticsLast;
static nsIAtom* source;
static nsIAtom* space;
static nsIAtom* spacer;
static nsIAtom* span;
static nsIAtom* spellcheck;
static nsIAtom* spinner;
static nsIAtom* split;
static nsIAtom* splitter;
static nsIAtom* spring;
static nsIAtom* src;
static nsIAtom* srcdoc;
static nsIAtom* srclang;
static nsIAtom* srcset;
static nsIAtom* stack;
static nsIAtom* standalone;
static nsIAtom* standby;
static nsIAtom* start;
static nsIAtom* start_after;
static nsIAtom* start_before;
static nsIAtom* startsWith;
static nsIAtom* state;
static nsIAtom* statedatasource;
static nsIAtom* staticHint;
static nsIAtom* statusbar;
static nsIAtom* statustext;
static nsIAtom* step;
static nsIAtom* stop;
static nsIAtom* stretch;
static nsIAtom* strike;
static nsIAtom* string;
static nsIAtom* stringLength;
static nsIAtom* stripSpace;
static nsIAtom* strong;
static nsIAtom* style;
static nsIAtom* stylesheet;
static nsIAtom* stylesheetPrefix;
static nsIAtom* subject;
static nsIAtom* submit;
static nsIAtom* substate;
static nsIAtom* substring;
static nsIAtom* substringAfter;
static nsIAtom* substringBefore;
static nsIAtom* sub;
static nsIAtom* sum;
static nsIAtom* sup;
static nsIAtom* summary;
static nsIAtom* systemProperty;
static nsIAtom* tab;
static nsIAtom* tabbox;
static nsIAtom* tabindex;
static nsIAtom* table;
static nsIAtom* tabpanel;
static nsIAtom* tabpanels;
static nsIAtom* tag;
static nsIAtom* target;
static nsIAtom* targets;
static nsIAtom* tbody;
static nsIAtom* td;
static nsIAtom* _template;
static nsIAtom* text_decoration;
static nsIAtom* terminate;
static nsIAtom* test;
static nsIAtom* text;
static nsIAtom* textAlign;
static nsIAtom* textarea;
static nsIAtom* textbox;
static nsIAtom* textnode;
static nsIAtom* textNodeDirectionalityMap;
static nsIAtom* tfoot;
static nsIAtom* th;
static nsIAtom* thead;
static nsIAtom* thumb;
static nsIAtom* time;
static nsIAtom* title;
static nsIAtom* titlebar;
static nsIAtom* titletip;
static nsIAtom* toggled;
static nsIAtom* token;
static nsIAtom* tokenize;
static nsIAtom* toolbar;
static nsIAtom* toolbarbutton;
static nsIAtom* toolbaritem;
static nsIAtom* toolbox;
static nsIAtom* tooltip;
static nsIAtom* tooltiptext;
static nsIAtom* top;
static nsIAtom* topleft;
static nsIAtom* topmargin;
static nsIAtom* toppadding;
static nsIAtom* topright;
static nsIAtom* tr;
static nsIAtom* track;
static nsIAtom* trailing;
static nsIAtom* transform;
static nsIAtom* transform_3d;
static nsIAtom* transformiix;
static nsIAtom* translate;
static nsIAtom* transparent;
static nsIAtom* tree;
static nsIAtom* treecell;
static nsIAtom* treechildren;
static nsIAtom* treecol;
static nsIAtom* treecolpicker;
static nsIAtom* treecols;
static nsIAtom* treeitem;
static nsIAtom* treerow;
static nsIAtom* treeseparator;
static nsIAtom* triple;
static nsIAtom* _true;
static nsIAtom* tt;
static nsIAtom* tty;
static nsIAtom* tv;
static nsIAtom* type;
static nsIAtom* typemustmatch;
static nsIAtom* u;
static nsIAtom* ul;
static nsIAtom* underflow;
static nsIAtom* undetermined;
static nsIAtom* unload;
static nsIAtom* unparsedEntityUri;
static nsIAtom* upperFirst;
static nsIAtom* uri;
static nsIAtom* use;
static nsIAtom* useAttributeSets;
static nsIAtom* usemap;
static nsIAtom* user_scalable;
static nsIAtom* userInput;
static nsIAtom* validate;
static nsIAtom* valign;
static nsIAtom* value;
static nsIAtom* values;
static nsIAtom* valueOf;
static nsIAtom* valuetype;
static nsIAtom* var;
static nsIAtom* variable;
static nsIAtom* vbox;
static nsIAtom* vcard_name;
static nsIAtom* vendor;
static nsIAtom* vendorUrl;
static nsIAtom* version;
static nsIAtom* vert;
static nsIAtom* vertical;
static nsIAtom* audio;
static nsIAtom* video;
static nsIAtom* videocontrols;
static nsIAtom* viewport;
static nsIAtom* viewport_height;
static nsIAtom* viewport_initial_scale;
static nsIAtom* viewport_maximum_scale;
static nsIAtom* viewport_minimum_scale;
static nsIAtom* viewport_user_scalable;
static nsIAtom* viewport_width;
static nsIAtom* visibility;
static nsIAtom* visuallyselected;
static nsIAtom* vlink;
static nsIAtom* vspace;
static nsIAtom* wbr;
static nsIAtom* webkitdirectory;
static nsIAtom* when;
static nsIAtom* where;
static nsIAtom* widget;
static nsIAtom* width;
static nsIAtom* willChange;
static nsIAtom* window;
static nsIAtom* headerWindowTarget;
static nsIAtom* windowtype;
static nsIAtom* withParam;
static nsIAtom* wizard;
static nsIAtom* wrap;
static nsIAtom* headerDNSPrefetchControl;
static nsIAtom* headerCSP;
static nsIAtom* headerCSPReportOnly;
static nsIAtom* headerXFO;
static nsIAtom* x_western;
static nsIAtom* xml;
static nsIAtom* xml_stylesheet;
static nsIAtom* xmlns;
static nsIAtom* xmp;
static nsIAtom* xulcontentsgenerated;
static nsIAtom* yes;
static nsIAtom* z_index;
static nsIAtom* zeroDigit;


static nsIAtom* percentage;
static nsIAtom* A;
static nsIAtom* alignment_baseline;
static nsIAtom* amplitude;
static nsIAtom* animate;
static nsIAtom* animateColor;
static nsIAtom* animateMotion;
static nsIAtom* animateTransform;
static nsIAtom* arithmetic;
static nsIAtom* atop;
static nsIAtom* azimuth;
static nsIAtom* B;
static nsIAtom* backgroundColor;
static nsIAtom* background_image;
static nsIAtom* baseFrequency;
static nsIAtom* baseline_shift;
static nsIAtom* bias;
static nsIAtom* caption_side;
static nsIAtom* clip_path;
static nsIAtom* clip_rule;
static nsIAtom* clipPath;
static nsIAtom* clipPathUnits;
static nsIAtom* cm;
static nsIAtom* colorBurn;
static nsIAtom* colorDodge;
static nsIAtom* colorInterpolation;
static nsIAtom* colorInterpolationFilters;
static nsIAtom* colorProfile;
static nsIAtom* cursor;
static nsIAtom* cx;
static nsIAtom* cy;
static nsIAtom* d;
static nsIAtom* darken;
static nsIAtom* defs;
static nsIAtom* deg;
static nsIAtom* desc;
static nsIAtom* diffuseConstant;
static nsIAtom* dilate;
static nsIAtom* direction;
static nsIAtom* disable;
static nsIAtom* discrete;
static nsIAtom* divisor;
static nsIAtom* dominant_baseline;
static nsIAtom* duplicate;
static nsIAtom* dx;
static nsIAtom* dy;
static nsIAtom* edgeMode;
static nsIAtom* ellipse;
static nsIAtom* elevation;
static nsIAtom* erode;
static nsIAtom* ex;
static nsIAtom* exact;
static nsIAtom* exclusion;
static nsIAtom* exponent;
static nsIAtom* feBlend;
static nsIAtom* feColorMatrix;
static nsIAtom* feComponentTransfer;
static nsIAtom* feComposite;
static nsIAtom* feConvolveMatrix;
static nsIAtom* feDiffuseLighting;
static nsIAtom* feDisplacementMap;
static nsIAtom* feDistantLight;
static nsIAtom* feDropShadow;
static nsIAtom* feFlood;
static nsIAtom* feFuncA;
static nsIAtom* feFuncB;
static nsIAtom* feFuncG;
static nsIAtom* feFuncR;
static nsIAtom* feGaussianBlur;
static nsIAtom* feImage;
static nsIAtom* feMerge;
static nsIAtom* feMergeNode;
static nsIAtom* feMorphology;
static nsIAtom* feOffset;
static nsIAtom* fePointLight;
static nsIAtom* feSpecularLighting;
static nsIAtom* feSpotLight;
static nsIAtom* feTile;
static nsIAtom* feTurbulence;
static nsIAtom* fill;
static nsIAtom* fill_opacity;
static nsIAtom* fill_rule;
static nsIAtom* filter;
static nsIAtom* filterUnits;
static nsIAtom* _float;
static nsIAtom* flood_color;
static nsIAtom* flood_opacity;
static nsIAtom* font_face;
static nsIAtom* font_face_format;
static nsIAtom* font_face_name;
static nsIAtom* font_face_src;
static nsIAtom* font_face_uri;
static nsIAtom* font_family;
static nsIAtom* font_size;
static nsIAtom* font_size_adjust;
static nsIAtom* font_stretch;
static nsIAtom* font_style;
static nsIAtom* font_variant;
static nsIAtom* foreignObject;
static nsIAtom* fractalNoise;
static nsIAtom* fx;
static nsIAtom* fy;
static nsIAtom* G;
static nsIAtom* g;
static nsIAtom* gamma;

static nsIAtom* generic_;
static nsIAtom* glyphRef;
static nsIAtom* grad;
static nsIAtom* gradientTransform;
static nsIAtom* gradientUnits;
static nsIAtom* hardLight;
static nsIAtom* hue;
static nsIAtom* hueRotate;
static nsIAtom* identity;
static nsIAtom* image_rendering;
static nsIAtom* in;
static nsIAtom* in2;
static nsIAtom* intercept;
static nsIAtom* k1;
static nsIAtom* k2;
static nsIAtom* k3;
static nsIAtom* k4;
static nsIAtom* kernelMatrix;
static nsIAtom* kernelUnitLength;
static nsIAtom* lengthAdjust;
static nsIAtom* letter_spacing;
static nsIAtom* lighten;
static nsIAtom* lighting_color;
static nsIAtom* limitingConeAngle;
static nsIAtom* linear;
static nsIAtom* linearGradient;
static nsIAtom* linearRGB;
static nsIAtom* list_style_type;
static nsIAtom* luminanceToAlpha;
static nsIAtom* luminosity;
static nsIAtom* magnify;
static nsIAtom* marker;
static nsIAtom* marker_end;
static nsIAtom* marker_mid;
static nsIAtom* marker_start;
static nsIAtom* markerHeight;
static nsIAtom* markerUnits;
static nsIAtom* markerWidth;
static nsIAtom* mask;
static nsIAtom* maskContentUnits;
static nsIAtom* mask_type;
static nsIAtom* maskUnits;
static nsIAtom* matrix;
static nsIAtom* metadata;
static nsIAtom* missingGlyph;
static nsIAtom* mm;
static nsIAtom* mpath;
static nsIAtom* noStitch;
static nsIAtom* numOctaves;
static nsIAtom* multiply;
static nsIAtom* objectBoundingBox;
static nsIAtom* offset;
static nsIAtom* onSVGLoad;
static nsIAtom* onSVGResize;
static nsIAtom* onSVGScroll;
static nsIAtom* onSVGUnload;
static nsIAtom* onSVGZoom;
static nsIAtom* onzoom;
static nsIAtom* opacity;
static nsIAtom* _operator;
static nsIAtom* out;
static nsIAtom* over;
static nsIAtom* overridePreserveAspectRatio;
static nsIAtom* pad;
static nsIAtom* path;
static nsIAtom* pathLength;
static nsIAtom* patternContentUnits;
static nsIAtom* patternTransform;
static nsIAtom* patternUnits;
static nsIAtom* pc;
static nsIAtom* pointer_events;
static nsIAtom* points;
static nsIAtom* pointsAtX;
static nsIAtom* pointsAtY;
static nsIAtom* pointsAtZ;
static nsIAtom* polyline;
static nsIAtom* preserveAlpha;
static nsIAtom* preserveAspectRatio;
static nsIAtom* primitiveUnits;
static nsIAtom* pt;
static nsIAtom* px;
static nsIAtom* R;
static nsIAtom* r;
static nsIAtom* rad;
static nsIAtom* radialGradient;
static nsIAtom* radius;
static nsIAtom* reflect;
static nsIAtom* refX;
static nsIAtom* refY;
static nsIAtom* requiredExtensions;
static nsIAtom* requiredFeatures;
static nsIAtom* rotate;
static nsIAtom* rx;
static nsIAtom* ry;
static nsIAtom* saturate;
static nsIAtom* saturation;
static nsIAtom* set;
static nsIAtom* seed;
static nsIAtom* shadow;
static nsIAtom* shape_rendering;
static nsIAtom* skewX;
static nsIAtom* skewY;
static nsIAtom* slope;
static nsIAtom* softLight;
static nsIAtom* spacing;
static nsIAtom* spacingAndGlyphs;
static nsIAtom* specularConstant;
static nsIAtom* specularExponent;
static nsIAtom* spreadMethod;
static nsIAtom* sRGB;
static nsIAtom* startOffset;
static nsIAtom* stdDeviation;
static nsIAtom* stitch;
static nsIAtom* stitchTiles;
static nsIAtom* stop_color;
static nsIAtom* stop_opacity;
static nsIAtom* stroke;
static nsIAtom* stroke_dasharray;
static nsIAtom* stroke_dashoffset;
static nsIAtom* stroke_linecap;
static nsIAtom* stroke_linejoin;
static nsIAtom* stroke_miterlimit;
static nsIAtom* stroke_opacity;
static nsIAtom* stroke_width;
static nsIAtom* strokeWidth;
static nsIAtom* surfaceScale;
static nsIAtom* svg;
static nsIAtom* svgContextPaint;
static nsIAtom* svgSwitch;
static nsIAtom* symbol;
static nsIAtom* systemLanguage;
static nsIAtom* tableValues;
static nsIAtom* targetX;
static nsIAtom* targetY;
static nsIAtom* text_anchor;
static nsIAtom* text_rendering;
static nsIAtom* textLength;
static nsIAtom* textPath;
static nsIAtom* tref;
static nsIAtom* tspan;
static nsIAtom* turbulence;
static nsIAtom* unicode_bidi;
static nsIAtom* userSpaceOnUse;
static nsIAtom* view;
static nsIAtom* viewBox;
static nsIAtom* viewTarget;
static nsIAtom* white_space;
static nsIAtom* word_spacing;
static nsIAtom* writing_mode;
static nsIAtom* x;
static nsIAtom* x1;
static nsIAtom* x2;
static nsIAtom* xChannelSelector;
static nsIAtom* xor_;
static nsIAtom* y;
static nsIAtom* y1;
static nsIAtom* y2;
static nsIAtom* yChannelSelector;
static nsIAtom* z;
static nsIAtom* zoomAndPan;
static nsIAtom* vector_effect;
static nsIAtom* vertical_align;

static nsIAtom* accumulate;
static nsIAtom* additive;
static nsIAtom* attributeName;
static nsIAtom* attributeType;
static nsIAtom* auto_reverse;
static nsIAtom* begin;
static nsIAtom* beginEvent;
static nsIAtom* by;
static nsIAtom* calcMode;
static nsIAtom* css;
static nsIAtom* dur;
static nsIAtom* keyPoints;
static nsIAtom* keySplines;
static nsIAtom* keyTimes;
static nsIAtom* mozAnimateMotionDummyAttr;
static nsIAtom* onbegin;
static nsIAtom* onbeginEvent;
static nsIAtom* onend;
static nsIAtom* onendEvent;
static nsIAtom* onrepeat;
static nsIAtom* onrepeatEvent;
static nsIAtom* repeatCount;
static nsIAtom* repeatDur;
static nsIAtom* repeatEvent;
static nsIAtom* restart;
static nsIAtom* to;
static nsIAtom* XML;

static nsIAtom* abs_;
static nsIAtom* accent_;
static nsIAtom* accentunder_;
static nsIAtom* actiontype_;
static nsIAtom* alignmentscope_;
static nsIAtom* altimg_;
static nsIAtom* altimg_height_;
static nsIAtom* altimg_valign_;
static nsIAtom* altimg_width_;
static nsIAtom* annotation_;
static nsIAtom* annotation_xml_;
static nsIAtom* apply_;
static nsIAtom* approx_;
static nsIAtom* arccos_;
static nsIAtom* arccosh_;
static nsIAtom* arccot_;
static nsIAtom* arccoth_;
static nsIAtom* arccsc_;
static nsIAtom* arccsch_;
static nsIAtom* arcsec_;
static nsIAtom* arcsech_;
static nsIAtom* arcsin_;
static nsIAtom* arcsinh_;
static nsIAtom* arctan_;
static nsIAtom* arctanh_;
static nsIAtom* arg_;
static nsIAtom* bevelled_;
static nsIAtom* bind_;
static nsIAtom* bvar_;
static nsIAtom* card_;
static nsIAtom* cartesianproduct_;
static nsIAtom* cbytes_;
static nsIAtom* cd_;
static nsIAtom* cdgroup_;
static nsIAtom* cerror_;
static nsIAtom* charalign_;
static nsIAtom* ci_;
static nsIAtom* closure_;
static nsIAtom* cn_;
static nsIAtom* codomain_;
static nsIAtom* columnalign_;
static nsIAtom* columnalignment_;
static nsIAtom* columnlines_;
static nsIAtom* columnspacing_;
static nsIAtom* columnspan_;
static nsIAtom* columnwidth_;
static nsIAtom* complexes_;
static nsIAtom* compose_;
static nsIAtom* condition_;
static nsIAtom* conjugate_;
static nsIAtom* cos_;
static nsIAtom* cosh_;
static nsIAtom* cot_;
static nsIAtom* coth_;
static nsIAtom* crossout_;
static nsIAtom* csc_;
static nsIAtom* csch_;
static nsIAtom* cs_;
static nsIAtom* csymbol_;
static nsIAtom* curl_;
static nsIAtom* decimalpoint_;
static nsIAtom* definitionURL_;
static nsIAtom* degree_;
static nsIAtom* denomalign_;
static nsIAtom* depth_;
static nsIAtom* determinant_;
static nsIAtom* diff_;
static nsIAtom* displaystyle_;
static nsIAtom* divergence_;
static nsIAtom* divide_;
static nsIAtom* domain_;
static nsIAtom* domainofapplication_;
static nsIAtom* edge_;
static nsIAtom* el_;
static nsIAtom* emptyset_;
static nsIAtom* eq_;
static nsIAtom* equalcolumns_;
static nsIAtom* equalrows_;
static nsIAtom* equivalent_;
static nsIAtom* eulergamma_;
static nsIAtom* exists_;
static nsIAtom* exp_;
static nsIAtom* exponentiale_;
static nsIAtom* factorial_;
static nsIAtom* factorof_;
static nsIAtom* fence_;
static nsIAtom* fn_;
static nsIAtom* fontfamily_;
static nsIAtom* fontsize_;
static nsIAtom* fontstyle_;
static nsIAtom* fontweight_;
static nsIAtom* forall_;
static nsIAtom* framespacing_;
static nsIAtom* gcd_;
static nsIAtom* geq_;
static nsIAtom* groupalign_;
static nsIAtom* gt_;
static nsIAtom* ident_;
static nsIAtom* imaginaryi_;
static nsIAtom* imaginary_;
static nsIAtom* implies_;
static nsIAtom* indentalignfirst_;
static nsIAtom* indentalign_;
static nsIAtom* indentalignlast_;
static nsIAtom* indentshiftfirst_;
static nsIAtom* indentshift_;
static nsIAtom* indenttarget_;
static nsIAtom* integers_;
static nsIAtom* intersect_;
static nsIAtom* interval_;
static nsIAtom* int_;
static nsIAtom* inverse_;
static nsIAtom* lambda_;
static nsIAtom* laplacian_;
static nsIAtom* largeop_;
static nsIAtom* lcm_;
static nsIAtom* leq_;
static nsIAtom* limit_;
static nsIAtom* linebreak_;
static nsIAtom* linebreakmultchar_;
static nsIAtom* linebreakstyle_;
static nsIAtom* linethickness_;
static nsIAtom* list_;
static nsIAtom* ln_;
static nsIAtom* location_;
static nsIAtom* logbase_;
static nsIAtom* log_;
static nsIAtom* longdivstyle_;
static nsIAtom* lowlimit_;
static nsIAtom* lquote_;
static nsIAtom* lspace_;
static nsIAtom* lt_;
static nsIAtom* maction_;
static nsIAtom* maligngroup_;
static nsIAtom* malignmark_;
static nsIAtom* mathbackground_;
static nsIAtom* mathcolor_;
static nsIAtom* mathsize_;
static nsIAtom* mathvariant_;
static nsIAtom* matrixrow_;
static nsIAtom* maxsize_;
static nsIAtom* mean_;
static nsIAtom* median_;
static nsIAtom* menclose_;
static nsIAtom* merror_;
static nsIAtom* mfenced_;
static nsIAtom* mfrac_;
static nsIAtom* mglyph_;
static nsIAtom* mi_;
static nsIAtom* minlabelspacing_;
static nsIAtom* minsize_;
static nsIAtom* minus_;
static nsIAtom* mlabeledtr_;
static nsIAtom* mlongdiv_;
static nsIAtom* mmultiscripts_;
static nsIAtom* mn_;
static nsIAtom* momentabout_;
static nsIAtom* moment_;
static nsIAtom* mo_;
static nsIAtom* movablelimits_;
static nsIAtom* mover_;
static nsIAtom* mpadded_;
static nsIAtom* mphantom_;
static nsIAtom* mprescripts_;
static nsIAtom* mroot_;
static nsIAtom* mrow_;
static nsIAtom* mscarries_;
static nsIAtom* mscarry_;
static nsIAtom* msgroup_;
static nsIAtom* msline_;
static nsIAtom* ms_;
static nsIAtom* mspace_;
static nsIAtom* msqrt_;
static nsIAtom* msrow_;
static nsIAtom* mstack_;
static nsIAtom* mstyle_;
static nsIAtom* msub_;
static nsIAtom* msubsup_;
static nsIAtom* msup_;
static nsIAtom* mtable_;
static nsIAtom* mtd_;
static nsIAtom* mtext_;
static nsIAtom* mtr_;
static nsIAtom* munder_;
static nsIAtom* munderover_;
static nsIAtom* naturalnumbers_;
static nsIAtom* neq_;
static nsIAtom* notanumber_;
static nsIAtom* notation_;
static nsIAtom* note_;
static nsIAtom* notin_;
static nsIAtom* notprsubset_;
static nsIAtom* notsubset_;
static nsIAtom* numalign_;
static nsIAtom* other_;
static nsIAtom* outerproduct_;
static nsIAtom* partialdiff_;
static nsIAtom* piece_;
static nsIAtom* piecewise_;
static nsIAtom* pi_;
static nsIAtom* plus_;
static nsIAtom* power_;
static nsIAtom* primes_;
static nsIAtom* product_;
static nsIAtom* prsubset_;
static nsIAtom* quotient_;
static nsIAtom* rationals_;
static nsIAtom* real_;
static nsIAtom* reals_;
static nsIAtom* reln_;
static nsIAtom* root_;
static nsIAtom* rowalign_;
static nsIAtom* rowlines_;
static nsIAtom* rowspacing_;
static nsIAtom* rquote_;
static nsIAtom* rspace_;
static nsIAtom* scalarproduct_;
static nsIAtom* schemaLocation_;
static nsIAtom* scriptlevel_;
static nsIAtom* scriptminsize_;
static nsIAtom* scriptsizemultiplier_;
static nsIAtom* scriptsize_;
static nsIAtom* sdev_;
static nsIAtom* sech_;
static nsIAtom* sec_;
static nsIAtom* selection_;
static nsIAtom* selector_;
static nsIAtom* semantics_;
static nsIAtom* separator_;
static nsIAtom* separators_;
static nsIAtom* sep_;
static nsIAtom* setdiff_;
static nsIAtom* set_;
static nsIAtom* share_;
static nsIAtom* shift_;
static nsIAtom* side_;
static nsIAtom* sinh_;
static nsIAtom* sin_;
static nsIAtom* stackalign_;
static nsIAtom* stretchy_;
static nsIAtom* subscriptshift_;
static nsIAtom* subset_;
static nsIAtom* superscriptshift_;
static nsIAtom* symmetric_;
static nsIAtom* tanh_;
static nsIAtom* tan_;
static nsIAtom* tendsto_;
static nsIAtom* times_;
static nsIAtom* transpose_;
static nsIAtom* union_;
static nsIAtom* uplimit_;
static nsIAtom* variance_;
static nsIAtom* vectorproduct_;
static nsIAtom* vector_;
static nsIAtom* voffset_;
static nsIAtom* xref_;
static nsIAtom* math;
static nsIAtom* avg;
static nsIAtom* booleanFromString;
static nsIAtom* countNonEmpty;
static nsIAtom* daysFromDate;
static nsIAtom* init;
static nsIAtom* instance;
static nsIAtom* months;
static nsIAtom* now;
static nsIAtom* seconds;
static nsIAtom* secondsFromDateTime;


static nsIAtom* onMozSwipeGestureMayStart;
static nsIAtom* onMozSwipeGestureStart;
static nsIAtom* onMozSwipeGestureUpdate;
static nsIAtom* onMozSwipeGestureEnd;
static nsIAtom* onMozSwipeGesture;
static nsIAtom* onMozMagnifyGestureStart;
static nsIAtom* onMozMagnifyGestureUpdate;
static nsIAtom* onMozMagnifyGesture;
static nsIAtom* onMozRotateGestureStart;
static nsIAtom* onMozRotateGestureUpdate;
static nsIAtom* onMozRotateGesture;
static nsIAtom* onMozTapGesture;
static nsIAtom* onMozPressTapGesture;
static nsIAtom* onMozEdgeUIStarted;
static nsIAtom* onMozEdgeUICanceled;
static nsIAtom* onMozEdgeUICompleted;


static nsIAtom* onpointerdown;
static nsIAtom* onpointermove;
static nsIAtom* onpointerup;
static nsIAtom* onpointercancel;
static nsIAtom* onpointerover;
static nsIAtom* onpointerout;
static nsIAtom* onpointerenter;
static nsIAtom* onpointerleave;
static nsIAtom* ongotpointercapture;
static nsIAtom* onlostpointercapture;


static nsIAtom* ondevicemotion;
static nsIAtom* ondeviceorientation;
static nsIAtom* onabsolutedeviceorientation;
static nsIAtom* ondeviceproximity;
static nsIAtom* onmozorientationchange;
static nsIAtom* onuserproximity;


static nsIAtom* ondevicelight;


static nsIAtom* onmozinterruptbegin;
static nsIAtom* onmozinterruptend;


static nsIAtom* ondevicechange;


static nsIAtom* mozinputrangeignorepreventdefault;






static nsIAtom* cdataTagName;
static nsIAtom* commentTagName;
static nsIAtom* documentNodeName;
static nsIAtom* documentFragmentNodeName;
static nsIAtom* documentTypeNodeName;
static nsIAtom* processingInstructionTagName;
static nsIAtom* textTagName;


static nsIAtom* bcTableCellFrame;
static nsIAtom* blockFrame;
static nsIAtom* boxFrame;
static nsIAtom* brFrame;
static nsIAtom* bulletFrame;
static nsIAtom* colorControlFrame;
static nsIAtom* columnSetFrame;
static nsIAtom* comboboxControlFrame;
static nsIAtom* comboboxDisplayFrame;
static nsIAtom* dateTimeControlFrame;
static nsIAtom* deckFrame;
static nsIAtom* detailsFrame;
static nsIAtom* fieldSetFrame;
static nsIAtom* flexContainerFrame;
static nsIAtom* formControlFrame;
static nsIAtom* frameSetFrame;
static nsIAtom* gfxButtonControlFrame;
static nsIAtom* gridContainerFrame;
static nsIAtom* HTMLButtonControlFrame;
static nsIAtom* HTMLCanvasFrame;
static nsIAtom* subDocumentFrame;
static nsIAtom* imageBoxFrame;
static nsIAtom* imageFrame;
static nsIAtom* imageControlFrame;
static nsIAtom* inlineFrame;
static nsIAtom* leafBoxFrame;
static nsIAtom* legendFrame;
static nsIAtom* letterFrame;
static nsIAtom* lineFrame;
static nsIAtom* listControlFrame;
static nsIAtom* menuFrame;
static nsIAtom* meterFrame;
static nsIAtom* menuPopupFrame;
static nsIAtom* numberControlFrame;
static nsIAtom* objectFrame;
static nsIAtom* pageFrame;
static nsIAtom* pageBreakFrame;
static nsIAtom* pageContentFrame;
static nsIAtom* placeholderFrame;
static nsIAtom* popupSetFrame;
static nsIAtom* progressFrame;
static nsIAtom* canvasFrame;
static nsIAtom* rangeFrame;
static nsIAtom* rootFrame;
static nsIAtom* rubyBaseContainerFrame;
static nsIAtom* rubyBaseFrame;
static nsIAtom* rubyFrame;
static nsIAtom* rubyTextContainerFrame;
static nsIAtom* rubyTextFrame;
static nsIAtom* scrollFrame;
static nsIAtom* scrollbarFrame;
static nsIAtom* sequenceFrame;
static nsIAtom* sliderFrame;
static nsIAtom* tableCellFrame;
static nsIAtom* tableColFrame;
static nsIAtom* tableColGroupFrame;
static nsIAtom* tableFrame;
static nsIAtom* tableWrapperFrame;
static nsIAtom* tableRowGroupFrame;
static nsIAtom* tableRowFrame;
static nsIAtom* textInputFrame;
static nsIAtom* textFrame;
static nsIAtom* viewportFrame;

static nsIAtom* XULLabelFrame;

static nsIAtom* svgAFrame;
static nsIAtom* svgClipPathFrame;
static nsIAtom* svgDefsFrame;
static nsIAtom* svgFEContainerFrame;
static nsIAtom* svgFEImageFrame;
static nsIAtom* svgFELeafFrame;
static nsIAtom* svgFEUnstyledLeafFrame;
static nsIAtom* svgFilterFrame;
static nsIAtom* svgForeignObjectFrame;
static nsIAtom* svgGenericContainerFrame;
static nsIAtom* svgGeometryFrame;
static nsIAtom* svgGFrame;
static nsIAtom* svgGradientFrame;
static nsIAtom* svgImageFrame;
static nsIAtom* svgInnerSVGFrame;
static nsIAtom* svgLinearGradientFrame;
static nsIAtom* svgMarkerFrame;
static nsIAtom* svgMarkerAnonChildFrame;
static nsIAtom* svgMaskFrame;
static nsIAtom* svgOuterSVGFrame;
static nsIAtom* svgOuterSVGAnonChildFrame;
static nsIAtom* svgPatternFrame;
static nsIAtom* svgRadialGradientFrame;
static nsIAtom* svgStopFrame;
static nsIAtom* svgSwitchFrame;
static nsIAtom* svgTextFrame;
static nsIAtom* svgUseFrame;
static nsIAtom* svgViewFrame;
static nsIAtom* HTMLVideoFrame;
static nsIAtom* onloadend;
static nsIAtom* onloadstart;
static nsIAtom* onprogress;
static nsIAtom* onsuspend;
static nsIAtom* onemptied;
static nsIAtom* onstalled;
static nsIAtom* onplay;
static nsIAtom* onpause;
static nsIAtom* onloadedmetadata;
static nsIAtom* onloadeddata;
static nsIAtom* onwaiting;
static nsIAtom* onplaying;
static nsIAtom* oncanplay;
static nsIAtom* oncanplaythrough;
static nsIAtom* onseeking;
static nsIAtom* onseeked;
static nsIAtom* ontimeout;
static nsIAtom* ontimeupdate;
static nsIAtom* onended;
static nsIAtom* onratechange;
static nsIAtom* ondurationchange;
static nsIAtom* onvolumechange;
static nsIAtom* onaddtrack;
static nsIAtom* oncontrollerchange;
static nsIAtom* oncuechange;
static nsIAtom* onenter;
static nsIAtom* onexit;
static nsIAtom* onencrypted;
static nsIAtom* encrypted;
static nsIAtom* onwaitingforkey;
static nsIAtom* onkeystatuseschange;
static nsIAtom* onremovetrack;
static nsIAtom* loadstart;
static nsIAtom* suspend;
static nsIAtom* emptied;
static nsIAtom* stalled;
static nsIAtom* play;
static nsIAtom* pause;
static nsIAtom* loadedmetadata;
static nsIAtom* loadeddata;
static nsIAtom* waiting;
static nsIAtom* playing;
static nsIAtom* seeking;
static nsIAtom* seeked;
static nsIAtom* timeupdate;
static nsIAtom* ended;
static nsIAtom* canplay;
static nsIAtom* canplaythrough;
static nsIAtom* ratechange;
static nsIAtom* durationchange;
static nsIAtom* volumechange;
static nsIAtom* ondataavailable;
static nsIAtom* onwarning;
static nsIAtom* onstart;
static nsIAtom* onstop;
static nsIAtom* onphoto;
static nsIAtom* onactivestatechanged;
static nsIAtom* ongamepadbuttondown;
static nsIAtom* ongamepadbuttonup;
static nsIAtom* ongamepadaxismove;
static nsIAtom* ongamepadconnected;
static nsIAtom* ongamepaddisconnected;


static nsIAtom* animationsProperty;
static nsIAtom* animationsOfBeforeProperty;
static nsIAtom* animationsOfAfterProperty;
static nsIAtom* animationEffectsProperty;
static nsIAtom* animationEffectsForBeforeProperty;
static nsIAtom* animationEffectsForAfterProperty;
static nsIAtom* cssPseudoElementBeforeProperty;
static nsIAtom* cssPseudoElementAfterProperty;
static nsIAtom* transitionsProperty;
static nsIAtom* transitionsOfBeforeProperty;
static nsIAtom* transitionsOfAfterProperty;
static nsIAtom* genConInitializerProperty;
static nsIAtom* labelMouseDownPtProperty;
static nsIAtom* lockedStyleStates;
static nsIAtom* apzCallbackTransform;
static nsIAtom* restylableAnonymousNode;
static nsIAtom* paintRequestTime;
static nsIAtom* pseudoProperty;


static nsIAtom* Japanese;
static nsIAtom* Chinese;
static nsIAtom* Taiwanese;
static nsIAtom* HongKongChinese;
static nsIAtom* Unicode;


static nsIAtom* ko;
static nsIAtom* zh_cn;
static nsIAtom* zh_hk;
static nsIAtom* zh_tw;


static nsIAtom* x_cyrillic;
static nsIAtom* he;
static nsIAtom* ar;
static nsIAtom* x_devanagari;
static nsIAtom* x_tamil;
static nsIAtom* x_armn;
static nsIAtom* x_beng;
static nsIAtom* x_cans;
static nsIAtom* x_ethi;
static nsIAtom* x_geor;
static nsIAtom* x_gujr;
static nsIAtom* x_guru;
static nsIAtom* x_khmr;
static nsIAtom* x_knda;
static nsIAtom* x_mlym;
static nsIAtom* x_orya;
static nsIAtom* x_sinh;
static nsIAtom* x_telu;
static nsIAtom* x_tibt;


static nsIAtom* az;
static nsIAtom* ba;
static nsIAtom* crh;
static nsIAtom* el;
static nsIAtom* ga;
static nsIAtom* nl;


static nsIAtom* x_math;


static nsIAtom* TypingTxnName;
static nsIAtom* IMETxnName;
static nsIAtom* DeleteTxnName;


static nsIAtom* serif;
static nsIAtom* sans_serif;
static nsIAtom* cursive;
static nsIAtom* fantasy;
static nsIAtom* monospace;
static nsIAtom* mozfixed;


static nsIAtom* Remote;
static nsIAtom* RemoteId;
static nsIAtom* RemoteType;
static nsIAtom* DisplayPort;
static nsIAtom* DisplayPortMargins;
static nsIAtom* DisplayPortBase;
static nsIAtom* AsyncScrollLayerCreationFailed;
static nsIAtom* forcemessagemanager;


static nsIAtom* color_picker_available;
static nsIAtom* scrollbar_start_backward;
static nsIAtom* scrollbar_start_forward;
static nsIAtom* scrollbar_end_backward;
static nsIAtom* scrollbar_end_forward;
static nsIAtom* scrollbar_thumb_proportional;
static nsIAtom* overlay_scrollbars;
static nsIAtom* windows_default_theme;
static nsIAtom* mac_graphite_theme;
static nsIAtom* mac_yosemite_theme;
static nsIAtom* windows_compositor;
static nsIAtom* windows_glass;
static nsIAtom* touch_enabled;
static nsIAtom* menubar_drag;
static nsIAtom* swipe_animation_enabled;
static nsIAtom* physical_home_button;


static nsIAtom* windows_classic;
static nsIAtom* windows_theme_aero;
static nsIAtom* windows_theme_aero_lite;
static nsIAtom* windows_theme_luna_blue;
static nsIAtom* windows_theme_luna_olive;
static nsIAtom* windows_theme_luna_silver;
static nsIAtom* windows_theme_royale;
static nsIAtom* windows_theme_zune;
static nsIAtom* windows_theme_generic;


static nsIAtom* _moz_color_picker_available;
static nsIAtom* _moz_scrollbar_start_backward;
static nsIAtom* _moz_scrollbar_start_forward;
static nsIAtom* _moz_scrollbar_end_backward;
static nsIAtom* _moz_scrollbar_end_forward;
static nsIAtom* _moz_scrollbar_thumb_proportional;
static nsIAtom* _moz_overlay_scrollbars;
static nsIAtom* _moz_windows_default_theme;
static nsIAtom* _moz_mac_graphite_theme;
static nsIAtom* _moz_mac_yosemite_theme;
static nsIAtom* _moz_windows_compositor;
static nsIAtom* _moz_windows_classic;
static nsIAtom* _moz_windows_glass;
static nsIAtom* _moz_windows_theme;
static nsIAtom* _moz_os_version;
static nsIAtom* _moz_touch_enabled;
static nsIAtom* _moz_menubar_drag;
static nsIAtom* _moz_device_pixel_ratio;
static nsIAtom* _moz_device_orientation;
static nsIAtom* _moz_is_resource_document;
static nsIAtom* _moz_swipe_animation_enabled;
static nsIAtom* _moz_physical_home_button;


static nsIAtom* Back;
static nsIAtom* Forward;
static nsIAtom* Reload;
static nsIAtom* Stop;
static nsIAtom* Search;
static nsIAtom* Bookmarks;
static nsIAtom* Home;
static nsIAtom* Clear;
static nsIAtom* VolumeUp;
static nsIAtom* VolumeDown;
static nsIAtom* NextTrack;
static nsIAtom* PreviousTrack;
static nsIAtom* MediaStop;
static nsIAtom* PlayPause;
static nsIAtom* Menu;
static nsIAtom* New;
static nsIAtom* Open;
static nsIAtom* Close;
static nsIAtom* Save;
static nsIAtom* Find;
static nsIAtom* Help;
static nsIAtom* Print;
static nsIAtom* SendMail;
static nsIAtom* ForwardMail;
static nsIAtom* ReplyToMail;






static nsIAtom* mouseWheel;
static nsIAtom* pixels;
static nsIAtom* lines;
static nsIAtom* pages;
static nsIAtom* scrollbars;
static nsIAtom* other;

static nsIAtom* apz;
static nsIAtom* restore;


static nsIAtom* alert;
static nsIAtom* alertdialog;
static nsIAtom* application;
static nsIAtom* aria_activedescendant;
static nsIAtom* aria_atomic;
static nsIAtom* aria_autocomplete;
static nsIAtom* aria_busy;
static nsIAtom* aria_checked;
static nsIAtom* aria_colcount;
static nsIAtom* aria_colindex;
static nsIAtom* aria_controls;
static nsIAtom* aria_describedby;
static nsIAtom* aria_details;
static nsIAtom* aria_disabled;
static nsIAtom* aria_dropeffect;
static nsIAtom* aria_errormessage;
static nsIAtom* aria_expanded;
static nsIAtom* aria_flowto;
static nsIAtom* aria_grabbed;
static nsIAtom* aria_haspopup;
static nsIAtom* aria_hidden;
static nsIAtom* aria_invalid;
static nsIAtom* aria_label;
static nsIAtom* aria_labelledby;
static nsIAtom* aria_level;
static nsIAtom* aria_live;
static nsIAtom* aria_modal;
static nsIAtom* aria_multiline;
static nsIAtom* aria_multiselectable;
static nsIAtom* aria_orientation;
static nsIAtom* aria_owns;
static nsIAtom* aria_posinset;
static nsIAtom* aria_pressed;
static nsIAtom* aria_readonly;
static nsIAtom* aria_relevant;
static nsIAtom* aria_required;
static nsIAtom* aria_rowcount;
static nsIAtom* aria_rowindex;
static nsIAtom* aria_selected;
static nsIAtom* aria_setsize;
static nsIAtom* aria_sort;
static nsIAtom* aria_valuenow;
static nsIAtom* aria_valuemin;
static nsIAtom* aria_valuemax;
static nsIAtom* aria_valuetext;
static nsIAtom* AreaFrame;
static nsIAtom* auto_generated;
static nsIAtom* banner;
static nsIAtom* checkable;
static nsIAtom* choices;
static nsIAtom* columnheader;
static nsIAtom* complementary;
static nsIAtom* containerAtomic;
static nsIAtom* containerBusy;
static nsIAtom* containerLive;
static nsIAtom* containerLiveRole;
static nsIAtom* containerRelevant;
static nsIAtom* contentinfo;
static nsIAtom* cycles;
static nsIAtom* datatable;
static nsIAtom* eventFromInput;
static nsIAtom* feed;
static nsIAtom* grammar;
static nsIAtom* gridcell;
static nsIAtom* heading;
static nsIAtom* hitregion;
static nsIAtom* InlineBlockFrame;
static nsIAtom* inlinevalue;
static nsIAtom* invalid;
static nsIAtom* item;
static nsIAtom* itemset;
static nsIAtom* lineNumber;
static nsIAtom* linkedPanel;
static nsIAtom* live;
static nsIAtom* menuitemcheckbox;
static nsIAtom* menuitemradio;
static nsIAtom* mixed;
static nsIAtom* multiline;
static nsIAtom* navigation;
static nsIAtom* polite;
static nsIAtom* posinset;
static nsIAtom* presentation;
static nsIAtom* progressbar;
static nsIAtom* region;
static nsIAtom* rowgroup;
static nsIAtom* rowheader;
static nsIAtom* search;
static nsIAtom* searchbox;
static nsIAtom* select1;
static nsIAtom* setsize;
static nsIAtom* spelling;
static nsIAtom* spinbutton;
static nsIAtom* status;
static nsIAtom* _switch;
static nsIAtom* tableCellIndex;
static nsIAtom* tablist;
static nsIAtom* textIndent;
static nsIAtom* textInputType;
static nsIAtom* textLineThroughColor;
static nsIAtom* textLineThroughStyle;
static nsIAtom* textPosition;
static nsIAtom* textUnderlineColor;
static nsIAtom* textUnderlineStyle;
static nsIAtom* timer;
static nsIAtom* toolbarname;
static nsIAtom* toolbarseparator;
static nsIAtom* toolbarspacer;
static nsIAtom* toolbarspring;
static nsIAtom* treegrid;
static nsIAtom* _undefined;
static nsIAtom* xmlroles;


static nsIAtom* close_fence;
static nsIAtom* denominator;
static nsIAtom* numerator;
static nsIAtom* open_fence;
static nsIAtom* overscript;
static nsIAtom* presubscript;
static nsIAtom* presuperscript;
static nsIAtom* root_index;
static nsIAtom* subscript;
static nsIAtom* superscript;
static nsIAtom* underscript;



static nsIAtom* onaudiostart;
static nsIAtom* onaudioend;
static nsIAtom* onsoundstart;
static nsIAtom* onsoundend;
static nsIAtom* onspeechstart;
static nsIAtom* onspeechend;
static nsIAtom* onresult;
static nsIAtom* onnomatch;
static nsIAtom* onresume;
static nsIAtom* onmark;
static nsIAtom* onboundary;



static nsIAtom* usercontextid;


static nsIAtom* nsuri_xmlns;
static nsIAtom* nsuri_xml;
static nsIAtom* nsuri_xhtml;
static nsIAtom* nsuri_xlink;
static nsIAtom* nsuri_xslt;
static nsIAtom* nsuri_xbl;
static nsIAtom* nsuri_mathml;
static nsIAtom* nsuri_rdf;
static nsIAtom* nsuri_xul;
static nsIAtom* nsuri_svg;


static nsIAtom* onsourceopen;
static nsIAtom* onsourceended;
static nsIAtom* onsourceclosed;
static nsIAtom* onupdatestart;
static nsIAtom* onupdate;
static nsIAtom* onupdateend;
static nsIAtom* onaddsourcebuffer;
static nsIAtom* onremovesourcebuffer;
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsGkAtoms.h" 2

};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h"
namespace mozilla {
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h"
class EventStates
{
public:
  typedef uint64_t InternalType;
  typedef uint64_t ServoType;

  constexpr EventStates()
    : mStates(0)
  {
  }






  explicit constexpr EventStates(InternalType aStates)
    : mStates(aStates)
  {
  }

  EventStates constexpr operator|(const EventStates& aEventStates) const
  {
    return EventStates(mStates | aEventStates.mStates);
  }

  EventStates& operator|=(const EventStates& aEventStates)
  {
    mStates |= aEventStates.mStates;
    return *this;
  }




  EventStates constexpr operator&(const EventStates& aEventStates) const
  {
    return EventStates(mStates & aEventStates.mStates);
  }

  EventStates& operator&=(const EventStates& aEventStates)
  {
    mStates &= aEventStates.mStates;
    return *this;
  }

  bool operator==(const EventStates& aEventStates) const
  {
    return mStates == aEventStates.mStates;
  }

  bool operator!=(const EventStates& aEventStates) const
  {
    return mStates != aEventStates.mStates;
  }

  EventStates operator~() const
  {
    return EventStates(~mStates);
  }

  EventStates operator^(const EventStates& aEventStates) const
  {
    return EventStates(mStates ^ aEventStates.mStates);
  }

  EventStates& operator^=(const EventStates& aEventStates)
  {
    mStates ^= aEventStates.mStates;
    return *this;
  }







  bool IsEmpty() const
  {
    return mStates == 0;
  }
# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h"
  bool HasState(EventStates aEventStates) const
  {
# 124 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h"
    return mStates & aEventStates.mStates;
  }
# 135 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h"
  bool HasAtLeastOneOfStates(EventStates aEventStates) const
  {
    return mStates & aEventStates.mStates;
  }
# 148 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventStates.h"
  bool HasAllStates(EventStates aEventStates) const
  {
    return (mStates & aEventStates.mStates) == aEventStates.mStates;
  }



  InternalType GetInternalValue() const {
    return mStates;
  }




  ServoType ServoValue() const
  {
    return mStates;
  }

private:
  InternalType mStates;
};

}
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/css/SheetParsingMode.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/css/SheetParsingMode.h"
namespace mozilla {
namespace css {
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/css/SheetParsingMode.h"
enum SheetParsingMode {
  eAuthorSheetFeatures = 0,
  eUserSheetFeatures,
  eAgentSheetFeatures
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CSSStyleSheetBinding.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CSSStyleSheetBinding.h"
namespace mozilla {

class StyleSheet;
struct StyleSheetAtoms;

namespace dom {

struct NativePropertyHooks;
class ProtoAndIfaceCache;

}

}

namespace mozilla {
namespace dom {

enum class CSSStyleSheetParsingMode : uint8_t {
  Author,
  User,
  Agent,
  EndGuard_
};

namespace CSSStyleSheetParsingModeValues {
extern const EnumEntry strings[4];
}

bool
ToJSValue(JSContext* aCx, CSSStyleSheetParsingMode aArgument, JS::MutableHandle<JS::Value> aValue);


namespace CSSStyleSheetBinding {

  typedef mozilla::StyleSheet NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::StyleSheet* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 71 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CSSStyleSheetBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/net/ReferrerPolicy.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHttpChannel.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHttpChannel.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannel.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannel.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRequest.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRequest.h"
class nsILoadGroup;

typedef uint32_t nsLoadFlags;
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRequest.h"
class nsIRequest : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetName(nsACString & aName) = 0;


  virtual nsresult IsPending(bool *_retval) = 0;


  virtual nsresult GetStatus(nsresult *aStatus) = 0;


  virtual nsresult Cancel(nsresult aStatus) = 0;


  virtual nsresult Suspend(void) = 0;


  virtual nsresult Resume(void) = 0;


  virtual nsresult GetLoadGroup(nsILoadGroup * *aLoadGroup) = 0;
  virtual nsresult SetLoadGroup(nsILoadGroup *aLoadGroup) = 0;


  virtual nsresult GetLoadFlags(nsLoadFlags *aLoadFlags) = 0;
  virtual nsresult SetLoadFlags(nsLoadFlags aLoadFlags) = 0;

  enum {
    LOAD_REQUESTMASK = 65535U,
    LOAD_NORMAL = 0U,
    LOAD_BACKGROUND = 1U,
    LOAD_HTML_OBJECT_DATA = 2U,
    INHIBIT_CACHING = 128U,
    INHIBIT_PERSISTENT_CACHING = 256U,
    LOAD_BYPASS_CACHE = 512U,
    LOAD_FROM_CACHE = 1024U,
    VALIDATE_ALWAYS = 2048U,
    VALIDATE_NEVER = 4096U,
    VALIDATE_ONCE_PER_SESSION = 8192U,
    LOAD_ANONYMOUS = 16384U,
    LOAD_FRESH_CONNECTION = 32768U
  };

};

  template<typename T> struct nsIRequest::COMTypeInfo<nsIRequest, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIRequest::COMTypeInfo<nsIRequest, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xef6bfbd2, 0xfd46, 0x48d8, { 0x96, 0xb7, 0x9f, 0x8f, 0x0f, 0xd3, 0x87, 0xfe }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannel.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadInfo.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadInfo.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContentPolicy.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContentPolicy.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContentPolicyBase.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContentPolicyBase.h"
class nsIURI;

class nsIDOMNode;

class nsIPrincipal;

typedef uint32_t nsContentPolicyType;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContentPolicyBase.h"
class nsIContentPolicyBase : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    TYPE_INVALID = 0U,
    TYPE_OTHER = 1U,
    TYPE_SCRIPT = 2U,
    TYPE_IMAGE = 3U,
    TYPE_STYLESHEET = 4U,
    TYPE_OBJECT = 5U,
    TYPE_DOCUMENT = 6U,
    TYPE_SUBDOCUMENT = 7U,
    TYPE_REFRESH = 8U,
    TYPE_XBL = 9U,
    TYPE_PING = 10U,
    TYPE_XMLHTTPREQUEST = 11U,
    TYPE_DATAREQUEST = 11U,
    TYPE_OBJECT_SUBREQUEST = 12U,
    TYPE_DTD = 13U,
    TYPE_FONT = 14U,
    TYPE_MEDIA = 15U,
    TYPE_WEBSOCKET = 16U,
    TYPE_CSP_REPORT = 17U,
    TYPE_XSLT = 18U,
    TYPE_BEACON = 19U,
    TYPE_FETCH = 20U,
    TYPE_IMAGESET = 21U,
    TYPE_WEB_MANIFEST = 22U,
    TYPE_INTERNAL_SCRIPT = 23U,
    TYPE_INTERNAL_WORKER = 24U,
    TYPE_INTERNAL_SHARED_WORKER = 25U,
    TYPE_INTERNAL_EMBED = 26U,
    TYPE_INTERNAL_OBJECT = 27U,
    TYPE_INTERNAL_FRAME = 28U,
    TYPE_INTERNAL_IFRAME = 29U,
    TYPE_INTERNAL_AUDIO = 30U,
    TYPE_INTERNAL_VIDEO = 31U,
    TYPE_INTERNAL_TRACK = 32U,
    TYPE_INTERNAL_XMLHTTPREQUEST = 33U,
    TYPE_INTERNAL_EVENTSOURCE = 34U,
    TYPE_INTERNAL_SERVICE_WORKER = 35U,
    TYPE_INTERNAL_SCRIPT_PRELOAD = 36U,
    TYPE_INTERNAL_IMAGE = 37U,
    TYPE_INTERNAL_IMAGE_PRELOAD = 38U,
    TYPE_INTERNAL_STYLESHEET = 39U,
    TYPE_INTERNAL_STYLESHEET_PRELOAD = 40U,
    TYPE_INTERNAL_IMAGE_FAVICON = 41U,
    TYPE_INTERNAL_WORKER_IMPORT_SCRIPTS = 42U,
    REJECT_REQUEST = -1,
    REJECT_TYPE = -2,
    REJECT_SERVER = -3,
    REJECT_OTHER = -4,
    ACCEPT = 1
  };

};

  template<typename T> struct nsIContentPolicyBase::COMTypeInfo<nsIContentPolicyBase, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIContentPolicyBase::COMTypeInfo<nsIContentPolicyBase, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x17418187, 0xd86f, 0x48dd, { 0x92, 0xd1, 0x23, 0x88, 0x38, 0xdf, 0x0a, 0x4e }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContentPolicy.h" 2






class nsIURI;

class nsIDOMNode;

class nsIPrincipal;
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContentPolicy.h"
class nsIContentPolicy : public nsIContentPolicyBase {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult ShouldLoad(nsContentPolicyType aContentType, nsIURI *aContentLocation, nsIURI *aRequestOrigin, nsISupports *aContext, const nsACString & aMimeTypeGuess, nsISupports *aExtra, nsIPrincipal *aRequestPrincipal, int16_t *_retval) = 0;


  virtual nsresult ShouldProcess(nsContentPolicyType aContentType, nsIURI *aContentLocation, nsIURI *aRequestOrigin, nsISupports *aContext, const nsACString & aMimeType, nsISupports *aExtra, nsIPrincipal *aRequestPrincipal, int16_t *_retval) = 0;

};

  template<typename T> struct nsIContentPolicy::COMTypeInfo<nsIContentPolicy, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIContentPolicy::COMTypeInfo<nsIContentPolicy, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xcaad4f1f, 0xd047, 0x46ac, { 0xae, 0x9d, 0xdc, 0x59, 0x8e, 0x4f, 0xb9, 0x1b }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadInfo.h" 2
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadInfo.h"
class nsIDOMDocument;

class nsINode;

class nsIPrincipal;



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BasePrincipal.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BasePrincipal.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSPrincipals.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSPrincipals.h"
class nsJSPrincipals : public nsIPrincipal, public JSPrincipals
{
public:

  static bool Subsume(JSPrincipals *jsprin, JSPrincipals *other);
  static void Destroy(JSPrincipals *jsprin);


  static bool ReadPrincipals(JSContext* aCx, JSStructuredCloneReader* aReader,
                             JSPrincipals** aOutPrincipals);

  static bool ReadKnownPrincipalType(JSContext* aCx,
                                     JSStructuredCloneReader* aReader,
                                     uint32_t aTag,
                                     JSPrincipals** aOutPrincipals);

  bool write(JSContext* aCx, JSStructuredCloneWriter* aWriter) final;





  static nsJSPrincipals* get(JSPrincipals *principals) {
    nsJSPrincipals *self = static_cast<nsJSPrincipals *>(principals);
    do { } while (0);
    return self;
  }
  static nsJSPrincipals* get(nsIPrincipal *principal) {
    nsJSPrincipals *self = static_cast<nsJSPrincipals *>(principal);
    do { } while (0);
    return self;
  }

  virtual MozExternalRefCountType AddRef(void) override;
  virtual MozExternalRefCountType Release(void) override;

  nsJSPrincipals() {
    refcount = 0;
    setDebugToken(DEBUG_TOKEN);
  }




  virtual nsresult GetScriptLocation(nsACString &aStr) = 0;
  static const uint32_t DEBUG_TOKEN = 0x0bf41760;

protected:
  virtual ~nsJSPrincipals() {
    setDebugToken(0);
  }

};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BasePrincipal.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OriginAttributes.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OriginAttributes.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ChromeUtils.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ChromeUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ChromeUtilsBinding.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ChromeUtilsBinding.h"
namespace mozilla {
namespace dom {

class ChromeUtils;
struct ChromeUtilsAtoms;
struct CompileScriptOptionsDictionaryAtoms;
struct NativePropertyHooks;
struct OriginAttributesDictionaryAtoms;
struct OriginAttributesPatternDictionaryAtoms;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

struct CompileScriptOptionsDictionary : public DictionaryBase
{
                        nsString mCharset;
                        bool mHasReturnValue;
                        bool mLazilyParse;

  CompileScriptOptionsDictionary();

  explicit inline CompileScriptOptionsDictionary(const FastDictionaryInitializer& )
  {

  }

  explicit inline CompileScriptOptionsDictionary(const CompileScriptOptionsDictionary& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  CompileScriptOptionsDictionary&
  operator=(const CompileScriptOptionsDictionary& aOther);

private:
  static bool
  InitIds(JSContext* cx, CompileScriptOptionsDictionaryAtoms* atomsCache);
};

namespace binding_detail {
struct FastCompileScriptOptionsDictionary : public CompileScriptOptionsDictionary
{
  inline FastCompileScriptOptionsDictionary()
    : CompileScriptOptionsDictionary(FastDictionaryInitializer())
  {

  }
};
}


struct OriginAttributesDictionary : public DictionaryBase
{
                        uint32_t mAppId;
                        nsString mFirstPartyDomain;
                        bool mInIsolatedMozBrowser;
                        uint32_t mPrivateBrowsingId;
                        uint32_t mUserContextId;

  OriginAttributesDictionary();

  explicit inline OriginAttributesDictionary(const FastDictionaryInitializer& )
  {

  }

  explicit inline OriginAttributesDictionary(const OriginAttributesDictionary& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  OriginAttributesDictionary&
  operator=(const OriginAttributesDictionary& aOther);

private:
  static bool
  InitIds(JSContext* cx, OriginAttributesDictionaryAtoms* atomsCache);
};

namespace binding_detail {
struct FastOriginAttributesDictionary : public OriginAttributesDictionary
{
  inline FastOriginAttributesDictionary()
    : OriginAttributesDictionary(FastDictionaryInitializer())
  {

  }
};
}


struct OriginAttributesPatternDictionary : public DictionaryBase
{
                        Optional<uint32_t> mAppId;
                        Optional<nsString> mFirstPartyDomain;
                        Optional<bool> mInIsolatedMozBrowser;
                        Optional<uint32_t> mPrivateBrowsingId;
                        Optional<uint32_t> mUserContextId;

  OriginAttributesPatternDictionary();

  explicit inline OriginAttributesPatternDictionary(const FastDictionaryInitializer& )
  {

  }

  explicit inline OriginAttributesPatternDictionary(const OriginAttributesPatternDictionary& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  OriginAttributesPatternDictionary&
  operator=(const OriginAttributesPatternDictionary& aOther);

private:
  static bool
  InitIds(JSContext* cx, OriginAttributesPatternDictionaryAtoms* atomsCache);
};

namespace binding_detail {
struct FastOriginAttributesPatternDictionary : public OriginAttributesPatternDictionary
{
  inline FastOriginAttributesPatternDictionary()
    : OriginAttributesPatternDictionary(FastDictionaryInitializer())
  {

  }
};
}


namespace ChromeUtilsBinding {

  typedef mozilla::dom::ChromeUtils NativeType;

  bool
  ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj);

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);
# 209 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ChromeUtilsBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ChromeUtils.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ThreadSafeChromeUtilsBinding.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ThreadSafeChromeUtilsBinding.h"
namespace mozilla {
namespace dom {

struct Base64URLDecodeOptionsAtoms;
struct Base64URLEncodeOptionsAtoms;
struct HeapSnapshotBoundariesAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;
class ThreadSafeChromeUtils;
struct ThreadSafeChromeUtilsAtoms;

}
}

namespace mozilla {
namespace dom {

enum class Base64URLDecodePadding : uint8_t {
  Require,
  Ignore,
  Reject,
  EndGuard_
};

namespace Base64URLDecodePaddingValues {
extern const EnumEntry strings[4];
}

bool
ToJSValue(JSContext* aCx, Base64URLDecodePadding aArgument, JS::MutableHandle<JS::Value> aValue);


struct Base64URLDecodeOptions : public DictionaryBase
{
                        Base64URLDecodePadding mPadding;

  Base64URLDecodeOptions();

  explicit inline Base64URLDecodeOptions(const FastDictionaryInitializer& )
  {

  }

  explicit inline Base64URLDecodeOptions(const Base64URLDecodeOptions& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  Base64URLDecodeOptions&
  operator=(const Base64URLDecodeOptions& aOther);

private:
  static bool
  InitIds(JSContext* cx, Base64URLDecodeOptionsAtoms* atomsCache);
};

namespace binding_detail {
struct FastBase64URLDecodeOptions : public Base64URLDecodeOptions
{
  inline FastBase64URLDecodeOptions()
    : Base64URLDecodeOptions(FastDictionaryInitializer())
  {

  }
};
}


struct Base64URLEncodeOptions : public DictionaryBase
{
                        bool mPad;

  Base64URLEncodeOptions();

  explicit inline Base64URLEncodeOptions(const FastDictionaryInitializer& )
  {

  }

  explicit inline Base64URLEncodeOptions(const Base64URLEncodeOptions& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  Base64URLEncodeOptions&
  operator=(const Base64URLEncodeOptions& aOther);

private:
  static bool
  InitIds(JSContext* cx, Base64URLEncodeOptionsAtoms* atomsCache);
};

namespace binding_detail {
struct FastBase64URLEncodeOptions : public Base64URLEncodeOptions
{
  inline FastBase64URLEncodeOptions()
    : Base64URLEncodeOptions(FastDictionaryInitializer())
  {

  }
};
}


struct HeapSnapshotBoundaries : public DictionaryBase
{
                        Optional<JSObject*> mDebugger;
                        Optional<Sequence<JSObject*>> mGlobals;
                        Optional<bool> mRuntime;

  HeapSnapshotBoundaries();

  explicit inline HeapSnapshotBoundaries(const FastDictionaryInitializer& )
  {

  }

private:
  HeapSnapshotBoundaries(const HeapSnapshotBoundaries&) = delete;
  HeapSnapshotBoundaries& operator=(const HeapSnapshotBoundaries&) = delete;

  static bool
  InitIds(JSContext* cx, HeapSnapshotBoundariesAtoms* atomsCache);

public:
  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);
};

namespace binding_detail {
struct FastHeapSnapshotBoundaries : public HeapSnapshotBoundaries
{
  inline FastHeapSnapshotBoundaries()
    : HeapSnapshotBoundaries(FastDictionaryInitializer())
  {

  }
};
}


namespace ThreadSafeChromeUtilsBinding {

  typedef mozilla::dom::ThreadSafeChromeUtils NativeType;

  bool
  ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj);

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);
# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ThreadSafeChromeUtilsBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ChromeUtils.h" 2


namespace mozilla {

namespace devtools {
class HeapSnapshot;
}

namespace dom {

class ArrayBufferViewOrArrayBuffer;
class PrecompiledScript;
class Promise;

class ThreadSafeChromeUtils
{
private:

  static void SaveHeapSnapshotShared(GlobalObject& global,
                                     const HeapSnapshotBoundaries& boundaries,
                                     nsAString& filePath,
                                     nsAString& snapshotId,
                                     ErrorResult& rv);

public:

  static void SaveHeapSnapshot(GlobalObject& global,
                               const HeapSnapshotBoundaries& boundaries,
                               nsAString& filePath,
                               ErrorResult& rv);


  static void SaveHeapSnapshotGetId(GlobalObject& global,
                                    const HeapSnapshotBoundaries& boundaries,
                                    nsAString& snapshotId,
                                    ErrorResult& rv);


  static already_AddRefed<devtools::HeapSnapshot> ReadHeapSnapshot(GlobalObject& global,
                                                                   const nsAString& filePath,
                                                                   ErrorResult& rv);

  static void NondeterministicGetWeakMapKeys(GlobalObject& aGlobal,
                                             JS::Handle<JS::Value> aMap,
                                             JS::MutableHandle<JS::Value> aRetval,
                                             ErrorResult& aRv);

  static void NondeterministicGetWeakSetKeys(GlobalObject& aGlobal,
                                             JS::Handle<JS::Value> aSet,
                                             JS::MutableHandle<JS::Value> aRetval,
                                             ErrorResult& aRv);

  static void Base64URLEncode(GlobalObject& aGlobal,
                              const ArrayBufferViewOrArrayBuffer& aSource,
                              const Base64URLEncodeOptions& aOptions,
                              nsACString& aResult,
                              ErrorResult& aRv);

  static void Base64URLDecode(GlobalObject& aGlobal,
                              const nsACString& aString,
                              const Base64URLDecodeOptions& aOptions,
                              JS::MutableHandle<JSObject*> aRetval,
                              ErrorResult& aRv);
};

class ChromeUtils : public ThreadSafeChromeUtils
{
public:
  static void
  OriginAttributesToSuffix(GlobalObject& aGlobal,
                           const dom::OriginAttributesDictionary& aAttrs,
                           nsCString& aSuffix);

  static bool
  OriginAttributesMatchPattern(dom::GlobalObject& aGlobal,
                               const dom::OriginAttributesDictionary& aAttrs,
                               const dom::OriginAttributesPatternDictionary& aPattern);

  static void
  CreateOriginAttributesFromOrigin(dom::GlobalObject& aGlobal,
                                   const nsAString& aOrigin,
                                   dom::OriginAttributesDictionary& aAttrs,
                                   ErrorResult& aRv);

  static void
  FillNonDefaultOriginAttributes(dom::GlobalObject& aGlobal,
                                 const dom::OriginAttributesDictionary& aAttrs,
                                 dom::OriginAttributesDictionary& aNewAttrs);

  static bool
  IsOriginAttributesEqual(dom::GlobalObject& aGlobal,
                          const dom::OriginAttributesDictionary& aA,
                          const dom::OriginAttributesDictionary& aB);

  static bool
  IsOriginAttributesEqual(const dom::OriginAttributesDictionary& aA,
                          const dom::OriginAttributesDictionary& aB);

  static bool
  IsOriginAttributesEqualIgnoringFPD(const dom::OriginAttributesDictionary& aA,
                                     const dom::OriginAttributesDictionary& aB)
  {
    return aA.mAppId == aB.mAppId &&
           aA.mInIsolatedMozBrowser == aB.mInIsolatedMozBrowser &&
           aA.mUserContextId == aB.mUserContextId &&
           aA.mPrivateBrowsingId == aB.mPrivateBrowsingId;
  }


  static already_AddRefed<Promise>
  CompileScript(GlobalObject& aGlobal,
                const nsAString& aUrl,
                const dom::CompileScriptOptionsDictionary& aOptions,
                ErrorResult& aRv);
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OriginAttributes.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptSecurityManager.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptSecurityManager.h"
class nsIURI;

class nsIChannel;

class nsIClassInfo;

class nsIDocShell;

class nsIDomainPolicy;

class nsILoadContext;


namespace mozilla {
namespace dom {
class DomainPolicyClone;
}
}
# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScriptSecurityManager.h"
class nsIScriptSecurityManager : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult CanCreateWrapper(JSContext *aJSContext, const nsIID & aIID, nsISupports *aObj, nsIClassInfo *aClassInfo) = 0;


  virtual nsresult CanCreateInstance(JSContext *aJSContext, const nsCID & aCID) = 0;


  virtual nsresult CanGetService(JSContext *aJSContext, const nsCID & aCID) = 0;


  virtual nsresult CheckLoadURIFromScript(JSContext *cx, nsIURI *uri) = 0;

  enum {
    STANDARD = 0U,
    LOAD_IS_AUTOMATIC_DOCUMENT_REPLACEMENT = 1U,
    ALLOW_CHROME = 2U,
    DISALLOW_INHERIT_PRINCIPAL = 4U,
    DISALLOW_SCRIPT_OR_DATA = 4U,
    DISALLOW_SCRIPT = 8U,
    DONT_REPORT_ERRORS = 16U
  };


  virtual nsresult CheckLoadURIWithPrincipal(nsIPrincipal *aPrincipal, nsIURI *uri, uint32_t flags) = 0;


  virtual nsresult CheckLoadURIStrWithPrincipal(nsIPrincipal *aPrincipal, const nsACString & uri, uint32_t flags) = 0;


  virtual nsresult GetSystemPrincipal(nsIPrincipal * *_retval) = 0;


  virtual nsresult GetAppCodebasePrincipal(nsIURI *uri, uint32_t appId, bool inMozBrowser, nsIPrincipal * *_retval) = 0;


  virtual nsresult GetLoadContextCodebasePrincipal(nsIURI *uri, nsILoadContext *loadContext, nsIPrincipal * *_retval) = 0;


  virtual nsresult GetDocShellCodebasePrincipal(nsIURI *uri, nsIDocShell *docShell, nsIPrincipal * *_retval) = 0;


  virtual nsresult GetNoAppCodebasePrincipal(nsIURI *uri, nsIPrincipal * *_retval) = 0;


  virtual nsresult GetCodebasePrincipal(nsIURI *uri, nsIPrincipal * *_retval) = 0;


  virtual nsresult CreateCodebasePrincipal(nsIURI *uri, JS::HandleValue originAttributes, JSContext* cx, nsIPrincipal * *_retval) = 0;


  virtual nsresult CreateCodebasePrincipalFromOrigin(const nsACString & origin, nsIPrincipal * *_retval) = 0;


  virtual nsresult CreateNullPrincipal(JS::HandleValue originAttributes, JSContext* cx, nsIPrincipal * *_retval) = 0;


  virtual nsresult CheckSameOriginURI(nsIURI *aSourceURI, nsIURI *aTargetURI, bool reportError) = 0;


  virtual nsresult GetChannelResultPrincipal(nsIChannel *aChannel, nsIPrincipal * *_retval) = 0;


  virtual nsresult GetChannelResultPrincipalIfNotSandboxed(nsIChannel *aChannel, nsIPrincipal * *_retval) = 0;


  virtual nsresult GetChannelURIPrincipal(nsIChannel *aChannel, nsIPrincipal * *_retval) = 0;


  virtual nsresult IsSystemPrincipal(nsIPrincipal *aPrincipal, bool *_retval) = 0;

     bool IsSystemPrincipal(nsIPrincipal* aPrincipal) {
      bool isSystem = false;
      IsSystemPrincipal(aPrincipal, &isSystem);
      return isSystem;
    }
  enum {
    NO_APP_ID = 0U,
    UNKNOWN_APP_ID = 4294967295U,
    DEFAULT_USER_CONTEXT_ID = 0U
  };


  virtual nsresult ActivateDomainPolicy(nsIDomainPolicy * *_retval) = 0;


  virtual nsresult GetDomainPolicyActive(bool *aDomainPolicyActive) = 0;


  virtual nsresult ActivateDomainPolicyInternal(nsIDomainPolicy * *_retval) = 0;


  virtual void CloneDomainPolicy(mozilla::dom::DomainPolicyClone *aClone) = 0;


  virtual nsresult PolicyAllowsScript(nsIURI *aDomain, bool *_retval) = 0;

};

  template<typename T> struct nsIScriptSecurityManager::COMTypeInfo<nsIScriptSecurityManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIScriptSecurityManager::COMTypeInfo<nsIScriptSecurityManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x51daad87, 0x3a0c, 0x44cc, { 0xb6, 0x20, 0x73, 0x56, 0x80, 0x1c, 0x90, 0x22 }};
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/OriginAttributes.h" 2

namespace mozilla {

class OriginAttributes : public dom::OriginAttributesDictionary
{
public:
  OriginAttributes() {}

  OriginAttributes(uint32_t aAppId, bool aInIsolatedMozBrowser)
  {
    mAppId = aAppId;
    mInIsolatedMozBrowser = aInIsolatedMozBrowser;
  }

  explicit OriginAttributes(const OriginAttributesDictionary& aOther)
    : OriginAttributesDictionary(aOther)
  {}

  void SetFirstPartyDomain(const bool aIsTopLevelDocument, nsIURI* aURI);
  void SetFirstPartyDomain(const bool aIsTopLevelDocument, const nsACString& aDomain);

  enum {
    STRIP_FIRST_PARTY_DOMAIN = 0x01,
    STRIP_USER_CONTEXT_ID = 0x02,
  };

  inline void StripAttributes(uint32_t aFlags)
  {
    if (aFlags & STRIP_FIRST_PARTY_DOMAIN) {
      mFirstPartyDomain.Truncate();
    }

    if (aFlags & STRIP_USER_CONTEXT_ID) {
      mUserContextId = nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID;
    }
  }

  bool operator==(const OriginAttributes& aOther) const
  {
    return mAppId == aOther.mAppId &&
           mInIsolatedMozBrowser == aOther.mInIsolatedMozBrowser &&
           mUserContextId == aOther.mUserContextId &&
           mPrivateBrowsingId == aOther.mPrivateBrowsingId &&
           mFirstPartyDomain == aOther.mFirstPartyDomain;
  }

  bool operator!=(const OriginAttributes& aOther) const
  {
    return !(*this == aOther);
  }




  void CreateSuffix(nsACString& aStr) const;


  void CreateAnonymizedSuffix(nsACString& aStr) const;

  __attribute__ ((warn_unused_result)) bool PopulateFromSuffix(const nsACString& aStr);



  __attribute__ ((warn_unused_result)) bool PopulateFromOrigin(const nsACString& aOrigin,
                                       nsACString& aOriginNoSuffix);



  void SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing);


  static inline bool IsFirstPartyEnabled()
  {
    return sFirstPartyIsolation;
  }




  static inline bool IsRestrictOpenerAccessForFPI()
  {


    return !sFirstPartyIsolation || sRestrictedOpenerAccess;
  }



  static bool IsPrivateBrowsing(const nsACString& aOrigin);

  static void InitPrefs();

private:
  static bool sFirstPartyIsolation;
  static bool sRestrictedOpenerAccess;
};

class OriginAttributesPattern : public dom::OriginAttributesPatternDictionary
{
public:






  OriginAttributesPattern() {}

  explicit OriginAttributesPattern(const OriginAttributesPatternDictionary& aOther)
    : OriginAttributesPatternDictionary(aOther) {}


  bool Matches(const OriginAttributes& aAttrs) const
  {
    if (mAppId.WasPassed() && mAppId.Value() != aAttrs.mAppId) {
      return false;
    }

    if (mInIsolatedMozBrowser.WasPassed() && mInIsolatedMozBrowser.Value() != aAttrs.mInIsolatedMozBrowser) {
      return false;
    }

    if (mUserContextId.WasPassed() && mUserContextId.Value() != aAttrs.mUserContextId) {
      return false;
    }

    if (mPrivateBrowsingId.WasPassed() && mPrivateBrowsingId.Value() != aAttrs.mPrivateBrowsingId) {
      return false;
    }

    if (mFirstPartyDomain.WasPassed() && mFirstPartyDomain.Value() != aAttrs.mFirstPartyDomain) {
      return false;
    }

    return true;
  }

  bool Overlaps(const OriginAttributesPattern& aOther) const
  {
    if (mAppId.WasPassed() && aOther.mAppId.WasPassed() &&
        mAppId.Value() != aOther.mAppId.Value()) {
      return false;
    }

    if (mInIsolatedMozBrowser.WasPassed() &&
        aOther.mInIsolatedMozBrowser.WasPassed() &&
        mInIsolatedMozBrowser.Value() != aOther.mInIsolatedMozBrowser.Value()) {
      return false;
    }

    if (mUserContextId.WasPassed() && aOther.mUserContextId.WasPassed() &&
        mUserContextId.Value() != aOther.mUserContextId.Value()) {
      return false;
    }

    if (mPrivateBrowsingId.WasPassed() && aOther.mPrivateBrowsingId.WasPassed() &&
        mPrivateBrowsingId.Value() != aOther.mPrivateBrowsingId.Value()) {
      return false;
    }

    if (mFirstPartyDomain.WasPassed() && aOther.mFirstPartyDomain.WasPassed() &&
        mFirstPartyDomain.Value() != aOther.mFirstPartyDomain.Value()) {
      return false;
    }

    return true;
  }
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BasePrincipal.h" 2

class nsIContentSecurityPolicy;
class nsIObjectOutputStream;
class nsIObjectInputStream;
class nsIURI;

class ExpandedPrincipal;

namespace mozilla {
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BasePrincipal.h"
class BasePrincipal : public nsJSPrincipals
{
public:
  enum PrincipalKind {
    eNullPrincipal,
    eCodebasePrincipal,
    eExpandedPrincipal,
    eSystemPrincipal
  };

  explicit BasePrincipal(PrincipalKind aKind);

  enum DocumentDomainConsideration { DontConsiderDocumentDomain, ConsiderDocumentDomain};
  bool Subsumes(nsIPrincipal* aOther, DocumentDomainConsideration aConsideration);

  virtual nsresult GetOrigin(nsACString& aOrigin) final;
  virtual nsresult GetOriginNoSuffix(nsACString& aOrigin) final;
  virtual nsresult Equals(nsIPrincipal* other, bool* _retval) final;
  virtual nsresult EqualsConsideringDomain(nsIPrincipal* other, bool* _retval) final;
  virtual nsresult Subsumes(nsIPrincipal* other, bool* _retval) final;
  virtual nsresult SubsumesConsideringDomain(nsIPrincipal* other, bool* _retval) final;
  virtual nsresult SubsumesConsideringDomainIgnoringFPD(nsIPrincipal* other, bool* _retval) final;
  virtual nsresult CheckMayLoad(nsIURI* uri, bool report, bool allowIfInheritsPrincipal) final;
  virtual nsresult GetCsp(nsIContentSecurityPolicy** aCsp) override;
  virtual nsresult SetCsp(nsIContentSecurityPolicy* aCsp) override;
  virtual nsresult EnsureCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) override;
  virtual nsresult GetPreloadCsp(nsIContentSecurityPolicy** aPreloadCSP) override;
  virtual nsresult EnsurePreloadCSP(nsIDOMDocument* aDocument, nsIContentSecurityPolicy** aCSP) override;
  virtual nsresult GetCspJSON(nsAString& outCSPinJSON) override;
  virtual nsresult GetIsNullPrincipal(bool* aResult) override;
  virtual nsresult GetIsCodebasePrincipal(bool* aResult) override;
  virtual nsresult GetIsExpandedPrincipal(bool* aResult) override;
  virtual nsresult GetIsSystemPrincipal(bool* aResult) override;
  virtual nsresult GetOriginAttributes(JSContext* aCx, JS::MutableHandle<JS::Value> aVal) final;
  virtual nsresult GetOriginSuffix(nsACString& aOriginSuffix) final;
  virtual nsresult GetAppStatus(uint16_t* aAppStatus) final;
  virtual nsresult GetAppId(uint32_t* aAppStatus) final;
  virtual nsresult GetIsInIsolatedMozBrowserElement(bool* aIsInIsolatedMozBrowserElement) final;
  virtual nsresult GetUnknownAppId(bool* aUnknownAppId) final;
  virtual nsresult GetUserContextId(uint32_t* aUserContextId) final;
  virtual nsresult GetPrivateBrowsingId(uint32_t* aPrivateBrowsingId) final;

  virtual bool AddonHasPermission(const nsAString& aPerm);

  virtual bool IsCodebasePrincipal() const { return false; };

  static BasePrincipal* Cast(nsIPrincipal* aPrin) { return static_cast<BasePrincipal*>(aPrin); }

  static already_AddRefed<BasePrincipal>
  CreateCodebasePrincipal(const nsACString& aOrigin);





  static already_AddRefed<BasePrincipal>
  CreateCodebasePrincipal(nsIURI* aURI, const OriginAttributes& aAttrs);

  const OriginAttributes& OriginAttributesRef() final { return mOriginAttributes; }
  uint32_t AppId() const { return mOriginAttributes.mAppId; }
  uint32_t UserContextId() const { return mOriginAttributes.mUserContextId; }
  uint32_t PrivateBrowsingId() const { return mOriginAttributes.mPrivateBrowsingId; }
  bool IsInIsolatedMozBrowserElement() const { return mOriginAttributes.mInIsolatedMozBrowser; }

  PrincipalKind Kind() const { return mKind; }

  already_AddRefed<BasePrincipal> CloneStrippingUserContextIdAndFirstPartyDomain();




  bool AddonAllowsLoad(nsIURI* aURI, bool aExplicit = false);


  inline bool FastEquals(nsIPrincipal* aOther);
  inline bool FastEqualsConsideringDomain(nsIPrincipal* aOther);
  inline bool FastSubsumes(nsIPrincipal* aOther);
  inline bool FastSubsumesConsideringDomain(nsIPrincipal* aOther);
  inline bool FastSubsumesConsideringDomainIgnoringFPD(nsIPrincipal* aOther);

protected:
  virtual ~BasePrincipal();



  virtual bool SubsumesInternal(nsIPrincipal* aOther, DocumentDomainConsideration aConsider) = 0;




  virtual bool MayLoadInternal(nsIURI* aURI) = 0;
  friend class ::ExpandedPrincipal;

  void
  SetHasExplicitDomain()
  {
    mHasExplicitDomain = true;
  }




  void FinishInit(const nsACString& aOriginNoSuffix,
                  const OriginAttributes& aOriginAttributes);

  nsCOMPtr<nsIContentSecurityPolicy> mCSP;
  nsCOMPtr<nsIContentSecurityPolicy> mPreloadCSP;

private:
  static already_AddRefed<BasePrincipal>
  CreateCodebasePrincipal(nsIURI* aURI, const OriginAttributes& aAttrs,
                          const nsACString& aOriginNoSuffix);

  nsCOMPtr<nsIAtom> mOriginNoSuffix;
  nsCOMPtr<nsIAtom> mOriginSuffix;

  OriginAttributes mOriginAttributes;
  PrincipalKind mKind;
  bool mHasExplicitDomain;
  bool mInitialized;
};

inline bool
BasePrincipal::FastEquals(nsIPrincipal* aOther)
{
  auto other = Cast(aOther);
  if (Kind() != other->Kind()) {

    return false;
  }






  if (Kind() == eNullPrincipal || Kind() == eSystemPrincipal) {
    return this == other;
  }

  if (Kind() == eCodebasePrincipal) {
    return mOriginNoSuffix == other->mOriginNoSuffix &&
           mOriginSuffix == other->mOriginSuffix;
  }

  do { } while (0);
  return mOriginNoSuffix == other->mOriginNoSuffix;
}

inline bool
BasePrincipal::FastEqualsConsideringDomain(nsIPrincipal* aOther)
{


  auto other = Cast(aOther);
  if (!mHasExplicitDomain && !other->mHasExplicitDomain) {
    return FastEquals(aOther);
  }

  return Subsumes(aOther, ConsiderDocumentDomain) &&
         other->Subsumes(this, ConsiderDocumentDomain);
}

inline bool
BasePrincipal::FastSubsumes(nsIPrincipal* aOther)
{




  auto other = Cast(aOther);
  if (Kind() == eNullPrincipal && other->Kind() == eNullPrincipal) {
    return this == other;
  }
  if (FastEquals(aOther)) {
    return true;
  }


  return Subsumes(aOther, DontConsiderDocumentDomain);
}

inline bool
BasePrincipal::FastSubsumesConsideringDomain(nsIPrincipal* aOther)
{



  if (!mHasExplicitDomain && !Cast(aOther)->mHasExplicitDomain) {
    return FastSubsumes(aOther);
  }

  return Subsumes(aOther, ConsiderDocumentDomain);
}

inline bool
BasePrincipal::FastSubsumesConsideringDomainIgnoringFPD(nsIPrincipal* aOther)
{
  if (Kind() == eCodebasePrincipal &&
      !dom::ChromeUtils::IsOriginAttributesEqualIgnoringFPD(
            mOriginAttributes, Cast(aOther)->mOriginAttributes)) {
    return false;
  }

 return SubsumesInternal(aOther, ConsiderDocumentDomain);
}

}
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadInfo.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LoadTainting.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LoadTainting.h"
namespace mozilla {
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LoadTainting.h"
enum class LoadTainting : uint8_t
{
  Basic = 0,
  CORS = 1,
  Opaque = 2
};

}
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadInfo.h" 2
class nsCString;
typedef uint32_t nsSecurityFlags;
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadInfo.h"
class nsILoadInfo : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    SEC_NORMAL = 0U,
    SEC_REQUIRE_SAME_ORIGIN_DATA_INHERITS = 1U,
    SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED = 2U,
    SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS = 4U,
    SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL = 8U,
    SEC_REQUIRE_CORS_DATA_INHERITS = 16U,
    SEC_COOKIES_DEFAULT = 0U,
    SEC_COOKIES_INCLUDE = 32U,
    SEC_COOKIES_SAME_ORIGIN = 64U,
    SEC_COOKIES_OMIT = 96U,
    SEC_FORCE_INHERIT_PRINCIPAL = 128U,
    SEC_SANDBOXED = 256U,
    SEC_ABOUT_BLANK_INHERITS = 512U,
    SEC_ALLOW_CHROME = 1024U,
    SEC_DISALLOW_SCRIPT = 2048U,
    SEC_DONT_FOLLOW_REDIRECTS = 4096U,
    SEC_LOAD_ERROR_PAGE = 8192U,
    SEC_FORCE_INHERIT_PRINCIPAL_OVERRULE_OWNER = 16384U
  };


  virtual nsresult GetLoadingPrincipal(nsIPrincipal * *aLoadingPrincipal) = 0;


  virtual nsIPrincipal * LoadingPrincipal(void) = 0;


  virtual nsresult GetTriggeringPrincipal(nsIPrincipal * *aTriggeringPrincipal) = 0;


  virtual nsIPrincipal * TriggeringPrincipal(void) = 0;


  virtual nsresult GetPrincipalToInherit(nsIPrincipal * *aPrincipalToInherit) = 0;
  virtual nsresult SetPrincipalToInherit(nsIPrincipal *aPrincipalToInherit) = 0;


  virtual nsIPrincipal * PrincipalToInherit(void) = 0;


  virtual nsresult GetLoadingDocument(nsIDOMDocument * *aLoadingDocument) = 0;


  virtual nsINode * LoadingNode(void) = 0;


  virtual nsresult GetSecurityFlags(nsSecurityFlags *aSecurityFlags) = 0;

   inline nsSecurityFlags GetSecurityFlags()
  {
    nsSecurityFlags result;
    mozilla::DebugOnly<nsresult> rv = GetSecurityFlags(&result);
    do { } while (0);
    return result;
  }

  virtual nsresult GetSecurityMode(uint32_t *aSecurityMode) = 0;
  inline uint32_t GetSecurityMode()
  {
    uint32_t result;
    mozilla::DebugOnly<nsresult> rv = GetSecurityMode(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsInThirdPartyContext(bool *aIsInThirdPartyContext) = 0;
  inline bool GetIsInThirdPartyContext()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsInThirdPartyContext(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetCookiePolicy(uint32_t *aCookiePolicy) = 0;
  inline uint32_t GetCookiePolicy()
  {
    uint32_t result;
    mozilla::DebugOnly<nsresult> rv = GetCookiePolicy(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetForceInheritPrincipal(bool *aForceInheritPrincipal) = 0;
  inline bool GetForceInheritPrincipal()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetForceInheritPrincipal(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetForceInheritPrincipalOverruleOwner(bool *aForceInheritPrincipalOverruleOwner) = 0;
  inline bool GetForceInheritPrincipalOverruleOwner()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetForceInheritPrincipalOverruleOwner(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetLoadingSandboxed(bool *aLoadingSandboxed) = 0;
  inline bool GetLoadingSandboxed()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetLoadingSandboxed(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetAboutBlankInherits(bool *aAboutBlankInherits) = 0;
  inline bool GetAboutBlankInherits()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetAboutBlankInherits(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetAllowChrome(bool *aAllowChrome) = 0;
  inline bool GetAllowChrome()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetAllowChrome(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetDisallowScript(bool *aDisallowScript) = 0;
  inline bool GetDisallowScript()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetDisallowScript(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetDontFollowRedirects(bool *aDontFollowRedirects) = 0;
  inline bool GetDontFollowRedirects()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetDontFollowRedirects(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetLoadErrorPage(bool *aLoadErrorPage) = 0;
  inline bool GetLoadErrorPage()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetLoadErrorPage(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetExternalContentPolicyType(nsContentPolicyType *aExternalContentPolicyType) = 0;

   inline nsContentPolicyType GetExternalContentPolicyType()
  {
    nsContentPolicyType result;
    mozilla::DebugOnly<nsresult> rv = GetExternalContentPolicyType(&result);
    do { } while (0);
    return result;
  }

  virtual nsContentPolicyType InternalContentPolicyType(void) = 0;


  virtual nsresult GetUpgradeInsecureRequests(bool *aUpgradeInsecureRequests) = 0;
  inline bool GetUpgradeInsecureRequests()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetUpgradeInsecureRequests(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetVerifySignedContent(bool *aVerifySignedContent) = 0;
  inline bool GetVerifySignedContent()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetVerifySignedContent(&result);
    do { } while (0);
    return result;
  }
  virtual nsresult SetVerifySignedContent(bool aVerifySignedContent) = 0;


  virtual nsresult GetEnforceSRI(bool *aEnforceSRI) = 0;
  inline bool GetEnforceSRI()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetEnforceSRI(&result);
    do { } while (0);
    return result;
  }
  virtual nsresult SetEnforceSRI(bool aEnforceSRI) = 0;


  virtual nsresult GetForceInheritPrincipalDropped(bool *aForceInheritPrincipalDropped) = 0;
  inline bool GetForceInheritPrincipalDropped()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetForceInheritPrincipalDropped(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetInnerWindowID(uint64_t *aInnerWindowID) = 0;
  inline uint64_t GetInnerWindowID()
  {
    uint64_t result;
    mozilla::DebugOnly<nsresult> rv = GetInnerWindowID(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetOuterWindowID(uint64_t *aOuterWindowID) = 0;
  inline uint64_t GetOuterWindowID()
  {
    uint64_t result;
    mozilla::DebugOnly<nsresult> rv = GetOuterWindowID(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetParentOuterWindowID(uint64_t *aParentOuterWindowID) = 0;
  inline uint64_t GetParentOuterWindowID()
  {
    uint64_t result;
    mozilla::DebugOnly<nsresult> rv = GetParentOuterWindowID(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetFrameOuterWindowID(uint64_t *aFrameOuterWindowID) = 0;
  inline uint64_t GetFrameOuterWindowID()
  {
    uint64_t result;
    mozilla::DebugOnly<nsresult> rv = GetFrameOuterWindowID(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult ResetPrincipalToInheritToNullPrincipal(void) = 0;


  virtual nsresult GetScriptableOriginAttributes(JSContext* cx, JS::MutableHandleValue aOriginAttributes) = 0;
  virtual nsresult SetScriptableOriginAttributes(JSContext* cx, JS::HandleValue aOriginAttributes) = 0;


  virtual nsresult GetOriginAttributes(mozilla::OriginAttributes *_retval) = 0;


  virtual nsresult SetOriginAttributes(const mozilla::OriginAttributes & aOriginAttrs) = 0;

   inline mozilla::OriginAttributes GetOriginAttributes()
  {
    mozilla::OriginAttributes result;
    mozilla::DebugOnly<nsresult> rv = GetOriginAttributes(&result);
    do { } while (0);
    return result;
  }

  virtual nsresult GetEnforceSecurity(bool *aEnforceSecurity) = 0;
  inline bool GetEnforceSecurity()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetEnforceSecurity(&result);
    do { } while (0);
    return result;
  }
  virtual nsresult SetEnforceSecurity(bool aEnforceSecurity) = 0;


  virtual nsresult GetInitialSecurityCheckDone(bool *aInitialSecurityCheckDone) = 0;
  inline bool GetInitialSecurityCheckDone()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetInitialSecurityCheckDone(&result);
    do { } while (0);
    return result;
  }
  virtual nsresult SetInitialSecurityCheckDone(bool aInitialSecurityCheckDone) = 0;


  virtual nsresult AppendRedirectedPrincipal(nsIPrincipal *principal, bool isInternalRedirect) = 0;


  virtual nsresult GetRedirectChainIncludingInternalRedirects(JSContext* cx, JS::MutableHandleValue aRedirectChainIncludingInternalRedirects) = 0;


  virtual const nsTArray<nsCOMPtr<nsIPrincipal>> & RedirectChainIncludingInternalRedirects(void) = 0;


  virtual nsresult GetRedirectChain(JSContext* cx, JS::MutableHandleValue aRedirectChain) = 0;


  virtual const nsTArray<nsCOMPtr<nsIPrincipal>> & RedirectChain(void) = 0;


  virtual void SetCorsPreflightInfo(const nsTArray<nsCString> & unsafeHeaders, bool forcePreflight) = 0;


  virtual const nsTArray<nsCString> & CorsUnsafeHeaders(void) = 0;


  virtual nsresult GetForcePreflight(bool *aForcePreflight) = 0;
  inline bool GetForcePreflight()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetForcePreflight(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsPreflight(bool *aIsPreflight) = 0;
  inline bool GetIsPreflight()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsPreflight(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetForceHSTSPriming(bool *aForceHSTSPriming) = 0;
  inline bool GetForceHSTSPriming()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetForceHSTSPriming(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetMixedContentWouldBlock(bool *aMixedContentWouldBlock) = 0;
  inline bool GetMixedContentWouldBlock()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetMixedContentWouldBlock(&result);
    do { } while (0);
    return result;
  }


  virtual void SetHSTSPriming(bool mixeContentWouldBlock) = 0;


  virtual void ClearHSTSPriming(void) = 0;

  enum {
    TAINTING_BASIC = 0U,
    TAINTING_CORS = 1U,
    TAINTING_OPAQUE = 2U
  };


  virtual nsresult GetTainting(uint32_t *aTainting) = 0;


  virtual nsresult MaybeIncreaseTainting(uint32_t aTainting) = 0;

   static_assert(TAINTING_BASIC == static_cast<uint32_t>(mozilla::LoadTainting::Basic),
                "basic tainting enums should match");
  static_assert(TAINTING_CORS == static_cast<uint32_t>(mozilla::LoadTainting::CORS),
                "cors tainting enums should match");
  static_assert(TAINTING_OPAQUE == static_cast<uint32_t>(mozilla::LoadTainting::Opaque),
                "opaque tainting enums should match");
  mozilla::LoadTainting GetTainting()
  {
    uint32_t tainting = TAINTING_BASIC;
    do { if ((((bool)(__builtin_expect(!!(!NS_FAILED_impl(GetTainting(&tainting))), 1))))) { } } while (0);
    return static_cast<mozilla::LoadTainting>(tainting);
  }
  void MaybeIncreaseTainting(mozilla::LoadTainting aTainting)
  {
    uint32_t tainting = static_cast<uint32_t>(aTainting);
    do { if ((((bool)(__builtin_expect(!!(!NS_FAILED_impl(MaybeIncreaseTainting(tainting))), 1))))) { } } while (0);
  }

  virtual nsresult GetIsTopLevelLoad(bool *aIsTopLevelLoad) = 0;
  inline bool GetIsTopLevelLoad()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsTopLevelLoad(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetSandboxedLoadingPrincipal(nsIPrincipal * *aSandboxedLoadingPrincipal) = 0;

};

  template<typename T> struct nsILoadInfo::COMTypeInfo<nsILoadInfo, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsILoadInfo::COMTypeInfo<nsILoadInfo, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xddc65bf9, 0x2f60, 0x41ab, { 0xb2, 0x2a, 0x4f, 0x1a, 0xe9, 0xef, 0xcd, 0x36 }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannel.h" 2






class nsIURI;

class nsIInterfaceRequestor;

class nsIInputStream;

class nsIStreamListener;
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannel.h"
class nsIChannel : public nsIRequest {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetOriginalURI(nsIURI * *aOriginalURI) = 0;
  virtual nsresult SetOriginalURI(nsIURI *aOriginalURI) = 0;


  virtual nsresult GetURI(nsIURI * *aURI) = 0;


  virtual nsresult GetOwner(nsISupports * *aOwner) = 0;
  virtual nsresult SetOwner(nsISupports *aOwner) = 0;


  virtual nsresult GetNotificationCallbacks(nsIInterfaceRequestor * *aNotificationCallbacks) = 0;
  virtual nsresult SetNotificationCallbacks(nsIInterfaceRequestor *aNotificationCallbacks) = 0;


  virtual nsresult GetSecurityInfo(nsISupports * *aSecurityInfo) = 0;


  virtual nsresult GetContentType(nsACString & aContentType) = 0;
  virtual nsresult SetContentType(const nsACString & aContentType) = 0;


  virtual nsresult GetContentCharset(nsACString & aContentCharset) = 0;
  virtual nsresult SetContentCharset(const nsACString & aContentCharset) = 0;


  virtual nsresult GetContentLength(int64_t *aContentLength) = 0;
  virtual nsresult SetContentLength(int64_t aContentLength) = 0;


  virtual nsresult Open(nsIInputStream * *_retval) = 0;


  virtual nsresult Open2(nsIInputStream * *_retval) = 0;


  virtual nsresult AsyncOpen(nsIStreamListener *aListener, nsISupports *aContext) = 0;


  virtual nsresult AsyncOpen2(nsIStreamListener *aListener) = 0;

  enum {
    LOAD_DOCUMENT_URI = 65536U,
    LOAD_RETARGETED_DOCUMENT_URI = 131072U,
    LOAD_REPLACE = 262144U,
    LOAD_INITIAL_DOCUMENT_URI = 524288U,
    LOAD_TARGETED = 1048576U,
    LOAD_CALL_CONTENT_SNIFFERS = 2097152U,
    LOAD_CLASSIFY_URI = 4194304U,
    LOAD_MEDIA_SNIFFER_OVERRIDES_CONTENT_TYPE = 8388608U,
    LOAD_EXPLICIT_CREDENTIALS = 16777216U,
    LOAD_BYPASS_SERVICE_WORKER = 33554432U
  };


  virtual nsresult GetContentDisposition(uint32_t *aContentDisposition) = 0;
  virtual nsresult SetContentDisposition(uint32_t aContentDisposition) = 0;

  enum {
    DISPOSITION_INLINE = 0U,
    DISPOSITION_ATTACHMENT = 1U
  };


  virtual nsresult GetContentDispositionFilename(nsAString & aContentDispositionFilename) = 0;
  virtual nsresult SetContentDispositionFilename(const nsAString & aContentDispositionFilename) = 0;


  virtual nsresult GetContentDispositionHeader(nsACString & aContentDispositionHeader) = 0;


  virtual nsresult GetLoadInfo(nsILoadInfo * *aLoadInfo) = 0;
  virtual nsresult SetLoadInfo(nsILoadInfo *aLoadInfo) = 0;

   inline already_AddRefed<nsILoadInfo> GetLoadInfo()
  {
    nsCOMPtr<nsILoadInfo> result;
    mozilla::DebugOnly<nsresult> rv = GetLoadInfo(getter_AddRefs(result));
    do { } while (0);
    return result.forget();
  }
};

  template<typename T> struct nsIChannel::COMTypeInfo<nsIChannel, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIChannel::COMTypeInfo<nsIChannel, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x2c389865, 0x23db, 0x4aa7, { 0x9f, 0xe5, 0x60, 0xcc, 0x7b, 0x00, 0x69, 0x7e }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHttpChannel.h" 2
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHttpChannel.h"
class nsIHttpHeaderVisitor;
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHttpChannel.h"
class nsIHttpChannel : public nsIChannel {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  __attribute__ ((warn_unused_result)) virtual nsresult GetRequestMethod(nsACString & aRequestMethod) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetRequestMethod(const nsACString & aRequestMethod) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetReferrer(nsIURI * *aReferrer) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetReferrer(nsIURI *aReferrer) = 0;

  enum {
    REFERRER_POLICY_UNSET = 0U,
    REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE = 1U,
    REFERRER_POLICY_NO_REFERRER = 2U,
    REFERRER_POLICY_ORIGIN = 3U,
    REFERRER_POLICY_ORIGIN_WHEN_XORIGIN = 4U,
    REFERRER_POLICY_UNSAFE_URL = 5U,
    REFERRER_POLICY_SAME_ORIGIN = 6U,
    REFERRER_POLICY_STRICT_ORIGIN = 7U,
    REFERRER_POLICY_STRICT_ORIGIN_WHEN_XORIGIN = 8U
  };


  __attribute__ ((warn_unused_result)) virtual nsresult GetReferrerPolicy(uint32_t *aReferrerPolicy) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult SetReferrerWithPolicy(nsIURI *referrer, uint32_t referrerPolicy) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetProtocolVersion(nsACString & aProtocolVersion) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetTransferSize(uint64_t *aTransferSize) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetDecodedBodySize(uint64_t *aDecodedBodySize) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetEncodedBodySize(uint64_t *aEncodedBodySize) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetRequestHeader(const nsACString & aHeader, nsACString & _retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult SetRequestHeader(const nsACString & aHeader, const nsACString & aValue, bool aMerge) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult SetEmptyRequestHeader(const nsACString & aHeader) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult VisitRequestHeaders(nsIHttpHeaderVisitor *aVisitor) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult VisitNonDefaultRequestHeaders(nsIHttpHeaderVisitor *aVisitor) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetAllowPipelining(bool *aAllowPipelining) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetAllowPipelining(bool aAllowPipelining) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetAllowSTS(bool *aAllowSTS) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetAllowSTS(bool aAllowSTS) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetRedirectionLimit(uint32_t *aRedirectionLimit) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetRedirectionLimit(uint32_t aRedirectionLimit) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetResponseStatus(uint32_t *aResponseStatus) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetResponseStatusText(nsACString & aResponseStatusText) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetRequestSucceeded(bool *aRequestSucceeded) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetIsMainDocumentChannel(bool *aIsMainDocumentChannel) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetIsMainDocumentChannel(bool aIsMainDocumentChannel) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetResponseHeader(const nsACString & header, nsACString & _retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult SetResponseHeader(const nsACString & header, const nsACString & value, bool merge) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult VisitResponseHeaders(nsIHttpHeaderVisitor *aVisitor) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetOriginalResponseHeader(const nsACString & aHeader, nsIHttpHeaderVisitor *aVisitor) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult VisitOriginalResponseHeaders(nsIHttpHeaderVisitor *aVisitor) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult IsNoStoreResponse(bool *_retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult IsNoCacheResponse(bool *_retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult IsPrivateResponse(bool *_retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult RedirectTo(nsIURI *aTargetURI) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetRequestContextID(uint64_t *aRequestContextID) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetRequestContextID(uint64_t aRequestContextID) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetChannelId(uint64_t *aChannelId) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetChannelId(uint64_t aChannelId) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetTopLevelContentWindowId(uint64_t *aTopLevelContentWindowId) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetTopLevelContentWindowId(uint64_t aTopLevelContentWindowId) = 0;


  virtual nsresult GetIsTrackingResource(bool *aIsTrackingResource) = 0;
  inline bool GetIsTrackingResource()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsTrackingResource(&result);
    do { } while (0);
    return result;
  }


  __attribute__ ((warn_unused_result)) virtual nsresult GetTopLevelOuterContentWindowId(uint64_t *aTopLevelOuterContentWindowId) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetTopLevelOuterContentWindowId(uint64_t aTopLevelOuterContentWindowId) = 0;

};

  template<typename T> struct nsIHttpChannel::COMTypeInfo<nsIHttpChannel, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIHttpChannel::COMTypeInfo<nsIHttpChannel, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xc5a4a073, 0x4539, 0x49c7, { 0xa3, 0xf2, 0xce, 0xc3, 0xf0, 0x61, 0x9c, 0x6c }};
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/net/ReferrerPolicy.h" 2


namespace mozilla { namespace net {

enum ReferrerPolicy {

  RP_No_Referrer = nsIHttpChannel::REFERRER_POLICY_NO_REFERRER,


  RP_Origin = nsIHttpChannel::REFERRER_POLICY_ORIGIN,


  RP_No_Referrer_When_Downgrade = nsIHttpChannel::REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE,


  RP_Origin_When_Crossorigin = nsIHttpChannel::REFERRER_POLICY_ORIGIN_WHEN_XORIGIN,


  RP_Unsafe_URL = nsIHttpChannel::REFERRER_POLICY_UNSAFE_URL,


  RP_Same_Origin = nsIHttpChannel::REFERRER_POLICY_SAME_ORIGIN,


  RP_Strict_Origin = nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN,


  RP_Strict_Origin_When_Cross_Origin = nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN_WHEN_XORIGIN,



  RP_Unset = nsIHttpChannel::REFERRER_POLICY_UNSET,
};


const char kRPS_Never[] = "never";
const char kRPS_No_Referrer[] = "no-referrer";


const char kRPS_Origin[] = "origin";


const char kRPS_Default[] = "default";
const char kRPS_No_Referrer_When_Downgrade[] = "no-referrer-when-downgrade";


const char kRPS_Origin_When_Cross_Origin[] = "origin-when-cross-origin";
const char kRPS_Origin_When_Crossorigin[] = "origin-when-crossorigin";


const char kRPS_Same_Origin[] = "same-origin";


const char kRPS_Strict_Origin[] = "strict-origin";


const char kRPS_Strict_Origin_When_Cross_Origin[] = "strict-origin-when-cross-origin";


const char kRPS_Always[] = "always";
const char kRPS_Unsafe_URL[] = "unsafe-url";

inline ReferrerPolicy
ReferrerPolicyFromString(const nsAString& content)
{
  if (content.IsEmpty()) {
    return RP_No_Referrer;
  }

  nsString lowerContent(content);
  ToLowerCase(lowerContent);


  if (lowerContent.EqualsLiteral(kRPS_Never) ||
      lowerContent.EqualsLiteral(kRPS_No_Referrer)) {
    return RP_No_Referrer;
  }
  if (lowerContent.EqualsLiteral(kRPS_Origin)) {
    return RP_Origin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Default) ||
      lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)) {
    return RP_No_Referrer_When_Downgrade;
  }
  if (lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin) ||
      lowerContent.EqualsLiteral(kRPS_Origin_When_Crossorigin)) {
    return RP_Origin_When_Crossorigin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Same_Origin)) {
    return RP_Same_Origin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin)) {
    return RP_Strict_Origin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)) {
    return RP_Strict_Origin_When_Cross_Origin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Always) ||
      lowerContent.EqualsLiteral(kRPS_Unsafe_URL)) {
    return RP_Unsafe_URL;
  }

  return RP_Unset;

}

inline bool
IsValidReferrerPolicy(const nsAString& content)
{
  if (content.IsEmpty()) {
    return true;
  }

  nsString lowerContent(content);
  ToLowerCase(lowerContent);

  return lowerContent.EqualsLiteral(kRPS_Never)
      || lowerContent.EqualsLiteral(kRPS_No_Referrer)
      || lowerContent.EqualsLiteral(kRPS_Origin)
      || lowerContent.EqualsLiteral(kRPS_Default)
      || lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)
      || lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin)
      || lowerContent.EqualsLiteral(kRPS_Origin_When_Crossorigin)
      || lowerContent.EqualsLiteral(kRPS_Same_Origin)
      || lowerContent.EqualsLiteral(kRPS_Strict_Origin)
      || lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)
      || lowerContent.EqualsLiteral(kRPS_Always)
      || lowerContent.EqualsLiteral(kRPS_Unsafe_URL);
}

inline ReferrerPolicy
AttributeReferrerPolicyFromString(const nsAString& content)
{


  if (content.IsEmpty()) {
    return RP_Unset;
  }

  nsString lowerContent(content);
  ToLowerCase(lowerContent);

  if (lowerContent.EqualsLiteral(kRPS_No_Referrer)) {
    return RP_No_Referrer;
  }
  if (lowerContent.EqualsLiteral(kRPS_Origin)) {
    return RP_Origin;
  }
  if (lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)) {
    return RP_No_Referrer_When_Downgrade;
  }
  if (lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin)) {
    return RP_Origin_When_Crossorigin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Unsafe_URL)) {
    return RP_Unsafe_URL;
  }
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin)) {
    return RP_Strict_Origin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Same_Origin)) {
    return RP_Same_Origin;
  }
  if (lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)) {
    return RP_Strict_Origin_When_Cross_Origin;
  }



  return RP_Unset;
}

}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleBackendType.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleBackendType.h"
namespace mozilla {




enum class StyleBackendType : uint8_t
{
  None,
  Gecko,
  Servo
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CORSMode.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CORSMode.h"
namespace mozilla {

enum CORSMode : uint8_t {



  CORS_NONE,





  CORS_ANONYMOUS,





  CORS_USE_CREDENTIALS
};

}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoUtils.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSLoaderObserver.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSLoaderObserver.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSLoaderObserver.h" 2





class nsICSSLoaderObserver : public nsISupports {
public:
  template<typename T, typename U> struct COMTypeInfo;
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSLoaderObserver.h"
  virtual nsresult StyleSheetLoaded(mozilla::StyleSheet* aSheet,
                              bool aWasAlternate,
                              nsresult aStatus) = 0;
};

template<typename T> struct nsICSSLoaderObserver::COMTypeInfo<nsICSSLoaderObserver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsICSSLoaderObserver::COMTypeInfo<nsICSSLoaderObserver, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xf51fbf2c, 0xfe4b, 0x4a15, { 0xaf, 0x7e, 0x5e, 0x20, 0x64, 0x5f, 0xaf, 0x58 } };
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSStyleSheet.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSStyleSheet.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMStyleSheet.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMStyleSheet.h"
class nsIDOMStyleSheet : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetType(nsAString & aType) = 0;


  virtual nsresult GetDisabled(bool *aDisabled) = 0;
  virtual nsresult SetDisabled(bool aDisabled) = 0;


  virtual nsresult GetOwnerNode(nsIDOMNode * *aOwnerNode) = 0;


  virtual nsresult GetParentStyleSheet(nsIDOMStyleSheet * *aParentStyleSheet) = 0;


  virtual nsresult GetHref(nsAString & aHref) = 0;


  virtual nsresult GetTitle(nsAString & aTitle) = 0;


  virtual nsresult GetMedia(nsIDOMMediaList * *aMedia) = 0;

};

  template<typename T> struct nsIDOMStyleSheet::COMTypeInfo<nsIDOMStyleSheet, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMStyleSheet::COMTypeInfo<nsIDOMStyleSheet, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xa6cf9080, 0x15b3, 0x11d2, { 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSStyleSheet.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSStyleSheet.h"
class nsIDOMCSSStyleSheet : public nsIDOMStyleSheet {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetOwnerRule(nsIDOMCSSRule * *aOwnerRule) = 0;


  virtual nsresult GetCssRules(nsIDOMCSSRuleList * *aCssRules) = 0;


  virtual nsresult InsertRule(const nsAString & rule, uint32_t index, uint32_t *_retval) = 0;


  virtual nsresult DeleteRule(uint32_t index) = 0;

};

  template<typename T> struct nsIDOMCSSStyleSheet::COMTypeInfo<nsIDOMCSSStyleSheet, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMCSSStyleSheet::COMTypeInfo<nsIDOMCSSStyleSheet, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xa6cf90c2, 0x15b3, 0x11d2, { 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 }};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h" 2


class nsIDocument;
class nsINode;
class nsIPrincipal;
class nsCSSRuleProcessor;

namespace mozilla {

class CSSStyleSheet;
class ServoStyleSheet;
struct StyleSheetInfo;
struct CSSStyleSheetInner;

namespace dom {
class CSSRuleList;
class MediaList;
class SRIMetadata;
}

namespace css {
class GroupRule;
class ImportRule;
class Rule;
}




class StyleSheet : public nsIDOMCSSStyleSheet
                 , public nsICSSLoaderObserver
                 , public nsWrapperCache
{
protected:
  StyleSheet(StyleBackendType aType, css::SheetParsingMode aParsingMode);
  StyleSheet(const StyleSheet& aCopy,
             nsIDocument* aDocumentToUse,
             nsINode* aOwningNodeToUse);
  virtual ~StyleSheet();

public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "StyleSheet"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<StyleSheet>(p)->DeleteCycleCollectable(); } static StyleSheet* Downcast(nsISupports* s) { return static_cast<StyleSheet*>(static_cast<nsIDOMCSSStyleSheet*>(s)); } static nsISupports* Upcast(StyleSheet *p) { return static_cast<nsISupports*>(static_cast<nsIDOMCSSStyleSheet*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &StyleSheet::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;


  void SetOwningNode(nsINode* aOwningNode)
  {
    mOwningNode = aOwningNode;
  }

  css::SheetParsingMode ParsingMode() { return mParsingMode; }
  mozilla::dom::CSSStyleSheetParsingMode ParsingModeDOM();




  bool IsComplete() const;
  void SetComplete();
# 87 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h"
  void SetEnabled(bool aEnabled);

  bool IsGecko() const { return !IsServo(); } bool IsServo() const { return mType == StyleBackendType::Servo; } inline CSSStyleSheet* AsGecko(); inline ServoStyleSheet* AsServo(); inline const CSSStyleSheet* AsGecko() const; inline const ServoStyleSheet* AsServo() const; inline CSSStyleSheet* GetAsGecko(); inline ServoStyleSheet* GetAsServo(); inline const CSSStyleSheet* GetAsGecko() const; inline const ServoStyleSheet* GetAsServo() const;


  inline bool IsInline() const;

  inline nsIURI* GetSheetURI() const;


  inline nsIURI* GetOriginalURI() const;
  inline nsIURI* GetBaseURI() const;





  inline void SetURIs(nsIURI* aSheetURI, nsIURI* aOriginalSheetURI,
                      nsIURI* aBaseURI);







  inline bool IsApplicable() const;
  inline bool HasRules() const;

  virtual already_AddRefed<StyleSheet> Clone(StyleSheet* aCloneParent,
                                             css::ImportRule* aCloneOwnerRule,
                                             nsIDocument* aCloneDocument,
                                             nsINode* aCloneOwningNode) const = 0;

  virtual bool IsModified() const = 0;


  enum DocumentAssociationMode {


    OwnedByDocument,


    NotOwnedByDocument
  };
  nsIDocument* GetAssociatedDocument() const { return mDocument; }
  bool IsOwnedByDocument() const {
    return mDocumentAssociationMode == OwnedByDocument;
  }

  void SetAssociatedDocument(nsIDocument* aDocument,
                             DocumentAssociationMode aMode);
  void ClearAssociatedDocument();
  nsINode* GetOwnerNode() const { return mOwningNode; }
  inline StyleSheet* GetParentSheet() const { return mParent; }

  void AppendStyleSheet(StyleSheet* aSheet);

  StyleSheet* GetFirstChild() const;


  inline nsIPrincipal* Principal() const;





  inline void SetPrincipal(nsIPrincipal* aPrincipal);

  void SetTitle(const nsAString& aTitle) { mTitle = aTitle; }
  void SetMedia(dom::MediaList* aMedia);


  inline CORSMode GetCORSMode() const;

  inline net::ReferrerPolicy GetReferrerPolicy() const;

  inline void GetIntegrity(dom::SRIMetadata& aResult) const;

  virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
# 175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSheet.h"
  inline StyleSheet* GetParentStyleSheet() const;

  dom::MediaList* Media();
  bool Disabled() const { return mDisabled; }



  virtual css::Rule* GetDOMOwnerRule() const = 0;
  dom::CSSRuleList* GetCssRules(nsIPrincipal& aSubjectPrincipal,
                                ErrorResult& aRv);
  uint32_t InsertRule(const nsAString& aRule, uint32_t aIndex,
                      nsIPrincipal& aSubjectPrincipal,
                      ErrorResult& aRv);
  void DeleteRule(uint32_t aIndex,
                  nsIPrincipal& aSubjectPrincipal,
                  ErrorResult& aRv);


  inline dom::ParentObject GetParentObject() const;
  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) final;


  virtual nsresult GetType(nsAString& aType) final;
  virtual nsresult GetDisabled(bool* aDisabled) final;
  virtual nsresult SetDisabled(bool aDisabled) final;
  virtual nsresult GetOwnerNode(nsIDOMNode** aOwnerNode) final;
  virtual nsresult GetParentStyleSheet(nsIDOMStyleSheet** aParentStyleSheet) final;
  virtual nsresult GetHref(nsAString& aHref) final;
  virtual nsresult GetTitle(nsAString& aTitle) final;
  virtual nsresult GetMedia(nsIDOMMediaList** aMedia) final;


  virtual nsresult GetOwnerRule(nsIDOMCSSRule** aOwnerRule) final;
  virtual nsresult GetCssRules(nsIDOMCSSRuleList** aCssRules) final;
  virtual nsresult InsertRule(const nsAString& aRule, uint32_t aIndex,
                      uint32_t* aReturn) final;
  virtual nsresult DeleteRule(uint32_t aIndex) final;




  inline void WillDirty();
  inline void DidDirty();

  nsresult DeleteRuleFromGroup(css::GroupRule* aGroup, uint32_t aIndex);
  nsresult InsertRuleIntoGroup(const nsAString& aRule,
                               css::GroupRule* aGroup, uint32_t aIndex);

private:


  inline StyleSheetInfo& SheetInfo();
  inline const StyleSheetInfo& SheetInfo() const;





  bool AreRulesAvailable(nsIPrincipal& aSubjectPrincipal,
                         ErrorResult& aRv);

protected:
  struct ChildSheetListBuilder {
    RefPtr<StyleSheet>* sheetSlot;
    StyleSheet* parent;

    void SetParentLinks(StyleSheet* aSheet);

    static void ReparentChildList(StyleSheet* aPrimarySheet,
                                  StyleSheet* aFirstChild);
  };

  void UnparentChildren();





  void SubjectSubsumesInnerPrincipal(nsIPrincipal& aSubjectPrincipal,
                                     ErrorResult& aRv);


  void DropMedia();


  void EnabledStateChanged();


  virtual void UnlinkInner();

  virtual void TraverseInner(nsCycleCollectionTraversalCallback &);

  StyleSheet* mParent;

  nsString mTitle;
  nsIDocument* mDocument;
  nsINode* mOwningNode;

  RefPtr<dom::MediaList> mMedia;

  RefPtr<StyleSheet> mNext;




  css::SheetParsingMode mParsingMode;

  const StyleBackendType mType;
  bool mDisabled;




  DocumentAssociationMode mDocumentAssociationMode;



  StyleSheetInfo* mInner;

  friend class ::nsCSSRuleProcessor;




  friend class mozilla::CSSStyleSheet;
  friend class mozilla::ServoStyleSheet;



  friend struct mozilla::StyleSheetInfo;
  friend struct mozilla::CSSStyleSheetInner;
};

}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
class nsAttrValue;
class nsIAtom;
class nsIContent;
class nsIDocument;
class nsINode;

namespace mozilla {
namespace dom {
class Element;
}
}
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
struct CharacterDataChangeInfo
{



  bool mAppend;




  uint32_t mChangeStart;






  uint32_t mChangeEnd;





  uint32_t mReplaceLength;
# 66 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  struct Details {
    enum {
      eMerge,
      eSplit
    } mType;




    nsIContent* mNextSibling;
  };




  Details* mDetails;
};
# 98 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
class nsIMutationObserver : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;
# 121 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void CharacterDataWillChange(nsIDocument *aDocument,
                                       nsIContent* aContent,
                                       CharacterDataChangeInfo* aInfo) = 0;
# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void CharacterDataChanged(nsIDocument *aDocument,
                                    nsIContent* aContent,
                                    CharacterDataChangeInfo* aInfo) = 0;
# 170 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void AttributeWillChange(nsIDocument* aDocument,
                                   mozilla::dom::Element* aElement,
                                   int32_t aNameSpaceID,
                                   nsIAtom* aAttribute,
                                   int32_t aModType,
                                   const nsAttrValue* aNewValue) = 0;
# 196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void AttributeChanged(nsIDocument* aDocument,
                                mozilla::dom::Element* aElement,
                                int32_t aNameSpaceID,
                                nsIAtom* aAttribute,
                                int32_t aModType,
                                const nsAttrValue* aOldValue) = 0;
# 211 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void NativeAnonymousChildListChange(nsIDocument* aDocument,
                                              nsIContent* aContent,
                                              bool aIsRemove) {}
# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void AttributeSetToCurrentValue(nsIDocument* aDocument,
                                          mozilla::dom::Element* aElement,
                                          int32_t aNameSpaceID,
                                          nsIAtom* aAttribute) {}
# 246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void ContentAppended(nsIDocument *aDocument,
                               nsIContent* aContainer,
                               nsIContent* aFirstNewContent,
                               int32_t aNewIndexInContainer) = 0;
# 270 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void ContentInserted(nsIDocument *aDocument,
                               nsIContent* aContainer,
                               nsIContent* aChild,
                               int32_t aIndexInContainer) = 0;
# 297 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void ContentRemoved(nsIDocument *aDocument,
                              nsIContent* aContainer,
                              nsIContent* aChild,
                              int32_t aIndexInContainer,
                              nsIContent* aPreviousSibling) = 0;
# 320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void NodeWillBeDestroyed(const nsINode *aNode) = 0;
# 338 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMutationObserver.h"
  virtual void ParentChainChanged(nsIContent *aContent) = 0;
};

template<typename T> struct nsIMutationObserver::COMTypeInfo<nsIMutationObserver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMutationObserver::COMTypeInfo<nsIMutationObserver, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x6d674c17, 0x0fbc, 0x4633, { 0x8f, 0x46, 0x73, 0x4e, 0x87, 0xeb, 0xf0, 0xc7 } };
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h" 2

class nsIContent;
class nsIDocument;

namespace mozilla {
namespace css {
class Rule;
}
}





typedef uint32_t nsUpdateType;






class nsIDocumentObserver : public nsIMutationObserver
{
public:
  template<typename T, typename U> struct COMTypeInfo;





  virtual void BeginUpdate(nsIDocument *aDocument,
                           nsUpdateType aUpdateType) = 0;





  virtual void EndUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType) = 0;




  virtual void BeginLoad(nsIDocument *aDocument) = 0;






  virtual void EndLoad(nsIDocument *aDocument) = 0;
# 80 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h"
  virtual void ContentStateChanged(nsIDocument* aDocument,
                                   nsIContent* aContent,
                                   mozilla::EventStates aStateMask) = 0;







  virtual void DocumentStatesChanged(nsIDocument* aDocument,
                                     mozilla::EventStates aStateMask) = 0;
# 103 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h"
  virtual void StyleSheetAdded(mozilla::StyleSheet* aStyleSheet,
                               bool aDocumentSheet) = 0;
# 116 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h"
  virtual void StyleSheetRemoved(mozilla::StyleSheet* aStyleSheet,
                                 bool aDocumentSheet) = 0;
# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h"
  virtual void StyleSheetApplicableStateChanged(mozilla::StyleSheet* aStyleSheet) = 0;
# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h"
  virtual void StyleRuleChanged(mozilla::StyleSheet* aStyleSheet) = 0;
# 150 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h"
  virtual void StyleRuleAdded(mozilla::StyleSheet* aStyleSheet) = 0;
# 161 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocumentObserver.h"
  virtual void StyleRuleRemoved(mozilla::StyleSheet* aStyleSheet) = 0;
};

template<typename T> struct nsIDocumentObserver::COMTypeInfo<nsIDocumentObserver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDocumentObserver::COMTypeInfo<nsIDocumentObserver, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x71041fa3, 0x6dd7, 0x4cde, { 0xbb, 0x76, 0xae, 0xcc, 0x69, 0xe1, 0x75, 0x78 } };
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadGroup.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadGroup.h"
class nsISimpleEnumerator;

class nsIRequestObserver;

class nsIInterfaceRequestor;

class nsIRequestContext;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILoadGroup.h"
class nsILoadGroup : public nsIRequest {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetGroupObserver(nsIRequestObserver * *aGroupObserver) = 0;
  virtual nsresult SetGroupObserver(nsIRequestObserver *aGroupObserver) = 0;


  virtual nsresult GetDefaultLoadRequest(nsIRequest * *aDefaultLoadRequest) = 0;
  virtual nsresult SetDefaultLoadRequest(nsIRequest *aDefaultLoadRequest) = 0;


  virtual nsresult AddRequest(nsIRequest *aRequest, nsISupports *aContext) = 0;


  virtual nsresult RemoveRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatus) = 0;


  virtual nsresult GetRequests(nsISimpleEnumerator * *aRequests) = 0;


  virtual nsresult GetActiveCount(uint32_t *aActiveCount) = 0;


  virtual nsresult GetNotificationCallbacks(nsIInterfaceRequestor * *aNotificationCallbacks) = 0;
  virtual nsresult SetNotificationCallbacks(nsIInterfaceRequestor *aNotificationCallbacks) = 0;


  virtual nsresult GetRequestContextID(uint64_t *aRequestContextID) = 0;


  virtual nsresult GetDefaultLoadFlags(nsLoadFlags *aDefaultLoadFlags) = 0;
  virtual nsresult SetDefaultLoadFlags(nsLoadFlags aDefaultLoadFlags) = 0;


  virtual nsresult GetUserAgentOverrideCache(nsACString & aUserAgentOverrideCache) = 0;
  virtual nsresult SetUserAgentOverrideCache(const nsACString & aUserAgentOverrideCache) = 0;

};

  template<typename T> struct nsILoadGroup::COMTypeInfo<nsILoadGroup, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsILoadGroup::COMTypeInfo<nsILoadGroup, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xf0c87725, 0x7a35, 0x463c, { 0x9c, 0xeb, 0x2c, 0x07, 0xf2, 0x34, 0x06, 0xcc }};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMNode.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMNode.h"
class nsIVariant;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMNode.h"
class nsIDOMNode : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    ELEMENT_NODE = 1U,
    ATTRIBUTE_NODE = 2U,
    TEXT_NODE = 3U,
    CDATA_SECTION_NODE = 4U,
    ENTITY_REFERENCE_NODE = 5U,
    ENTITY_NODE = 6U,
    PROCESSING_INSTRUCTION_NODE = 7U,
    COMMENT_NODE = 8U,
    DOCUMENT_NODE = 9U,
    DOCUMENT_TYPE_NODE = 10U,
    DOCUMENT_FRAGMENT_NODE = 11U,
    NOTATION_NODE = 12U
  };


  virtual nsresult GetNodeName(nsAString & aNodeName) = 0;


  virtual nsresult GetNodeValue(nsAString & aNodeValue) = 0;
  virtual nsresult SetNodeValue(const nsAString & aNodeValue) = 0;


  virtual nsresult GetNodeType(uint16_t *aNodeType) = 0;


  virtual nsresult GetParentNode(nsIDOMNode * *aParentNode) = 0;


  virtual nsresult GetChildNodes(nsIDOMNodeList * *aChildNodes) = 0;


  virtual nsresult GetFirstChild(nsIDOMNode * *aFirstChild) = 0;


  virtual nsresult GetLastChild(nsIDOMNode * *aLastChild) = 0;


  virtual nsresult GetPreviousSibling(nsIDOMNode * *aPreviousSibling) = 0;


  virtual nsresult GetNextSibling(nsIDOMNode * *aNextSibling) = 0;


  virtual nsresult GetOwnerDocument(nsIDOMDocument * *aOwnerDocument) = 0;


  virtual nsresult RemoveChild(nsIDOMNode *oldChild, nsIDOMNode * *_retval) = 0;


  virtual nsresult HasChildNodes(bool *_retval) = 0;


  virtual nsresult CloneNode(bool deep, uint8_t _argc, nsIDOMNode * *_retval) = 0;


  virtual nsresult GetNamespaceURI(nsAString & aNamespaceURI) = 0;


  virtual nsresult GetPrefix(nsAString & aPrefix) = 0;


  virtual nsresult GetLocalName(nsAString & aLocalName) = 0;

  enum {
    DOCUMENT_POSITION_DISCONNECTED = 1U,
    DOCUMENT_POSITION_PRECEDING = 2U,
    DOCUMENT_POSITION_FOLLOWING = 4U,
    DOCUMENT_POSITION_CONTAINS = 8U,
    DOCUMENT_POSITION_CONTAINED_BY = 16U,
    DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32U
  };


  virtual nsresult GetTextContent(nsAString & aTextContent) = 0;
  virtual nsresult SetTextContent(const nsAString & aTextContent) = 0;

};

  template<typename T> struct nsIDOMNode::COMTypeInfo<nsIDOMNode, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMNode::COMTypeInfo<nsIDOMNode, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xcc35b412, 0x009b, 0x46a3, { 0x9b, 0xe0, 0x76, 0x44, 0x8f, 0x12, 0x54, 0x8d }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NameSpaceConstants.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NameSpaceConstants.h"
static const int32_t kNameSpaceID_None = 0;
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h" 2




class nsIDocument;
class nsNodeInfoManager;

namespace mozilla {
namespace dom {

class NodeInfo final
{
public:
  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<NodeInfo>::value, "Reference-counted class " "NodeInfo" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); nsrefcnt count = mRefCnt.incr(static_cast<void*>(this), NodeInfo::cycleCollection::GetParticipant()); ; return count; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); nsrefcnt count = mRefCnt.decr(static_cast<void*>(this), NodeInfo::cycleCollection::GetParticipant()); ; return count; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsCycleCollectionParticipant { public: constexpr cycleCollection () : nsCycleCollectionParticipant(true) {} private: public: virtual void Root(void *n) override; virtual void Unlink(void *n) override; virtual void Unroot(void *n) override; virtual nsresult TraverseNative(void *n, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "NodeInfo"; }; virtual void DeleteCycleCollectable(void *n) override { DowncastCCParticipant<NodeInfo>(n)->DeleteCycleCollectable(); } static NodeInfo* Downcast(void* s) { return DowncastCCParticipant<NodeInfo>(s); } static void* Upcast(NodeInfo *p) { return static_cast<void*>(p); } virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static nsCycleCollectionParticipant* GetParticipant() { return &NodeInfo::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;







  void GetName(nsAString& aName) const;
# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h"
  nsIAtom* NameAtom() const
  {
    return mInner.mName;
  }
# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h"
  const nsString& QualifiedName() const {
    return mQualifiedName;
  }




  const nsString& NodeName() const {
    return mNodeName;
  }




  const nsString& LocalName() const {
    return mLocalName;
  }







  void GetPrefix(nsAString& aPrefix) const;







  nsIAtom* GetPrefixAtom() const
  {
    return mInner.mPrefix;
  }




  void GetNamespaceURI(nsAString& aNameSpaceURI) const;





  int32_t NamespaceID() const
  {
    return mInner.mNamespaceID;
  }





  uint16_t NodeType() const
  {
    return mInner.mNodeType;
  }




  nsIAtom* GetExtraName() const
  {
    return mInner.mExtraName;
  }





  nsNodeInfoManager* NodeInfoManager() const
  {
    return mOwnerManager;
  }






  inline bool Equals(NodeInfo* aNodeInfo) const;

  bool NameAndNamespaceEquals(NodeInfo* aNodeInfo) const;

  bool Equals(nsIAtom* aNameAtom) const
  {
    return mInner.mName == aNameAtom;
  }

  bool Equals(nsIAtom* aNameAtom, nsIAtom* aPrefixAtom) const
  {
    return (mInner.mName == aNameAtom) && (mInner.mPrefix == aPrefixAtom);
  }

  bool Equals(nsIAtom* aNameAtom, int32_t aNamespaceID) const
  {
    return ((mInner.mName == aNameAtom) &&
            (mInner.mNamespaceID == aNamespaceID));
  }

  bool Equals(nsIAtom* aNameAtom, nsIAtom* aPrefixAtom, int32_t aNamespaceID) const
  {
    return ((mInner.mName == aNameAtom) &&
            (mInner.mPrefix == aPrefixAtom) &&
            (mInner.mNamespaceID == aNamespaceID));
  }

  bool NamespaceEquals(int32_t aNamespaceID) const
  {
    return mInner.mNamespaceID == aNamespaceID;
  }

  inline bool Equals(const nsAString& aName) const;

  inline bool Equals(const nsAString& aName, const nsAString& aPrefix) const;

  inline bool Equals(const nsAString& aName, int32_t aNamespaceID) const;

  inline bool Equals(const nsAString& aName, const nsAString& aPrefix, int32_t aNamespaceID) const;

  bool NamespaceEquals(const nsAString& aNamespaceURI) const;

  inline bool QualifiedNameEquals(nsIAtom* aNameAtom) const;

  bool QualifiedNameEquals(const nsAString& aQualifiedName) const
  {
    return mQualifiedName == aQualifiedName;
  }




  nsIDocument* GetDocument() const
  {
    return mDocument;
  }

private:
  NodeInfo() = delete;
  NodeInfo(const NodeInfo& aOther) = delete;



  NodeInfo(nsIAtom* aName, nsIAtom* aPrefix, int32_t aNamespaceID,
           uint16_t aNodeType, nsIAtom* aExtraName,
           nsNodeInfoManager* aOwnerManager);

  ~NodeInfo();

public:
  bool CanSkip();





  void DeleteCycleCollectable();

protected:
# 244 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/NodeInfo.h"
  class NodeInfoInner
  {
  public:
    NodeInfoInner()
      : mName(nullptr), mPrefix(nullptr), mNamespaceID(-1),
        mNodeType(0), mNameString(nullptr), mExtraName(nullptr)
    {
    }
    NodeInfoInner(nsIAtom *aName, nsIAtom *aPrefix, int32_t aNamespaceID,
                    uint16_t aNodeType, nsIAtom* aExtraName)
      : mName(aName), mPrefix(aPrefix), mNamespaceID(aNamespaceID),
        mNodeType(aNodeType), mNameString(nullptr), mExtraName(aExtraName)
    {
    }
    NodeInfoInner(const nsAString& aTmpName, nsIAtom *aPrefix,
                    int32_t aNamespaceID, uint16_t aNodeType)
      : mName(nullptr), mPrefix(aPrefix), mNamespaceID(aNamespaceID),
        mNodeType(aNodeType), mNameString(&aTmpName), mExtraName(nullptr)
    {
    }

    nsCOMPtr<nsIAtom> mName;
    nsCOMPtr<nsIAtom> mPrefix;
    int32_t mNamespaceID;
    uint16_t mNodeType;
    const nsAString* mNameString;
    nsCOMPtr<nsIAtom> mExtraName;
  };


  friend class ::nsNodeInfoManager;



  nsIDocument* mDocument;

  NodeInfoInner mInner;

  RefPtr<nsNodeInfoManager> mOwnerManager;







  nsString mQualifiedName;


  nsString mNodeName;



  nsString mLocalName;
};

}
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIVariant.h" 1
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIVariant.h"
class nsIDataType : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    VTYPE_INT8 = 0U,
    VTYPE_INT16 = 1U,
    VTYPE_INT32 = 2U,
    VTYPE_INT64 = 3U,
    VTYPE_UINT8 = 4U,
    VTYPE_UINT16 = 5U,
    VTYPE_UINT32 = 6U,
    VTYPE_UINT64 = 7U,
    VTYPE_FLOAT = 8U,
    VTYPE_DOUBLE = 9U,
    VTYPE_BOOL = 10U,
    VTYPE_CHAR = 11U,
    VTYPE_WCHAR = 12U,
    VTYPE_VOID = 13U,
    VTYPE_ID = 14U,
    VTYPE_DOMSTRING = 15U,
    VTYPE_CHAR_STR = 16U,
    VTYPE_WCHAR_STR = 17U,
    VTYPE_INTERFACE = 18U,
    VTYPE_INTERFACE_IS = 19U,
    VTYPE_ARRAY = 20U,
    VTYPE_STRING_SIZE_IS = 21U,
    VTYPE_WSTRING_SIZE_IS = 22U,
    VTYPE_UTF8STRING = 23U,
    VTYPE_CSTRING = 24U,
    VTYPE_ASTRING = 25U,
    VTYPE_EMPTY_ARRAY = 254U,
    VTYPE_EMPTY = 255U
  };

};

  template<typename T> struct nsIDataType::COMTypeInfo<nsIDataType, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDataType::COMTypeInfo<nsIDataType, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x4d12e540, 0x83d7, 0x11d5, { 0x90, 0xed, 0x00, 0x10, 0xa4, 0xe7, 0x3d, 0x9a }};
# 123 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIVariant.h"
class nsIVariant : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetDataType(uint16_t *aDataType) = 0;


  virtual nsresult GetAsInt8(uint8_t *_retval) = 0;


  virtual nsresult GetAsInt16(int16_t *_retval) = 0;


  virtual nsresult GetAsInt32(int32_t *_retval) = 0;


  virtual nsresult GetAsInt64(int64_t *_retval) = 0;


  virtual nsresult GetAsUint8(uint8_t *_retval) = 0;


  virtual nsresult GetAsUint16(uint16_t *_retval) = 0;


  virtual nsresult GetAsUint32(uint32_t *_retval) = 0;


  virtual nsresult GetAsUint64(uint64_t *_retval) = 0;


  virtual nsresult GetAsFloat(float *_retval) = 0;


  virtual nsresult GetAsDouble(double *_retval) = 0;


  virtual nsresult GetAsBool(bool *_retval) = 0;


  virtual nsresult GetAsChar(char *_retval) = 0;


  virtual nsresult GetAsWChar(char16_t *_retval) = 0;


  virtual nsresult GetAsID(nsID *retval) = 0;


  virtual nsresult GetAsAString(nsAString & _retval) = 0;


  virtual nsresult GetAsDOMString(nsAString & _retval) = 0;


  virtual nsresult GetAsACString(nsACString & _retval) = 0;


  virtual nsresult GetAsAUTF8String(nsACString & _retval) = 0;


  virtual nsresult GetAsString(char * *_retval) = 0;


  virtual nsresult GetAsWString(char16_t * *_retval) = 0;


  virtual nsresult GetAsISupports(nsISupports * *_retval) = 0;


  virtual nsresult GetAsJSVal(JS::MutableHandleValue _retval) = 0;


  virtual nsresult GetAsInterface(nsIID **iid, void **iface) = 0;


  virtual nsresult GetAsArray(uint16_t *type, nsIID *iid, uint32_t *count, void **ptr) = 0;


  virtual nsresult GetAsStringWithSize(uint32_t *size, char * *str) = 0;


  virtual nsresult GetAsWStringWithSize(uint32_t *size, char16_t * *str) = 0;

};

  template<typename T> struct nsIVariant::COMTypeInfo<nsIVariant, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIVariant::COMTypeInfo<nsIVariant, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x81e4c2de, 0xacac, 0x4ad6, { 0x90, 0x1a, 0xb5, 0xfb, 0x1b, 0x85, 0x1a, 0x0d }};
# 539 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIVariant.h"
class nsIWritableVariant : public nsIVariant {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetWritable(bool *aWritable) = 0;
  virtual nsresult SetWritable(bool aWritable) = 0;


  virtual nsresult SetAsInt8(uint8_t aValue) = 0;


  virtual nsresult SetAsInt16(int16_t aValue) = 0;


  virtual nsresult SetAsInt32(int32_t aValue) = 0;


  virtual nsresult SetAsInt64(int64_t aValue) = 0;


  virtual nsresult SetAsUint8(uint8_t aValue) = 0;


  virtual nsresult SetAsUint16(uint16_t aValue) = 0;


  virtual nsresult SetAsUint32(uint32_t aValue) = 0;


  virtual nsresult SetAsUint64(uint64_t aValue) = 0;


  virtual nsresult SetAsFloat(float aValue) = 0;


  virtual nsresult SetAsDouble(double aValue) = 0;


  virtual nsresult SetAsBool(bool aValue) = 0;


  virtual nsresult SetAsChar(char aValue) = 0;


  virtual nsresult SetAsWChar(char16_t aValue) = 0;


  virtual nsresult SetAsID(const nsID & aValue) = 0;


  virtual nsresult SetAsAString(const nsAString & aValue) = 0;


  virtual nsresult SetAsDOMString(const nsAString & aValue) = 0;


  virtual nsresult SetAsACString(const nsACString & aValue) = 0;


  virtual nsresult SetAsAUTF8String(const nsACString & aValue) = 0;


  virtual nsresult SetAsString(const char * aValue) = 0;


  virtual nsresult SetAsWString(const char16_t * aValue) = 0;


  virtual nsresult SetAsISupports(nsISupports *aValue) = 0;


  virtual nsresult SetAsInterface(const nsIID & iid, void *iface) = 0;


  virtual nsresult SetAsArray(uint16_t type, const nsIID *iid, uint32_t count, void *ptr) = 0;


  virtual nsresult SetAsStringWithSize(uint32_t size, const char * str) = 0;


  virtual nsresult SetAsWStringWithSize(uint32_t size, const char16_t * str) = 0;


  virtual nsresult SetAsVoid(void) = 0;


  virtual nsresult SetAsEmpty(void) = 0;


  virtual nsresult SetAsEmptyArray(void) = 0;


  virtual nsresult SetFromVariant(nsIVariant *aValue) = 0;

};

  template<typename T> struct nsIWritableVariant::COMTypeInfo<nsIWritableVariant, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIWritableVariant::COMTypeInfo<nsIWritableVariant, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x5586a590, 0x8c82, 0x11d5, { 0x90, 0xf3, 0x00, 0x10, 0xa4, 0xe7, 0x3d, 0x9a }};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeInfoManager.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeInfoManager.h"
class nsAString;
class nsBindingManager;
class nsIAtom;
class nsIDocument;
class nsIDOMDocumentType;
class nsIPrincipal;
struct PLHashEntry;
struct PLHashTable;
template<class T> struct already_AddRefed;

namespace mozilla {
namespace dom {
class NodeInfo;
}
}



class nsNodeInfoManager final
{
private:
  ~nsNodeInfoManager();

public:
  nsNodeInfoManager();

  void DeleteCycleCollectable(void) { delete this; } class cycleCollection : public nsCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = true) : nsCycleCollectionParticipant(true) {} private: public: virtual void Root(void *n) override; virtual void Unlink(void *n) override; virtual void Unroot(void *n) override; virtual nsresult TraverseNative(void *n, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "nsNodeInfoManager"; }; virtual void DeleteCycleCollectable(void *n) override { DowncastCCParticipant<nsNodeInfoManager>(n)->DeleteCycleCollectable(); } static nsNodeInfoManager* Downcast(void* s) { return DowncastCCParticipant<nsNodeInfoManager>(s); } static void* Upcast(nsNodeInfoManager *p) { return static_cast<void*>(p); } virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static nsCycleCollectionParticipant* GetParticipant() { return &nsNodeInfoManager::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsNodeInfoManager>::value, "Reference-counted class " "nsNodeInfoManager" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); nsrefcnt count = mRefCnt.incr(static_cast<void*>(this), nsNodeInfoManager::cycleCollection::GetParticipant()); ; return count; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); nsrefcnt count = mRefCnt.decr(static_cast<void*>(this), nsNodeInfoManager::cycleCollection::GetParticipant()); ; return count; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:




  nsresult Init(nsIDocument *aDocument);





  void DropDocumentReference();




  already_AddRefed<mozilla::dom::NodeInfo>
  GetNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, int32_t aNamespaceID,
              uint16_t aNodeType, nsIAtom* aExtraName = nullptr);
  nsresult GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix,
                       int32_t aNamespaceID, uint16_t aNodeType,
                       mozilla::dom::NodeInfo** aNodeInfo);
  nsresult GetNodeInfo(const nsAString& aName, nsIAtom *aPrefix,
                       const nsAString& aNamespaceURI, uint16_t aNodeType,
                       mozilla::dom::NodeInfo** aNodeInfo);




  already_AddRefed<mozilla::dom::NodeInfo> GetTextNodeInfo();




  already_AddRefed<mozilla::dom::NodeInfo> GetCommentNodeInfo();




  already_AddRefed<mozilla::dom::NodeInfo> GetDocumentNodeInfo();





  nsIDocument* GetDocument() const
  {
    return mDocument;
  }




  nsIPrincipal *DocumentPrincipal() const {
    do { } while(0);
    return mPrincipal;
  }

  void RemoveNodeInfo(mozilla::dom::NodeInfo *aNodeInfo);

  nsBindingManager* GetBindingManager() const
  {
    return mBindingManager;
  }

protected:
  friend class nsDocument;
  friend class nsXULPrototypeDocument;
  friend nsresult NS_NewDOMDocumentType(nsIDOMDocumentType** ,
                                        nsNodeInfoManager *,
                                        nsIAtom *,
                                        const nsAString& ,
                                        const nsAString& ,
                                        const nsAString& );




  void SetDocumentPrincipal(nsIPrincipal *aPrincipal);

private:
  static int NodeInfoInnerKeyCompare(const void *key1, const void *key2);
  static PLHashNumber GetNodeInfoInnerHashValue(const void *key);
  static int DropNodeInfoDocument(PLHashEntry *he, int hashIndex,
                                     void *arg);

  PLHashTable *mNodeInfoHash;
  nsIDocument * mDocument;
  uint32_t mNonDocumentNodeInfos;
  nsCOMPtr<nsIPrincipal> mPrincipal;
  nsCOMPtr<nsIPrincipal> mDefaultPrincipal;
  mozilla::dom::NodeInfo * mTextNodeInfo;
  mozilla::dom::NodeInfo * mCommentNodeInfo;
  mozilla::dom::NodeInfo * mDocumentNodeInfo;
  RefPtr<nsBindingManager> mBindingManager;
  mozilla::dom::NodeInfo* mRecentlyUsedNodeInfos[31];
};
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPropertyTable.h" 1
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPropertyTable.h"
class nsIAtom;

typedef void
(*NSPropertyFunc)(void *aObject,
                  nsIAtom *aPropertyName,
                  void *aPropertyValue,
                  void *aData);







typedef NSPropertyFunc NSPropertyDtorFunc;
class nsINode;
class nsIFrame;

class nsPropertyOwner
{
public:
  nsPropertyOwner(const nsPropertyOwner& aOther) : mObject(aOther.mObject) {}




               nsPropertyOwner(const nsINode* aObject) : mObject(aObject) {}
               nsPropertyOwner(const nsIFrame* aObject) : mObject(aObject) {}

  operator const void*() { return mObject; }
  const void* get() { return mObject; }

private:
  const void* mObject;
};

class nsPropertyTable
{
 public:




  void* GetProperty(const nsPropertyOwner& aObject,
                    nsIAtom *aPropertyName,
                    nsresult *aResult = nullptr)
  {
    return GetPropertyInternal(aObject, aPropertyName, false, aResult);
  }
# 95 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPropertyTable.h"
  nsresult SetProperty(const nsPropertyOwner& aObject,
                                   nsIAtom *aPropertyName,
                                   void *aPropertyValue,
                                   NSPropertyDtorFunc aDtor,
                                   void *aDtorData,
                                   bool aTransfer = false,
                                   void **aOldValue = nullptr)
  {
    return SetPropertyInternal(aObject, aPropertyName, aPropertyValue,
                               aDtor, aDtorData, aTransfer, aOldValue);
  }





  nsresult DeleteProperty(nsPropertyOwner aObject,
                                      nsIAtom *aPropertyName);






  void* UnsetProperty(const nsPropertyOwner& aObject,
                      nsIAtom *aPropertyName,
                      nsresult *aStatus = nullptr)
  {
    return GetPropertyInternal(aObject, aPropertyName, true, aStatus);
  }





  void DeleteAllPropertiesFor(nsPropertyOwner aObject);
# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPropertyTable.h"
  nsresult
    TransferOrDeleteAllPropertiesFor(nsPropertyOwner aObject,
                                     nsPropertyTable *aOtherTable);






  void Enumerate(nsPropertyOwner aObject,
                             NSPropertyFunc aCallback, void *aData);






  void EnumerateAll(NSPropertyFunc aCallback, void *aData);





  void DeleteAllProperties();

  nsPropertyTable() : mPropertyList(nullptr) {}
  ~nsPropertyTable() {
    DeleteAllProperties();
  }






  static void SupportsDtorFunc(void *aObject, nsIAtom *aPropertyName,
                               void *aPropertyValue, void *aData);

  class PropertyList;

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

 private:
  void DestroyPropertyList();
  PropertyList* GetPropertyListFor(nsIAtom *aPropertyName) const;
  void* GetPropertyInternal(nsPropertyOwner aObject,
                                        nsIAtom *aPropertyName,
                                        bool aRemove,
                                        nsresult *aStatus);
  nsresult SetPropertyInternal(nsPropertyOwner aObject,
                                           nsIAtom *aPropertyName,
                                           void *aPropertyValue,
                                           NSPropertyDtorFunc aDtor,
                                           void *aDtorData,
                                           bool aTransfer,
                                           void **aOldValue);

  PropertyList *mPropertyList;
};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTObserverArray.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTObserverArray.h"
class nsTObserverArray_base
{
public:
  typedef size_t index_type;
  typedef size_t size_type;
  typedef ptrdiff_t diff_type;

protected:
  class Iterator_base
  {
  protected:
    friend class nsTObserverArray_base;

    Iterator_base(index_type aPosition, Iterator_base* aNext)
      : mPosition(aPosition)
      , mNext(aNext)
    {
    }



    index_type mPosition;


    Iterator_base* mNext;
  };

  nsTObserverArray_base() : mIterators(nullptr) {}

  ~nsTObserverArray_base()
  {
    do { } while(0);
  }
# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTObserverArray.h"
  void AdjustIterators(index_type aModPos, diff_type aAdjustment);




  void ClearIterators();

  mutable Iterator_base* mIterators;
};

template<class T, size_t N>
class nsAutoTObserverArray : protected nsTObserverArray_base
{
public:
  typedef T elem_type;
  typedef nsTArray<T> array_type;

  nsAutoTObserverArray() {}






  size_type Length() const { return mArray.Length(); }


  bool IsEmpty() const { return mArray.IsEmpty(); }






  elem_type& ElementAt(index_type aIndex)
  {
    return mArray.ElementAt(aIndex);
  }


  const elem_type& ElementAt(index_type aIndex) const
  {
    return mArray.ElementAt(aIndex);
  }






  elem_type& SafeElementAt(index_type aIndex, elem_type& aDef)
  {
    return mArray.SafeElementAt(aIndex, aDef);
  }


  const elem_type& SafeElementAt(index_type aIndex, const elem_type& aDef) const
  {
    return mArray.SafeElementAt(aIndex, aDef);
  }
# 141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTObserverArray.h"
  template<class Item>
  bool Contains(const Item& aItem) const
  {
    return IndexOf(aItem) != array_type::NoIndex;
  }







  template<class Item>
  index_type IndexOf(const Item& aItem, index_type aStart = 0) const
  {
    return mArray.IndexOf(aItem, aStart);
  }
# 167 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTObserverArray.h"
  template<class Item>
  elem_type* InsertElementAt(index_type aIndex, const Item& aItem)
  {
    elem_type* item = mArray.InsertElementAt(aIndex, aItem);
    AdjustIterators(aIndex, 1);
    return item;
  }



  elem_type* InsertElementAt(index_type aIndex)
  {
    elem_type* item = mArray.InsertElementAt(aIndex);
    AdjustIterators(aIndex, 1);
    return item;
  }





  template<class Item>
  bool PrependElementUnlessExists(const Item& aItem)
  {
    if (Contains(aItem)) {
      return true;
    }

    bool inserted = mArray.InsertElementAt(0, aItem) != nullptr;
    AdjustIterators(0, 1);
    return inserted;
  }




  template<class Item>
  elem_type* AppendElement(const Item& aItem)
  {
    return mArray.AppendElement(aItem);
  }



  elem_type* AppendElement()
  {
    return mArray.AppendElement();
  }





  template<class Item>
  bool AppendElementUnlessExists(const Item& aItem)
  {
    return Contains(aItem) || AppendElement(aItem) != nullptr;
  }



  void RemoveElementAt(index_type aIndex)
  {
    do { } while(0);
    mArray.RemoveElementAt(aIndex);
    AdjustIterators(aIndex, -1);
  }






  template<class Item>
  bool RemoveElement(const Item& aItem)
  {
    index_type index = mArray.IndexOf(aItem, 0);
    if (index == array_type::NoIndex) {
      return false;
    }

    mArray.RemoveElementAt(index);
    AdjustIterators(index, -1);
    return true;
  }


  void RemoveElementsBy(std::function<bool(const elem_type&)> aPredicate)
  {
    index_type i = 0;
    mArray.RemoveElementsBy([&](const elem_type& aItem) {
      if (aPredicate(aItem)) {

        AdjustIterators(i, -1);
        return true;
      }
      ++i;
      return false;
    });
  }




  void Clear()
  {
    mArray.Clear();
    ClearIterators();
  }


  void Compact() { mArray.Compact(); }





  size_t ShallowSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    return mArray.ShallowSizeOfExcludingThis(aMallocSizeOf);
  }






  class Iterator : public Iterator_base
  {
  protected:
    friend class nsAutoTObserverArray;
    typedef nsAutoTObserverArray<T, N> array_type;

    Iterator(index_type aPosition, const array_type& aArray)
      : Iterator_base(aPosition, aArray.mIterators)
      , mArray(const_cast<array_type&>(aArray))
    {
      aArray.mIterators = this;
    }

    ~Iterator()
    {
      do { } while(0);



      mArray.mIterators = mNext;
    }


    array_type& mArray;
  };
# 327 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTObserverArray.h"
  class ForwardIterator : protected Iterator
  {
  public:
    typedef nsAutoTObserverArray<T, N> array_type;
    typedef Iterator base_type;

    explicit ForwardIterator(const array_type& aArray)
      : Iterator(0, aArray)
    {
    }

    ForwardIterator(const array_type& aArray, index_type aPos)
      : Iterator(aPos, aArray)
    {
    }

    bool operator<(const ForwardIterator& aOther) const
    {
      do { } while(0);

      return base_type::mPosition < aOther.mPosition;
    }




    bool HasMore() const
    {
      return base_type::mPosition < base_type::mArray.Length();
    }




    elem_type& GetNext()
    {
      do { } while(0);
      return base_type::mArray.ElementAt(base_type::mPosition++);
    }
  };



  class EndLimitedIterator : protected ForwardIterator
  {
  public:
    typedef nsAutoTObserverArray<T, N> array_type;
    typedef Iterator base_type;

    explicit EndLimitedIterator(const array_type& aArray)
      : ForwardIterator(aArray)
      , mEnd(aArray, aArray.Length())
    {
    }




    bool HasMore() const { return *this < mEnd; }




    elem_type& GetNext()
    {
      do { } while(0);
      return base_type::mArray.ElementAt(base_type::mPosition++);
    }

  private:
    ForwardIterator mEnd;
  };
# 407 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsTObserverArray.h"
  class BackwardIterator : protected Iterator
  {
  public:
    typedef nsAutoTObserverArray<T, N> array_type;
    typedef Iterator base_type;

    explicit BackwardIterator(const array_type& aArray)
      : Iterator(aArray.Length(), aArray)
    {
    }




    bool HasMore() const { return base_type::mPosition > 0; }




    elem_type& GetNext()
    {
      do { } while(0);
      return base_type::mArray.ElementAt(--base_type::mPosition);
    }




    void Remove()
    {
      return base_type::mArray.RemoveElementAt(base_type::mPosition);
    }
  };

protected:
  AutoTArray<T, N> mArray;
};

template<class T>
class nsTObserverArray : public nsAutoTObserverArray<T, 0>
{
public:
  typedef nsAutoTObserverArray<T, 0> base_type;
  typedef nsTObserverArray_base::size_type size_type;





  nsTObserverArray() {}


  explicit nsTObserverArray(size_type aCapacity)
  {
    base_type::mArray.SetCapacity(aCapacity);
  }
};

template<typename T, size_t N>
inline void
ImplCycleCollectionUnlink(nsAutoTObserverArray<T, N>& aField)
{
  aField.Clear();
}

template<typename T, size_t N>
inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            nsAutoTObserverArray<T, N>& aField,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  aFlags |= CycleCollectionEdgeNameArrayFlag;
  size_t length = aField.Length();
  for (size_t i = 0; i < length; ++i) {
    ImplCycleCollectionTraverse(aCallback, aField.ElementAt(i), aName, aFlags);
  }
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 2
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
class nsAttrAndChildArray;
class nsChildContentList;
struct nsCSSSelectorList;
class nsDOMAttributeMap;
class nsIAnimationObserver;
class nsIContent;
class nsIDocument;
class nsIDOMElement;
class nsIDOMNodeList;
class nsIEditor;
class nsIFrame;
class nsIMutationObserver;
class nsINode;
class nsINodeList;
class nsIPresShell;
class nsIPrincipal;
class nsIURI;
class nsNodeSupportsWeakRefTearoff;
class nsNodeWeakReference;
class nsDOMMutationObserver;

namespace mozilla {
class EventListenerManager;
namespace dom {




inline bool IsSpaceCharacter(char16_t aChar) {
  return aChar == ' ' || aChar == '\t' || aChar == '\n' || aChar == '\r' ||
         aChar == '\f';
}
inline bool IsSpaceCharacter(char aChar) {
  return aChar == ' ' || aChar == '\t' || aChar == '\n' || aChar == '\r' ||
         aChar == '\f';
}
class AccessibleNode;
struct BoxQuadOptions;
struct ConvertCoordinateOptions;
class DOMPoint;
class DOMQuad;
class DOMRectReadOnly;
class Element;
class EventHandlerNonNull;
template<typename T> class Optional;
class OwningNodeOrString;
template<typename> class Sequence;
class Text;
class TextOrElementOrDocument;
struct DOMPointInit;
struct GetRootNodeOptions;
enum class CallerType : uint32_t;
}
}




enum {

  NODE_HAS_LISTENERMANAGER = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (0))),


  NODE_HAS_PROPERTIES = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (1))),






  NODE_IS_ANONYMOUS_ROOT = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (2))),







  NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (3))),





  NODE_IS_NATIVE_ANONYMOUS_ROOT = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (4))),



  NODE_FORCE_XBL_BINDINGS = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (5))),


  NODE_MAY_BE_IN_BINDING_MNGR = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (6))),

  NODE_IS_EDITABLE = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (7))),
# 151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  NODE_IS_NATIVE_ANONYMOUS = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (8))),


  NODE_IS_IN_SHADOW_TREE = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (9))),


  NODE_HAS_EMPTY_SELECTOR = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (10))),



  NODE_HAS_SLOW_SELECTOR = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (11))),



  NODE_HAS_EDGE_CHILD_SELECTOR = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (12))),
# 174 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (13))),

  NODE_ALL_SELECTOR_FLAGS = NODE_HAS_EMPTY_SELECTOR |
                                          NODE_HAS_SLOW_SELECTOR |
                                          NODE_HAS_EDGE_CHILD_SELECTOR |
                                          NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS,



  NODE_NEEDS_FRAME = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (14))),




  NODE_DESCENDANTS_NEED_FRAMES = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (15))),


  NODE_HAS_ACCESSKEY = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (16))),


  NODE_HAS_DIRECTION_RTL = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (17))),


  NODE_HAS_DIRECTION_LTR = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (18))),

  NODE_ALL_DIRECTION_FLAGS = NODE_HAS_DIRECTION_LTR |
                                          NODE_HAS_DIRECTION_RTL,

  NODE_CHROME_ONLY_ACCESS = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (19))),

  NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (20))),






  NODE_SHARED_RESTYLE_BIT_1 = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (21))),
  NODE_SHARED_RESTYLE_BIT_2 = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (22))),


  NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO = NODE_SHARED_RESTYLE_BIT_1,



  NODE_HAS_ANIMATION_ONLY_DIRTY_DESCENDANTS_FOR_SERVO =
    NODE_SHARED_RESTYLE_BIT_2,


  NODE_TYPE_SPECIFIC_BITS_OFFSET = 23
};






static_assert(WRAPPER_CACHE_FLAGS_BITS_USED + (NODE_TYPE_SPECIFIC_BITS_OFFSET) <= sizeof(nsWrapperCache::FlagsType) * 8, "Not enough space for our bits");







class nsMutationGuard {
public:
  nsMutationGuard()
  {
    mStartingGeneration = sGeneration;
  }
# 258 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  bool Mutated(uint8_t aIgnoreCount)
  {
    return (sGeneration - mStartingGeneration) > aIgnoreCount;
  }




  static void DidMutate()
  {
    sGeneration++;
  }

private:

  uint64_t mStartingGeneration;


  static uint64_t sGeneration;
};
# 301 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
class nsINode : public mozilla::dom::EventTarget
{
public:
  typedef mozilla::dom::BoxQuadOptions BoxQuadOptions;
  typedef mozilla::dom::ConvertCoordinateOptions ConvertCoordinateOptions;
  typedef mozilla::dom::DOMPoint DOMPoint;
  typedef mozilla::dom::DOMPointInit DOMPointInit;
  typedef mozilla::dom::DOMQuad DOMQuad;
  typedef mozilla::dom::DOMRectReadOnly DOMRectReadOnly;
  typedef mozilla::dom::OwningNodeOrString OwningNodeOrString;
  typedef mozilla::dom::TextOrElementOrDocument TextOrElementOrDocument;
  typedef mozilla::dom::CallerType CallerType;
  typedef mozilla::ErrorResult ErrorResult;

  template<class T>
  using Sequence = mozilla::dom::Sequence<T>;

  template<typename T, typename U> struct COMTypeInfo;
# 343 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;






  virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
    return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
  }

  friend class nsNodeUtils;
  friend class nsNodeWeakReference;
  friend class nsNodeSupportsWeakRefTearoff;
  friend class nsAttrAndChildArray;


  explicit nsINode(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
  : mNodeInfo(aNodeInfo)
  , mParent(nullptr)
  , mBoolFlags(0)
  , mNextSibling(nullptr)
  , mPreviousSibling(nullptr)
  , mFirstChild(nullptr)
  , mSubtreeRoot(this)
  , mSlots(nullptr)
  {
  }


  virtual ~nsINode();




  enum {

    eCONTENT = 1 << 0,

    eDOCUMENT = 1 << 1,

    eATTRIBUTE = 1 << 2,

    eTEXT = 1 << 3,

    ePROCESSING_INSTRUCTION = 1 << 4,

    eCOMMENT = 1 << 5,

    eHTML_FORM_CONTROL = 1 << 6,

    eDOCUMENT_FRAGMENT = 1 << 7,


    eDATA_NODE = 1 << 8,

    eMEDIA = 1 << 9,

    eANIMATION = 1 << 10,

    eFILTER = 1 << 11
  };
# 414 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual bool IsNodeOfType(uint32_t aFlags) const = 0;

  virtual JSObject* WrapObject(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) override;





  static bool HasBoxQuadsSupport(JSContext* aCx, JSObject* );

protected:
# 434 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual JSObject* WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) = 0;

public:
  mozilla::dom::ParentObject GetParentObject() const;






  virtual nsINode* GetScopeChainParent() const;




  bool IsElement() const {
    return GetBoolFlag(NodeIsElement);
  }





  mozilla::dom::Element* AsElement();
  const mozilla::dom::Element* AsElement() const;





  nsIContent* AsContent();
  const nsIContent* AsContent() const
  {
    return const_cast<nsINode*>(this)->AsContent();
  }





  mozilla::dom::Text* GetAsText();
  const mozilla::dom::Text* GetAsText() const;

  virtual nsIDOMNode* AsDOMNode() = 0;




  bool HasChildren() const { return !!mFirstChild; }





  virtual uint32_t GetChildCount() const = 0;






  virtual nsIContent* GetChildAt(uint32_t aIndex) const = 0;
# 506 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const = 0;
# 516 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual int32_t IndexOf(const nsINode* aPossibleChild) const = 0;
# 532 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsIDocument *OwnerDoc() const
  {
    return mNodeInfo->GetDocument();
  }





  nsINode *OwnerDocAsNode() const;






  bool IsInUncomposedDoc() const
  {
    return GetBoolFlag(IsInDocument);
  }
# 560 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsIDocument* GetUncomposedDoc() const
  {
    return IsInUncomposedDoc() ? OwnerDoc() : nullptr;
  }






  nsIDocument* GetComposedDoc() const
  {
    return IsInShadowTree() ?
      GetComposedDocInternal() : GetUncomposedDoc();
  }




  bool IsInComposedDoc() const
  {
    return IsInUncomposedDoc() || (IsInShadowTree() && GetComposedDocInternal());
  }





  uint16_t NodeType() const
  {
    return mNodeInfo->NodeType();
  }
  const nsString& NodeName() const
  {
    return mNodeInfo->NodeName();
  }
  const nsString& LocalName() const
  {
    return mNodeInfo->LocalName();
  }





  inline mozilla::dom::NodeInfo* NodeInfo() const
  {
    return mNodeInfo;
  }

  inline bool IsInNamespace(int32_t aNamespace) const
  {
    return mNodeInfo->NamespaceID() == aNamespace;
  }





  friend std::ostream& operator<<(std::ostream& aStream, const nsINode& aNode);

protected:


  inline bool IsNodeInternal() const
  {
    return false;
  }

  template<typename First, typename... Args>
  inline bool IsNodeInternal(First aFirst, Args... aArgs) const
  {
    return mNodeInfo->Equals(aFirst) || IsNodeInternal(aArgs...);
  }

public:
  inline bool IsHTMLElement() const
  {
    return IsElement() && IsInNamespace(3);
  }

  inline bool IsHTMLElement(nsIAtom* aTag) const
  {
    return IsElement() && mNodeInfo->Equals(aTag, 3);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfHTMLElements(First aFirst, Args... aArgs) const
  {
    return IsHTMLElement() && IsNodeInternal(aFirst, aArgs...);
  }

  inline bool IsSVGElement() const
  {
    return IsElement() && IsInNamespace(10);
  }

  inline bool IsSVGElement(nsIAtom* aTag) const
  {
    return IsElement() && mNodeInfo->Equals(aTag, 10);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfSVGElements(First aFirst, Args... aArgs) const
  {
    return IsSVGElement() && IsNodeInternal(aFirst, aArgs...);
  }

  inline bool IsXULElement() const
  {
    return IsElement() && IsInNamespace(9);
  }

  inline bool IsXULElement(nsIAtom* aTag) const
  {
    return IsElement() && mNodeInfo->Equals(aTag, 9);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfXULElements(First aFirst, Args... aArgs) const
  {
    return IsXULElement() && IsNodeInternal(aFirst, aArgs...);
  }

  inline bool IsMathMLElement() const
  {
    return IsElement() && IsInNamespace(7);
  }

  inline bool IsMathMLElement(nsIAtom* aTag) const
  {
    return IsElement() && mNodeInfo->Equals(aTag, 7);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfMathMLElements(First aFirst, Args... aArgs) const
  {
    return IsMathMLElement() && IsNodeInternal(aFirst, aArgs...);
  }
# 720 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual nsresult InsertChildAt(nsIContent* aKid, uint32_t aIndex,
                                 bool aNotify) = 0;
# 741 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsresult AppendChildTo(nsIContent* aKid, bool aNotify)
  {
    return InsertChildAt(aKid, GetChildCount(), aNotify);
  }
# 757 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) = 0;
# 770 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void* GetProperty(nsIAtom *aPropertyName,
                    nsresult *aStatus = nullptr) const
  {
    return GetProperty(0, aPropertyName, aStatus);
  }
# 788 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void* GetProperty(uint16_t aCategory, nsIAtom *aPropertyName,
                    nsresult *aStatus = nullptr) const;
# 808 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsresult SetProperty(nsIAtom *aPropertyName, void *aValue,
                       NSPropertyDtorFunc aDtor = nullptr,
                       bool aTransfer = false)
  {
    return SetProperty(0, aPropertyName, aValue, aDtor, aTransfer);
  }
# 834 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsresult SetProperty(uint16_t aCategory,
                       nsIAtom *aPropertyName, void *aValue,
                       NSPropertyDtorFunc aDtor = nullptr,
                       bool aTransfer = false,
                       void **aOldValue = nullptr);




  template<class T>
  static void DeleteProperty(void *, nsIAtom *, void *aPropertyValue, void *)
  {
    delete static_cast<T *>(aPropertyValue);
  }







  void DeleteProperty(nsIAtom *aPropertyName)
  {
    DeleteProperty(0, aPropertyName);
  }
# 867 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void DeleteProperty(uint16_t aCategory, nsIAtom *aPropertyName);
# 882 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void* UnsetProperty(nsIAtom *aPropertyName,
                      nsresult *aStatus = nullptr)
  {
    return UnsetProperty(0, aPropertyName, aStatus);
  }
# 902 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void* UnsetProperty(uint16_t aCategory, nsIAtom *aPropertyName,
                      nsresult *aStatus = nullptr);

  bool HasProperties() const
  {
    return HasFlag(NODE_HAS_PROPERTIES);
  }





  nsIPrincipal* NodePrincipal() const {
    return mNodeInfo->NodeInfoManager()->DocumentPrincipal();
  }





  nsIContent* GetParent() const {
    return (__builtin_expect(!!(GetBoolFlag(ParentIsContent)), 1)) ?
      reinterpret_cast<nsIContent*>(mParent) : nullptr;
  }






  nsINode* GetParentNode() const
  {
    return mParent;
  }
# 945 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  inline nsINode* GetFlattenedTreeParentNode() const;







  inline nsINode* GetFlattenedTreeParentNodeForStyle() const;





  mozilla::dom::Element* GetParentElement() const
  {
    return mParent && mParent->IsElement() ? mParent->AsElement() : nullptr;
  }





  mozilla::dom::Element* GetParentElementCrossingShadowRoot() const;






  nsINode* SubtreeRoot() const;





  nsINode* GetRootNode(const mozilla::dom::GetRootNodeOptions& aOptions);




  virtual nsresult AddEventListener(const nsAString & type, nsIDOMEventListener *listener, bool useCapture, bool wantsUntrusted, uint8_t _argc) override; virtual nsresult AddSystemEventListener(const nsAString & type, nsIDOMEventListener *listener, bool aUseCapture, bool aWantsUntrusted, uint8_t _argc) override; virtual nsresult RemoveEventListener(const nsAString & type, nsIDOMEventListener *listener, bool useCapture) override; virtual nsresult RemoveSystemEventListener(const nsAString & type, nsIDOMEventListener *listener, bool aUseCapture) override; virtual nsresult DispatchEvent(nsIDOMEvent *evt, bool *_retval) override; virtual mozilla::dom::EventTarget * GetTargetForDOMEvent(void) override; virtual mozilla::dom::EventTarget * GetTargetForEventTargetChain(void) override; virtual nsresult GetEventTargetParent(mozilla::EventChainPreVisitor & aVisitor) override; virtual nsresult WillHandleEvent(mozilla::EventChainPostVisitor & aVisitor) override; virtual nsresult PostHandleEvent(mozilla::EventChainPostVisitor & aVisitor) override; virtual nsresult DispatchDOMEvent(mozilla::WidgetEvent *aEvent, nsIDOMEvent *aDOMEvent, nsPresContext *aPresContext, nsEventStatus *aEventStatus) override; virtual nsIScriptContext * GetContextForEventHandlers(nsresult *aRv) override;

  virtual mozilla::EventListenerManager*
    GetExistingListenerManager() const override;
  virtual mozilla::EventListenerManager*
    GetOrCreateListenerManager() override;

  using mozilla::dom::EventTarget::RemoveEventListener;
  using nsIDOMEventTarget::AddEventListener;
  virtual void AddEventListener(const nsAString& aType,
                                mozilla::dom::EventListener* aListener,
                                const mozilla::dom::AddEventListenerOptionsOrBoolean& aOptions,
                                const mozilla::dom::Nullable<bool>& aWantsUntrusted,
                                mozilla::ErrorResult& aRv) override;
  using nsIDOMEventTarget::AddSystemEventListener;

  virtual bool IsApzAware() const override;

  virtual nsPIDOMWindowOuter* GetOwnerGlobalForBindings() override;
  virtual nsIGlobalObject* GetOwnerGlobal() const override;






  bool IsStyledByServo() const;




  inline void UnsetRestyleFlagsIfGecko();
# 1032 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void AddMutationObserver(nsIMutationObserver* aMutationObserver)
  {
    nsSlots* s = Slots();
    do { } while(0);


    s->mMutationObservers.AppendElement(aMutationObserver);
  }
# 1048 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void AddMutationObserverUnlessExists(nsIMutationObserver* aMutationObserver)
  {
    nsSlots* s = Slots();
    s->mMutationObservers.AppendElementUnlessExists(aMutationObserver);
  }







  void AddAnimationObserver(nsIAnimationObserver* aAnimationObserver);





  void AddAnimationObserverUnlessExists(nsIAnimationObserver* aAnimationObserver);




  void RemoveMutationObserver(nsIMutationObserver* aMutationObserver)
  {
    nsSlots* s = GetExistingSlots();
    if (s) {
      s->mMutationObservers.RemoveElement(aMutationObserver);
    }
  }
# 1088 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const = 0;



  class nsSlots
  {
  public:
    nsSlots();



    virtual ~nsSlots();

    void Traverse(nsCycleCollectionTraversalCallback &cb);
    void Unlink();




    nsTObserverArray<nsIMutationObserver*> mMutationObservers;






    RefPtr<nsChildContentList> mChildNodes;





    nsNodeWeakReference* mWeakReference;





    uint32_t mEditableDescendantCount;
  };
# 1139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void SetFlags(FlagsType aFlagsToSet)
  {
    do { } while(0);







    nsWrapperCache::SetFlags(aFlagsToSet);
  }

  void UnsetFlags(FlagsType aFlagsToUnset)
  {
    do { } while(0);




    nsWrapperCache::UnsetFlags(aFlagsToUnset);
  }

  void ChangeEditableDescendantCount(int32_t aDelta);





  uint32_t EditableDescendantCount();







  void ResetEditableDescendantCount();

  void SetEditableFlag(bool aEditable)
  {
    if (aEditable) {
      SetFlags(NODE_IS_EDITABLE);
    }
    else {
      UnsetFlags(NODE_IS_EDITABLE);
    }
  }

  bool IsEditable() const
  {

    return IsEditableInternal();



  }





  bool IsNativeAnonymous() const
  {
    return HasFlag(NODE_IS_NATIVE_ANONYMOUS);
  }




  bool IsInNativeAnonymousSubtree() const
  {







    return HasFlag(NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE);

  }

  bool IsInAnonymousSubtree() const;


  bool IsAnonymousContentInSVGUseSubtree() const;



  bool ChromeOnlyAccess() const
  {
    return HasFlag(NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE | NODE_CHROME_ONLY_ACCESS);
  }

  bool IsInShadowTree() const
  {
    return HasFlag(NODE_IS_IN_SHADOW_TREE);
  }







  bool IsSelectionDescendant() const
  {
    return IsDescendantOfCommonAncestorForRangeInSelection() ||
           IsCommonAncestorForRangeInSelection();
  }






  nsIContent* GetTextEditorRootContent(nsIEditor** aEditor = nullptr);
# 1266 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsIContent* GetSelectionRootContent(nsIPresShell* aPresShell);

  virtual nsINodeList* ChildNodes();
  nsIContent* GetFirstChild() const { return mFirstChild; }
  nsIContent* GetLastChild() const
  {
    uint32_t count;
    nsIContent* const* children = GetChildArray(&count);

    return count > 0 ? children[count - 1] : nullptr;
  }





  nsIDocument* GetOwnerDocument() const;

  void Normalize();
# 1294 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const = 0;
  already_AddRefed<nsIURI> GetBaseURIObject() const;
# 1305 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  bool IsNodeApzAware() const
  {
    return NodeMayBeApzAware() ? IsNodeApzAwareInternal() : false;
  }
# 1318 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  virtual bool IsNodeApzAwareInternal() const;



  virtual bool IsHTMLShadowElement() const { return false; }



  virtual bool IsHTMLContentElement() const { return false; }

  void GetTextContent(nsAString& aTextContent,
                      mozilla::OOMReporter& aError)
  {
    GetTextContentInternal(aTextContent, aError);
  }
  void SetTextContent(const nsAString& aTextContent,
                      mozilla::ErrorResult& aError)
  {
    SetTextContentInternal(aTextContent, aError);
  }

  mozilla::dom::Element* QuerySelector(const nsAString& aSelector,
                                       mozilla::ErrorResult& aResult);
  already_AddRefed<nsINodeList> QuerySelectorAll(const nsAString& aSelector,
                                                 mozilla::ErrorResult& aResult);

protected:


  mozilla::dom::Element* GetElementById(const nsAString& aId);
# 1361 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsresult SetUserData(const nsAString& aKey, nsIVariant* aData,
                       nsIVariant** aResult);
# 1372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsIVariant* GetUserData(const nsAString& aKey);

public:
  void LookupPrefix(const nsAString& aNamespace, nsAString& aResult);
  bool IsDefaultNamespace(const nsAString& aNamespaceURI)
  {
    nsAutoString defaultNamespace;
    LookupNamespaceURI(EmptyString(), defaultNamespace);
    return aNamespaceURI.Equals(defaultNamespace);
  }
  void LookupNamespaceURI(const nsAString& aNamespacePrefix,
                          nsAString& aNamespaceURI);

  nsIContent* GetNextSibling() const { return mNextSibling; }
  nsIContent* GetPreviousSibling() const { return mPreviousSibling; }
# 1395 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsIContent* GetNextNode(const nsINode* aRoot = nullptr) const
  {
    return GetNextNodeImpl(aRoot, false);
  }
# 1407 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsIContent* GetNextNonChildNode(const nsINode* aRoot = nullptr) const
  {
    return GetNextNodeImpl(aRoot, true);
  }






  bool Contains(const nsINode* aOther) const;

  bool UnoptimizableCCNode() const;

private:

  nsIDocument* GetComposedDocInternal() const;

  nsIContent* GetNextNodeImpl(const nsINode* aRoot,
                              const bool aSkipChildren) const
  {
# 1438 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
    if (!aSkipChildren) {
      nsIContent* kid = GetFirstChild();
      if (kid) {
        return kid;
      }
    }
    if (this == aRoot) {
      return nullptr;
    }
    const nsINode* cur = this;
    while (1) {
      nsIContent* next = cur->GetNextSibling();
      if (next) {
        return next;
      }
      nsINode* parent = cur->GetParentNode();
      if (parent == aRoot) {
        return nullptr;
      }
      cur = parent;
    }
    do { } while(0);
  }

public:
# 1471 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsIContent* GetPreviousContent(const nsINode* aRoot = nullptr) const
  {
# 1484 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
    if (this == aRoot) {
      return nullptr;
    }
    nsIContent* cur = this->GetParent();
    nsIContent* iter = this->GetPreviousSibling();
    while (iter) {
      cur = iter;
      iter = reinterpret_cast<nsINode*>(iter)->GetLastChild();
    }
    return cur;
  }




private:
  enum BooleanFlag {

    NodeHasRenderingObservers,


    IsInDocument,

    ParentIsContent,

    NodeIsElement,



    ElementHasID,

    ElementMayHaveClass,

    ElementMayHaveStyle,

    ElementHasName,

    ElementMayHaveContentEditableAttr,


    NodeIsCommonAncestorForRangeInSelection,

    NodeIsDescendantOfCommonAncestorForRangeInSelection,

    NodeIsCCMarkedRoot,

    NodeIsCCBlackTree,


    NodeIsPurpleRoot,

    ElementHasLockedStyleStates,

    ElementHasPointerLock,

    NodeMayHaveDOMMutationObserver,

    NodeIsContent,

    ElementHasAnimations,

    NodeHasValidDirAttribute,

    NodeHasFixedDir,


    NodeHasDirAutoSet,



    NodeHasTextNodeDirectionalityMap,

    NodeHasDirAuto,

    NodeAncestorHasDirAuto,


    ElementIsInStyleScope,

    ElementIsScopedStyleRoot,

    NodeHandlingClick,

    NodeHasRelevantHoverRules,


    ElementHasWeirdParserInsertionMode,

    ParserHasNotified,

    MayBeApzAware,

    BooleanFlagCount
  };

  void SetBoolFlag(BooleanFlag name, bool value) {
    static_assert(BooleanFlagCount <= 8*sizeof(mBoolFlags),
                  "Too many boolean flags");
    mBoolFlags = (mBoolFlags & ~(1 << name)) | (value << name);
  }

  void SetBoolFlag(BooleanFlag name) {
    static_assert(BooleanFlagCount <= 8*sizeof(mBoolFlags),
                  "Too many boolean flags");
    mBoolFlags |= (1 << name);
  }

  void ClearBoolFlag(BooleanFlag name) {
    static_assert(BooleanFlagCount <= 8*sizeof(mBoolFlags),
                  "Too many boolean flags");
    mBoolFlags &= ~(1 << name);
  }

  bool GetBoolFlag(BooleanFlag name) const {
    static_assert(BooleanFlagCount <= 8*sizeof(mBoolFlags),
                  "Too many boolean flags");
    return mBoolFlags & (1 << name);
  }

public:
  bool HasRenderingObservers() const
    { return GetBoolFlag(NodeHasRenderingObservers); }
  void SetHasRenderingObservers(bool aValue)
    { SetBoolFlag(NodeHasRenderingObservers, aValue); }
  bool IsContent() const { return GetBoolFlag(NodeIsContent); }
  bool HasID() const { return GetBoolFlag(ElementHasID); }
  bool MayHaveClass() const { return GetBoolFlag(ElementMayHaveClass); }
  void SetMayHaveClass() { SetBoolFlag(ElementMayHaveClass); }
  bool MayHaveStyle() const { return GetBoolFlag(ElementMayHaveStyle); }
  bool HasName() const { return GetBoolFlag(ElementHasName); }
  bool MayHaveContentEditableAttr() const
    { return GetBoolFlag(ElementMayHaveContentEditableAttr); }
  bool IsCommonAncestorForRangeInSelection() const
    { return GetBoolFlag(NodeIsCommonAncestorForRangeInSelection); }
  void SetCommonAncestorForRangeInSelection()
    { SetBoolFlag(NodeIsCommonAncestorForRangeInSelection); }
  void ClearCommonAncestorForRangeInSelection()
    { ClearBoolFlag(NodeIsCommonAncestorForRangeInSelection); }
  bool IsDescendantOfCommonAncestorForRangeInSelection() const
    { return GetBoolFlag(NodeIsDescendantOfCommonAncestorForRangeInSelection); }
  void SetDescendantOfCommonAncestorForRangeInSelection()
    { SetBoolFlag(NodeIsDescendantOfCommonAncestorForRangeInSelection); }
  void ClearDescendantOfCommonAncestorForRangeInSelection()
    { ClearBoolFlag(NodeIsDescendantOfCommonAncestorForRangeInSelection); }

  void SetCCMarkedRoot(bool aValue)
    { SetBoolFlag(NodeIsCCMarkedRoot, aValue); }
  bool CCMarkedRoot() const { return GetBoolFlag(NodeIsCCMarkedRoot); }
  void SetInCCBlackTree(bool aValue)
    { SetBoolFlag(NodeIsCCBlackTree, aValue); }
  bool InCCBlackTree() const { return GetBoolFlag(NodeIsCCBlackTree); }
  void SetIsPurpleRoot(bool aValue)
    { SetBoolFlag(NodeIsPurpleRoot, aValue); }
  bool IsPurpleRoot() const { return GetBoolFlag(NodeIsPurpleRoot); }
  bool MayHaveDOMMutationObserver()
    { return GetBoolFlag(NodeMayHaveDOMMutationObserver); }
  void SetMayHaveDOMMutationObserver()
    { SetBoolFlag(NodeMayHaveDOMMutationObserver, true); }
  bool HasListenerManager() { return HasFlag(NODE_HAS_LISTENERMANAGER); }
  bool HasPointerLock() const { return GetBoolFlag(ElementHasPointerLock); }
  void SetPointerLock() { SetBoolFlag(ElementHasPointerLock); }
  void ClearPointerLock() { ClearBoolFlag(ElementHasPointerLock); }
  bool MayHaveAnimations() const { return GetBoolFlag(ElementHasAnimations); }
  void SetMayHaveAnimations() { SetBoolFlag(ElementHasAnimations); }
  void SetHasValidDir() { SetBoolFlag(NodeHasValidDirAttribute); }
  void ClearHasValidDir() { ClearBoolFlag(NodeHasValidDirAttribute); }
  bool HasValidDir() const { return GetBoolFlag(NodeHasValidDirAttribute); }
  void SetHasFixedDir() {
    do { } while (0);

    SetBoolFlag(NodeHasFixedDir);
  }
  void ClearHasFixedDir() {
    do { } while (0);

    ClearBoolFlag(NodeHasFixedDir);
  }
  bool HasFixedDir() const { return GetBoolFlag(NodeHasFixedDir); }
  void SetHasDirAutoSet() {
    do { } while (0);

    SetBoolFlag(NodeHasDirAutoSet);
  }
  void ClearHasDirAutoSet() {
    do { } while (0);

    ClearBoolFlag(NodeHasDirAutoSet);
  }
  bool HasDirAutoSet() const
    { return GetBoolFlag(NodeHasDirAutoSet); }
  void SetHasTextNodeDirectionalityMap() {
    do { } while (0);

    SetBoolFlag(NodeHasTextNodeDirectionalityMap);
  }
  void ClearHasTextNodeDirectionalityMap() {
    do { } while (0);

    ClearBoolFlag(NodeHasTextNodeDirectionalityMap);
  }
  bool HasTextNodeDirectionalityMap() const {
    do { } while (0);

    return GetBoolFlag(NodeHasTextNodeDirectionalityMap);
  }

  void SetHasDirAuto() { SetBoolFlag(NodeHasDirAuto); }
  void ClearHasDirAuto() { ClearBoolFlag(NodeHasDirAuto); }
  bool HasDirAuto() const { return GetBoolFlag(NodeHasDirAuto); }

  void SetAncestorHasDirAuto() { SetBoolFlag(NodeAncestorHasDirAuto); }
  void ClearAncestorHasDirAuto() { ClearBoolFlag(NodeAncestorHasDirAuto); }
  bool AncestorHasDirAuto() const { return GetBoolFlag(NodeAncestorHasDirAuto); }

  bool NodeOrAncestorHasDirAuto() const
    { return HasDirAuto() || AncestorHasDirAuto(); }

  void SetIsElementInStyleScope(bool aValue) {
    do { } while (0);
    SetBoolFlag(ElementIsInStyleScope, aValue);
  }
  void SetIsElementInStyleScope() {
    do { } while (0);
    SetBoolFlag(ElementIsInStyleScope);
  }
  void ClearIsElementInStyleScope() {
    do { } while (0);
    ClearBoolFlag(ElementIsInStyleScope);
  }
  bool IsElementInStyleScope() const { return GetBoolFlag(ElementIsInStyleScope); }

  void SetIsScopedStyleRoot() { SetBoolFlag(ElementIsScopedStyleRoot); }
  void ClearIsScopedStyleRoot() { ClearBoolFlag(ElementIsScopedStyleRoot); }
  bool IsScopedStyleRoot() { return GetBoolFlag(ElementIsScopedStyleRoot); }
  bool HasRelevantHoverRules() const { return GetBoolFlag(NodeHasRelevantHoverRules); }
  void SetHasRelevantHoverRules() { SetBoolFlag(NodeHasRelevantHoverRules); }
  void SetParserHasNotified() { SetBoolFlag(ParserHasNotified); };
  bool HasParserNotified() { return GetBoolFlag(ParserHasNotified); }

  void SetMayBeApzAware() { SetBoolFlag(MayBeApzAware); }
  bool NodeMayBeApzAware() const
  {
    return GetBoolFlag(MayBeApzAware);
  }
protected:
  void SetParentIsContent(bool aValue) { SetBoolFlag(ParentIsContent, aValue); }
  void SetIsInDocument() { SetBoolFlag(IsInDocument); }
  void SetNodeIsContent() { SetBoolFlag(NodeIsContent); }
  void ClearInDocument() { ClearBoolFlag(IsInDocument); }
  void SetIsElement() { SetBoolFlag(NodeIsElement); }
  void SetHasID() { SetBoolFlag(ElementHasID); }
  void ClearHasID() { ClearBoolFlag(ElementHasID); }
  void SetMayHaveStyle() { SetBoolFlag(ElementMayHaveStyle); }
  void SetHasName() { SetBoolFlag(ElementHasName); }
  void ClearHasName() { ClearBoolFlag(ElementHasName); }
  void SetMayHaveContentEditableAttr()
    { SetBoolFlag(ElementMayHaveContentEditableAttr); }
  void SetHasLockedStyleStates() { SetBoolFlag(ElementHasLockedStyleStates); }
  void ClearHasLockedStyleStates() { ClearBoolFlag(ElementHasLockedStyleStates); }
  bool HasLockedStyleStates() const
    { return GetBoolFlag(ElementHasLockedStyleStates); }
  void SetHasWeirdParserInsertionMode() { SetBoolFlag(ElementHasWeirdParserInsertionMode); }
  bool HasWeirdParserInsertionMode() const
  { return GetBoolFlag(ElementHasWeirdParserInsertionMode); }
  bool HandlingClick() const { return GetBoolFlag(NodeHandlingClick); }
  void SetHandlingClick() { SetBoolFlag(NodeHandlingClick); }
  void ClearHandlingClick() { ClearBoolFlag(NodeHandlingClick); }

  void SetSubtreeRootPointer(nsINode* aSubtreeRoot)
  {
    do { } while(0);
    do { } while(0);

    mSubtreeRoot = aSubtreeRoot;
  }

  void ClearSubtreeRootPointer()
  {
    mSubtreeRoot = nullptr;
  }

public:

  void BindObject(nsISupports* aObject);


  void UnbindObject(nsISupports* aObject);

  void GetBoundMutationObservers(nsTArray<RefPtr<nsDOMMutationObserver> >& aResult);

  already_AddRefed<mozilla::dom::AccessibleNode> GetAccessibleNode();





  uint32_t Length() const;

  void GetNodeName(mozilla::dom::DOMString& aNodeName)
  {
    const nsString& nodeName = NodeName();
    aNodeName.SetStringBuffer(nsStringBuffer::FromString(nodeName),
                              nodeName.Length());
  }
  __attribute__ ((warn_unused_result)) nsresult GetBaseURI(nsAString& aBaseURI) const;




  void GetBaseURIFromJS(nsAString& aBaseURI,
                        CallerType aCallerType,
                        ErrorResult& aRv) const;
  bool HasChildNodes() const
  {
    return HasChildren();
  }
  uint16_t CompareDocumentPosition(nsINode& aOther) const;
  void GetNodeValue(nsAString& aNodeValue)
  {
    GetNodeValueInternal(aNodeValue);
  }
  void SetNodeValue(const nsAString& aNodeValue,
                    mozilla::ErrorResult& aError)
  {
    SetNodeValueInternal(aNodeValue, aError);
  }
  virtual void GetNodeValueInternal(nsAString& aNodeValue);
  virtual void SetNodeValueInternal(const nsAString& aNodeValue,
                                    mozilla::ErrorResult& aError)
  {


  }
  void EnsurePreInsertionValidity(nsINode& aNewChild, nsINode* aRefChild,
                                  mozilla::ErrorResult& aError);
  nsINode* InsertBefore(nsINode& aNode, nsINode* aChild,
                        mozilla::ErrorResult& aError)
  {
    return ReplaceOrInsertBefore(false, &aNode, aChild, aError);
  }
  nsINode* AppendChild(nsINode& aNode, mozilla::ErrorResult& aError)
  {
    return InsertBefore(aNode, nullptr, aError);
  }
  nsINode* ReplaceChild(nsINode& aNode, nsINode& aChild,
                        mozilla::ErrorResult& aError)
  {
    return ReplaceOrInsertBefore(true, &aNode, &aChild, aError);
  }
  nsINode* RemoveChild(nsINode& aChild, mozilla::ErrorResult& aError);
  already_AddRefed<nsINode> CloneNode(bool aDeep, mozilla::ErrorResult& aError);
  bool IsSameNode(nsINode* aNode);
  bool IsEqualNode(nsINode* aNode);
  void GetNamespaceURI(nsAString& aNamespaceURI) const
  {
    mNodeInfo->GetNamespaceURI(aNamespaceURI);
  }

  void GetPrefix(nsAString& aPrefix)
  {
    mNodeInfo->GetPrefix(aPrefix);
  }

  void GetLocalName(mozilla::dom::DOMString& aLocalName) const
  {
    const nsString& localName = LocalName();
    if (localName.IsVoid()) {
      aLocalName.SetNull();
    } else {
      aLocalName.SetStringBuffer(nsStringBuffer::FromString(localName),
                                 localName.Length());
    }
  }

  nsDOMAttributeMap* GetAttributes();
  void SetUserData(JSContext* aCx, const nsAString& aKey,
                   JS::Handle<JS::Value> aData,
                   JS::MutableHandle<JS::Value> aRetval,
                   mozilla::ErrorResult& aError);
  void GetUserData(JSContext* aCx, const nsAString& aKey,
                   JS::MutableHandle<JS::Value> aRetval,
                   mozilla::ErrorResult& aError);




  nsresult RemoveFromParent()
  {
    nsINode* parent = GetParentNode();
    mozilla::ErrorResult rv;
    parent->RemoveChild(*this, rv);
    return rv.StealNSResult();
  }


  mozilla::dom::Element* GetPreviousElementSibling() const;
  mozilla::dom::Element* GetNextElementSibling() const;

  void Before(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);
  void After(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);
  void ReplaceWith(const Sequence<OwningNodeOrString>& aNodes,
                   ErrorResult& aRv);



  void Remove();


  mozilla::dom::Element* GetFirstElementChild() const;
  mozilla::dom::Element* GetLastElementChild() const;

  void Prepend(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);
  void Append(const Sequence<OwningNodeOrString>& aNodes, ErrorResult& aRv);

  void GetBoxQuads(const BoxQuadOptions& aOptions,
                   nsTArray<RefPtr<DOMQuad> >& aResult,
                   CallerType aCallerType,
                   ErrorResult& aRv);

  already_AddRefed<DOMQuad> ConvertQuadFromNode(DOMQuad& aQuad,
                                                const TextOrElementOrDocument& aFrom,
                                                const ConvertCoordinateOptions& aOptions,
                                                CallerType aCallerType,
                                                ErrorResult& aRv);
  already_AddRefed<DOMQuad> ConvertRectFromNode(DOMRectReadOnly& aRect,
                                                const TextOrElementOrDocument& aFrom,
                                                const ConvertCoordinateOptions& aOptions,
                                                CallerType aCallerType,
                                                ErrorResult& aRv);
  already_AddRefed<DOMPoint> ConvertPointFromNode(const DOMPointInit& aPoint,
                                                  const TextOrElementOrDocument& aFrom,
                                                  const ConvertCoordinateOptions& aOptions,
                                                  CallerType aCallerType,
                                                  ErrorResult& aRv);

protected:



  virtual nsINode::nsSlots* CreateSlots();

  bool HasSlots() const
  {
    return mSlots != nullptr;
  }

  nsSlots* GetExistingSlots() const
  {
    return mSlots;
  }

  nsSlots* Slots()
  {
    if (!HasSlots()) {
      mSlots = CreateSlots();
      do { } while (0);
    }
    return GetExistingSlots();
  }

  nsTObserverArray<nsIMutationObserver*> *GetMutationObservers()
  {
    return HasSlots() ? &GetExistingSlots()->mMutationObservers : nullptr;
  }

  bool IsEditableInternal() const;
  virtual bool IsEditableExternal() const
  {
    return IsEditableInternal();
  }

  virtual void GetTextContentInternal(nsAString& aTextContent,
                                      mozilla::OOMReporter& aError);
  virtual void SetTextContentInternal(const nsAString& aTextContent,
                                      mozilla::ErrorResult& aError)
  {
  }
# 1970 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsresult GetParentNode(nsIDOMNode** aParentNode);
  nsresult GetChildNodes(nsIDOMNodeList** aChildNodes);
  nsresult GetFirstChild(nsIDOMNode** aFirstChild);
  nsresult GetLastChild(nsIDOMNode** aLastChild);
  nsresult GetPreviousSibling(nsIDOMNode** aPrevSibling);
  nsresult GetNextSibling(nsIDOMNode** aNextSibling);
  nsresult GetOwnerDocument(nsIDOMDocument** aOwnerDocument);

  void EnsurePreInsertionValidity1(nsINode& aNewChild, nsINode* aRefChild,
                                   mozilla::ErrorResult& aError);
  void EnsurePreInsertionValidity2(bool aReplace, nsINode& aNewChild,
                                   nsINode* aRefChild,
                                   mozilla::ErrorResult& aError);
  nsINode* ReplaceOrInsertBefore(bool aReplace, nsINode* aNewChild,
                                 nsINode* aRefChild,
                                 mozilla::ErrorResult& aError);
  nsresult RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aReturn);







  virtual mozilla::dom::Element* GetNameSpaceElement() = 0;
# 2007 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  void doRemoveChildAt(uint32_t aIndex, bool aNotify, nsIContent* aKid,
                       nsAttrAndChildArray& aChildArray);
# 2020 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsresult doInsertChildAt(nsIContent* aKid, uint32_t aIndex,
                           bool aNotify, nsAttrAndChildArray& aChildArray);
# 2031 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
  nsCSSSelectorList* ParseSelectorList(const nsAString& aSelectorString,
                                       mozilla::ErrorResult& aRv);

public:
# 2048 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventNameList.h" 1
# 151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventNameList.h"
mozilla::dom::EventHandlerNonNull* GetOnabort(); void SetOnabort(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOncanplay(); void SetOncanplay(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOncanplaythrough(); void SetOncanplaythrough(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnchange(); void SetOnchange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnauxclick(); void SetOnauxclick(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnclick(); void SetOnclick(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnclose(); void SetOnclose(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOncontextmenu(); void SetOncontextmenu(mozilla::dom::EventHandlerNonNull* listener);
# 189 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventNameList.h"
mozilla::dom::EventHandlerNonNull* GetOndblclick(); void SetOndblclick(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndrag(); void SetOndrag(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndragend(); void SetOndragend(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndragenter(); void SetOndragenter(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndragexit(); void SetOndragexit(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndragleave(); void SetOndragleave(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndragover(); void SetOndragover(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndragstart(); void SetOndragstart(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndrop(); void SetOndrop(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOndurationchange(); void SetOndurationchange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnemptied(); void SetOnemptied(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnended(); void SetOnended(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnfullscreenchange(); void SetOnfullscreenchange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnfullscreenerror(); void SetOnfullscreenerror(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOninput(); void SetOninput(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOninvalid(); void SetOninvalid(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnkeydown(); void SetOnkeydown(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnkeypress(); void SetOnkeypress(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnkeyup(); void SetOnkeyup(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmozkeydownonplugin(); void SetOnmozkeydownonplugin(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmozkeyuponplugin(); void SetOnmozkeyuponplugin(mozilla::dom::EventHandlerNonNull* listener);







mozilla::dom::EventHandlerNonNull* GetOnloadeddata(); void SetOnloadeddata(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnloadedmetadata(); void SetOnloadedmetadata(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnloadend(); void SetOnloadend(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnloadstart(); void SetOnloadstart(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmousedown(); void SetOnmousedown(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmouseenter(); void SetOnmouseenter(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmouseleave(); void SetOnmouseleave(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmousemove(); void SetOnmousemove(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmouseout(); void SetOnmouseout(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmouseover(); void SetOnmouseover(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmouseup(); void SetOnmouseup(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmozfullscreenchange(); void SetOnmozfullscreenchange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmozfullscreenerror(); void SetOnmozfullscreenerror(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmozpointerlockchange(); void SetOnmozpointerlockchange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnmozpointerlockerror(); void SetOnmozpointerlockerror(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerlockchange(); void SetOnpointerlockchange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerlockerror(); void SetOnpointerlockerror(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerdown(); void SetOnpointerdown(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointermove(); void SetOnpointermove(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerup(); void SetOnpointerup(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointercancel(); void SetOnpointercancel(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerover(); void SetOnpointerover(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerout(); void SetOnpointerout(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerenter(); void SetOnpointerenter(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpointerleave(); void SetOnpointerleave(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOngotpointercapture(); void SetOngotpointercapture(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnlostpointercapture(); void SetOnlostpointercapture(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnselectstart(); void SetOnselectstart(mozilla::dom::EventHandlerNonNull* listener);






mozilla::dom::EventHandlerNonNull* GetOnpause(); void SetOnpause(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnplay(); void SetOnplay(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnplaying(); void SetOnplaying(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnprogress(); void SetOnprogress(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnratechange(); void SetOnratechange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnreset(); void SetOnreset(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnseeked(); void SetOnseeked(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnseeking(); void SetOnseeking(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnselect(); void SetOnselect(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnshow(); void SetOnshow(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnstalled(); void SetOnstalled(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnsubmit(); void SetOnsubmit(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnsuspend(); void SetOnsuspend(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntimeupdate(); void SetOntimeupdate(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntoggle(); void SetOntoggle(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnvolumechange(); void SetOnvolumechange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwaiting(); void SetOnwaiting(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwheel(); void SetOnwheel(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOncopy(); void SetOncopy(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOncut(); void SetOncut(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnpaste(); void SetOnpaste(mozilla::dom::EventHandlerNonNull* listener);




mozilla::dom::EventHandlerNonNull* GetOnbeforescriptexecute(); void SetOnbeforescriptexecute(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnafterscriptexecute(); void SetOnafterscriptexecute(mozilla::dom::EventHandlerNonNull* listener);




mozilla::dom::EventHandlerNonNull* GetOnblur(); void SetOnblur(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnerror(); void SetOnerror(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnfocus(); void SetOnfocus(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnfocusin(); void SetOnfocusin(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnfocusout(); void SetOnfocusout(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnload(); void SetOnload(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnresize(); void SetOnresize(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnscroll(); void SetOnscroll(mozilla::dom::EventHandlerNonNull* listener);
# 652 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventNameList.h"
mozilla::dom::EventHandlerNonNull* GetOntouchstart(); void SetOntouchstart(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntouchend(); void SetOntouchend(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntouchmove(); void SetOntouchmove(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntouchcancel(); void SetOntouchcancel(mozilla::dom::EventHandlerNonNull* listener);




mozilla::dom::EventHandlerNonNull* GetOnreadystatechange(); void SetOnreadystatechange(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnselectionchange(); void SetOnselectionchange(mozilla::dom::EventHandlerNonNull* listener);
# 970 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EventNameList.h"
mozilla::dom::EventHandlerNonNull* GetOntransitionstart(); void SetOntransitionstart(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntransitionrun(); void SetOntransitionrun(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntransitionend(); void SetOntransitionend(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOntransitioncancel(); void SetOntransitioncancel(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnanimationstart(); void SetOnanimationstart(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnanimationend(); void SetOnanimationend(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnanimationiteration(); void SetOnanimationiteration(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnanimationcancel(); void SetOnanimationcancel(mozilla::dom::EventHandlerNonNull* listener);





mozilla::dom::EventHandlerNonNull* GetOnwebkitAnimationEnd(); void SetOnwebkitAnimationEnd(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwebkitAnimationIteration(); void SetOnwebkitAnimationIteration(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwebkitAnimationStart(); void SetOnwebkitAnimationStart(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwebkitTransitionEnd(); void SetOnwebkitTransitionEnd(mozilla::dom::EventHandlerNonNull* listener);




mozilla::dom::EventHandlerNonNull* GetOnwebkitanimationend(); void SetOnwebkitanimationend(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwebkitanimationiteration(); void SetOnwebkitanimationiteration(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwebkitanimationstart(); void SetOnwebkitanimationstart(mozilla::dom::EventHandlerNonNull* listener);



mozilla::dom::EventHandlerNonNull* GetOnwebkittransitionend(); void SetOnwebkittransitionend(mozilla::dom::EventHandlerNonNull* listener);
# 2049 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINode.h" 2




protected:
  static bool Traverse(nsINode *tmp, nsCycleCollectionTraversalCallback &cb);
  static void Unlink(nsINode *tmp);

  RefPtr<mozilla::dom::NodeInfo> mNodeInfo;




  nsINode* mParent;

private:

  uint32_t mBoolFlags;

protected:


  nsIContent* mNextSibling;
  nsIContent* mPreviousSibling;



  nsIContent* mFirstChild;

  union {

    nsIFrame* mPrimaryFrame;




    nsINode* mSubtreeRoot;
  };


  nsSlots* mSlots;
};

inline nsIDOMNode* GetAsDOMNode(nsINode* aNode)
{
  return aNode ? aNode->AsDOMNode() : nullptr;
}






template<class C, class D>
inline nsINode* NODE_FROM(C& aContent, D& aDocument)
{
  if (aContent)
    return static_cast<nsINode*>(aContent);
  return static_cast<nsINode*>(aDocument);
}

template<typename T> struct nsINode::COMTypeInfo<nsINode, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsINode::COMTypeInfo<nsINode, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x70ba4547, 0x7699, 0x44fc, { 0xb3, 0x20, 0x52, 0xdb, 0xe3, 0xd1, 0xf9, 0x0a } };

inline nsISupports*
ToSupports(nsINode* aPointer)
{
  return aPointer;
}

inline nsISupports*
ToCanonicalSupports(nsINode* aPointer)
{
  return aPointer;
}
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStreamListener.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStreamListener.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRequestObserver.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRequestObserver.h"
class nsIRequest;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIRequestObserver.h"
class nsIRequestObserver : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) = 0;


  virtual nsresult OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) = 0;

};

  template<typename T> struct nsIRequestObserver::COMTypeInfo<nsIRequestObserver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIRequestObserver::COMTypeInfo<nsIRequestObserver, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xfd91e2e0, 0x1481, 0x11d3, { 0x93, 0x33, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStreamListener.h" 2






class nsIInputStream;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStreamListener.h"
class nsIStreamListener : public nsIRequestObserver {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext, nsIInputStream *aInputStream, uint64_t aOffset, uint32_t aCount) = 0;

};

  template<typename T> struct nsIStreamListener::COMTypeInfo<nsIStreamListener, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIStreamListener::COMTypeInfo<nsIStreamListener, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x3b4c8a77, 0x76ba, 0x4610, { 0xb3, 0x16, 0x67, 0x8c, 0x73, 0xa3, 0xb8, 0x8c }};
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDTD.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDTD.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITokenizer.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITokenizer.h"
class nsScanner;
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITokenizer.h"
class nsITokenizer : public nsISupports {
public:
  template<typename T, typename U> struct COMTypeInfo;

  virtual nsresult WillTokenize(bool aIsFinalChunk)=0;
  virtual nsresult ConsumeToken(nsScanner& aScanner,bool& aFlushTokens)=0;
};

template<typename T> struct nsITokenizer::COMTypeInfo<nsITokenizer, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsITokenizer::COMTypeInfo<nsITokenizer, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0Xae98a348, 0X5e91, 0X41a8, { 0Xa5, 0Xb4, 0Xd2, 0X20, 0Xf3, 0X1f, 0Xc4, 0Xab } };
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDTD.h" 2





enum eAutoDetectResult {
    eUnknownDetect,
    eValidDetect,
    ePrimaryDetect,
    eInvalidDetect
};

enum nsDTDMode {
    eDTDMode_unknown = 0,
    eDTDMode_quirks,
    eDTDMode_almost_standards,
    eDTDMode_full_standards,
    eDTDMode_autodetect,
    eDTDMode_fragment
};


class nsIContentSink;
class CParserContext;

class nsIDTD : public nsISupports
{
public:

    template<typename T, typename U> struct COMTypeInfo;

    virtual nsresult WillBuildModel(const CParserContext& aParserContext,
                              nsITokenizer* aTokenizer,
                              nsIContentSink* aSink) = 0;







    virtual nsresult DidBuildModel(nsresult anErrorCode) = 0;
# 81 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDTD.h"
    virtual nsresult BuildModel(nsITokenizer* aTokenizer, nsIContentSink* aSink) = 0;
# 92 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDTD.h"
    virtual bool CanContain(int32_t aParent,int32_t aChild) const = 0;
# 102 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDTD.h"
    virtual bool IsContainer(int32_t aTag) const = 0;
# 114 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDTD.h"
    virtual void Terminate() = 0;

    virtual int32_t GetType() = 0;





    virtual nsDTDMode GetMode() const = 0;
};

template<typename T> struct nsIDTD::COMTypeInfo<nsIDTD, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDTD::COMTypeInfo<nsIDTD, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x3de05873, 0xefa7, 0x410d, { 0xa4, 0x61, 0x80, 0x33, 0xaf, 0xd9, 0xe3, 0x26 } };
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsParserBase.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsParserBase.h"
class nsParserBase : public nsISupports
{
  public:
    virtual bool IsParserEnabled() { return true; }
    virtual nsresult GetChannel(nsIChannel** aChannel) {
      *aChannel = nullptr;
      return NS_OK;
    }
};
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h" 2





class nsIContentSink;
class nsIRequestObserver;
class nsString;
class nsIURI;
class nsIChannel;

enum eParserCommands {
  eViewNormal,
  eViewSource,
  eViewFragment,
  eViewErrors
};

enum eParserDocType {
  ePlainText = 0,
  eXML,
  eHTML_Quirks,
  eHTML_Strict
};

enum eStreamState {eNone,eOnStart,eOnDataAvail,eOnStop};
# 65 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h"
class nsIParser : public nsParserBase {
  public:

    template<typename T, typename U> struct COMTypeInfo;







    virtual void SetContentSink(nsIContentSink* aSink)=0;







    virtual nsIContentSink* GetContentSink(void)=0;
# 95 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h"
    virtual void GetCommand(nsCString& aCommand)=0;
    virtual void SetCommand(const char* aCommand)=0;
    virtual void SetCommand(eParserCommands aParserCommand)=0;
# 108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h"
    virtual void SetDocumentCharset(const nsACString& aCharset, int32_t aSource)=0;
    virtual void GetDocumentCharset(nsACString& oCharset, int32_t& oSource)=0;







    virtual nsresult GetChannel(nsIChannel** aChannel) override = 0;







    virtual nsresult GetDTD(nsIDTD** aDTD) = 0;




    virtual nsIStreamListener* GetStreamListener() = 0;
# 144 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h"
    virtual nsresult ContinueInterruptedParsing() = 0;


    virtual void BlockParser() = 0;





    virtual void UnblockParser() = 0;




    virtual void ContinueInterruptedParsingAsync() = 0;

    virtual bool IsParserEnabled() override = 0;
    virtual bool IsComplete() = 0;

    virtual nsresult Parse(nsIURI* aURL,
                     nsIRequestObserver* aListener = nullptr,
                     void* aKey = 0,
                     nsDTDMode aMode = eDTDMode_autodetect) = 0;

    virtual nsresult Terminate(void) = 0;
# 179 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h"
    virtual nsresult ParseFragment(const nsAString& aSourceBuffer,
                             nsTArray<nsString>& aTagStack) = 0;







    virtual nsresult BuildModel(void) = 0;
# 200 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIParser.h"
    virtual nsresult CancelParsingEvents() = 0;

    virtual void Reset() = 0;




    virtual bool IsInsertionPointDefined() = 0;





    virtual void PushDefinedInsertionPoint() = 0;






    virtual void PopDefinedInsertionPoint() = 0;




    virtual void MarkAsNotScriptCreated(const char* aCommand) = 0;




    virtual bool IsScriptCreated() = 0;
};

template<typename T> struct nsIParser::COMTypeInfo<nsIParser, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIParser::COMTypeInfo<nsIParser, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x2c4ad90a, 0x740e, 0x4212, { 0xba, 0x3f, 0xfe, 0xac, 0xda, 0x4b, 0x92, 0x9e } };
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIServiceManager.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIServiceManager.h"
class nsIServiceManager : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetService(const nsCID & aClass, const nsIID & aIID, void **result) = 0;


  virtual nsresult GetServiceByContractID(const char * aContractID, const nsIID & aIID, void **result) = 0;


  virtual nsresult IsServiceInstantiated(const nsCID & aClass, const nsIID & aIID, bool *_retval) = 0;


  virtual nsresult IsServiceInstantiatedByContractID(const char * aContractID, const nsIID & aIID, bool *_retval) = 0;

};

  template<typename T> struct nsIServiceManager::COMTypeInfo<nsIServiceManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIServiceManager::COMTypeInfo<nsIServiceManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x8bb35ed9, 0xe332, 0x462d, { 0x91, 0x55, 0x4a, 0x00, 0x2a, 0xb5, 0xc9, 0x58 }};
# 138 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIServiceManager.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsComponentManagerUtils.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsComponentManagerUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFactory.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFactory.h"
class nsIFactory : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult CreateInstance(nsISupports *aOuter, const nsIID & iid, void **result) = 0;


  virtual nsresult LockFactory(bool lock) = 0;

};

  template<typename T> struct nsIFactory::COMTypeInfo<nsIFactory, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIFactory::COMTypeInfo<nsIFactory, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x00000001, 0x0000, 0x0000, { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 }};
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsComponentManagerUtils.h" 2


nsresult CallCreateInstance(const nsCID& aClass, nsISupports* aDelegate,
                            const nsIID& aIID, void** aResult);

nsresult CallCreateInstance(const char* aContractID, nsISupports* aDelegate,
                            const nsIID& aIID, void** aResult);

nsresult CallGetClassObject(const nsCID& aClass, const nsIID& aIID,
                            void** aResult);

nsresult CallGetClassObject(const char* aContractID, const nsIID& aIID,
                            void** aResult);


class nsCreateInstanceByCID final : public nsCOMPtr_helper
{
public:
  nsCreateInstanceByCID(const nsCID& aCID, nsresult* aErrorPtr)
    : mCID(aCID)
    , mErrorPtr(aErrorPtr)
  {
  }

  virtual nsresult operator()(const nsIID&, void**) const
    override;

private:
  const nsCID& mCID;
  nsresult* mErrorPtr;
};

class nsCreateInstanceByContractID final : public nsCOMPtr_helper
{
public:
  nsCreateInstanceByContractID(const char* aContractID, nsresult* aErrorPtr)
    : mContractID(aContractID)
    , mErrorPtr(aErrorPtr)
  {
  }

  virtual nsresult operator()(const nsIID&, void**) const override;

private:
  const char* mContractID;
  nsresult* mErrorPtr;
};

class nsCreateInstanceFromFactory final : public nsCOMPtr_helper
{
public:
  nsCreateInstanceFromFactory(nsIFactory* aFactory, nsresult* aErrorPtr)
    : mFactory(aFactory)
    , mErrorPtr(aErrorPtr)
  {
  }

  virtual nsresult operator()(const nsIID&, void**) const override;

private:
  nsIFactory* mFactory;
  nsresult* mErrorPtr;
};


inline const nsCreateInstanceByCID
do_CreateInstance(const nsCID& aCID, nsresult* aError = 0)
{
  return nsCreateInstanceByCID(aCID, aError);
}

inline const nsCreateInstanceByContractID
do_CreateInstance(const char* aContractID, nsresult* aError = 0)
{
  return nsCreateInstanceByContractID(aContractID, aError);
}

inline const nsCreateInstanceFromFactory
do_CreateInstance(nsIFactory* aFactory, nsresult* aError = 0)
{
  return nsCreateInstanceFromFactory(aFactory, aError);
}


class nsGetClassObjectByCID final : public nsCOMPtr_helper
{
public:
  nsGetClassObjectByCID(const nsCID& aCID, nsresult* aErrorPtr)
    : mCID(aCID)
    , mErrorPtr(aErrorPtr)
  {
  }

  virtual nsresult operator()(const nsIID&, void**) const override;

private:
  const nsCID& mCID;
  nsresult* mErrorPtr;
};

class nsGetClassObjectByContractID final : public nsCOMPtr_helper
{
public:
  nsGetClassObjectByContractID(const char* aContractID, nsresult* aErrorPtr)
    : mContractID(aContractID)
    , mErrorPtr(aErrorPtr)
  {
  }

  virtual nsresult operator()(const nsIID&, void**) const override;

private:
  const char* mContractID;
  nsresult* mErrorPtr;
};
# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsComponentManagerUtils.h"
inline const nsGetClassObjectByCID
do_GetClassObject(const nsCID& aCID, nsresult* aError = 0)
{
  return nsGetClassObjectByCID(aCID, aError);
}

inline const nsGetClassObjectByContractID
do_GetClassObject(const char* aContractID, nsresult* aError = 0)
{
  return nsGetClassObjectByContractID(aContractID, aError);
}


template<class DestinationType>
inline nsresult
CallCreateInstance(const nsCID& aClass,
                   nsISupports* aDelegate,
                   DestinationType** aDestination)
{
  do { } while(0);

  return CallCreateInstance(aClass, aDelegate,
                            (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                            reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallCreateInstance(const nsCID& aClass, DestinationType** aDestination)
{
  do { } while(0);

  return CallCreateInstance(aClass, nullptr,
                            (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                            reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallCreateInstance(const char* aContractID,
                   nsISupports* aDelegate,
                   DestinationType** aDestination)
{
  do { } while(0);
  do { } while(0);

  return CallCreateInstance(aContractID,
                            aDelegate,
                            (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                            reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallCreateInstance(const char* aContractID, DestinationType** aDestination)
{
  do { } while(0);
  do { } while(0);

  return CallCreateInstance(aContractID, nullptr,
                            (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                            reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallCreateInstance(nsIFactory* aFactory,
                   nsISupports* aDelegate,
                   DestinationType** aDestination)
{
  do { } while(0);
  do { } while(0);

  return aFactory->CreateInstance(aDelegate,
                                  (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                                  reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallCreateInstance(nsIFactory* aFactory, DestinationType** aDestination)
{
  do { } while(0);
  do { } while(0);

  return aFactory->CreateInstance(nullptr,
                                  (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                                  reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallGetClassObject(const nsCID& aClass, DestinationType** aDestination)
{
  do { } while(0);

  return CallGetClassObject(aClass, (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                            reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallGetClassObject(const char* aContractID, DestinationType** aDestination)
{
  do { } while(0);

  return CallGetClassObject(aContractID, (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                            reinterpret_cast<void**>(aDestination));
}
# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIServiceManager.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsServiceManagerUtils.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsServiceManagerUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIServiceManager.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsServiceManagerUtils.h" 2


inline const nsGetServiceByCID
do_GetService(const nsCID& aCID)
{
  return nsGetServiceByCID(aCID);
}

inline const nsGetServiceByCIDWithError
do_GetService(const nsCID& aCID, nsresult* aError)
{
  return nsGetServiceByCIDWithError(aCID, aError);
}

inline const nsGetServiceByContractID
do_GetService(const char* aContractID)
{
  return nsGetServiceByContractID(aContractID);
}

inline const nsGetServiceByContractIDWithError
do_GetService(const char* aContractID, nsresult* aError)
{
  return nsGetServiceByContractIDWithError(aContractID, aError);
}

class nsGetServiceFromCategory final : public nsCOMPtr_helper
{
public:
  nsGetServiceFromCategory(const char* aCategory, const char* aEntry,
                           nsresult* aErrorPtr)
    : mCategory(aCategory)
    , mEntry(aEntry)
    , mErrorPtr(aErrorPtr)
  {
  }

  virtual nsresult operator()(const nsIID&, void**) const
    override;
protected:
  const char* mCategory;
  const char* mEntry;
  nsresult* mErrorPtr;
};

inline const nsGetServiceFromCategory
do_GetServiceFromCategory(const char* aCategory, const char* aEntry,
                          nsresult* aError = 0)
{
  return nsGetServiceFromCategory(aCategory, aEntry, aError);
}

nsresult CallGetService(const nsCID& aClass, const nsIID& aIID, void** aResult);

nsresult CallGetService(const char* aContractID, const nsIID& aIID,
                        void** aResult);


template<class DestinationType>
inline nsresult
CallGetService(const nsCID& aClass,
               DestinationType** aDestination)
{
  do { } while(0);

  return CallGetService(aClass,
                        (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                        reinterpret_cast<void**>(aDestination));
}

template<class DestinationType>
inline nsresult
CallGetService(const char* aContractID,
               DestinationType** aDestination)
{
  do { } while(0);
  do { } while(0);

  return CallGetService(aContractID,
                        (DestinationType::template COMTypeInfo<DestinationType, void>::kIID),
                        reinterpret_cast<void**>(aDestination));
}
# 140 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIServiceManager.h" 2
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIUUIDGenerator.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIUUIDGenerator.h"
class nsIUUIDGenerator : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GenerateUUID(nsID **_retval) = 0;


  virtual nsresult GenerateUUIDInPlace(nsID *id) = 0;

};

  template<typename T> struct nsIUUIDGenerator::COMTypeInfo<nsIUUIDGenerator, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIUUIDGenerator::COMTypeInfo<nsIUUIDGenerator, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x138ad1b2, 0xc694, 0x41cc, { 0xb2, 0x01, 0x33, 0x3c, 0xe9, 0x36, 0xd8, 0xb8 }};
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsURIHashKey.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsURIHashKey.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Unused.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Unused.h"
namespace mozilla {





struct unused_t
{
  template<typename T>
  inline void
  operator<<(const T& ) const {}
};

extern __attribute__((weak)) __attribute__((visibility("default"))) const unused_t Unused;

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsURIHashKey.h" 2




class nsURIHashKey : public PLDHashEntryHdr
{
public:
    typedef nsIURI* KeyType;
    typedef const nsIURI* KeyTypePointer;

    explicit nsURIHashKey(const nsIURI* aKey) :
        mKey(const_cast<nsIURI*>(aKey)) { ; }
    nsURIHashKey(const nsURIHashKey& toCopy) :
        mKey(toCopy.mKey) { ; }
    ~nsURIHashKey() { ; }

    nsIURI* GetKey() const { return mKey; }

    bool KeyEquals(const nsIURI* aKey) const {
        bool eq;
        if (!mKey) {
            return !aKey;
        }
        if (((bool)(__builtin_expect(!!(!NS_FAILED_impl(mKey->Equals(const_cast<nsIURI*>(aKey), &eq))), 1)))) {
            return eq;
        }
        return false;
    }

    static const nsIURI* KeyToPointer(nsIURI* aKey) { return aKey; }
    static PLDHashNumber HashKey(const nsIURI* aKey) {
        if (!aKey) {

            return mozilla::HashString(EmptyCString());
        }
        nsAutoCString spec;


        mozilla::Unused << const_cast<nsIURI*>(aKey)->GetSpec(spec);
        return mozilla::HashString(spec);
    }

    enum { ALLOW_MEMMOVE = true };

protected:
    nsCOMPtr<nsIURI> mKey;
};
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UseCounter.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UseCounter.h"
namespace mozilla {

enum UseCounter : int16_t {
  eUseCounter_UNKNOWN = -1,








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UseCounterList.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UseCounterList.h"
eUseCounter_SVGSVGElement_getElementById,
eUseCounter_SVGSVGElement_currentScale_getter, eUseCounter_SVGSVGElement_currentScale_setter,
eUseCounter_property_Fill,
eUseCounter_property_FillOpacity,
eUseCounter_PushManager_subscribe,
eUseCounter_PushSubscription_unsubscribe,
eUseCounter_Window_sidebar_getter, eUseCounter_Window_sidebar_setter,
eUseCounter_External_addSearchEngine,
eUseCounter_OfflineResourceList_swapCache,
eUseCounter_OfflineResourceList_update,
eUseCounter_OfflineResourceList_status_getter, eUseCounter_OfflineResourceList_status_setter,
eUseCounter_OfflineResourceList_onchecking_getter, eUseCounter_OfflineResourceList_onchecking_setter,
eUseCounter_OfflineResourceList_onerror_getter, eUseCounter_OfflineResourceList_onerror_setter,
eUseCounter_OfflineResourceList_onnoupdate_getter, eUseCounter_OfflineResourceList_onnoupdate_setter,
eUseCounter_OfflineResourceList_ondownloading_getter, eUseCounter_OfflineResourceList_ondownloading_setter,
eUseCounter_OfflineResourceList_onprogress_getter, eUseCounter_OfflineResourceList_onprogress_setter,
eUseCounter_OfflineResourceList_onupdateready_getter, eUseCounter_OfflineResourceList_onupdateready_setter,
eUseCounter_OfflineResourceList_oncached_getter, eUseCounter_OfflineResourceList_oncached_setter,
eUseCounter_OfflineResourceList_onobsolete_getter, eUseCounter_OfflineResourceList_onobsolete_setter,
eUseCounter_IDBDatabase_createMutableFile,
eUseCounter_IDBDatabase_mozCreateFileHandle,
eUseCounter_IDBMutableFile_open,
eUseCounter_IDBMutableFile_getFile,
eUseCounter_DataTransfer_addElement,
eUseCounter_DataTransfer_mozItemCount_getter, eUseCounter_DataTransfer_mozItemCount_setter,
eUseCounter_DataTransfer_mozCursor_getter, eUseCounter_DataTransfer_mozCursor_setter,
eUseCounter_DataTransfer_mozTypesAt,
eUseCounter_DataTransfer_mozClearDataAt,
eUseCounter_DataTransfer_mozSetDataAt,
eUseCounter_DataTransfer_mozGetDataAt,
eUseCounter_DataTransfer_mozUserCancelled_getter, eUseCounter_DataTransfer_mozUserCancelled_setter,
eUseCounter_DataTransfer_mozSourceNode_getter, eUseCounter_DataTransfer_mozSourceNode_setter,
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UseCounter.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDeprecatedOperationList.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDeprecatedOperationList.h"
eUseCounter_GetAttributeNode,
eUseCounter_SetAttributeNode,
eUseCounter_GetAttributeNodeNS,
eUseCounter_SetAttributeNodeNS,
eUseCounter_RemoveAttributeNode,
eUseCounter_CreateAttribute,
eUseCounter_CreateAttributeNS,
eUseCounter_NodeValue,
eUseCounter_TextContent,
eUseCounter_EnablePrivilege,
eUseCounter_DOMExceptionCode,
eUseCounter_NoExposedProps,
eUseCounter_MutationEvent,
eUseCounter_Components,
eUseCounter_PrefixedVisibilityAPI,
eUseCounter_NodeIteratorDetach,
eUseCounter_LenientThis,
eUseCounter_GetPreventDefault,
eUseCounter_GetSetUserData,
eUseCounter_MozGetAsFile,
eUseCounter_UseOfCaptureEvents,
eUseCounter_UseOfReleaseEvents,
eUseCounter_UseOfDOM3LoadMethod,
eUseCounter_ChromeUseOfDOM3LoadMethod,
eUseCounter_ShowModalDialog,
eUseCounter_Window_Content,
eUseCounter_SyncXMLHttpRequest,
eUseCounter_DataContainerEvent,
eUseCounter_Window_Controllers,
eUseCounter_ImportXULIntoContent,
eUseCounter_PannerNodeDoppler,
eUseCounter_NavigatorGetUserMedia,
eUseCounter_WebrtcDeprecatedPrefix,
eUseCounter_RTCPeerConnectionGetStreams,
eUseCounter_AppCache,
eUseCounter_PrefixedImageSmoothingEnabled,
eUseCounter_PrefixedFullscreenAPI,
eUseCounter_LenientSetter,
eUseCounter_FileLastModifiedDate,
eUseCounter_ImageBitmapRenderingContext_TransferImageBitmap,
eUseCounter_URLCreateObjectURL_MediaStream,
eUseCounter_XMLBaseAttribute,
eUseCounter_XMLBaseAttributeForStyleAttr,
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/UseCounter.h" 2


  eUseCounter_Count
};

}
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/WeakPtr.h" 1
# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/WeakPtr.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCounted.h" 1
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCounted.h"
namespace mozilla {
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCounted.h"
namespace detail {
const MozRefCountType DEAD = 0xffffdead;
# 86 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCounted.h"
enum RefCountAtomicity
{
  AtomicRefCount,
  NonAtomicRefCount
};

template<typename T, RefCountAtomicity Atomicity>
class RefCounted
{
protected:
  RefCounted() : mRefCnt(0) {}
  ~RefCounted() { do { } while (0); }

public:

  void AddRef() const
  {

    do { } while (0);

    ++mRefCnt;







  }

  void Release() const
  {

    do { } while (0);

    MozRefCountType cnt = --mRefCnt;
# 130 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCounted.h"
    if (0 == cnt) {







      delete static_cast<const T*>(this);
    }
  }


  void ref() { AddRef(); }
  void deref() { Release(); }
  MozRefCountType refCount() const { return mRefCnt; }
  bool hasOneRef() const
  {
    do { } while (0);
    return mRefCnt == 1;
  }

private:
  mutable typename Conditional<Atomicity == AtomicRefCount,
                               Atomic<MozRefCountType>,
                               MozRefCountType>::Type mRefCnt;
};
# 175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCounted.h"
}

template<typename T>
class RefCounted : public detail::RefCounted<T, detail::NonAtomicRefCount>
{
public:
  ~RefCounted()
  {
    static_assert(IsBaseOf<RefCounted, T>::value,
                  "T must derive from RefCounted<T>");
  }
};

namespace external {
# 197 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RefCounted.h"
template<typename T>
class AtomicRefCounted :
  public mozilla::detail::RefCounted<T, mozilla::detail::AtomicRefCount>
{
public:
  ~AtomicRefCounted()
  {
    static_assert(IsBaseOf<AtomicRefCounted, T>::value,
                  "T must derive from AtomicRefCounted<T>");
  }
};

}

}
# 74 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/WeakPtr.h" 2
# 131 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/WeakPtr.h"
namespace mozilla {

template <typename T> class WeakPtr;
template <typename T> class SupportsWeakPtr;
# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/WeakPtr.h"
namespace detail {



template<class T>
class WeakReference : public ::mozilla::RefCounted<WeakReference<T> >
{
public:
  explicit WeakReference(T* p) : mPtr(p)
  {
    do { } while (false);
  }

  T* get() const {
    do { } while (false);
    return mPtr;
  }
# 175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/WeakPtr.h"
private:
  friend class mozilla::SupportsWeakPtr<T>;

  void detach() {
    do { } while (false);
    mPtr = nullptr;
  }

  T* mPtr;

};

}

template <typename T>
class SupportsWeakPtr
{
protected:
  ~SupportsWeakPtr()
  {
    static_assert(IsBaseOf<SupportsWeakPtr<T>, T>::value,
                  "T must derive from SupportsWeakPtr<T>");
    if (mSelfReferencingWeakPtr) {
      mSelfReferencingWeakPtr.mRef->detach();
    }
  }

private:
  const WeakPtr<T>& SelfReferencingWeakPtr()
  {
    if (!mSelfReferencingWeakPtr) {
      mSelfReferencingWeakPtr.mRef = new detail::WeakReference<T>(static_cast<T*>(this));
    } else {
      do { } while (false);
    }
    return mSelfReferencingWeakPtr;
  }

  const WeakPtr<const T>& SelfReferencingWeakPtr() const
  {
    const WeakPtr<T>& p = const_cast<SupportsWeakPtr*>(this)->SelfReferencingWeakPtr();
    return reinterpret_cast<const WeakPtr<const T>&>(p);
  }

  friend class WeakPtr<T>;
  friend class WeakPtr<const T>;

  WeakPtr<T> mSelfReferencingWeakPtr;
};

template <typename T>
class WeakPtr
{
  typedef detail::WeakReference<T> WeakReference;

public:
  WeakPtr& operator=(const WeakPtr& aOther)
  {
    mRef = aOther.mRef;
    do { } while (false);
    return *this;
  }

  WeakPtr(const WeakPtr& aOther)
  {

    *this = aOther;
  }

  WeakPtr& operator=(T* aOther)
  {
    if (aOther) {
      *this = aOther->SelfReferencingWeakPtr();
    } else if (!mRef || mRef->get()) {

      mRef = new WeakReference(nullptr);
    }


    return *this;
  }

               WeakPtr(T* aOther)
  {
    *this = aOther;
    do { } while (false);
  }


  WeakPtr() : mRef(new WeakReference(nullptr)) {}

  operator T*() const { return mRef->get(); }
  T& operator*() const { return *mRef->get(); }

  T* operator->() const { return mRef->get(); }

  T* get() const { return mRef->get(); }

private:
  friend class SupportsWeakPtr<T>;

  explicit WeakPtr(const RefPtr<WeakReference>& aOther) : mRef(aOther) {}

  RefPtr<WeakReference> mRef;
};

}
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h" 2


namespace mozilla {
namespace gfx {

typedef float Float;

enum class SurfaceType : int8_t {
  DATA,
  D2D1_BITMAP,
  D2D1_DRAWTARGET,
  CAIRO,
  CAIRO_IMAGE,
  COREGRAPHICS_IMAGE,
  COREGRAPHICS_CGCONTEXT,
  SKIA,
  DUAL_DT,
  D2D1_1_IMAGE,
  RECORDING,
  TILED,
  DATA_SHARED,
};

enum class SurfaceFormat : int8_t {




  B8G8R8A8,
  B8G8R8X8,
  R8G8B8A8,
  R8G8B8X8,
  A8R8G8B8,
  X8R8G8B8,

  R8G8B8,
  B8G8R8,




  R5G6B5_UINT16,


  A8,


  YUV,
  NV12,
  YUV422,
  HSV,
  Lab,
  Depth,


  UNKNOWN,





  A8R8G8B8_UINT32 = B8G8R8A8,
  X8R8G8B8_UINT32 = B8G8R8X8






};

inline bool IsOpaque(SurfaceFormat aFormat)
{
  switch (aFormat) {
  case SurfaceFormat::B8G8R8X8:
  case SurfaceFormat::R8G8B8X8:
  case SurfaceFormat::R5G6B5_UINT16:
  case SurfaceFormat::YUV:
  case SurfaceFormat::NV12:
  case SurfaceFormat::YUV422:
    return true;
  default:
    return false;
  }
}

enum class FilterType : int8_t {
  BLEND = 0,
  TRANSFORM,
  MORPHOLOGY,
  COLOR_MATRIX,
  FLOOD,
  TILE,
  TABLE_TRANSFER,
  DISCRETE_TRANSFER,
  LINEAR_TRANSFER,
  GAMMA_TRANSFER,
  CONVOLVE_MATRIX,
  DISPLACEMENT_MAP,
  TURBULENCE,
  ARITHMETIC_COMBINE,
  COMPOSITE,
  DIRECTIONAL_BLUR,
  GAUSSIAN_BLUR,
  POINT_DIFFUSE,
  POINT_SPECULAR,
  SPOT_DIFFUSE,
  SPOT_SPECULAR,
  DISTANT_DIFFUSE,
  DISTANT_SPECULAR,
  CROP,
  PREMULTIPLY,
  UNPREMULTIPLY
};

enum class DrawTargetType : int8_t {
  SOFTWARE_RASTER = 0,
  HARDWARE_RASTER,
  VECTOR
};

enum class BackendType : int8_t {
  NONE = 0,
  DIRECT2D,
  CAIRO,
  SKIA,
  RECORDING,
  DIRECT2D1_1,


  BACKEND_LAST
};

enum class FontType : int8_t {
  DWRITE,
  GDI,
  MAC,
  SKIA,
  CAIRO,
  COREGRAPHICS,
  FONTCONFIG,
  FREETYPE
};

enum class NativeSurfaceType : int8_t {
  D3D10_TEXTURE,
  CAIRO_CONTEXT,
  CGCONTEXT,
  CGCONTEXT_ACCELERATED,
  OPENGL_TEXTURE
};

enum class NativeFontType : int8_t {
  DWRITE_FONT_FACE,
  GDI_FONT_FACE,
  MAC_FONT_FACE,
  SKIA_FONT_FACE,
  CAIRO_FONT_FACE
};

enum class FontStyle : int8_t {
  NORMAL,
  ITALIC,
  BOLD,
  BOLD_ITALIC
};

enum class FontHinting : int8_t {
  NONE,
  LIGHT,
  NORMAL,
  FULL
};

enum class CompositionOp : int8_t {
  OP_OVER,
  OP_ADD,
  OP_ATOP,
  OP_OUT,
  OP_IN,
  OP_SOURCE,
  OP_DEST_IN,
  OP_DEST_OUT,
  OP_DEST_OVER,
  OP_DEST_ATOP,
  OP_XOR,
  OP_MULTIPLY,
  OP_SCREEN,
  OP_OVERLAY,
  OP_DARKEN,
  OP_LIGHTEN,
  OP_COLOR_DODGE,
  OP_COLOR_BURN,
  OP_HARD_LIGHT,
  OP_SOFT_LIGHT,
  OP_DIFFERENCE,
  OP_EXCLUSION,
  OP_HUE,
  OP_SATURATION,
  OP_COLOR,
  OP_LUMINOSITY,
  OP_COUNT
};

enum class Axis : int8_t {
  X_AXIS,
  Y_AXIS,
  BOTH
};

enum class ExtendMode : int8_t {
  CLAMP,
  REPEAT,
  REPEAT_X,
  REPEAT_Y,
  REFLECT
};

enum class FillRule : int8_t {
  FILL_WINDING,
  FILL_EVEN_ODD
};

enum class AntialiasMode : int8_t {
  NONE,
  GRAY,
  SUBPIXEL,
  DEFAULT
};


enum class SamplingFilter : int8_t {
  GOOD,
  LINEAR,
  POINT,
  SENTINEL
};

enum class PatternType : int8_t {
  COLOR,
  SURFACE,
  LINEAR_GRADIENT,
  RADIAL_GRADIENT
};

enum class JoinStyle : int8_t {
  BEVEL,
  ROUND,
  MITER,


  MITER_OR_BEVEL
};

enum class CapStyle : int8_t {
  BUTT,
  ROUND,
  SQUARE
};

enum class SamplingBounds : int8_t {
  UNBOUNDED,
  BOUNDED
};


struct Color
{
public:
  Color()
    : r(0.0f), g(0.0f), b(0.0f), a(0.0f)
  {}
  Color(Float aR, Float aG, Float aB, Float aA)
    : r(aR), g(aG), b(aB), a(aA)
  {}
  Color(Float aR, Float aG, Float aB)
    : r(aR), g(aG), b(aB), a(1.0f)
  {}

  static Color FromABGR(uint32_t aColor)
  {
    Color newColor(((aColor >> 0) & 0xff) * (1.0f / 255.0f),
                   ((aColor >> 8) & 0xff) * (1.0f / 255.0f),
                   ((aColor >> 16) & 0xff) * (1.0f / 255.0f),
                   ((aColor >> 24) & 0xff) * (1.0f / 255.0f));

    return newColor;
  }



  static Color UnusualFromARGB(uint32_t aColor)
  {
    Color newColor(((aColor >> 16) & 0xff) * (1.0f / 255.0f),
                   ((aColor >> 8) & 0xff) * (1.0f / 255.0f),
                   ((aColor >> 0) & 0xff) * (1.0f / 255.0f),
                   ((aColor >> 24) & 0xff) * (1.0f / 255.0f));

    return newColor;
  }

  uint32_t ToABGR() const
  {
    return uint32_t(r * 255.0f) | uint32_t(g * 255.0f) << 8 |
           uint32_t(b * 255.0f) << 16 | uint32_t(a * 255.0f) << 24;
  }



  uint32_t UnusualToARGB() const
  {
    return uint32_t(b * 255.0f) | uint32_t(g * 255.0f) << 8 |
           uint32_t(r * 255.0f) << 16 | uint32_t(a * 255.0f) << 24;
  }

  bool operator==(const Color& aColor) const {
    return r == aColor.r && g == aColor.g && b == aColor.b && a == aColor.a;
  }

  bool operator!=(const Color& aColor) const {
    return !(*this == aColor);
  }

  Float r, g, b, a;
};

struct GradientStop
{
  bool operator<(const GradientStop& aOther) const {
    return offset < aOther.offset;
  }

  Float offset;
  Color color;
};

enum class JobStatus {
    Complete,
    Wait,
    Yield,
    Error
};

}
}


typedef mozilla::gfx::SurfaceFormat gfxImageFormat;
# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h"
namespace mozilla {


enum Side { eSideTop, eSideRight, eSideBottom, eSideLeft };

enum SideBits {
  eSideBitsNone = 0,
  eSideBitsTop = 1 << eSideTop,
  eSideBitsRight = 1 << eSideRight,
  eSideBitsBottom = 1 << eSideBottom,
  eSideBitsLeft = 1 << eSideLeft,
  eSideBitsTopBottom = eSideBitsTop | eSideBitsBottom,
  eSideBitsLeftRight = eSideBitsLeft | eSideBitsRight,
  eSideBitsAll = eSideBitsTopBottom | eSideBitsLeftRight
};
# 399 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h"
static inline Side& operator++(Side& side) {
  do { } while (0);

  side = Side(side + 1);
  return side;
}

enum Corner {

  eCornerTopLeft = 0,
  eCornerTopRight = 1,
  eCornerBottomRight = 2,
  eCornerBottomLeft = 3
};




constexpr int eCornerCount = 4;
# 428 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h"
static inline Corner operator++(Corner& aCorner) {
  do { } while (0);

  aCorner = Corner(aCorner + 1);
  return aCorner;
}


enum HalfCorner {

  eCornerTopLeftX = 0,
  eCornerTopLeftY = 1,
  eCornerTopRightX = 2,
  eCornerTopRightY = 3,
  eCornerBottomRightX = 4,
  eCornerBottomRightY = 5,
  eCornerBottomLeftX = 6,
  eCornerBottomLeftY = 7
};
# 457 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h"
static inline HalfCorner operator++(HalfCorner& aHalfCorner) {
  do { } while (0);

  aHalfCorner = HalfCorner(aHalfCorner + 1);
  return aHalfCorner;
}




constexpr bool HalfCornerIsX(HalfCorner aHalfCorner)
{
  return !(aHalfCorner % 2);
}

constexpr Corner HalfToFullCorner(HalfCorner aHalfCorner)
{
  return Corner(aHalfCorner / 2);
}

constexpr HalfCorner FullToHalfCorner(Corner aCorner, bool aIsVertical)
{
  return HalfCorner(aCorner * 2 + aIsVertical);
}

constexpr bool SideIsVertical(Side aSide)
{
  return aSide % 2;
}





constexpr Corner SideToFullCorner(Side aSide, bool aIsSecond)
{
  return Corner((aSide + aIsSecond) % 4);
}
# 503 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Types.h"
constexpr HalfCorner SideToHalfCorner(Side aSide, bool aIsSecond,
                                      bool aIsParallel)
{
  return HalfCorner(((aSide + aIsSecond) * 2 + (aSide + !aIsParallel) % 2) % 8);
}

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseCoord.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseCoord.h"
namespace mozilla {
namespace gfx {






template <class T, class Sub>
struct BaseCoord {
  T value;


  constexpr BaseCoord() : value(0) {}
  explicit constexpr BaseCoord(T aValue) : value(aValue) {}




  operator T() const { return value; }

  friend bool operator==(Sub aA, Sub aB) {
    return aA.value == aB.value;
  }
  friend bool operator!=(Sub aA, Sub aB) {
    return aA.value != aB.value;
  }

  friend Sub operator+(Sub aA, Sub aB) {
    return Sub(aA.value + aB.value);
  }
  friend Sub operator-(Sub aA, Sub aB) {
    return Sub(aA.value - aB.value);
  }
  friend Sub operator*(Sub aCoord, T aScale) {
    return Sub(aCoord.value * aScale);
  }
  friend Sub operator*(T aScale, Sub aCoord) {
    return Sub(aScale * aCoord.value);
  }
  friend Sub operator/(Sub aCoord, T aScale) {
    return Sub(aCoord.value / aScale);
  }


  Sub& operator+=(Sub aCoord) {
    value += aCoord.value;
    return *static_cast<Sub*>(this);
  }
  Sub& operator-=(Sub aCoord) {
    value -= aCoord.value;
    return *static_cast<Sub*>(this);
  }
  Sub& operator*=(T aScale) {
    value *= aScale;
    return *static_cast<Sub*>(this);
  }
  Sub& operator/=(T aScale) {
    value /= aScale;
    return *static_cast<Sub*>(this);
  }





  friend bool operator==(Sub aA, T aB) {
    return aA.value == aB;
  }
  friend bool operator==(T aA, Sub aB) {
    return aA == aB.value;
  }
  friend bool operator!=(Sub aA, T aB) {
    return aA.value != aB;
  }
  friend bool operator!=(T aA, Sub aB) {
    return aA != aB.value;
  }
  friend T operator+(Sub aA, T aB) {
    return aA.value + aB;
  }
  friend T operator+(T aA, Sub aB) {
    return aA + aB.value;
  }
  friend T operator-(Sub aA, T aB) {
    return aA.value - aB;
  }
  friend T operator-(T aA, Sub aB) {
    return aA - aB.value;
  }

  Sub operator-() const {
    return Sub(-value);
  }
};

}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" 2

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h" 2

namespace mozilla {

template <typename> struct IsPixel;

namespace gfx {

template <class units> struct IntCoordTyped;
template <class units, class F = Float> struct CoordTyped;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h"
template <class coord, class primitive>
struct CommonType;

template <class units, class primitive>
struct CommonType<IntCoordTyped<units>, primitive> {
    typedef decltype(int32_t() + primitive()) type;
};

template <class units, class F, class primitive>
struct CommonType<CoordTyped<units, F>, primitive> {
    typedef decltype(F() + primitive()) type;
};
# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Coord.h"
template <bool B, class coord, class primitive>
struct CoordOperatorsHelper {


};

template <class coord, class primitive>
struct CoordOperatorsHelper<true, coord, primitive> {
  friend bool operator==(coord aA, primitive aB) {
    return aA.value == aB;
  }
  friend bool operator==(primitive aA, coord aB) {
    return aA == aB.value;
  }
  friend bool operator!=(coord aA, primitive aB) {
    return aA.value != aB;
  }
  friend bool operator!=(primitive aA, coord aB) {
    return aA != aB.value;
  }

  typedef typename CommonType<coord, primitive>::type result_type;

  friend result_type operator+(coord aA, primitive aB) {
    return aA.value + aB;
  }
  friend result_type operator+(primitive aA, coord aB) {
    return aA + aB.value;
  }
  friend result_type operator-(coord aA, primitive aB) {
    return aA.value - aB;
  }
  friend result_type operator-(primitive aA, coord aB) {
    return aA - aB.value;
  }
  friend result_type operator*(coord aCoord, primitive aScale) {
    return aCoord.value * aScale;
  }
  friend result_type operator*(primitive aScale, coord aCoord) {
    return aScale * aCoord.value;
  }
  friend result_type operator/(coord aCoord, primitive aScale) {
    return aCoord.value / aScale;
  }

};




template<class units>
struct IntCoordTyped :
  public BaseCoord< int32_t, IntCoordTyped<units> >,
  public CoordOperatorsHelper< true, IntCoordTyped<units>, float >,
  public CoordOperatorsHelper< true, IntCoordTyped<units>, double > {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef BaseCoord< int32_t, IntCoordTyped<units> > Super;

  constexpr IntCoordTyped() : Super() {}
  constexpr IntCoordTyped(int32_t aValue) : Super(aValue) {}
};

template<class units, class F>
struct CoordTyped :
  public BaseCoord< F, CoordTyped<units, F> >,
  public CoordOperatorsHelper< !IsSame<F, int32_t>::value, CoordTyped<units, F>, int32_t >,
  public CoordOperatorsHelper< !IsSame<F, uint32_t>::value, CoordTyped<units, F>, uint32_t >,
  public CoordOperatorsHelper< !IsSame<F, double>::value, CoordTyped<units, F>, double >,
  public CoordOperatorsHelper< !IsSame<F, float>::value, CoordTyped<units, F>, float > {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef BaseCoord< F, CoordTyped<units, F> > Super;

  constexpr CoordTyped() : Super() {}
  constexpr CoordTyped(F aValue) : Super(aValue) {}
  explicit constexpr CoordTyped(const IntCoordTyped<units>& aCoord) : Super(F(aCoord.value)) {}

  void Round() {
    this->value = floor(this->value + 0.5);
  }
  void Truncate() {
    this->value = int32_t(this->value);
  }

  IntCoordTyped<units> Rounded() const {
    return IntCoordTyped<units>(int32_t(floor(this->value + 0.5)));
  }
  IntCoordTyped<units> Truncated() const {
    return IntCoordTyped<units>(int32_t(this->value));
  }
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Triangle.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Triangle.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint.h" 1








# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint.h" 2





namespace mozilla {
namespace gfx {






template <class T, class Sub, class Coord = T>
struct BasePoint {
  union {
    struct {
      T x, y;
    };
    T components[2];
  };


  constexpr BasePoint() : x(0), y(0) {}
  constexpr BasePoint(Coord aX, Coord aY) : x(aX), y(aY) {}

  void MoveTo(T aX, T aY) { x = aX; y = aY; }
  void MoveBy(T aDx, T aDy) { x += aDx; y += aDy; }




  bool operator==(const Sub& aPoint) const {
    return x == aPoint.x && y == aPoint.y;
  }
  bool operator!=(const Sub& aPoint) const {
    return x != aPoint.x || y != aPoint.y;
  }

  Sub operator+(const Sub& aPoint) const {
    return Sub(x + aPoint.x, y + aPoint.y);
  }
  Sub operator-(const Sub& aPoint) const {
    return Sub(x - aPoint.x, y - aPoint.y);
  }
  Sub& operator+=(const Sub& aPoint) {
    x += aPoint.x;
    y += aPoint.y;
    return *static_cast<Sub*>(this);
  }
  Sub& operator-=(const Sub& aPoint) {
    x -= aPoint.x;
    y -= aPoint.y;
    return *static_cast<Sub*>(this);
  }

  Sub operator*(T aScale) const {
    return Sub(x * aScale, y * aScale);
  }
  Sub operator/(T aScale) const {
    return Sub(x / aScale, y / aScale);
  }

  Sub operator-() const {
    return Sub(-x, -y);
  }

  T DotProduct(const Sub& aPoint) const {
      return x * aPoint.x + y * aPoint.y;
  }

  Coord Length() const {
    return hypot(x, y);
  }

  T LengthSquare() const {
    return x * x + y * y;
  }




  Sub& Round() {
    x = Coord(floor(T(x) + T(0.5)));
    y = Coord(floor(T(y) + T(0.5)));
    return *static_cast<Sub*>(this);
  }


  bool IsFinite() const
  {
    typedef typename mozilla::Conditional<mozilla::IsSame<T, float>::value, float, double>::Type FloatType;
    return (mozilla::IsFinite(FloatType(x)) && mozilla::IsFinite(FloatType(y)));
    return true;
  }

  void Clamp(T aMaxAbsValue)
  {
    x = std::max(std::min(x, aMaxAbsValue), -aMaxAbsValue);
    y = std::max(std::min(y, aMaxAbsValue), -aMaxAbsValue);
  }

  friend std::ostream& operator<<(std::ostream& stream, const BasePoint<T, Sub, Coord>& aPoint) {
    return stream << '(' << aPoint.x << ',' << aPoint.y << ')';
  }

};

}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint3D.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint3D.h"
namespace mozilla {
namespace gfx {






template <class T, class Sub>
struct BasePoint3D {
  union {
    struct {
      T x, y, z;
    };
    T components[3];
  };


  BasePoint3D() : x(0), y(0), z(0) {}
  BasePoint3D(T aX, T aY, T aZ) : x(aX), y(aY), z(aZ) {}

  void MoveTo(T aX, T aY, T aZ) { x = aX; y = aY; z = aZ; }
  void MoveBy(T aDx, T aDy, T aDz) { x += aDx; y += aDy; z += aDz; }




  T& operator[](int aIndex) {
    do { } while (0);
    return *((&x)+aIndex);
  }

  const T& operator[](int aIndex) const {
    do { } while (0);
    return *((&x)+aIndex);
  }

  bool operator==(const Sub& aPoint) const {
    return x == aPoint.x && y == aPoint.y && z == aPoint.z;
  }
  bool operator!=(const Sub& aPoint) const {
    return x != aPoint.x || y != aPoint.y || z != aPoint.z;
  }

  Sub operator+(const Sub& aPoint) const {
    return Sub(x + aPoint.x, y + aPoint.y, z + aPoint.z);
  }
  Sub operator-(const Sub& aPoint) const {
    return Sub(x - aPoint.x, y - aPoint.y, z - aPoint.z);
  }
  Sub& operator+=(const Sub& aPoint) {
    x += aPoint.x;
    y += aPoint.y;
    z += aPoint.z;
    return *static_cast<Sub*>(this);
  }
  Sub& operator-=(const Sub& aPoint) {
    x -= aPoint.x;
    y -= aPoint.y;
    z -= aPoint.z;
    return *static_cast<Sub*>(this);
  }

  Sub operator*(T aScale) const {
    return Sub(x * aScale, y * aScale, z * aScale);
  }
  Sub operator/(T aScale) const {
    return Sub(x / aScale, y / aScale, z / aScale);
  }

  Sub& operator*=(T aScale) {
    x *= aScale;
    y *= aScale;
    z *= aScale;
    return *static_cast<Sub*>(this);
  }

  Sub& operator/=(T aScale) {
      x /= aScale;
      y /= aScale;
      z /= aScale;
      return *static_cast<Sub*>(this);
  }

  Sub operator-() const {
    return Sub(-x, -y, -z);
  }

  Sub CrossProduct(const Sub& aPoint) const {
      return Sub(y * aPoint.z - aPoint.y * z,
                 z * aPoint.x - aPoint.z * x,
                 x * aPoint.y - aPoint.x * y);
  }

  T DotProduct(const Sub& aPoint) const {
      return x * aPoint.x + y * aPoint.y + z * aPoint.z;
  }

  T Length() const {
      return sqrt(x*x + y*y + z*z);
  }


  void Normalize() {
      *this /= Length();
  }
};

}
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint4D.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BasePoint4D.h"
namespace mozilla {
namespace gfx {






template <class T, class Sub>
struct BasePoint4D {
  union {
    struct {
      T x, y, z, w;
    };
    T components[4];
  };


  BasePoint4D() : x(0), y(0), z(0), w(0) {}
  BasePoint4D(T aX, T aY, T aZ, T aW) : x(aX), y(aY), z(aZ), w(aW) {}

  void MoveTo(T aX, T aY, T aZ, T aW) { x = aX; y = aY; z = aZ; w = aW; }
  void MoveBy(T aDx, T aDy, T aDz, T aDw) { x += aDx; y += aDy; z += aDz; w += aDw; }




  bool operator==(const Sub& aPoint) const {
    return x == aPoint.x && y == aPoint.y &&
           z == aPoint.z && w == aPoint.w;
  }
  bool operator!=(const Sub& aPoint) const {
    return x != aPoint.x || y != aPoint.y ||
           z != aPoint.z || w != aPoint.w;
  }

  Sub operator+(const Sub& aPoint) const {
    return Sub(x + aPoint.x, y + aPoint.y, z + aPoint.z, w + aPoint.w);
  }
  Sub operator-(const Sub& aPoint) const {
    return Sub(x - aPoint.x, y - aPoint.y, z - aPoint.z, w - aPoint.w);
  }
  Sub& operator+=(const Sub& aPoint) {
    x += aPoint.x;
    y += aPoint.y;
    z += aPoint.z;
    w += aPoint.w;
    return *static_cast<Sub*>(this);
  }
  Sub& operator-=(const Sub& aPoint) {
    x -= aPoint.x;
    y -= aPoint.y;
    z -= aPoint.z;
    w -= aPoint.w;
    return *static_cast<Sub*>(this);
  }

  Sub operator*(T aScale) const {
    return Sub(x * aScale, y * aScale, z * aScale, w * aScale);
  }
  Sub operator/(T aScale) const {
    return Sub(x / aScale, y / aScale, z / aScale, w / aScale);
  }

  Sub& operator*=(T aScale) {
    x *= aScale;
    y *= aScale;
    z *= aScale;
    w *= aScale;
    return *static_cast<Sub*>(this);
  }

  Sub& operator/=(T aScale) {
    x /= aScale;
    y /= aScale;
    z /= aScale;
    w /= aScale;
    return *static_cast<Sub*>(this);
  }

  Sub operator-() const {
    return Sub(-x, -y, -z, -w);
  }

  T& operator[](int aIndex) {
    do { } while (0);
    return *((&x)+aIndex);
  }

  const T& operator[](int aIndex) const {
    do { } while (0);
    return *((&x)+aIndex);
  }

  T DotProduct(const Sub& aPoint) const {
    return x * aPoint.x + y * aPoint.y + z * aPoint.z + w * aPoint.w;
  }


  Sub CrossProduct(const Sub& aPoint) const {
      return Sub(y * aPoint.z - aPoint.y * z,
          z * aPoint.x - aPoint.z * x,
          x * aPoint.y - aPoint.x * y,
          0);
  }

  T Length() const {
    return sqrt(x*x + y*y + z*z + w*w);
  }

  void Normalize() {
    *this /= Length();
  }

  bool HasPositiveWCoord() { return w > 0; }
};

}
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseSize.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseSize.h"
namespace mozilla {
namespace gfx {






template <class T, class Sub>
struct BaseSize {
  union {
    struct {
      T width, height;
    };
    T components[2];
  };


  constexpr BaseSize() : width(0), height(0) {}
  constexpr BaseSize(T aWidth, T aHeight) : width(aWidth), height(aHeight) {}

  void SizeTo(T aWidth, T aHeight) { width = aWidth; height = aHeight; }

  bool IsEmpty() const {
    return width <= 0 || height <= 0;
  }

  bool IsSquare() const {
    return width == height;
  }




  bool operator==(const Sub& aSize) const {
    return width == aSize.width && height == aSize.height;
  }
  bool operator!=(const Sub& aSize) const {
    return width != aSize.width || height != aSize.height;
  }
  bool operator<=(const Sub& aSize) const {
    return width <= aSize.width && height <= aSize.height;
  }
  bool operator<(const Sub& aSize) const {
    return *this <= aSize && *this != aSize;
  }

  Sub operator+(const Sub& aSize) const {
    return Sub(width + aSize.width, height + aSize.height);
  }
  Sub operator-(const Sub& aSize) const {
    return Sub(width - aSize.width, height - aSize.height);
  }
  Sub& operator+=(const Sub& aSize) {
    width += aSize.width;
    height += aSize.height;
    return *static_cast<Sub*>(this);
  }
  Sub& operator-=(const Sub& aSize) {
    width -= aSize.width;
    height -= aSize.height;
    return *static_cast<Sub*>(this);
  }

  Sub operator*(T aScale) const {
    return Sub(width * aScale, height * aScale);
  }
  Sub operator/(T aScale) const {
    return Sub(width / aScale, height / aScale);
  }
  friend Sub operator*(T aScale, const Sub& aSize) {
    return Sub(aScale * aSize.width, aScale * aSize.height);
  }
  void Scale(T aXScale, T aYScale) {
    width *= aXScale;
    height *= aYScale;
  }

  Sub operator*(const Sub& aSize) const {
    return Sub(width * aSize.width, height * aSize.height);
  }
  Sub operator/(const Sub& aSize) const {
    return Sub(width / aSize.width, height / aSize.height);
  }

  friend Sub Min(const Sub& aA, const Sub& aB) {
    return Sub(std::min(aA.width, aB.width),
               std::min(aA.height, aB.height));
  }

  friend Sub Max(const Sub& aA, const Sub& aB) {
    return Sub(std::max(aA.width, aB.width),
               std::max(aA.height, aB.height));
  }

  friend std::ostream& operator<<(std::ostream& aStream,
      const BaseSize<T, Sub>& aSize) {
    return aStream << aSize.width << " x " << aSize.height;
  }
};

}
}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Point.h" 2

namespace mozilla {

template <typename> struct IsPixel;

namespace gfx {


struct UnknownUnits {};

}

template<> struct IsPixel<gfx::UnknownUnits> : TrueType {};

namespace gfx {






template<typename T>
struct IntParam {
  constexpr IntParam(char val) : value(val) {}
  constexpr IntParam(unsigned char val) : value(val) {}
  constexpr IntParam(short val) : value(val) {}
  constexpr IntParam(unsigned short val) : value(val) {}
  constexpr IntParam(int val) : value(val) {}
  constexpr IntParam(unsigned int val) : value(val) {}
  constexpr IntParam(long val) : value(val) {}
  constexpr IntParam(unsigned long val) : value(val) {}
  constexpr IntParam(long long val) : value(val) {}
  constexpr IntParam(unsigned long long val) : value(val) {}
  template<typename Unit>
  constexpr IntParam(IntCoordTyped<Unit> val) : value(val) {}


               IntParam(float val) = delete;
               IntParam(double val) = delete;

  T value;
};

template<class units, class> struct PointTyped;
template<class units, class> struct SizeTyped;

template<class units>
struct IntPointTyped :
  public BasePoint< int32_t, IntPointTyped<units>, IntCoordTyped<units> >,
  public units {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef IntParam<int32_t> ToInt;
  typedef IntCoordTyped<units> Coord;
  typedef BasePoint< int32_t, IntPointTyped<units>, IntCoordTyped<units> > Super;

  constexpr IntPointTyped() : Super() {}
  constexpr IntPointTyped(ToInt aX, ToInt aY) : Super(Coord(aX.value), Coord(aY.value)) {}

  static IntPointTyped<units> Round(float aX, float aY) {
    return IntPointTyped(int32_t(floorf(aX + 0.5)), int32_t(floorf(aY + 0.5)));
  }

  static IntPointTyped<units> Ceil(float aX, float aY) {
    return IntPointTyped(int32_t(ceil(aX)), int32_t(ceil(aY)));
  }

  static IntPointTyped<units> Floor(float aX, float aY) {
    return IntPointTyped(int32_t(floorf(aX)), int32_t(floorf(aY)));
  }

  static IntPointTyped<units> Truncate(float aX, float aY) {
    return IntPointTyped(int32_t(aX), int32_t(aY));
  }

  static IntPointTyped<units> Round(const PointTyped<units, float>& aPoint);
  static IntPointTyped<units> Ceil(const PointTyped<units, float>& aPoint);
  static IntPointTyped<units> Floor(const PointTyped<units, float>& aPoint);
  static IntPointTyped<units> Truncate(const PointTyped<units, float>& aPoint);




  static IntPointTyped<units> FromUnknownPoint(const IntPointTyped<UnknownUnits>& aPoint) {
    return IntPointTyped<units>(aPoint.x, aPoint.y);
  }

  IntPointTyped<UnknownUnits> ToUnknownPoint() const {
    return IntPointTyped<UnknownUnits>(this->x, this->y);
  }
};
typedef IntPointTyped<UnknownUnits> IntPoint;

template<class units, class F = Float>
struct PointTyped :
  public BasePoint< F, PointTyped<units, F>, CoordTyped<units, F> >,
  public units {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef CoordTyped<units, F> Coord;
  typedef BasePoint< F, PointTyped<units, F>, CoordTyped<units, F> > Super;

  constexpr PointTyped() : Super() {}
  constexpr PointTyped(F aX, F aY) : Super(Coord(aX), Coord(aY)) {}


  constexpr PointTyped(F aX, Coord aY) : Super(Coord(aX), aY) {}
  constexpr PointTyped(Coord aX, F aY) : Super(aX, Coord(aY)) {}
  constexpr PointTyped(Coord aX, Coord aY) : Super(aX.value, aY.value) {}
  constexpr PointTyped(const IntPointTyped<units>& point) : Super(F(point.x), F(point.y)) {}




  static PointTyped<units, F> FromUnknownPoint(const PointTyped<UnknownUnits, F>& aPoint) {
    return PointTyped<units, F>(aPoint.x, aPoint.y);
  }

  PointTyped<UnknownUnits, F> ToUnknownPoint() const {
    return PointTyped<UnknownUnits, F>(this->x, this->y);
  }
};
typedef PointTyped<UnknownUnits> Point;
typedef PointTyped<UnknownUnits, double> PointDouble;

template<class units>
IntPointTyped<units> RoundedToInt(const PointTyped<units>& aPoint) {
  return IntPointTyped<units>::Round(aPoint.x, aPoint.y);
}

template<class units>
IntPointTyped<units> TruncatedToInt(const PointTyped<units>& aPoint) {
  return IntPointTyped<units>::Truncate(aPoint.x, aPoint.y);
}

template<class units, class F = Float>
struct Point3DTyped :
  public BasePoint3D< F, Point3DTyped<units, F> > {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef BasePoint3D< F, Point3DTyped<units, F> > Super;

  Point3DTyped() : Super() {}
  Point3DTyped(F aX, F aY, F aZ) : Super(aX, aY, aZ) {}




  static Point3DTyped<units, F> FromUnknownPoint(const Point3DTyped<UnknownUnits, F>& aPoint) {
    return Point3DTyped<units, F>(aPoint.x, aPoint.y, aPoint.z);
  }

  Point3DTyped<UnknownUnits, F> ToUnknownPoint() const {
    return Point3DTyped<UnknownUnits, F>(this->x, this->y, this->z);
  }
};
typedef Point3DTyped<UnknownUnits> Point3D;
typedef Point3DTyped<UnknownUnits, double> PointDouble3D;

template<typename units>
IntPointTyped<units>
IntPointTyped<units>::Round(const PointTyped<units, float>& aPoint)
{
  return IntPointTyped::Round(aPoint.x, aPoint.y);
}

template<typename units>
IntPointTyped<units>
IntPointTyped<units>::Ceil(const PointTyped<units, float>& aPoint)
{
  return IntPointTyped::Ceil(aPoint.x, aPoint.y);
}

template<typename units>
IntPointTyped<units>
IntPointTyped<units>::Floor(const PointTyped<units, float>& aPoint)
{
  return IntPointTyped::Floor(aPoint.x, aPoint.y);
}

template<typename units>
IntPointTyped<units>
IntPointTyped<units>::Truncate(const PointTyped<units, float>& aPoint)
{
  return IntPointTyped::Truncate(aPoint.x, aPoint.y);
}

template<class units, class F = Float>
struct Point4DTyped :
  public BasePoint4D< F, Point4DTyped<units, F> > {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef BasePoint4D< F, Point4DTyped<units, F> > Super;

  Point4DTyped() : Super() {}
  Point4DTyped(F aX, F aY, F aZ, F aW) : Super(aX, aY, aZ, aW) {}

  explicit Point4DTyped(const Point3DTyped<units, F>& aPoint)
    : Super(aPoint.x, aPoint.y, aPoint.z, 1) {}




  static Point4DTyped<units, F> FromUnknownPoint(const Point4DTyped<UnknownUnits, F>& aPoint) {
    return Point4DTyped<units, F>(aPoint.x, aPoint.y, aPoint.z, aPoint.w);
  }

  Point4DTyped<UnknownUnits, F> ToUnknownPoint() const {
    return Point4DTyped<UnknownUnits, F>(this->x, this->y, this->z, this->w);
  }

  PointTyped<units, F> As2DPoint() const {
    return PointTyped<units, F>(this->x / this->w,
                                this->y / this->w);
  }

  Point3DTyped<units, F> As3DPoint() const {
    return Point3DTyped<units, F>(this->x / this->w,
                                  this->y / this->w,
                                  this->z / this->w);
  }
};
typedef Point4DTyped<UnknownUnits> Point4D;
typedef Point4DTyped<UnknownUnits, double> PointDouble4D;

template<class units>
struct IntSizeTyped :
  public BaseSize< int32_t, IntSizeTyped<units> >,
  public units {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef IntParam<int32_t> ToInt;
  typedef BaseSize< int32_t, IntSizeTyped<units> > Super;

  constexpr IntSizeTyped() : Super() {}
  constexpr IntSizeTyped(ToInt aWidth, ToInt aHeight) : Super(aWidth.value, aHeight.value) {}

  static IntSizeTyped<units> Round(float aWidth, float aHeight) {
    return IntSizeTyped(int32_t(floorf(aWidth + 0.5)), int32_t(floorf(aHeight + 0.5)));
  }

  static IntSizeTyped<units> Truncate(float aWidth, float aHeight) {
    return IntSizeTyped(int32_t(aWidth), int32_t(aHeight));
  }

  static IntSizeTyped<units> Ceil(float aWidth, float aHeight) {
    return IntSizeTyped(int32_t(ceil(aWidth)), int32_t(ceil(aHeight)));
  }

  static IntSizeTyped<units> Floor(float aWidth, float aHeight) {
    return IntSizeTyped(int32_t(floorf(aWidth)), int32_t(floorf(aHeight)));
  }

  static IntSizeTyped<units> Round(const SizeTyped<units, float>& aSize);
  static IntSizeTyped<units> Ceil(const SizeTyped<units, float>& aSize);
  static IntSizeTyped<units> Floor(const SizeTyped<units, float>& aSize);
  static IntSizeTyped<units> Truncate(const SizeTyped<units, float>& aSize);




  static IntSizeTyped<units> FromUnknownSize(const IntSizeTyped<UnknownUnits>& aSize) {
    return IntSizeTyped<units>(aSize.width, aSize.height);
  }

  IntSizeTyped<UnknownUnits> ToUnknownSize() const {
    return IntSizeTyped<UnknownUnits>(this->width, this->height);
  }
};
typedef IntSizeTyped<UnknownUnits> IntSize;

template<class units, class F = Float>
struct SizeTyped :
  public BaseSize< F, SizeTyped<units, F> >,
  public units {
  static_assert(IsPixel<units>::value,
                "'units' must be a coordinate system tag");

  typedef BaseSize< F, SizeTyped<units, F> > Super;

  constexpr SizeTyped() : Super() {}
  constexpr SizeTyped(F aWidth, F aHeight) : Super(aWidth, aHeight) {}
  explicit SizeTyped(const IntSizeTyped<units>& size) :
    Super(F(size.width), F(size.height)) {}




  static SizeTyped<units, F> FromUnknownSize(const SizeTyped<UnknownUnits, F>& aSize) {
    return SizeTyped<units, F>(aSize.width, aSize.height);
  }

  SizeTyped<UnknownUnits, F> ToUnknownSize() const {
    return SizeTyped<UnknownUnits, F>(this->width, this->height);
  }
};
typedef SizeTyped<UnknownUnits> Size;
typedef SizeTyped<UnknownUnits, double> SizeDouble;

template<class units>
IntSizeTyped<units> RoundedToInt(const SizeTyped<units>& aSize) {
  return IntSizeTyped<units>(int32_t(floorf(aSize.width + 0.5f)),
                             int32_t(floorf(aSize.height + 0.5f)));
}

template<typename units> IntSizeTyped<units>
IntSizeTyped<units>::Round(const SizeTyped<units, float>& aSize) {
  return IntSizeTyped::Round(aSize.width, aSize.height);
}

template<typename units> IntSizeTyped<units>
IntSizeTyped<units>::Ceil(const SizeTyped<units, float>& aSize) {
  return IntSizeTyped::Ceil(aSize.width, aSize.height);
}

template<typename units> IntSizeTyped<units>
IntSizeTyped<units>::Floor(const SizeTyped<units, float>& aSize) {
  return IntSizeTyped::Floor(aSize.width, aSize.height);
}

template<typename units> IntSizeTyped<units>
IntSizeTyped<units>::Truncate(const SizeTyped<units, float>& aSize) {
  return IntSizeTyped::Truncate(aSize.width, aSize.height);
}

}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Triangle.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h" 2







namespace mozilla {
namespace gfx {
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h"
template <class T, class Sub, class Point, class SizeT, class MarginT>
struct BaseRect {
  T x, y, width, height;


  BaseRect() : x(0), y(0), width(0), height(0) {}
  BaseRect(const Point& aOrigin, const SizeT &aSize) :
      x(aOrigin.x), y(aOrigin.y), width(aSize.width), height(aSize.height)
  {
  }
  BaseRect(T aX, T aY, T aWidth, T aHeight) :
      x(aX), y(aY), width(aWidth), height(aHeight)
  {
  }



  bool IsEmpty() const { return height <= 0 || width <= 0; }
  void SetEmpty() { width = height = 0; }


  bool IsFinite() const
  {
    typedef typename mozilla::Conditional<mozilla::IsSame<T, float>::value, float, double>::Type FloatType;
    return (mozilla::IsFinite(FloatType(x)) &&
            mozilla::IsFinite(FloatType(y)) &&
            mozilla::IsFinite(FloatType(width)) &&
            mozilla::IsFinite(FloatType(height)));
  }




  bool Contains(const Sub& aRect) const
  {
    return aRect.IsEmpty() ||
           (x <= aRect.x && aRect.XMost() <= XMost() &&
            y <= aRect.y && aRect.YMost() <= YMost());
  }



  bool Contains(T aX, T aY) const
  {
    return x <= aX && aX < XMost() &&
           y <= aY && aY < YMost();
  }



  bool Contains(const Point& aPoint) const { return Contains(aPoint.x, aPoint.y); }




  bool Intersects(const Sub& aRect) const
  {
    return !IsEmpty() && !aRect.IsEmpty() &&
           x < aRect.XMost() && aRect.x < XMost() &&
           y < aRect.YMost() && aRect.y < YMost();
  }




  __attribute__ ((warn_unused_result)) Sub Intersect(const Sub& aRect) const
  {
    Sub result;
    result.x = std::max<T>(x, aRect.x);
    result.y = std::max<T>(y, aRect.y);
    result.width = std::min<T>(x - result.x + width, aRect.x - result.x + aRect.width);
    result.height = std::min<T>(y - result.y + height, aRect.y - result.y + aRect.height);
    if (result.width < 0 || result.height < 0) {
      result.SizeTo(0, 0);
    }
    return result;
  }






  bool IntersectRect(const Sub& aRect1, const Sub& aRect2)
  {
    *static_cast<Sub*>(this) = aRect1.Intersect(aRect2);
    return !IsEmpty();
  }







  __attribute__ ((warn_unused_result)) Sub Union(const Sub& aRect) const
  {
    if (IsEmpty()) {
      return aRect;
    } else if (aRect.IsEmpty()) {
      return *static_cast<const Sub*>(this);
    } else {
      return UnionEdges(aRect);
    }
  }





  __attribute__ ((warn_unused_result)) Sub UnionEdges(const Sub& aRect) const
  {
    Sub result;
    result.x = std::min(x, aRect.x);
    result.y = std::min(y, aRect.y);
    result.width = std::max(XMost(), aRect.XMost()) - result.x;
    result.height = std::max(YMost(), aRect.YMost()) - result.y;
    return result;
  }






  void UnionRect(const Sub& aRect1, const Sub& aRect2)
  {
    *static_cast<Sub*>(this) = aRect1.Union(aRect2);
  }






  void UnionRectEdges(const Sub& aRect1, const Sub& aRect2)
  {
    *static_cast<Sub*>(this) = aRect1.UnionEdges(aRect2);
  }


  void ExpandToEnclose(const Point& aPoint)
  {
    if (aPoint.x < x) {
      width = XMost() - aPoint.x;
      x = aPoint.x;
    } else if (aPoint.x > XMost()) {
      width = aPoint.x - x;
    }
    if (aPoint.y < y) {
      height = YMost() - aPoint.y;
      y = aPoint.y;
    } else if (aPoint.y > YMost()) {
      height = aPoint.y - y;
    }
  }

  void SetRect(T aX, T aY, T aWidth, T aHeight)
  {
    x = aX; y = aY; width = aWidth; height = aHeight;
  }
  void SetRect(const Point& aPt, const SizeT& aSize)
  {
    SetRect(aPt.x, aPt.y, aSize.width, aSize.height);
  }
  void MoveTo(T aX, T aY) { x = aX; y = aY; }
  void MoveTo(const Point& aPoint) { x = aPoint.x; y = aPoint.y; }
  void MoveBy(T aDx, T aDy) { x += aDx; y += aDy; }
  void MoveBy(const Point& aPoint) { x += aPoint.x; y += aPoint.y; }
  void SizeTo(T aWidth, T aHeight) { width = aWidth; height = aHeight; }
  void SizeTo(const SizeT& aSize) { width = aSize.width; height = aSize.height; }

  void Inflate(T aD) { Inflate(aD, aD); }
  void Inflate(T aDx, T aDy)
  {
    x -= aDx;
    y -= aDy;
    width += 2 * aDx;
    height += 2 * aDy;
  }
  void Inflate(const MarginT& aMargin)
  {
    x -= aMargin.left;
    y -= aMargin.top;
    width += aMargin.LeftRight();
    height += aMargin.TopBottom();
  }
  void Inflate(const SizeT& aSize) { Inflate(aSize.width, aSize.height); }

  void Deflate(T aD) { Deflate(aD, aD); }
  void Deflate(T aDx, T aDy)
  {
    x += aDx;
    y += aDy;
    width = std::max(T(0), width - 2 * aDx);
    height = std::max(T(0), height - 2 * aDy);
  }
  void Deflate(const MarginT& aMargin)
  {
    x += aMargin.left;
    y += aMargin.top;
    width = std::max(T(0), width - aMargin.LeftRight());
    height = std::max(T(0), height - aMargin.TopBottom());
  }
  void Deflate(const SizeT& aSize) { Deflate(aSize.width, aSize.height); }





  bool IsEqualEdges(const Sub& aRect) const
  {
    return x == aRect.x && y == aRect.y &&
           width == aRect.width && height == aRect.height;
  }


  bool IsEqualInterior(const Sub& aRect) const
  {
    return IsEqualEdges(aRect) || (IsEmpty() && aRect.IsEmpty());
  }

  friend Sub operator+(Sub aSub, const Point& aPoint)
  {
    aSub += aPoint;
    return aSub;
  }
  friend Sub operator-(Sub aSub, const Point& aPoint)
  {
    aSub -= aPoint;
    return aSub;
  }
  friend Sub operator+(Sub aSub, const SizeT& aSize)
  {
    aSub += aSize;
    return aSub;
  }
  friend Sub operator-(Sub aSub, const SizeT& aSize)
  {
    aSub -= aSize;
    return aSub;
  }
  Sub& operator+=(const Point& aPoint)
  {
    MoveBy(aPoint);
    return *static_cast<Sub*>(this);
  }
  Sub& operator-=(const Point& aPoint)
  {
    MoveBy(-aPoint);
    return *static_cast<Sub*>(this);
  }
  Sub& operator+=(const SizeT& aSize)
  {
    width += aSize.width;
    height += aSize.height;
    return *static_cast<Sub*>(this);
  }
  Sub& operator-=(const SizeT& aSize)
  {
    width -= aSize.width;
    height -= aSize.height;
    return *static_cast<Sub*>(this);
  }

  MarginT operator-(const Sub& aRect) const
  {
    return MarginT(aRect.y - y,
                   XMost() - aRect.XMost(),
                   YMost() - aRect.YMost(),
                   aRect.x - x);
  }


  Point TopLeft() const { return Point(x, y); }
  Point TopRight() const { return Point(XMost(), y); }
  Point BottomLeft() const { return Point(x, YMost()); }
  Point BottomRight() const { return Point(XMost(), YMost()); }
  Point AtCorner(Corner aCorner) const {
    switch (aCorner) {
      case eCornerTopLeft: return TopLeft();
      case eCornerTopRight: return TopRight();
      case eCornerBottomRight: return BottomRight();
      case eCornerBottomLeft: return BottomLeft();
    }
    do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 329; ::abort(); } while (0); } while (0);
  }
  Point CCWCorner(mozilla::Side side) const {
    switch (side) {
      case eSideTop: return TopLeft();
      case eSideRight: return TopRight();
      case eSideBottom: return BottomRight();
      case eSideLeft: return BottomLeft();
    }
    do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 338; ::abort(); } while (0); } while (0);
  }
  Point CWCorner(mozilla::Side side) const {
    switch (side) {
      case eSideTop: return TopRight();
      case eSideRight: return BottomRight();
      case eSideBottom: return BottomLeft();
      case eSideLeft: return TopLeft();
    }
    do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 347; ::abort(); } while (0); } while (0);
  }
  Point Center() const { return Point(x, y) + Point(width, height)/2; }
  SizeT Size() const { return SizeT(width, height); }

  T Area() const { return width * height; }


  T X() const { return x; }
  T Y() const { return y; }
  T Width() const { return width; }
  T Height() const { return height; }
  T XMost() const { return x + width; }
  T YMost() const { return y + height; }


  T Edge(mozilla::Side aSide) const
  {
    switch (aSide) {
      case eSideTop: return Y();
      case eSideRight: return XMost();
      case eSideBottom: return YMost();
      case eSideLeft: return X();
    }
    do { AnnotateMozCrashReason("MOZ_CRASH(" "GFX: Incomplete switch" ")"); do { *((volatile int*) __null) = 371; ::abort(); } while (0); } while (0);
  }


  void SetLeftEdge(T aX) {
    do { } while (0);
    width = XMost() - aX;
    x = aX;
  }
  void SetRightEdge(T aXMost) {
    do { } while (0);
    width = aXMost - x;
  }
  void SetTopEdge(T aY) {
    do { } while (0);
    height = YMost() - aY;
    y = aY;
  }
  void SetBottomEdge(T aYMost) {
    do { } while (0);
    height = aYMost - y;
  }
# 405 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseRect.h"
  void Round()
  {
    T x0 = static_cast<T>(floor(T(X()) + 0.5));
    T y0 = static_cast<T>(floor(T(Y()) + 0.5));
    T x1 = static_cast<T>(floor(T(XMost()) + 0.5));
    T y1 = static_cast<T>(floor(T(YMost()) + 0.5));

    x = x0;
    y = y0;

    width = x1 - x0;
    height = y1 - y0;
  }



  void RoundIn()
  {
    T x0 = static_cast<T>(ceil(T(X())));
    T y0 = static_cast<T>(ceil(T(Y())));
    T x1 = static_cast<T>(floor(T(XMost())));
    T y1 = static_cast<T>(floor(T(YMost())));

    x = x0;
    y = y0;

    width = x1 - x0;
    height = y1 - y0;
  }



  void RoundOut()
  {
    T x0 = static_cast<T>(floor(T(X())));
    T y0 = static_cast<T>(floor(T(Y())));
    T x1 = static_cast<T>(ceil(T(XMost())));
    T y1 = static_cast<T>(ceil(T(YMost())));

    x = x0;
    y = y0;

    width = x1 - x0;
    height = y1 - y0;
  }


  void Scale(T aScale) { Scale(aScale, aScale); }

  void Scale(T aXScale, T aYScale)
  {
    T right = XMost() * aXScale;
    T bottom = YMost() * aYScale;
    x = x * aXScale;
    y = y * aYScale;
    width = right - x;
    height = bottom - y;
  }



  void ScaleRoundOut(double aScale) { ScaleRoundOut(aScale, aScale); }




  void ScaleRoundOut(double aXScale, double aYScale)
  {
    T right = static_cast<T>(ceil(double(XMost()) * aXScale));
    T bottom = static_cast<T>(ceil(double(YMost()) * aYScale));
    x = static_cast<T>(floor(double(x) * aXScale));
    y = static_cast<T>(floor(double(y) * aYScale));
    width = right - x;
    height = bottom - y;
  }


  void ScaleRoundIn(double aScale) { ScaleRoundIn(aScale, aScale); }



  void ScaleRoundIn(double aXScale, double aYScale)
  {
    T right = static_cast<T>(floor(double(XMost()) * aXScale));
    T bottom = static_cast<T>(floor(double(YMost()) * aYScale));
    x = static_cast<T>(ceil(double(x) * aXScale));
    y = static_cast<T>(ceil(double(y) * aYScale));
    width = std::max<T>(0, right - x);
    height = std::max<T>(0, bottom - y);
  }



  void ScaleInverseRoundOut(double aScale) { ScaleInverseRoundOut(aScale, aScale); }




  void ScaleInverseRoundOut(double aXScale, double aYScale)
  {
    T right = static_cast<T>(ceil(double(XMost()) / aXScale));
    T bottom = static_cast<T>(ceil(double(YMost()) / aYScale));
    x = static_cast<T>(floor(double(x) / aXScale));
    y = static_cast<T>(floor(double(y) / aYScale));
    width = right - x;
    height = bottom - y;
  }


  void ScaleInverseRoundIn(double aScale) { ScaleInverseRoundIn(aScale, aScale); }



  void ScaleInverseRoundIn(double aXScale, double aYScale)
  {
    T right = static_cast<T>(floor(double(XMost()) / aXScale));
    T bottom = static_cast<T>(floor(double(YMost()) / aYScale));
    x = static_cast<T>(ceil(double(x) / aXScale));
    y = static_cast<T>(ceil(double(y) / aYScale));
    width = std::max<T>(0, right - x);
    height = std::max<T>(0, bottom - y);
  }





  __attribute__ ((warn_unused_result)) Point ClampPoint(const Point& aPoint) const
  {
    return Point(std::max(x, std::min(XMost(), aPoint.x)),
                 std::max(y, std::min(YMost(), aPoint.y)));
  }






  __attribute__ ((warn_unused_result)) Sub MoveInsideAndClamp(const Sub& aRect) const
  {
    Sub rect(std::max(aRect.x, x),
             std::max(aRect.y, y),
             std::min(aRect.width, width),
             std::min(aRect.height, height));
    rect.x = std::min(rect.XMost(), aRect.XMost()) - rect.width;
    rect.y = std::min(rect.YMost(), aRect.YMost()) - rect.height;
    return rect;
  }







  static Sub MaxIntRect()
  {
    return Sub(
      static_cast<T>(-std::numeric_limits<int32_t>::max() * 0.5),
      static_cast<T>(-std::numeric_limits<int32_t>::max() * 0.5),
      static_cast<T>(std::numeric_limits<int32_t>::max()),
      static_cast<T>(std::numeric_limits<int32_t>::max())
    );
  };

  friend std::ostream& operator<<(std::ostream& stream,
      const BaseRect<T, Sub, Point, SizeT, MarginT>& aRect) {
    return stream << '(' << aRect.x << ',' << aRect.y << ','
                  << aRect.width << ',' << aRect.height << ')';
  }

private:


  bool operator==(const Sub& aRect) const { return false; }
  bool operator!=(const Sub& aRect) const { return false; }
};

}
}
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseMargin.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/BaseMargin.h"
namespace mozilla {




struct Sides final {
  Sides() : mBits(0) {}
  explicit Sides(SideBits aSideBits)
  {
    do { } while (0);
    mBits = aSideBits;
  }
  bool IsEmpty() const { return mBits == 0; }
  bool Top() const { return (mBits & eSideBitsTop) != 0; }
  bool Right() const { return (mBits & eSideBitsRight) != 0; }
  bool Bottom() const { return (mBits & eSideBitsBottom) != 0; }
  bool Left() const { return (mBits & eSideBitsLeft) != 0; }
  bool Contains(SideBits aSideBits) const
  {
    do { } while (0);
    return (mBits & aSideBits) == aSideBits;
  }
  Sides operator|(Sides aOther) const
  {
    return Sides(SideBits(mBits | aOther.mBits));
  }
  Sides operator|(SideBits aSideBits) const
  {
    return *this | Sides(aSideBits);
  }
  Sides& operator|=(Sides aOther)
  {
    mBits |= aOther.mBits;
    return *this;
  }
  Sides& operator|=(SideBits aSideBits)
  {
    return *this |= Sides(aSideBits);
  }
  bool operator==(Sides aOther) const
  {
    return mBits == aOther.mBits;
  }
  bool operator!=(Sides aOther) const
  {
    return !(*this == aOther);
  }

private:
  uint8_t mBits;
};

namespace gfx {





template <class T, class Sub>
struct BaseMargin {
  typedef mozilla::Side SideT;



  T top, right, bottom, left;


  BaseMargin() : top(0), right(0), bottom(0), left(0) {}
  BaseMargin(T aTop, T aRight, T aBottom, T aLeft) :
      top(aTop), right(aRight), bottom(aBottom), left(aLeft) {}

  void SizeTo(T aTop, T aRight, T aBottom, T aLeft)
  {
    top = aTop; right = aRight; bottom = aBottom; left = aLeft;
  }

  T LeftRight() const { return left + right; }
  T TopBottom() const { return top + bottom; }

  T& Side(SideT aSide) {

    return *(&top + int(aSide));
  }
  T Side(SideT aSide) const {

    return *(&top + int(aSide));
  }

  void ApplySkipSides(Sides aSkipSides)
  {
    if (aSkipSides.Top()) {
      top = 0;
    }
    if (aSkipSides.Right()) {
      right = 0;
    }
    if (aSkipSides.Bottom()) {
      bottom = 0;
    }
    if (aSkipSides.Left()) {
      left = 0;
    }
  }



  bool operator==(const Sub& aMargin) const {
    return top == aMargin.top && right == aMargin.right &&
           bottom == aMargin.bottom && left == aMargin.left;
  }
  bool operator!=(const Sub& aMargin) const {
    return !(*this == aMargin);
  }
  Sub operator+(const Sub& aMargin) const {
    return Sub(top + aMargin.top, right + aMargin.right,
               bottom + aMargin.bottom, left + aMargin.left);
  }
  Sub operator-(const Sub& aMargin) const {
    return Sub(top - aMargin.top, right - aMargin.right,
               bottom - aMargin.bottom, left - aMargin.left);
  }
  Sub& operator+=(const Sub& aMargin) {
    top += aMargin.top;
    right += aMargin.right;
    bottom += aMargin.bottom;
    left += aMargin.left;
    return *static_cast<Sub*>(this);
  }

  friend std::ostream& operator<<(std::ostream& aStream,
      const BaseMargin& aMargin) {
    return aStream << '(' << aMargin.top << ',' << aMargin.right << ','
                  << aMargin.bottom << ',' << aMargin.left << ')';
  }
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/NumericTools.h" 1








namespace mozilla {






inline int32_t
RoundDownToMultiple(int32_t x, int32_t aMultiplier)
{


  int mod = x % aMultiplier;
  if (x > 0) {
    return x - mod;
  }
  return mod ? x - aMultiplier - mod : x;
}




inline int32_t
RoundUpToMultiple(int32_t x, int32_t aMultiplier)
{
  int mod = x % aMultiplier;
  if (x > 0) {
    return mod ? x + aMultiplier - mod : x;
  }
  return x - mod;
}

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
namespace mozilla {

template<typename T> class CheckedInt;

namespace detail {
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
struct UnsupportedType {};

template<typename IntegerType>
struct IsSupportedPass2
{
  static const bool value = false;
};

template<typename IntegerType>
struct IsSupported
{
  static const bool value = IsSupportedPass2<IntegerType>::value;
};

template<>
struct IsSupported<int8_t>
{ static const bool value = true; };

template<>
struct IsSupported<uint8_t>
{ static const bool value = true; };

template<>
struct IsSupported<int16_t>
{ static const bool value = true; };

template<>
struct IsSupported<uint16_t>
{ static const bool value = true; };

template<>
struct IsSupported<int32_t>
{ static const bool value = true; };

template<>
struct IsSupported<uint32_t>
{ static const bool value = true; };

template<>
struct IsSupported<int64_t>
{ static const bool value = true; };

template<>
struct IsSupported<uint64_t>
{ static const bool value = true; };


template<>
struct IsSupportedPass2<char>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<signed char>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<unsigned char>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<short>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<unsigned short>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<int>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<unsigned int>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<long>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<unsigned long>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<long long>
{ static const bool value = true; };

template<>
struct IsSupportedPass2<unsigned long long>
{ static const bool value = true; };







template<typename IntegerType, size_t Size = sizeof(IntegerType)>
struct TwiceBiggerType
{
  typedef typename detail::StdintTypeForSizeAndSignedness<
                     sizeof(IntegerType) * 2,
                     IsSigned<IntegerType>::value
                   >::Type Type;
};

template<typename IntegerType>
struct TwiceBiggerType<IntegerType, 8>
{
  typedef UnsupportedType Type;
};

template<typename T>
inline bool
HasSignBit(T aX)
{




  return bool(typename MakeUnsigned<T>::Type(aX) >>
              PositionOfSignBit<T>::value);
}



template<typename T>
inline T
BinaryComplement(T aX)
{
  return ~aX;
}

template<typename T,
         typename U,
         bool IsTSigned = IsSigned<T>::value,
         bool IsUSigned = IsSigned<U>::value>
struct DoesRangeContainRange
{
};

template<typename T, typename U, bool Signedness>
struct DoesRangeContainRange<T, U, Signedness, Signedness>
{
  static const bool value = sizeof(T) >= sizeof(U);
};

template<typename T, typename U>
struct DoesRangeContainRange<T, U, true, false>
{
  static const bool value = sizeof(T) > sizeof(U);
};

template<typename T, typename U>
struct DoesRangeContainRange<T, U, false, true>
{
  static const bool value = false;
};

template<typename T,
         typename U,
         bool IsTSigned = IsSigned<T>::value,
         bool IsUSigned = IsSigned<U>::value,
         bool DoesTRangeContainURange = DoesRangeContainRange<T, U>::value>
struct IsInRangeImpl {};

template<typename T, typename U, bool IsTSigned, bool IsUSigned>
struct IsInRangeImpl<T, U, IsTSigned, IsUSigned, true>
{
  static bool constexpr run(U)
  {
    return true;
  }
};

template<typename T, typename U>
struct IsInRangeImpl<T, U, true, true, false>
{
  static bool constexpr run(U aX)
  {
    return aX <= MaxValue<T>::value && aX >= MinValue<T>::value;
  }
};

template<typename T, typename U>
struct IsInRangeImpl<T, U, false, false, false>
{
  static bool constexpr run(U aX)
  {
    return aX <= MaxValue<T>::value;
  }
};

template<typename T, typename U>
struct IsInRangeImpl<T, U, true, false, false>
{
  static bool constexpr run(U aX)
  {
    return sizeof(T) > sizeof(U) || aX <= U(MaxValue<T>::value);
  }
};

template<typename T, typename U>
struct IsInRangeImpl<T, U, false, true, false>
{
  static bool constexpr run(U aX)
  {
    return sizeof(T) >= sizeof(U)
           ? aX >= 0
           : aX >= 0 && aX <= U(MaxValue<T>::value);
  }
};

template<typename T, typename U>
inline constexpr bool
IsInRange(U aX)
{
  return IsInRangeImpl<T, U>::run(aX);
}

template<typename T>
inline bool
IsAddValid(T aX, T aY)
{






  typename MakeUnsigned<T>::Type ux = aX;
  typename MakeUnsigned<T>::Type uy = aY;
  typename MakeUnsigned<T>::Type result = ux + uy;
  return IsSigned<T>::value
         ? HasSignBit(BinaryComplement(T((result ^ aX) & (result ^ aY))))
         : BinaryComplement(aX) >= aY;
}

template<typename T>
inline bool
IsSubValid(T aX, T aY)
{



  typename MakeUnsigned<T>::Type ux = aX;
  typename MakeUnsigned<T>::Type uy = aY;
  typename MakeUnsigned<T>::Type result = ux - uy;

  return IsSigned<T>::value
         ? HasSignBit(BinaryComplement(T((result ^ aX) & (aX ^ aY))))
         : aX >= aY;
}

template<typename T,
         bool IsTSigned = IsSigned<T>::value,
         bool TwiceBiggerTypeIsSupported =
           IsSupported<typename TwiceBiggerType<T>::Type>::value>
struct IsMulValidImpl {};

template<typename T, bool IsTSigned>
struct IsMulValidImpl<T, IsTSigned, true>
{
  static bool run(T aX, T aY)
  {
    typedef typename TwiceBiggerType<T>::Type TwiceBiggerType;
    TwiceBiggerType product = TwiceBiggerType(aX) * TwiceBiggerType(aY);
    return IsInRange<T>(product);
  }
};

template<typename T>
struct IsMulValidImpl<T, true, false>
{
  static bool run(T aX, T aY)
  {
    const T max = MaxValue<T>::value;
    const T min = MinValue<T>::value;

    if (aX == 0 || aY == 0) {
      return true;
    }
    if (aX > 0) {
      return aY > 0
             ? aX <= max / aY
             : aY >= min / aX;
    }


    return aY > 0
           ? aX >= min / aY
           : aY >= max / aX;
  }
};

template<typename T>
struct IsMulValidImpl<T, false, false>
{
  static bool run(T aX, T aY)
  {
    return aY == 0 || aX <= MaxValue<T>::value / aY;
  }
};

template<typename T>
inline bool
IsMulValid(T aX, T aY)
{
  return IsMulValidImpl<T>::run(aX, aY);
}

template<typename T>
inline bool
IsDivValid(T aX, T aY)
{


  return aY != 0 &&
         !(IsSigned<T>::value && aX == MinValue<T>::value && aY == T(-1));
}

template<typename T, bool IsTSigned = IsSigned<T>::value>
struct IsModValidImpl;

template<typename T>
inline bool
IsModValid(T aX, T aY)
{
  return IsModValidImpl<T>::run(aX, aY);
}
# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
template<typename T>
struct IsModValidImpl<T, false>
{
  static inline bool run(T aX, T aY)
  {
    return aY >= 1;
  }
};

template<typename T>
struct IsModValidImpl<T, true>
{
  static inline bool run(T aX, T aY)
  {
    if (aX < 0) {
      return false;
    }
    return aY >= 1;
  }
};

template<typename T, bool IsSigned = IsSigned<T>::value>
struct NegateImpl;

template<typename T>
struct NegateImpl<T, false>
{
  static CheckedInt<T> negate(const CheckedInt<T>& aVal)
  {


    return CheckedInt<T>(0, aVal.isValid() && aVal.mValue == 0);
  }
};

template<typename T>
struct NegateImpl<T, true>
{
  static CheckedInt<T> negate(const CheckedInt<T>& aVal)
  {


    if (!aVal.isValid() || aVal.mValue == MinValue<T>::value) {
      return CheckedInt<T>(aVal.mValue, false);
    }
    return CheckedInt<T>(-aVal.mValue, true);
  }
};

}
# 499 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
template<typename T>
class CheckedInt
{
protected:
  T mValue;
  bool mIsValid;

  template<typename U>
  CheckedInt(U aValue, bool aIsValid) : mValue(aValue), mIsValid(aIsValid)
  {
    static_assert(detail::IsSupported<T>::value &&
                  detail::IsSupported<U>::value,
                  "This type is not supported by CheckedInt");
  }

  friend struct detail::NegateImpl<T>;

public:
# 528 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
  template<typename U>
               constexpr CheckedInt(U aValue)
    : mValue(T(aValue)),
      mIsValid(detail::IsInRange<T>(aValue))
  {
    static_assert(detail::IsSupported<T>::value &&
                  detail::IsSupported<U>::value,
                  "This type is not supported by CheckedInt");
  }

  template<typename U>
  friend class CheckedInt;

  template<typename U>
  CheckedInt<U> toChecked() const
  {
    CheckedInt<U> ret(mValue);
    ret.mIsValid = ret.mIsValid && mIsValid;
    return ret;
  }


  constexpr CheckedInt() : mValue(0), mIsValid(true)
  {
    static_assert(detail::IsSupported<T>::value,
                  "This type is not supported by CheckedInt");
  }


  T value() const
  {
    do { } while (0);
    return mValue;
  }






  bool isValid() const
  {
    return mIsValid;
  }

  template<typename U>
  friend CheckedInt<U> operator +(const CheckedInt<U>& aLhs,
                                  const CheckedInt<U>& aRhs);
  template<typename U>
  CheckedInt& operator +=(U aRhs);
  CheckedInt& operator +=(const CheckedInt<T>& aRhs);

  template<typename U>
  friend CheckedInt<U> operator -(const CheckedInt<U>& aLhs,
                                  const CheckedInt<U>& aRhs);
  template<typename U>
  CheckedInt& operator -=(U aRhs);
  CheckedInt& operator -=(const CheckedInt<T>& aRhs);

  template<typename U>
  friend CheckedInt<U> operator *(const CheckedInt<U>& aLhs,
                                  const CheckedInt<U>& aRhs);
  template<typename U>
  CheckedInt& operator *=(U aRhs);
  CheckedInt& operator *=(const CheckedInt<T>& aRhs);

  template<typename U>
  friend CheckedInt<U> operator /(const CheckedInt<U>& aLhs,
                                  const CheckedInt<U>& aRhs);
  template<typename U>
  CheckedInt& operator /=(U aRhs);
  CheckedInt& operator /=(const CheckedInt<T>& aRhs);

  template<typename U>
  friend CheckedInt<U> operator %(const CheckedInt<U>& aLhs,
                                  const CheckedInt<U>& aRhs);
  template<typename U>
  CheckedInt& operator %=(U aRhs);
  CheckedInt& operator %=(const CheckedInt<T>& aRhs);

  CheckedInt operator -() const
  {
    return detail::NegateImpl<T>::negate(*this);
  }
# 631 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
  bool operator ==(const CheckedInt& aOther) const
  {
    return mIsValid && aOther.mIsValid && mValue == aOther.mValue;
  }


  CheckedInt& operator++()
  {
    *this += 1;
    return *this;
  }


  CheckedInt operator++(int)
  {
    CheckedInt tmp = *this;
    *this += 1;
    return tmp;
  }


  CheckedInt& operator--()
  {
    *this -= 1;
    return *this;
  }


  CheckedInt operator--(int)
  {
    CheckedInt tmp = *this;
    *this -= 1;
    return tmp;
  }

private:




  template<typename U> bool operator !=(U aOther) const = delete;
  template<typename U> bool operator < (U aOther) const = delete;
  template<typename U> bool operator <=(U aOther) const = delete;
  template<typename U> bool operator > (U aOther) const = delete;
  template<typename U> bool operator >=(U aOther) const = delete;
};
# 690 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
template<typename T> inline CheckedInt<T> operator +(const CheckedInt<T>& aLhs, const CheckedInt<T>& aRhs) { if (!detail::IsAddValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt<T>(0, false); } return CheckedInt<T>(aLhs.mValue + aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); }
template<typename T> inline CheckedInt<T> operator -(const CheckedInt<T>& aLhs, const CheckedInt<T>& aRhs) { if (!detail::IsSubValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt<T>(0, false); } return CheckedInt<T>(aLhs.mValue - aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); }
template<typename T> inline CheckedInt<T> operator *(const CheckedInt<T>& aLhs, const CheckedInt<T>& aRhs) { if (!detail::IsMulValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt<T>(0, false); } return CheckedInt<T>(aLhs.mValue * aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); }
template<typename T> inline CheckedInt<T> operator /(const CheckedInt<T>& aLhs, const CheckedInt<T>& aRhs) { if (!detail::IsDivValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt<T>(0, false); } return CheckedInt<T>(aLhs.mValue / aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); }
template<typename T> inline CheckedInt<T> operator %(const CheckedInt<T>& aLhs, const CheckedInt<T>& aRhs) { if (!detail::IsModValid(aLhs.mValue, aRhs.mValue)) { return CheckedInt<T>(0, false); } return CheckedInt<T>(aLhs.mValue % aRhs.mValue, aLhs.mIsValid && aRhs.mIsValid); }
# 704 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
namespace detail {

template<typename T, typename U>
struct CastToCheckedIntImpl
{
  typedef CheckedInt<T> ReturnType;
  static CheckedInt<T> run(U aU) { return aU; }
};

template<typename T>
struct CastToCheckedIntImpl<T, CheckedInt<T> >
{
  typedef const CheckedInt<T>& ReturnType;
  static const CheckedInt<T>& run(const CheckedInt<T>& aU) { return aU; }
};

}

template<typename T, typename U>
inline typename detail::CastToCheckedIntImpl<T, U>::ReturnType
castToCheckedInt(U aU)
{
  static_assert(detail::IsSupported<T>::value &&
                detail::IsSupported<U>::value,
                "This type is not supported by CheckedInt");
  return detail::CastToCheckedIntImpl<T, U>::run(aU);
}
# 757 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CheckedInt.h"
template<typename T> template<typename U> CheckedInt<T>& CheckedInt<T>::operator +=(U aRhs) { *this = *this + castToCheckedInt<T>(aRhs); return *this; } template<typename T> CheckedInt<T>& CheckedInt<T>::operator +=(const CheckedInt<T>& aRhs) { *this = *this + aRhs; return *this; } template<typename T, typename U> inline CheckedInt<T> operator +(const CheckedInt<T>& aLhs, U aRhs) { return aLhs + castToCheckedInt<T>(aRhs); } template<typename T, typename U> inline CheckedInt<T> operator +(U aLhs, const CheckedInt<T>& aRhs) { return castToCheckedInt<T>(aLhs) + aRhs; }
template<typename T> template<typename U> CheckedInt<T>& CheckedInt<T>::operator *=(U aRhs) { *this = *this * castToCheckedInt<T>(aRhs); return *this; } template<typename T> CheckedInt<T>& CheckedInt<T>::operator *=(const CheckedInt<T>& aRhs) { *this = *this * aRhs; return *this; } template<typename T, typename U> inline CheckedInt<T> operator *(const CheckedInt<T>& aLhs, U aRhs) { return aLhs * castToCheckedInt<T>(aRhs); } template<typename T, typename U> inline CheckedInt<T> operator *(U aLhs, const CheckedInt<T>& aRhs) { return castToCheckedInt<T>(aLhs) * aRhs; }
template<typename T> template<typename U> CheckedInt<T>& CheckedInt<T>::operator -=(U aRhs) { *this = *this - castToCheckedInt<T>(aRhs); return *this; } template<typename T> CheckedInt<T>& CheckedInt<T>::operator -=(const CheckedInt<T>& aRhs) { *this = *this - aRhs; return *this; } template<typename T, typename U> inline CheckedInt<T> operator -(const CheckedInt<T>& aLhs, U aRhs) { return aLhs - castToCheckedInt<T>(aRhs); } template<typename T, typename U> inline CheckedInt<T> operator -(U aLhs, const CheckedInt<T>& aRhs) { return castToCheckedInt<T>(aLhs) - aRhs; }
template<typename T> template<typename U> CheckedInt<T>& CheckedInt<T>::operator /=(U aRhs) { *this = *this / castToCheckedInt<T>(aRhs); return *this; } template<typename T> CheckedInt<T>& CheckedInt<T>::operator /=(const CheckedInt<T>& aRhs) { *this = *this / aRhs; return *this; } template<typename T, typename U> inline CheckedInt<T> operator /(const CheckedInt<T>& aLhs, U aRhs) { return aLhs / castToCheckedInt<T>(aRhs); } template<typename T, typename U> inline CheckedInt<T> operator /(U aLhs, const CheckedInt<T>& aRhs) { return castToCheckedInt<T>(aLhs) / aRhs; }
template<typename T> template<typename U> CheckedInt<T>& CheckedInt<T>::operator %=(U aRhs) { *this = *this % castToCheckedInt<T>(aRhs); return *this; } template<typename T> CheckedInt<T>& CheckedInt<T>::operator %=(const CheckedInt<T>& aRhs) { *this = *this % aRhs; return *this; } template<typename T, typename U> inline CheckedInt<T> operator %(const CheckedInt<T>& aLhs, U aRhs) { return aLhs % castToCheckedInt<T>(aRhs); } template<typename T, typename U> inline CheckedInt<T> operator %(U aLhs, const CheckedInt<T>& aRhs) { return castToCheckedInt<T>(aLhs) % aRhs; }



template<typename T, typename U>
inline bool
operator ==(const CheckedInt<T>& aLhs, U aRhs)
{
  return aLhs == castToCheckedInt<T>(aRhs);
}

template<typename T, typename U>
inline bool
operator ==(U aLhs, const CheckedInt<T>& aRhs)
{
  return castToCheckedInt<T>(aLhs) == aRhs;
}


typedef CheckedInt<int8_t> CheckedInt8;
typedef CheckedInt<uint8_t> CheckedUint8;
typedef CheckedInt<int16_t> CheckedInt16;
typedef CheckedInt<uint16_t> CheckedUint16;
typedef CheckedInt<int32_t> CheckedInt32;
typedef CheckedInt<uint32_t> CheckedUint32;
typedef CheckedInt<int64_t> CheckedInt64;
typedef CheckedInt<uint64_t> CheckedUint64;

}
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" 2




# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 1 3
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h" 2

namespace mozilla {
namespace gfx {

static inline bool
IsOperatorBoundByMask(CompositionOp aOp) {
  switch (aOp) {
  case CompositionOp::OP_IN:
  case CompositionOp::OP_OUT:
  case CompositionOp::OP_DEST_IN:
  case CompositionOp::OP_DEST_ATOP:
  case CompositionOp::OP_SOURCE:
    return false;
  default:
    return true;
  }
}

template <class T>
struct ClassStorage
{
  char bytes[sizeof(T)];

  const T *addr() const { return (const T *)bytes; }
  T *addr() { return (T *)(void *)bytes; }
};

static inline bool
FuzzyEqual(Float aA, Float aB, Float aErr)
{
  if ((aA + aErr >= aB) && (aA - aErr <= aB)) {
    return true;
  }
  return false;
}

static inline void
NudgeToInteger(float *aVal)
{
  float r = floorf(*aVal + 0.5f);





  if (FuzzyEqual(r, *aVal, r == 0.0f ? 1e-6f : fabs(r*1e-6f))) {
    *aVal = r;
  }
}

static inline void
NudgeToInteger(float *aVal, float aErr)
{
  float r = floorf(*aVal + 0.5f);
  if (FuzzyEqual(r, *aVal, aErr)) {
    *aVal = r;
  }
}

static inline Float
Distance(Point aA, Point aB)
{
  return hypotf(aB.x - aA.x, aB.y - aA.y);
}

static inline int
BytesPerPixel(SurfaceFormat aFormat)
{
  switch (aFormat) {
  case SurfaceFormat::A8:
    return 1;
  case SurfaceFormat::R5G6B5_UINT16:
    return 2;
  case SurfaceFormat::R8G8B8:
  case SurfaceFormat::B8G8R8:
    return 3;
  case SurfaceFormat::HSV:
  case SurfaceFormat::Lab:
    return 3 * sizeof(float);
  case SurfaceFormat::Depth:
    return sizeof(uint16_t);
  default:
    return 4;
  }
}

static inline bool
IsOpaqueFormat(SurfaceFormat aFormat) {
  switch (aFormat) {
    case SurfaceFormat::B8G8R8X8:
    case SurfaceFormat::R8G8B8X8:
    case SurfaceFormat::X8R8G8B8:
    case SurfaceFormat::YUV:
    case SurfaceFormat::NV12:
    case SurfaceFormat::YUV422:
    case SurfaceFormat::R5G6B5_UINT16:
      return true;
    default:
      return false;
  }
}

template<typename T, int alignment = 16>
struct AlignedArray
{
  typedef T value_type;

  AlignedArray()
    : mPtr(nullptr)
    , mStorage(nullptr)
  {
  }

  explicit __attribute__((always_inline)) inline AlignedArray(size_t aCount, bool aZero = false)
    : mStorage(nullptr)
    , mCount(0)
  {
    Realloc(aCount, aZero);
  }

  __attribute__((always_inline)) inline ~AlignedArray()
  {
    Dealloc();
  }

  void Dealloc()
  {




    static_assert(mozilla::IsPod<T>::value,
                  "Destructors must be invoked for this type");
# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h"
    free(mStorage);
    mStorage = nullptr;
    mPtr = nullptr;
  }

  __attribute__((always_inline)) inline void Realloc(size_t aCount, bool aZero = false)
  {
    free(mStorage);
    CheckedInt32 storageByteCount =
      CheckedInt32(sizeof(T)) * aCount + (alignment - 1);
    if (!storageByteCount.isValid()) {
      mStorage = nullptr;
      mPtr = nullptr;
      mCount = 0;
      return;
    }


    if (aZero) {


      mStorage = static_cast<uint8_t *>(calloc(1, storageByteCount.value()));
    } else {
      mStorage = static_cast<uint8_t *>(malloc(storageByteCount.value()));
    }
    if (!mStorage) {
      mStorage = nullptr;
      mPtr = nullptr;
      mCount = 0;
      return;
    }
    if (uintptr_t(mStorage) % alignment) {

      mPtr = (T*)(uintptr_t(mStorage) + alignment - (uintptr_t(mStorage) % alignment));
    } else {
      mPtr = (T*)(mStorage);
    }




    mPtr = new (mPtr) T[aCount];
    mCount = aCount;
  }

  void Swap(AlignedArray<T, alignment>& aOther)
  {
    mozilla::Swap(mPtr, aOther.mPtr);
    mozilla::Swap(mStorage, aOther.mStorage);
    mozilla::Swap(mCount, aOther.mCount);
  }

  __attribute__((always_inline)) inline operator T*()
  {
    return mPtr;
  }

  T *mPtr;

private:
  uint8_t *mStorage;
  size_t mCount;
};
# 230 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Tools.h"
template<int alignment>
int32_t GetAlignedStride(int32_t aWidth, int32_t aBytesPerPixel)
{
  static_assert(alignment > 0 && (alignment & (alignment-1)) == 0,
                "This implementation currently require power-of-two alignment");
  const int32_t mask = alignment - 1;
  CheckedInt32 stride = CheckedInt32(aWidth) * CheckedInt32(aBytesPerPixel) + CheckedInt32(mask);
  if (stride.isValid()) {
    return stride.value() & ~mask;
  }
  return 0;
}

}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 1 3
# 40 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/cmath" 3
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Rect.h" 2

namespace mozilla {

template <typename> struct IsPixel;

namespace gfx {

template<class units, class F> struct RectTyped;

template<class units>
struct IntMarginTyped:
    public BaseMargin<int32_t, IntMarginTyped<units> >,
    public units {
    static_assert(IsPixel<units>::value,
                  "'units' must be a coordinate system tag");

    typedef BaseMargin<int32_t, IntMarginTyped<units> > Super;

    IntMarginTyped() : Super() {}
    IntMarginTyped(int32_t aTop, int32_t aRight, int32_t aBottom, int32_t aLeft) :
        Super(aTop, aRight, aBottom, aLeft) {}




    static IntMarginTyped<units> FromUnknownMargin(const IntMarginTyped<UnknownUnits>& aMargin) {
        return IntMarginTyped<units>(aMargin.top, aMargin.right,
                                     aMargin.bottom, aMargin.left);
    }

    IntMarginTyped<UnknownUnits> ToUnknownMargin() const {
        return IntMarginTyped<UnknownUnits>(this->top, this->right,
                                            this->bottom, this->left);
    }
};
typedef IntMarginTyped<UnknownUnits> IntMargin;

template<class units, class F = Float>
struct MarginTyped:
    public BaseMargin<F, MarginTyped<units> >,
    public units {
    static_assert(IsPixel<units>::value,
                  "'units' must be a coordinate system tag");

    typedef BaseMargin<F, MarginTyped<units, F> > Super;

    MarginTyped() : Super() {}
    MarginTyped(F aTop, F aRight, F aBottom, F aLeft) :
        Super(aTop, aRight, aBottom, aLeft) {}
    explicit MarginTyped(const IntMarginTyped<units>& aMargin) :
        Super(F(aMargin.top), F(aMargin.right),
              F(aMargin.bottom), F(aMargin.left)) {}
};
typedef MarginTyped<UnknownUnits> Margin;
typedef MarginTyped<UnknownUnits, double> MarginDouble;

template<class units>
IntMarginTyped<units> RoundedToInt(const MarginTyped<units>& aMargin)
{
  return IntMarginTyped<units>(int32_t(floorf(aMargin.top + 0.5f)),
                               int32_t(floorf(aMargin.right + 0.5f)),
                               int32_t(floorf(aMargin.bottom + 0.5f)),
                               int32_t(floorf(aMargin.left + 0.5f)));
}

template<class units>
struct IntRectTyped :
    public BaseRect<int32_t, IntRectTyped<units>, IntPointTyped<units>, IntSizeTyped<units>, IntMarginTyped<units> >,
    public units {
    static_assert(IsPixel<units>::value,
                  "'units' must be a coordinate system tag");

    typedef BaseRect<int32_t, IntRectTyped<units>, IntPointTyped<units>, IntSizeTyped<units>, IntMarginTyped<units> > Super;
    typedef IntRectTyped<units> Self;
    typedef IntParam<int32_t> ToInt;

    IntRectTyped() : Super() {}
    IntRectTyped(const IntPointTyped<units>& aPos, const IntSizeTyped<units>& aSize) :
        Super(aPos, aSize) {}

    IntRectTyped(ToInt aX, ToInt aY, ToInt aWidth, ToInt aHeight) :
        Super(aX.value, aY.value, aWidth.value, aHeight.value) {}

    static IntRectTyped<units> RoundIn(float aX, float aY, float aW, float aH) {
      return IntRectTyped<units>::RoundIn(RectTyped<units, float>(aX, aY, aW, aH));
    }

    static IntRectTyped<units> RoundOut(float aX, float aY, float aW, float aH) {
      return IntRectTyped<units>::RoundOut(RectTyped<units, float>(aX, aY, aW, aH));
    }

    static IntRectTyped<units> Round(float aX, float aY, float aW, float aH) {
      return IntRectTyped<units>::Round(RectTyped<units, float>(aX, aY, aW, aH));
    }

    static IntRectTyped<units> Truncate(float aX, float aY, float aW, float aH) {
      return IntRectTyped<units>(IntPointTyped<units>::Truncate(aX, aY),
                                 IntSizeTyped<units>::Truncate(aW, aH));
    }

    static IntRectTyped<units> RoundIn(const RectTyped<units, float>& aRect) {
      auto tmp(aRect);
      tmp.RoundIn();
      return IntRectTyped(int32_t(tmp.x), int32_t(tmp.y),
                          int32_t(tmp.width), int32_t(tmp.height));
    }

    static IntRectTyped<units> RoundOut(const RectTyped<units, float>& aRect) {
      auto tmp(aRect);
      tmp.RoundOut();
      return IntRectTyped(int32_t(tmp.x), int32_t(tmp.y),
                          int32_t(tmp.width), int32_t(tmp.height));
    }

    static IntRectTyped<units> Round(const RectTyped<units, float>& aRect) {
      auto tmp(aRect);
      tmp.Round();
      return IntRectTyped(int32_t(tmp.x), int32_t(tmp.y),
                          int32_t(tmp.width), int32_t(tmp.height));
    }

    static IntRectTyped<units> Truncate(const RectTyped<units, float>& aRect) {
      return IntRectTyped::Truncate(aRect.x, aRect.y, aRect.width, aRect.height);
    }


    void Round() {}
    void RoundIn() {}
    void RoundOut() {}




    static IntRectTyped<units> FromUnknownRect(const IntRectTyped<UnknownUnits>& rect) {
        return IntRectTyped<units>(rect.x, rect.y, rect.width, rect.height);
    }

    IntRectTyped<UnknownUnits> ToUnknownRect() const {
        return IntRectTyped<UnknownUnits>(this->x, this->y, this->width, this->height);
    }

    bool Overflows() const {
      CheckedInt<int32_t> xMost = this->x;
      xMost += this->width;
      CheckedInt<int32_t> yMost = this->y;
      yMost += this->height;
      return !xMost.isValid() || !yMost.isValid();
    }




    __attribute__ ((warn_unused_result)) Maybe<Self> SafeUnion(const Self& aRect) const
    {
      if (this->IsEmpty()) {
        return aRect.Overflows() ? Nothing() : Some(aRect);
      } else if (aRect.IsEmpty()) {
        return Some(*static_cast<const Self*>(this));
      } else {
        return this->SafeUnionEdges(aRect);
      }
    }



    __attribute__ ((warn_unused_result)) Maybe<Self> SafeUnionEdges(const Self& aRect) const
    {
      if (this->Overflows() || aRect.Overflows()) {
        return Nothing();
      }


      CheckedInt<int32_t> newX = std::min(this->x, aRect.x);
      CheckedInt<int32_t> newY = std::min(this->y, aRect.y);
      CheckedInt<int32_t> newXMost = std::max(this->XMost(), aRect.XMost());
      CheckedInt<int32_t> newYMost = std::max(this->YMost(), aRect.YMost());
      CheckedInt<int32_t> newW = newXMost - newX;
      CheckedInt<int32_t> newH = newYMost - newY;
      if (!newW.isValid() || !newH.isValid()) {
        return Nothing();
      }
      return Some(Self(newX.value(), newY.value(), newW.value(), newH.value()));
    }


    bool operator==(const IntRectTyped<units>& aRect) const
    {
      return IntRectTyped<units>::IsEqualEdges(aRect);
    }

    void InflateToMultiple(const IntSizeTyped<units>& aTileSize)
    {
      if (this->IsEmpty()) {
        return;
      }

      int32_t yMost = this->YMost();
      int32_t xMost = this->XMost();

      this->x = mozilla::RoundDownToMultiple(this->x, aTileSize.width);
      this->y = mozilla::RoundDownToMultiple(this->y, aTileSize.height);
      xMost = mozilla::RoundUpToMultiple(xMost, aTileSize.width);
      yMost = mozilla::RoundUpToMultiple(yMost, aTileSize.height);

      this->width = xMost - this->x;
      this->height = yMost - this->y;
    }

};
typedef IntRectTyped<UnknownUnits> IntRect;

template<class units, class F = Float>
struct RectTyped :
    public BaseRect<F, RectTyped<units, F>, PointTyped<units, F>, SizeTyped<units, F>, MarginTyped<units, F> >,
    public units {
    static_assert(IsPixel<units>::value,
                  "'units' must be a coordinate system tag");

    typedef BaseRect<F, RectTyped<units, F>, PointTyped<units, F>, SizeTyped<units, F>, MarginTyped<units, F> > Super;

    RectTyped() : Super() {}
    RectTyped(const PointTyped<units, F>& aPos, const SizeTyped<units, F>& aSize) :
        Super(aPos, aSize) {}
    RectTyped(F _x, F _y, F _width, F _height) :
        Super(_x, _y, _width, _height) {}
    explicit RectTyped(const IntRectTyped<units>& rect) :
        Super(F(rect.x), F(rect.y),
              F(rect.width), F(rect.height)) {}

    void NudgeToIntegers()
    {
      NudgeToInteger(&(this->x));
      NudgeToInteger(&(this->y));
      NudgeToInteger(&(this->width));
      NudgeToInteger(&(this->height));
    }

    bool ToIntRect(IntRectTyped<units> *aOut) const
    {
      *aOut = IntRectTyped<units>(int32_t(this->X()), int32_t(this->Y()),
                                  int32_t(this->Width()), int32_t(this->Height()));
      return RectTyped<units, F>(F(aOut->x), F(aOut->y),
                                 F(aOut->width), F(aOut->height))
             .IsEqualEdges(*this);
    }




    static RectTyped<units, F> FromUnknownRect(const RectTyped<UnknownUnits, F>& rect) {
        return RectTyped<units, F>(rect.x, rect.y, rect.width, rect.height);
    }

    RectTyped<UnknownUnits, F> ToUnknownRect() const {
        return RectTyped<UnknownUnits, F>(this->x, this->y, this->width, this->height);
    }


    bool operator==(const RectTyped<units, F>& aRect) const
    {
      return RectTyped<units, F>::IsEqualEdges(aRect);
    }
};
typedef RectTyped<UnknownUnits> Rect;
typedef RectTyped<UnknownUnits, double> RectDouble;

template<class units>
IntRectTyped<units> RoundedToInt(const RectTyped<units>& aRect)
{
  RectTyped<units> copy(aRect);
  copy.Round();
  return IntRectTyped<units>(int32_t(copy.x),
                             int32_t(copy.y),
                             int32_t(copy.width),
                             int32_t(copy.height));
}

template<class units>
IntRectTyped<units> RoundedIn(const RectTyped<units>& aRect)
{
  return IntRectTyped<units>::RoundIn(aRect);
}

template<class units>
IntRectTyped<units> RoundedOut(const RectTyped<units>& aRect)
{
  return IntRectTyped<units>::RoundOut(aRect);
}

template<class units>
IntRectTyped<units> TruncatedToInt(const RectTyped<units>& aRect) {
  return IntRectTyped<units>::Truncate(aRect);
}

template<class units>
RectTyped<units> IntRectToRect(const IntRectTyped<units>& aRect)
{
  return RectTyped<units>(aRect.x, aRect.y, aRect.width, aRect.height);
}


template <typename T>
Maybe<T>
IntersectMaybeRects(const Maybe<T>& a, const Maybe<T>& b)
{
  if (!a) {
    return b;
  } else if (!b) {
    return a;
  } else {
    return Some(a->Intersect(*b));
  }
}

}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Triangle.h" 2

namespace mozilla {
namespace gfx {




template<class Units, class F = Float>
struct TriangleTyped
{
  PointTyped<Units, F> p1, p2, p3;
  F width, height;

  TriangleTyped()
    : p1(), p2(), p3() {}

  TriangleTyped(PointTyped<Units, F> aP1,
                PointTyped<Units, F> aP2,
                PointTyped<Units, F> aP3)
    : p1(aP1), p2(aP2), p3(aP3) {}

  RectTyped<Units, F> BoundingBox() const
  {
    F minX = std::min(std::min(p1.x, p2.x), p3.x);
    F maxX = std::max(std::max(p1.x, p2.x), p3.x);

    F minY = std::min(std::min(p1.y, p2.y), p3.y);
    F maxY = std::max(std::max(p1.y, p2.y), p3.y);

    return RectTyped<Units, F>(minX, minY, maxX - minX, maxY - minY);
  }
};

typedef TriangleTyped<UnknownUnits, Float> Triangle;

template<class Units, class F = Float>
struct TexturedTriangleTyped : public TriangleTyped<Units, F>
{
  explicit TexturedTriangleTyped(const TriangleTyped<Units, F>& aTriangle)
    : TriangleTyped<Units, F>(aTriangle) {}

  explicit TexturedTriangleTyped(TriangleTyped<Units, F>&& aTriangle)
    : TriangleTyped<Units, F>(Move(aTriangle)) {}

  TriangleTyped<Units, F> textureCoords;
};

typedef TexturedTriangleTyped<UnknownUnits, Float> TexturedTriangle;

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Quaternion.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Quaternion.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 1 3
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Quaternion.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/MatrixFwd.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/MatrixFwd.h"
namespace mozilla {
namespace gfx {

struct UnknownUnits;

template<class SourceUnits, class TargetUnits>
class Matrix4x4Typed;

typedef Matrix4x4Typed<UnknownUnits, UnknownUnits> Matrix4x4;

}
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Quaternion.h" 2


namespace mozilla {
namespace gfx {

class Quaternion
{
public:
  Quaternion()
    : x(0.0f), y(0.0f), z(0.0f), w(1.0f)
  {}

  Quaternion(Float aX, Float aY, Float aZ, Float aW)
    : x(aX), y(aY), z(aZ), w(aW)
  {}


  Quaternion(const Quaternion& aOther)
  {
    memcpy(this, &aOther, sizeof(*this));
  }

  Float x, y, z, w;

  friend std::ostream& operator<<(std::ostream& aStream, const Quaternion& aQuat);

  void Set(Float aX, Float aY, Float aZ, Float aW)
  {
    x = aX; y = aY; z = aZ; w = aW;
  }


  void SetFromRotationMatrix(const Matrix4x4& aMatrix);


  Quaternion operator*(const Quaternion &aQuat) const
  {
    Quaternion o;
    const Float bx = aQuat.x, by = aQuat.y, bz = aQuat.z, bw = aQuat.w;

    o.x = x*bw + w*bx + y*bz - z*by;
    o.y = y*bw + w*by + z*bx - x*bz;
    o.z = z*bw + w*bz + x*by - y*bx;
    o.w = w*bw - x*bx - y*by - z*bz;
    return o;
  }

  Quaternion& operator*=(const Quaternion &aQuat)
  {
    *this = *this * aQuat;
    return *this;
  }

  Float Length() const
  {
    return sqrt(x*x + y*y + z*z + w*w);
  }

  Quaternion& Conjugate()
  {
    x *= -1.f; y *= -1.f; z *= -1.f;
    return *this;
  }

  Quaternion& Normalize()
  {
    Float l = Length();
    if (l) {
      l = 1.0f / l;
      x *= l; y *= l; z *= l; w *= l;
    } else {
      x = y = z = 0.f;
      w = 1.f;
    }
    return *this;
  }

  Quaternion& Invert()
  {
    return Conjugate().Normalize();
  }

  Point3D RotatePoint(const Point3D& aPoint) {
    Float uvx = Float(2.0) * (y*aPoint.z - z*aPoint.y);
    Float uvy = Float(2.0) * (z*aPoint.x - x*aPoint.z);
    Float uvz = Float(2.0) * (x*aPoint.y - y*aPoint.x);

    return Point3D(aPoint.x + w*uvx + y*uvz - z*uvy,
                   aPoint.y + w*uvy + z*uvx - x*uvz,
                   aPoint.z + w*uvz + x*uvy - y*uvx);
  }
};

}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h" 2

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 1 3
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h" 2




namespace mozilla {
namespace gfx {

static bool FuzzyEqual(Float aV1, Float aV2) {

  return fabs(aV2 - aV1) < 1e-6;
}

class Matrix
{
public:
  Matrix()
    : _11(1.0f), _12(0)
    , _21(0), _22(1.0f)
    , _31(0), _32(0)
  {}
  Matrix(Float a11, Float a12, Float a21, Float a22, Float a31, Float a32)
    : _11(a11), _12(a12)
    , _21(a21), _22(a22)
    , _31(a31), _32(a32)
  {}
  union {
    struct {
      Float _11, _12;
      Float _21, _22;
      Float _31, _32;
    };
    Float components[6];
  };

  __attribute__((always_inline)) inline Matrix Copy() const
  {
    return Matrix(*this);
  }

  friend std::ostream& operator<<(std::ostream& aStream, const Matrix& aMatrix);

  Point TransformPoint(const Point &aPoint) const
  {
    Point retPoint;

    retPoint.x = aPoint.x * _11 + aPoint.y * _21 + _31;
    retPoint.y = aPoint.x * _12 + aPoint.y * _22 + _32;

    return retPoint;
  }

  Size TransformSize(const Size &aSize) const
  {
    Size retSize;

    retSize.width = aSize.width * _11 + aSize.height * _21;
    retSize.height = aSize.width * _12 + aSize.height * _22;

    return retSize;
  }

            Rect TransformBounds(const Rect& rect) const;

  static Matrix Translation(Float aX, Float aY)
  {
    return Matrix(1.0f, 0.0f, 0.0f, 1.0f, aX, aY);
  }

  static Matrix Translation(Point aPoint)
  {
    return Translation(aPoint.x, aPoint.y);
  }
# 108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
  Matrix &PreTranslate(Float aX, Float aY)
  {
    _31 += _11 * aX + _21 * aY;
    _32 += _12 * aX + _22 * aY;

    return *this;
  }

  Matrix &PreTranslate(const Point &aPoint)
  {
    return PreTranslate(aPoint.x, aPoint.y);
  }
# 133 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
  Matrix &PostTranslate(Float aX, Float aY)
  {
    _31 += aX;
    _32 += aY;
    return *this;
  }

  Matrix &PostTranslate(const Point &aPoint)
  {
    return PostTranslate(aPoint.x, aPoint.y);
  }

  static Matrix Scaling(Float aScaleX, Float aScaleY)
  {
    return Matrix(aScaleX, 0.0f, 0.0f, aScaleY, 0.0f, 0.0f);
  }




  Matrix &PreScale(Float aX, Float aY)
  {
    _11 *= aX;
    _12 *= aX;
    _21 *= aY;
    _22 *= aY;

    return *this;
  }




  Matrix &PostScale(Float aScaleX, Float aScaleY)
  {
    _11 *= aScaleX;
    _12 *= aScaleY;
    _21 *= aScaleX;
    _22 *= aScaleY;
    _31 *= aScaleX;
    _32 *= aScaleY;

    return *this;
  }

            static Matrix Rotation(Float aAngle);




  Matrix &PreRotate(Float aAngle)
  {
    return *this = Matrix::Rotation(aAngle) * *this;
  }

  bool Invert()
  {

    Float A = _22;
    Float B = -_21;
    Float C = _21 * _32 - _22 * _31;
    Float D = -_12;
    Float E = _11;
    Float F = _31 * _12 - _11 * _32;

    Float det = Determinant();

    if (!det) {
      return false;
    }

    Float inv_det = 1 / det;

    _11 = inv_det * A;
    _12 = inv_det * D;
    _21 = inv_det * B;
    _22 = inv_det * E;
    _31 = inv_det * C;
    _32 = inv_det * F;

    return true;
  }

  Matrix Inverse() const
  {
    Matrix clone = *this;
    DebugOnly<bool> inverted = clone.Invert();
    do { } while (0);
    return clone;
  }

  Float Determinant() const
  {
    return _11 * _22 - _12 * _21;
  }

  Matrix operator*(const Matrix &aMatrix) const
  {
    Matrix resultMatrix;

    resultMatrix._11 = this->_11 * aMatrix._11 + this->_12 * aMatrix._21;
    resultMatrix._12 = this->_11 * aMatrix._12 + this->_12 * aMatrix._22;
    resultMatrix._21 = this->_21 * aMatrix._11 + this->_22 * aMatrix._21;
    resultMatrix._22 = this->_21 * aMatrix._12 + this->_22 * aMatrix._22;
    resultMatrix._31 = this->_31 * aMatrix._11 + this->_32 * aMatrix._21 + aMatrix._31;
    resultMatrix._32 = this->_31 * aMatrix._12 + this->_32 * aMatrix._22 + aMatrix._32;

    return resultMatrix;
  }

  Matrix& operator*=(const Matrix &aMatrix)
  {
    *this = *this * aMatrix;
    return *this;
  }




  Matrix &PreMultiply(const Matrix &aMatrix)
  {
    *this = aMatrix * *this;
    return *this;
  }




  bool operator==(const Matrix& other) const
  {
    return FuzzyEqual(_11, other._11) && FuzzyEqual(_12, other._12) &&
           FuzzyEqual(_21, other._21) && FuzzyEqual(_22, other._22) &&
           FuzzyEqual(_31, other._31) && FuzzyEqual(_32, other._32);
  }

  bool operator!=(const Matrix& other) const
  {
    return !(*this == other);
  }

  bool ExactlyEquals(const Matrix& o) const
  {
    return _11 == o._11 && _12 == o._12 &&
           _21 == o._21 && _22 == o._22 &&
           _31 == o._31 && _32 == o._32;
  }


  bool IsFinite() const
  {
    return mozilla::IsFinite(_11) && mozilla::IsFinite(_12) &&
           mozilla::IsFinite(_21) && mozilla::IsFinite(_22) &&
           mozilla::IsFinite(_31) && mozilla::IsFinite(_32);
  }




  bool IsRectilinear() const {
    if (FuzzyEqual(_12, 0) && FuzzyEqual(_21, 0)) {
      return true;
    } else if (FuzzyEqual(_22, 0) && FuzzyEqual(_11, 0)) {
      return true;
    }

    return false;
  }





  bool HasNonIntegerTranslation() const {
    return HasNonTranslation() ||
      !FuzzyEqual(_31, floor(_31 + Float(0.5))) ||
      !FuzzyEqual(_32, floor(_32 + Float(0.5)));
  }




  bool HasOnlyIntegerTranslation() const {
    return !HasNonIntegerTranslation();
  }





  bool HasNonTranslation() const {
    return !FuzzyEqual(_11, 1.0) || !FuzzyEqual(_22, 1.0) ||
           !FuzzyEqual(_12, 0.0) || !FuzzyEqual(_21, 0.0);
  }





  bool HasNonTranslationOrFlip() const {
      return !FuzzyEqual(_11, 1.0) ||
             (!FuzzyEqual(_22, 1.0) && !FuzzyEqual(_22, -1.0)) ||
             !FuzzyEqual(_21, 0.0) || !FuzzyEqual(_12, 0.0);
  }



  bool IsIdentity() const
  {
    return _11 == 1.0f && _12 == 0.0f &&
           _21 == 0.0f && _22 == 1.0f &&
           _31 == 0.0f && _32 == 0.0f;
  }



  bool IsSingular() const
  {
    Float det = Determinant();
    return !mozilla::IsFinite(det) || det == 0;
  }

            Matrix &NudgeToIntegers();

  bool IsTranslation() const
  {
    return FuzzyEqual(_11, 1.0f) && FuzzyEqual(_12, 0.0f) &&
           FuzzyEqual(_21, 0.0f) && FuzzyEqual(_22, 1.0f);
  }

  static bool FuzzyIsInteger(Float aValue)
  {
    return FuzzyEqual(aValue, floorf(aValue + 0.5f));
  }

  bool IsIntegerTranslation() const
  {
    return IsTranslation() && FuzzyIsInteger(_31) && FuzzyIsInteger(_32);
  }

  bool IsAllIntegers() const
  {
    return FuzzyIsInteger(_11) && FuzzyIsInteger(_12) &&
           FuzzyIsInteger(_21) && FuzzyIsInteger(_22) &&
           FuzzyIsInteger(_31) && FuzzyIsInteger(_32);
  }

  Point GetTranslation() const {
    return Point(_31, _32);
  }





  bool PreservesAxisAlignedRectangles() const {
      return ((FuzzyEqual(_11, 0.0) && FuzzyEqual(_22, 0.0))
          || (FuzzyEqual(_12, 0.0) && FuzzyEqual(_21, 0.0)));
  }






  bool HasNonAxisAlignedTransform() const {
      return !FuzzyEqual(_21, 0.0) || !FuzzyEqual(_12, 0.0);
  }




  bool HasNegativeScaling() const {
      return (_11 < 0.0) || (_22 < 0.0);
  }
};


double
SafeTangent(double aTheta);
double
FlushToZero(double aVal);

template<class Units, class F>
Point4DTyped<Units, F>
ComputePerspectivePlaneIntercept(const Point4DTyped<Units, F>& aFirst,
                                 const Point4DTyped<Units, F>& aSecond)
{
# 429 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
  float t = -aFirst.w / (aSecond.w - aFirst.w);


  return aFirst + (aSecond - aFirst) * t;
}


template <typename SourceUnits, typename TargetUnits>
class Matrix4x4Typed
{
public:
  typedef PointTyped<SourceUnits> SourcePoint;
  typedef PointTyped<TargetUnits> TargetPoint;
  typedef Point3DTyped<SourceUnits> SourcePoint3D;
  typedef Point3DTyped<TargetUnits> TargetPoint3D;
  typedef Point4DTyped<SourceUnits> SourcePoint4D;
  typedef Point4DTyped<TargetUnits> TargetPoint4D;
  typedef RectTyped<SourceUnits> SourceRect;
  typedef RectTyped<TargetUnits> TargetRect;

  Matrix4x4Typed()
    : _11(1.0f), _12(0.0f), _13(0.0f), _14(0.0f)
    , _21(0.0f), _22(1.0f), _23(0.0f), _24(0.0f)
    , _31(0.0f), _32(0.0f), _33(1.0f), _34(0.0f)
    , _41(0.0f), _42(0.0f), _43(0.0f), _44(1.0f)
  {}

  Matrix4x4Typed(Float a11, Float a12, Float a13, Float a14,
                 Float a21, Float a22, Float a23, Float a24,
                 Float a31, Float a32, Float a33, Float a34,
                 Float a41, Float a42, Float a43, Float a44)
    : _11(a11), _12(a12), _13(a13), _14(a14)
    , _21(a21), _22(a22), _23(a23), _24(a24)
    , _31(a31), _32(a32), _33(a33), _34(a34)
    , _41(a41), _42(a42), _43(a43), _44(a44)
  {}

  explicit Matrix4x4Typed(const Float aArray[16])
  {
    memcpy(components, aArray, sizeof(components));
  }

  Matrix4x4Typed(const Matrix4x4Typed& aOther)
  {
    memcpy(this, &aOther, sizeof(*this));
  }

  union {
    struct {
      Float _11, _12, _13, _14;
      Float _21, _22, _23, _24;
      Float _31, _32, _33, _34;
      Float _41, _42, _43, _44;
    };
    Float components[16];
  };

  friend std::ostream& operator<<(std::ostream& aStream, const Matrix4x4Typed& aMatrix)
  {
    const Float *f = &aMatrix._11;
    aStream << "[ " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ;" << std::endl; f += 4;
    aStream << "  " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ;" << std::endl; f += 4;
    aStream << "  " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ;" << std::endl; f += 4;
    aStream << "  " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << " ]" << std::endl;
    return aStream;
  }

  Point4D& operator[](int aIndex)
  {
      do { } while (0);
      return *reinterpret_cast<Point4D*>((&_11)+4*aIndex);
  }
  const Point4D& operator[](int aIndex) const
  {
      do { } while (0);
      return *reinterpret_cast<const Point4D*>((&_11)+4*aIndex);
  }




  bool Is2D() const
  {
    if (_13 != 0.0f || _14 != 0.0f ||
        _23 != 0.0f || _24 != 0.0f ||
        _31 != 0.0f || _32 != 0.0f || _33 != 1.0f || _34 != 0.0f ||
        _43 != 0.0f || _44 != 1.0f) {
      return false;
    }
    return true;
  }

  bool Is2D(Matrix* aMatrix) const {
    if (!Is2D()) {
      return false;
    }
    if (aMatrix) {
      aMatrix->_11 = _11;
      aMatrix->_12 = _12;
      aMatrix->_21 = _21;
      aMatrix->_22 = _22;
      aMatrix->_31 = _41;
      aMatrix->_32 = _42;
    }
    return true;
  }

  Matrix As2D() const
  {
    do { } while (0);

    return Matrix(_11, _12, _21, _22, _41, _42);
  }

  bool CanDraw2D(Matrix* aMatrix = nullptr) const {
    if (_14 != 0.0f ||
        _24 != 0.0f ||
        _44 != 1.0f) {
      return false;
    }
    if (aMatrix) {
      aMatrix->_11 = _11;
      aMatrix->_12 = _12;
      aMatrix->_21 = _21;
      aMatrix->_22 = _22;
      aMatrix->_31 = _41;
      aMatrix->_32 = _42;
    }
    return true;
  }

  Matrix4x4Typed& ProjectTo2D() {
    _31 = 0.0f;
    _32 = 0.0f;
    _13 = 0.0f;
    _23 = 0.0f;
    _33 = 1.0f;
    _43 = 0.0f;
    _34 = 0.0f;







    if (_14 == 0.0f && _24 == 0.0f &&
        _44 != 1.0f && _44 != 0.0f) {
      Float scale = 1.0f / _44;
      _11 *= scale;
      _12 *= scale;
      _21 *= scale;
      _22 *= scale;
      _41 *= scale;
      _42 *= scale;
      _44 = 1.0f;
    }
    return *this;
  }

  template<class F>
  Point4DTyped<TargetUnits, F>
  ProjectPoint(const PointTyped<SourceUnits, F>& aPoint) const {






    F z = -(aPoint.x * _13 + aPoint.y * _23 + _43) / _33;


    return this->TransformPoint(Point4DTyped<SourceUnits, F>(aPoint.x, aPoint.y, z, 1));
  }

  template<class F>
  RectTyped<TargetUnits, F>
  ProjectRectBounds(const RectTyped<SourceUnits, F>& aRect, const RectTyped<TargetUnits, F>& aClip) const
  {
# 632 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
    Point4DTyped<TargetUnits, F> points[4];

    points[0] = ProjectPoint(aRect.TopLeft());
    points[1] = ProjectPoint(aRect.TopRight());
    points[2] = ProjectPoint(aRect.BottomRight());
    points[3] = ProjectPoint(aRect.BottomLeft());

    F min_x = std::numeric_limits<F>::max();
    F min_y = std::numeric_limits<F>::max();
    F max_x = -std::numeric_limits<F>::max();
    F max_y = -std::numeric_limits<F>::max();

    for (int i=0; i<4; i++) {

      if (points[i].HasPositiveWCoord()) {
        PointTyped<TargetUnits, F> point2d = aClip.ClampPoint(points[i].As2DPoint());
        min_x = std::min<F>(point2d.x, min_x);
        max_x = std::max<F>(point2d.x, max_x);
        min_y = std::min<F>(point2d.y, min_y);
        max_y = std::max<F>(point2d.y, max_y);
      }

      int next = (i == 3) ? 0 : i + 1;
      if (points[i].HasPositiveWCoord() != points[next].HasPositiveWCoord()) {



        Point4DTyped<TargetUnits, F> intercept =
          ComputePerspectivePlaneIntercept(points[i], points[next]);


        if (intercept.x < 0.0f) {
          min_x = aClip.x;
        } else if (intercept.x > 0.0f) {
          max_x = aClip.XMost();
        }
        if (intercept.y < 0.0f) {
          min_y = aClip.y;
        } else if (intercept.y > 0.0f) {
          max_y = aClip.YMost();
        }
      }
    }

    if (max_x < min_x || max_y < min_y) {
      return RectTyped<TargetUnits, F>(0, 0, 0, 0);
    }

    return RectTyped<TargetUnits, F>(min_x, min_y, max_x - min_x, max_y - min_y);
  }





  template<class F>
  RectTyped<TargetUnits, F> TransformAndClipBounds(const RectTyped<SourceUnits, F>& aRect,
                                                   const RectTyped<TargetUnits, F>& aClip) const
  {
    PointTyped<UnknownUnits, F> verts[kTransformAndClipRectMaxVerts];
    size_t vertCount = TransformAndClipRect(aRect, aClip, verts);

    F min_x = std::numeric_limits<F>::max();
    F min_y = std::numeric_limits<F>::max();
    F max_x = -std::numeric_limits<F>::max();
    F max_y = -std::numeric_limits<F>::max();
    for (size_t i=0; i < vertCount; i++) {
      min_x = std::min(min_x, verts[i].x);
      max_x = std::max(max_x, verts[i].x);
      min_y = std::min(min_y, verts[i].y);
      max_y = std::max(max_y, verts[i].y);
    }

    if (max_x < min_x || max_y < min_y) {
      return RectTyped<TargetUnits, F>(0, 0, 0, 0);
    }

    return RectTyped<TargetUnits, F>(min_x, min_y, max_x - min_x, max_y - min_y);
  }

  template<class F>
  RectTyped<TargetUnits, F> TransformAndClipBounds(const TriangleTyped<SourceUnits, F>& aTriangle,
                                                   const RectTyped<TargetUnits, F>& aClip) const
  {
    return TransformAndClipBounds(aTriangle.BoundingBox(), aClip);
  }
# 729 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
  template<class F>
  size_t TransformAndClipRect(const RectTyped<SourceUnits, F>& aRect,
                              const RectTyped<TargetUnits, F>& aClip,
                              PointTyped<TargetUnits, F>* aVerts) const
  {


    Point4DTyped<UnknownUnits, F> points[2][kTransformAndClipRectMaxVerts];
    Point4DTyped<UnknownUnits, F>* dstPoint = points[0];

    *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.x, aRect.y, 0, 1));
    *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.XMost(), aRect.y, 0, 1));
    *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.XMost(), aRect.YMost(), 0, 1));
    *dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.x, aRect.YMost(), 0, 1));



    Point4DTyped<UnknownUnits, F> planeNormals[4];
    planeNormals[0] = Point4DTyped<UnknownUnits, F>(1.0, 0.0, 0.0, -aClip.x);
    planeNormals[1] = Point4DTyped<UnknownUnits, F>(-1.0, 0.0, 0.0, aClip.XMost());
    planeNormals[2] = Point4DTyped<UnknownUnits, F>(0.0, 1.0, 0.0, -aClip.y);
    planeNormals[3] = Point4DTyped<UnknownUnits, F>(0.0, -1.0, 0.0, aClip.YMost());




    for (int plane=0; plane < 4; plane++) {
      planeNormals[plane].Normalize();
      Point4DTyped<UnknownUnits, F>* srcPoint = points[plane & 1];
      Point4DTyped<UnknownUnits, F>* srcPointEnd = dstPoint;

      dstPoint = points[~plane & 1];
      Point4DTyped<UnknownUnits, F>* dstPointStart = dstPoint;

      Point4DTyped<UnknownUnits, F>* prevPoint = srcPointEnd - 1;
      F prevDot = planeNormals[plane].DotProduct(*prevPoint);
      while (srcPoint < srcPointEnd && ((dstPoint - dstPointStart) < kTransformAndClipRectMaxVerts)) {
        F nextDot = planeNormals[plane].DotProduct(*srcPoint);

        if ((nextDot >= 0.0) != (prevDot >= 0.0)) {


          F t = -prevDot / (nextDot - prevDot);
          *dstPoint++ = *srcPoint * t + *prevPoint * (1.0 - t);
        }

        if (nextDot >= 0.0) {


          *dstPoint++ = *srcPoint;
        }

        prevPoint = srcPoint++;
        prevDot = nextDot;
      }

      if (dstPoint == dstPointStart) {
        break;
      }
    }

    size_t dstPointCount = 0;
    size_t srcPointCount = dstPoint - points[0];
    for (Point4DTyped<UnknownUnits, F>* srcPoint = points[0]; srcPoint < points[0] + srcPointCount; srcPoint++) {

      PointTyped<TargetUnits, F> p;
      if (srcPoint->w == 0.0) {


        p = PointTyped<TargetUnits, F>(0.0, 0.0);
      } else {
        p = srcPoint->As2DPoint();
      }

      if (dstPointCount == 0 || p != aVerts[dstPointCount - 1]) {
        aVerts[dstPointCount++] = p;
      }
    }

    return dstPointCount;
  }

  static const int kTransformAndClipRectMaxVerts = 32;

  static Matrix4x4Typed From2D(const Matrix &aMatrix) {
    Matrix4x4Typed matrix;
    matrix._11 = aMatrix._11;
    matrix._12 = aMatrix._12;
    matrix._21 = aMatrix._21;
    matrix._22 = aMatrix._22;
    matrix._41 = aMatrix._31;
    matrix._42 = aMatrix._32;
    return matrix;
  }

  bool Is2DIntegerTranslation() const
  {
    return Is2D() && As2D().IsIntegerTranslation();
  }

  TargetPoint4D TransposeTransform4D(const SourcePoint4D& aPoint) const
  {
      Float x = aPoint.x * _11 + aPoint.y * _12 + aPoint.z * _13 + aPoint.w * _14;
      Float y = aPoint.x * _21 + aPoint.y * _22 + aPoint.z * _23 + aPoint.w * _24;
      Float z = aPoint.x * _31 + aPoint.y * _32 + aPoint.z * _33 + aPoint.w * _34;
      Float w = aPoint.x * _41 + aPoint.y * _42 + aPoint.z * _43 + aPoint.w * _44;

      return TargetPoint4D(x, y, z, w);
  }

  template<class F>
  Point4DTyped<TargetUnits, F> TransformPoint(const Point4DTyped<SourceUnits, F>& aPoint) const
  {
    Point4DTyped<TargetUnits, F> retPoint;

    retPoint.x = aPoint.x * _11 + aPoint.y * _21 + aPoint.z * _31 + aPoint.w * _41;
    retPoint.y = aPoint.x * _12 + aPoint.y * _22 + aPoint.z * _32 + aPoint.w * _42;
    retPoint.z = aPoint.x * _13 + aPoint.y * _23 + aPoint.z * _33 + aPoint.w * _43;
    retPoint.w = aPoint.x * _14 + aPoint.y * _24 + aPoint.z * _34 + aPoint.w * _44;

    return retPoint;
  }

  template<class F>
  Point3DTyped<TargetUnits, F> TransformPoint(const Point3DTyped<SourceUnits, F>& aPoint) const
  {
    Point3DTyped<TargetUnits, F> result;
    result.x = aPoint.x * _11 + aPoint.y * _21 + aPoint.z * _31 + _41;
    result.y = aPoint.x * _12 + aPoint.y * _22 + aPoint.z * _32 + _42;
    result.z = aPoint.x * _13 + aPoint.y * _23 + aPoint.z * _33 + _43;

    result /= (aPoint.x * _14 + aPoint.y * _24 + aPoint.z * _34 + _44);

    return result;
  }

  template<class F>
  PointTyped<TargetUnits, F> TransformPoint(const PointTyped<SourceUnits, F> &aPoint) const
  {
    Point4DTyped<SourceUnits, F> temp(aPoint.x, aPoint.y, 0, 1);
    return TransformPoint(temp).As2DPoint();
  }

  template<class F>
            RectTyped<TargetUnits, F> TransformBounds(const RectTyped<SourceUnits, F>& aRect) const
  {
    Point4DTyped<TargetUnits, F> verts[4];
    verts[0] = TransformPoint(Point4DTyped<SourceUnits, F>(aRect.x, aRect.y, 0.0, 1.0));
    verts[1] = TransformPoint(Point4DTyped<SourceUnits, F>(aRect.XMost(), aRect.y, 0.0, 1.0));
    verts[2] = TransformPoint(Point4DTyped<SourceUnits, F>(aRect.XMost(), aRect.YMost(), 0.0, 1.0));
    verts[3] = TransformPoint(Point4DTyped<SourceUnits, F>(aRect.x, aRect.YMost(), 0.0, 1.0));

    PointTyped<TargetUnits, F> quad[4];
    F min_x, max_x;
    F min_y, max_y;

    quad[0] = TransformPoint(aRect.TopLeft());
    quad[1] = TransformPoint(aRect.TopRight());
    quad[2] = TransformPoint(aRect.BottomLeft());
    quad[3] = TransformPoint(aRect.BottomRight());

    min_x = max_x = quad[0].x;
    min_y = max_y = quad[0].y;

    for (int i = 1; i < 4; i++) {
      if (quad[i].x < min_x) {
        min_x = quad[i].x;
      }
      if (quad[i].x > max_x) {
        max_x = quad[i].x;
      }

      if (quad[i].y < min_y) {
        min_y = quad[i].y;
      }
      if (quad[i].y > max_y) {
        max_y = quad[i].y;
      }
    }

    return RectTyped<TargetUnits, F>(min_x, min_y, max_x - min_x, max_y - min_y);
  }

  static Matrix4x4Typed Translation(Float aX, Float aY, Float aZ)
  {
    return Matrix4x4Typed(1.0f, 0.0f, 0.0f, 0.0f,
                          0.0f, 1.0f, 0.0f, 0.0f,
                          0.0f, 0.0f, 1.0f, 0.0f,
                          aX, aY, aZ, 1.0f);
  }

  static Matrix4x4Typed Translation(const TargetPoint3D& aP)
  {
    return Translation(aP.x, aP.y, aP.z);
  }

  static Matrix4x4Typed Translation(const TargetPoint& aP)
  {
    return Translation(aP.x, aP.y, 0);
  }
# 949 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
  Matrix4x4Typed &PreTranslate(Float aX, Float aY, Float aZ)
  {
    _41 += aX * _11 + aY * _21 + aZ * _31;
    _42 += aX * _12 + aY * _22 + aZ * _32;
    _43 += aX * _13 + aY * _23 + aZ * _33;
    _44 += aX * _14 + aY * _24 + aZ * _34;

    return *this;
  }

  Matrix4x4Typed &PreTranslate(const Point3D& aPoint) {
    return PreTranslate(aPoint.x, aPoint.y, aPoint.z);
  }
# 975 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Matrix.h"
  Matrix4x4Typed &PostTranslate(Float aX, Float aY, Float aZ)
  {
    _11 += _14 * aX;
    _21 += _24 * aX;
    _31 += _34 * aX;
    _41 += _44 * aX;
    _12 += _14 * aY;
    _22 += _24 * aY;
    _32 += _34 * aY;
    _42 += _44 * aY;
    _13 += _14 * aZ;
    _23 += _24 * aZ;
    _33 += _34 * aZ;
    _43 += _44 * aZ;

    return *this;
  }

  Matrix4x4Typed &PostTranslate(const TargetPoint3D& aPoint) {
    return PostTranslate(aPoint.x, aPoint.y, aPoint.z);
  }

  Matrix4x4Typed &PostTranslate(const TargetPoint& aPoint) {
    return PostTranslate(aPoint.x, aPoint.y, 0);
  }

  static Matrix4x4Typed Scaling(Float aScaleX, Float aScaleY, float aScaleZ)
  {
    return Matrix4x4Typed(aScaleX, 0.0f, 0.0f, 0.0f,
                          0.0f, aScaleY, 0.0f, 0.0f,
                          0.0f, 0.0f, aScaleZ, 0.0f,
                          0.0f, 0.0f, 0.0f, 1.0f);
  }




  Matrix4x4Typed &PreScale(Float aX, Float aY, Float aZ)
  {
    _11 *= aX;
    _12 *= aX;
    _13 *= aX;
    _14 *= aX;
    _21 *= aY;
    _22 *= aY;
    _23 *= aY;
    _24 *= aY;
    _31 *= aZ;
    _32 *= aZ;
    _33 *= aZ;
    _34 *= aZ;

    return *this;
  }




  Matrix4x4Typed &PostScale(Float aScaleX, Float aScaleY, Float aScaleZ)
  {
    _11 *= aScaleX;
    _21 *= aScaleX;
    _31 *= aScaleX;
    _41 *= aScaleX;
    _12 *= aScaleY;
    _22 *= aScaleY;
    _32 *= aScaleY;
    _42 *= aScaleY;
    _13 *= aScaleZ;
    _23 *= aScaleZ;
    _33 *= aScaleZ;
    _43 *= aScaleZ;

    return *this;
  }

  void SkewXY(Float aSkew)
  {
    (*this)[1] += (*this)[0] * aSkew;
  }

  void SkewXZ(Float aSkew)
  {
      (*this)[2] += (*this)[0] * aSkew;
  }

  void SkewYZ(Float aSkew)
  {
      (*this)[2] += (*this)[1] * aSkew;
  }

  Matrix4x4Typed &ChangeBasis(const Point3D& aOrigin)
  {
    return ChangeBasis(aOrigin.x, aOrigin.y, aOrigin.z);
  }

  Matrix4x4Typed &ChangeBasis(Float aX, Float aY, Float aZ)
  {

    PreTranslate(-aX, -aY, -aZ);


    PostTranslate(aX, aY, aZ);

    return *this;
  }

  Matrix4x4Typed& Transpose() {
    std::swap(_12, _21);
    std::swap(_13, _31);
    std::swap(_14, _41);

    std::swap(_23, _32);
    std::swap(_24, _42);

    std::swap(_34, _43);

    return *this;
  }

  bool operator==(const Matrix4x4Typed& o) const
  {

    return _11 == o._11 && _12 == o._12 && _13 == o._13 && _14 == o._14 &&
           _21 == o._21 && _22 == o._22 && _23 == o._23 && _24 == o._24 &&
           _31 == o._31 && _32 == o._32 && _33 == o._33 && _34 == o._34 &&
           _41 == o._41 && _42 == o._42 && _43 == o._43 && _44 == o._44;
  }

  bool operator!=(const Matrix4x4Typed& o) const
  {
    return !((*this) == o);
  }

  template <typename NewTargetUnits>
  Matrix4x4Typed<SourceUnits, NewTargetUnits> operator*(const Matrix4x4Typed<TargetUnits, NewTargetUnits> &aMatrix) const
  {
    Matrix4x4Typed<SourceUnits, NewTargetUnits> matrix;

    matrix._11 = _11 * aMatrix._11 + _12 * aMatrix._21 + _13 * aMatrix._31 + _14 * aMatrix._41;
    matrix._21 = _21 * aMatrix._11 + _22 * aMatrix._21 + _23 * aMatrix._31 + _24 * aMatrix._41;
    matrix._31 = _31 * aMatrix._11 + _32 * aMatrix._21 + _33 * aMatrix._31 + _34 * aMatrix._41;
    matrix._41 = _41 * aMatrix._11 + _42 * aMatrix._21 + _43 * aMatrix._31 + _44 * aMatrix._41;
    matrix._12 = _11 * aMatrix._12 + _12 * aMatrix._22 + _13 * aMatrix._32 + _14 * aMatrix._42;
    matrix._22 = _21 * aMatrix._12 + _22 * aMatrix._22 + _23 * aMatrix._32 + _24 * aMatrix._42;
    matrix._32 = _31 * aMatrix._12 + _32 * aMatrix._22 + _33 * aMatrix._32 + _34 * aMatrix._42;
    matrix._42 = _41 * aMatrix._12 + _42 * aMatrix._22 + _43 * aMatrix._32 + _44 * aMatrix._42;
    matrix._13 = _11 * aMatrix._13 + _12 * aMatrix._23 + _13 * aMatrix._33 + _14 * aMatrix._43;
    matrix._23 = _21 * aMatrix._13 + _22 * aMatrix._23 + _23 * aMatrix._33 + _24 * aMatrix._43;
    matrix._33 = _31 * aMatrix._13 + _32 * aMatrix._23 + _33 * aMatrix._33 + _34 * aMatrix._43;
    matrix._43 = _41 * aMatrix._13 + _42 * aMatrix._23 + _43 * aMatrix._33 + _44 * aMatrix._43;
    matrix._14 = _11 * aMatrix._14 + _12 * aMatrix._24 + _13 * aMatrix._34 + _14 * aMatrix._44;
    matrix._24 = _21 * aMatrix._14 + _22 * aMatrix._24 + _23 * aMatrix._34 + _24 * aMatrix._44;
    matrix._34 = _31 * aMatrix._14 + _32 * aMatrix._24 + _33 * aMatrix._34 + _34 * aMatrix._44;
    matrix._44 = _41 * aMatrix._14 + _42 * aMatrix._24 + _43 * aMatrix._34 + _44 * aMatrix._44;

    return matrix;
  }

  Matrix4x4Typed& operator*=(const Matrix4x4Typed<TargetUnits, TargetUnits> &aMatrix)
  {
    *this = *this * aMatrix;
    return *this;
  }



  bool IsIdentity() const
  {
    return _11 == 1.0f && _12 == 0.0f && _13 == 0.0f && _14 == 0.0f &&
           _21 == 0.0f && _22 == 1.0f && _23 == 0.0f && _24 == 0.0f &&
           _31 == 0.0f && _32 == 0.0f && _33 == 1.0f && _34 == 0.0f &&
           _41 == 0.0f && _42 == 0.0f && _43 == 0.0f && _44 == 1.0f;
  }

  bool IsSingular() const
  {
    return Determinant() == 0.0;
  }

  Float Determinant() const
  {
    return _14 * _23 * _32 * _41
         - _13 * _24 * _32 * _41
         - _14 * _22 * _33 * _41
         + _12 * _24 * _33 * _41
         + _13 * _22 * _34 * _41
         - _12 * _23 * _34 * _41
         - _14 * _23 * _31 * _42
         + _13 * _24 * _31 * _42
         + _14 * _21 * _33 * _42
         - _11 * _24 * _33 * _42
         - _13 * _21 * _34 * _42
         + _11 * _23 * _34 * _42
         + _14 * _22 * _31 * _43
         - _12 * _24 * _31 * _43
         - _14 * _21 * _32 * _43
         + _11 * _24 * _32 * _43
         + _12 * _21 * _34 * _43
         - _11 * _22 * _34 * _43
         - _13 * _22 * _31 * _44
         + _12 * _23 * _31 * _44
         + _13 * _21 * _32 * _44
         - _11 * _23 * _32 * _44
         - _12 * _21 * _33 * _44
         + _11 * _22 * _33 * _44;
  }


  bool Invert()
  {
    Float det = Determinant();
    if (!det) {
      return false;
    }

    Matrix4x4Typed<SourceUnits, TargetUnits> result;
    result._11 = _23 * _34 * _42 - _24 * _33 * _42 + _24 * _32 * _43 - _22 * _34 * _43 - _23 * _32 * _44 + _22 * _33 * _44;
    result._12 = _14 * _33 * _42 - _13 * _34 * _42 - _14 * _32 * _43 + _12 * _34 * _43 + _13 * _32 * _44 - _12 * _33 * _44;
    result._13 = _13 * _24 * _42 - _14 * _23 * _42 + _14 * _22 * _43 - _12 * _24 * _43 - _13 * _22 * _44 + _12 * _23 * _44;
    result._14 = _14 * _23 * _32 - _13 * _24 * _32 - _14 * _22 * _33 + _12 * _24 * _33 + _13 * _22 * _34 - _12 * _23 * _34;
    result._21 = _24 * _33 * _41 - _23 * _34 * _41 - _24 * _31 * _43 + _21 * _34 * _43 + _23 * _31 * _44 - _21 * _33 * _44;
    result._22 = _13 * _34 * _41 - _14 * _33 * _41 + _14 * _31 * _43 - _11 * _34 * _43 - _13 * _31 * _44 + _11 * _33 * _44;
    result._23 = _14 * _23 * _41 - _13 * _24 * _41 - _14 * _21 * _43 + _11 * _24 * _43 + _13 * _21 * _44 - _11 * _23 * _44;
    result._24 = _13 * _24 * _31 - _14 * _23 * _31 + _14 * _21 * _33 - _11 * _24 * _33 - _13 * _21 * _34 + _11 * _23 * _34;
    result._31 = _22 * _34 * _41 - _24 * _32 * _41 + _24 * _31 * _42 - _21 * _34 * _42 - _22 * _31 * _44 + _21 * _32 * _44;
    result._32 = _14 * _32 * _41 - _12 * _34 * _41 - _14 * _31 * _42 + _11 * _34 * _42 + _12 * _31 * _44 - _11 * _32 * _44;
    result._33 = _12 * _24 * _41 - _14 * _22 * _41 + _14 * _21 * _42 - _11 * _24 * _42 - _12 * _21 * _44 + _11 * _22 * _44;
    result._34 = _14 * _22 * _31 - _12 * _24 * _31 - _14 * _21 * _32 + _11 * _24 * _32 + _12 * _21 * _34 - _11 * _22 * _34;
    result._41 = _23 * _32 * _41 - _22 * _33 * _41 - _23 * _31 * _42 + _21 * _33 * _42 + _22 * _31 * _43 - _21 * _32 * _43;
    result._42 = _12 * _33 * _41 - _13 * _32 * _41 + _13 * _31 * _42 - _11 * _33 * _42 - _12 * _31 * _43 + _11 * _32 * _43;
    result._43 = _13 * _22 * _41 - _12 * _23 * _41 - _13 * _21 * _42 + _11 * _23 * _42 + _12 * _21 * _43 - _11 * _22 * _43;
    result._44 = _12 * _23 * _31 - _13 * _22 * _31 + _13 * _21 * _32 - _11 * _23 * _32 - _12 * _21 * _33 + _11 * _22 * _33;

    result._11 /= det;
    result._12 /= det;
    result._13 /= det;
    result._14 /= det;
    result._21 /= det;
    result._22 /= det;
    result._23 /= det;
    result._24 /= det;
    result._31 /= det;
    result._32 /= det;
    result._33 /= det;
    result._34 /= det;
    result._41 /= det;
    result._42 /= det;
    result._43 /= det;
    result._44 /= det;
    *this = result;

    return true;
  }

  Matrix4x4Typed<TargetUnits, SourceUnits> Inverse() const
  {
    typedef Matrix4x4Typed<TargetUnits, SourceUnits> InvertedMatrix;
    InvertedMatrix clone = InvertedMatrix::FromUnknownMatrix(ToUnknownMatrix());
    DebugOnly<bool> inverted = clone.Invert();
    do { } while (0);
    return clone;
  }

  Maybe<Matrix4x4Typed<TargetUnits, SourceUnits>> MaybeInverse() const
  {
    typedef Matrix4x4Typed<TargetUnits, SourceUnits> InvertedMatrix;
    InvertedMatrix clone = InvertedMatrix::FromUnknownMatrix(ToUnknownMatrix());
    if (clone.Invert()) {
      return Some(clone);
    }
    return Nothing();
  }

  void Normalize()
  {
      for (int i = 0; i < 4; i++) {
          for (int j = 0; j < 4; j++) {
              (*this)[i][j] /= (*this)[3][3];
         }
      }
  }

  bool FuzzyEqual(const Matrix4x4Typed& o) const
  {
    return gfx::FuzzyEqual(_11, o._11) && gfx::FuzzyEqual(_12, o._12) &&
           gfx::FuzzyEqual(_13, o._13) && gfx::FuzzyEqual(_14, o._14) &&
           gfx::FuzzyEqual(_21, o._21) && gfx::FuzzyEqual(_22, o._22) &&
           gfx::FuzzyEqual(_23, o._23) && gfx::FuzzyEqual(_24, o._24) &&
           gfx::FuzzyEqual(_31, o._31) && gfx::FuzzyEqual(_32, o._32) &&
           gfx::FuzzyEqual(_33, o._33) && gfx::FuzzyEqual(_34, o._34) &&
           gfx::FuzzyEqual(_41, o._41) && gfx::FuzzyEqual(_42, o._42) &&
           gfx::FuzzyEqual(_43, o._43) && gfx::FuzzyEqual(_44, o._44);
  }

  bool FuzzyEqualsMultiplicative(const Matrix4x4Typed& o) const
  {
    return ::mozilla::FuzzyEqualsMultiplicative(_11, o._11) &&
           ::mozilla::FuzzyEqualsMultiplicative(_12, o._12) &&
           ::mozilla::FuzzyEqualsMultiplicative(_13, o._13) &&
           ::mozilla::FuzzyEqualsMultiplicative(_14, o._14) &&
           ::mozilla::FuzzyEqualsMultiplicative(_21, o._21) &&
           ::mozilla::FuzzyEqualsMultiplicative(_22, o._22) &&
           ::mozilla::FuzzyEqualsMultiplicative(_23, o._23) &&
           ::mozilla::FuzzyEqualsMultiplicative(_24, o._24) &&
           ::mozilla::FuzzyEqualsMultiplicative(_31, o._31) &&
           ::mozilla::FuzzyEqualsMultiplicative(_32, o._32) &&
           ::mozilla::FuzzyEqualsMultiplicative(_33, o._33) &&
           ::mozilla::FuzzyEqualsMultiplicative(_34, o._34) &&
           ::mozilla::FuzzyEqualsMultiplicative(_41, o._41) &&
           ::mozilla::FuzzyEqualsMultiplicative(_42, o._42) &&
           ::mozilla::FuzzyEqualsMultiplicative(_43, o._43) &&
           ::mozilla::FuzzyEqualsMultiplicative(_44, o._44);
  }

  bool IsBackfaceVisible() const
  {

    Float det = Determinant();
    Float __33 = _12*_24*_41 - _14*_22*_41 +
                _14*_21*_42 - _11*_24*_42 -
                _12*_21*_44 + _11*_22*_44;
    return (__33 * det) < 0;
  }

  Matrix4x4Typed &NudgeToIntegersFixedEpsilon()
  {
    NudgeToInteger(&_11);
    NudgeToInteger(&_12);
    NudgeToInteger(&_13);
    NudgeToInteger(&_14);
    NudgeToInteger(&_21);
    NudgeToInteger(&_22);
    NudgeToInteger(&_23);
    NudgeToInteger(&_24);
    NudgeToInteger(&_31);
    NudgeToInteger(&_32);
    NudgeToInteger(&_33);
    NudgeToInteger(&_34);
    static const float error = 1e-5f;
    NudgeToInteger(&_41, error);
    NudgeToInteger(&_42, error);
    NudgeToInteger(&_43, error);
    NudgeToInteger(&_44, error);
    return *this;
  }

  Point4D TransposedVector(int aIndex) const
  {
      do { } while (0);
      return Point4D(*((&_11)+aIndex), *((&_21)+aIndex), *((&_31)+aIndex), *((&_41)+aIndex));
  }

  void SetTransposedVector(int aIndex, Point4D &aVector)
  {
      do { } while (0);
      *((&_11)+aIndex) = aVector.x;
      *((&_21)+aIndex) = aVector.y;
      *((&_31)+aIndex) = aVector.z;
      *((&_41)+aIndex) = aVector.w;
  }




  void SetRotationFromQuaternion(const Quaternion& q)
  {
    const Float x2 = q.x + q.x, y2 = q.y + q.y, z2 = q.z + q.z;
    const Float xx = q.x * x2, xy = q.x * y2, xz = q.x * z2;
    const Float yy = q.y * y2, yz = q.y * z2, zz = q.z * z2;
    const Float wx = q.w * x2, wy = q.w * y2, wz = q.w * z2;

    _11 = 1.0f - (yy + zz);
    _21 = xy + wz;
    _31 = xz - wy;
    _41 = 0.0f;

    _12 = xy - wz;
    _22 = 1.0f - (xx + zz);
    _32 = yz + wx;
    _42 = 0.0f;

    _13 = xz + wy;
    _23 = yz - wx;
    _33 = 1.0f - (xx + yy);
    _43 = 0.0f;

    _14 = _42 = _43 = 0.0f;
    _44 = 1.0f;
  }


  void SetNAN()
  {
    _11 = UnspecifiedNaN<Float>();
    _21 = UnspecifiedNaN<Float>();
    _31 = UnspecifiedNaN<Float>();
    _41 = UnspecifiedNaN<Float>();
    _12 = UnspecifiedNaN<Float>();
    _22 = UnspecifiedNaN<Float>();
    _32 = UnspecifiedNaN<Float>();
    _42 = UnspecifiedNaN<Float>();
    _13 = UnspecifiedNaN<Float>();
    _23 = UnspecifiedNaN<Float>();
    _33 = UnspecifiedNaN<Float>();
    _43 = UnspecifiedNaN<Float>();
    _14 = UnspecifiedNaN<Float>();
    _24 = UnspecifiedNaN<Float>();
    _34 = UnspecifiedNaN<Float>();
    _44 = UnspecifiedNaN<Float>();
  }

  void SkewXY(double aXSkew, double aYSkew)
  {

    float tanX = SafeTangent(aXSkew);
    float tanY = SafeTangent(aYSkew);
    float temp;

    temp = _11;
    _11 += tanY * _21;
    _21 += tanX * temp;

    temp = _12;
    _12 += tanY * _22;
    _22 += tanX * temp;

    temp = _13;
    _13 += tanY * _23;
    _23 += tanX * temp;

    temp = _14;
    _14 += tanY * _24;
    _24 += tanX * temp;
  }

  void RotateX(double aTheta)
  {

    double cosTheta = FlushToZero(cos(aTheta));
    double sinTheta = FlushToZero(sin(aTheta));

    float temp;

    temp = _21;
    _21 = cosTheta * _21 + sinTheta * _31;
    _31 = -sinTheta * temp + cosTheta * _31;

    temp = _22;
    _22 = cosTheta * _22 + sinTheta * _32;
    _32 = -sinTheta * temp + cosTheta * _32;

    temp = _23;
    _23 = cosTheta * _23 + sinTheta * _33;
    _33 = -sinTheta * temp + cosTheta * _33;

    temp = _24;
    _24 = cosTheta * _24 + sinTheta * _34;
    _34 = -sinTheta * temp + cosTheta * _34;
  }

  void RotateY(double aTheta)
  {

    double cosTheta = FlushToZero(cos(aTheta));
    double sinTheta = FlushToZero(sin(aTheta));

    float temp;

    temp = _11;
    _11 = cosTheta * _11 + -sinTheta * _31;
    _31 = sinTheta * temp + cosTheta * _31;

    temp = _12;
    _12 = cosTheta * _12 + -sinTheta * _32;
    _32 = sinTheta * temp + cosTheta * _32;

    temp = _13;
    _13 = cosTheta * _13 + -sinTheta * _33;
    _33 = sinTheta * temp + cosTheta * _33;

    temp = _14;
    _14 = cosTheta * _14 + -sinTheta * _34;
    _34 = sinTheta * temp + cosTheta * _34;
  }

  void RotateZ(double aTheta)
  {

    double cosTheta = FlushToZero(cos(aTheta));
    double sinTheta = FlushToZero(sin(aTheta));

    float temp;

    temp = _11;
    _11 = cosTheta * _11 + sinTheta * _21;
    _21 = -sinTheta * temp + cosTheta * _21;

    temp = _12;
    _12 = cosTheta * _12 + sinTheta * _22;
    _22 = -sinTheta * temp + cosTheta * _22;

    temp = _13;
    _13 = cosTheta * _13 + sinTheta * _23;
    _23 = -sinTheta * temp + cosTheta * _23;

    temp = _14;
    _14 = cosTheta * _14 + sinTheta * _24;
    _24 = -sinTheta * temp + cosTheta * _24;
  }





  void SetRotateAxisAngle(double aX, double aY, double aZ, double aTheta)
  {
    Point3D vector(aX, aY, aZ);
    if (!vector.Length()) {
      return;
    }
    vector.Normalize();

    double x = vector.x;
    double y = vector.y;
    double z = vector.z;

    double cosTheta = FlushToZero(cos(aTheta));
    double sinTheta = FlushToZero(sin(aTheta));


    double sc = sinTheta / 2;

    double sq = (1 - cosTheta) / 2;

    _11 = 1 - 2 * (y * y + z * z) * sq;
    _12 = 2 * (x * y * sq + z * sc);
    _13 = 2 * (x * z * sq - y * sc);
    _14 = 0.0f;
    _21 = 2 * (x * y * sq - z * sc);
    _22 = 1 - 2 * (x * x + z * z) * sq;
    _23 = 2 * (y * z * sq + x * sc);
    _24 = 0.0f;
    _31 = 2 * (x * z * sq + y * sc);
    _32 = 2 * (y * z * sq - x * sc);
    _33 = 1 - 2 * (x * x + y * y) * sq;
    _34 = 0.0f;
    _41 = 0.0f;
    _42 = 0.0f;
    _43 = 0.0f;
    _44 = 1.0f;
  }

  void Perspective(float aDepth)
  {
    do { } while (0);
    _31 += -1.0/aDepth * _41;
    _32 += -1.0/aDepth * _42;
    _33 += -1.0/aDepth * _43;
    _34 += -1.0/aDepth * _44;
  }

  Point3D GetNormalVector() const
  {


    Point3D a = TransformPoint(Point3D(0, 0, 0));
    Point3D b = TransformPoint(Point3D(0, 1, 0));
    Point3D c = TransformPoint(Point3D(1, 0, 0));


    Point3D ab = b - a;
    Point3D ac = c - a;

    return ac.CrossProduct(ab);
  }





  bool HasNonTranslation() const {
    return !gfx::FuzzyEqual(_11, 1.0) || !gfx::FuzzyEqual(_22, 1.0) ||
           !gfx::FuzzyEqual(_12, 0.0) || !gfx::FuzzyEqual(_21, 0.0) ||
           !gfx::FuzzyEqual(_13, 0.0) || !gfx::FuzzyEqual(_23, 0.0) ||
           !gfx::FuzzyEqual(_31, 0.0) || !gfx::FuzzyEqual(_32, 0.0) ||
           !gfx::FuzzyEqual(_33, 1.0);
  }





  bool HasNonIntegerTranslation() const {
    return HasNonTranslation() ||
      !gfx::FuzzyEqual(_41, floor(_41 + 0.5)) ||
      !gfx::FuzzyEqual(_42, floor(_42 + 0.5)) ||
      !gfx::FuzzyEqual(_43, floor(_43 + 0.5));
  }




  bool HasPerspectiveComponent() const {
    return _14 != 0 || _24 != 0 || _34 != 0 || _44 != 1;
  }




  Matrix4x4 ToUnknownMatrix() const {
    return Matrix4x4{_11, _12, _13, _14,
                     _21, _22, _23, _24,
                     _31, _32, _33, _34,
                     _41, _42, _43, _44};
  }
  static Matrix4x4Typed FromUnknownMatrix(const Matrix4x4& aUnknown) {
    return Matrix4x4Typed{aUnknown._11, aUnknown._12, aUnknown._13, aUnknown._14,
                          aUnknown._21, aUnknown._22, aUnknown._23, aUnknown._24,
                          aUnknown._31, aUnknown._32, aUnknown._33, aUnknown._34,
                          aUnknown._41, aUnknown._42, aUnknown._43, aUnknown._44};
  }
};

typedef Matrix4x4Typed<UnknownUnits, UnknownUnits> Matrix4x4;

class Matrix5x4
{
public:
  Matrix5x4()
    : _11(1.0f), _12(0), _13(0), _14(0)
    , _21(0), _22(1.0f), _23(0), _24(0)
    , _31(0), _32(0), _33(1.0f), _34(0)
    , _41(0), _42(0), _43(0), _44(1.0f)
    , _51(0), _52(0), _53(0), _54(0)
  {}
  Matrix5x4(Float a11, Float a12, Float a13, Float a14,
         Float a21, Float a22, Float a23, Float a24,
         Float a31, Float a32, Float a33, Float a34,
         Float a41, Float a42, Float a43, Float a44,
         Float a51, Float a52, Float a53, Float a54)
    : _11(a11), _12(a12), _13(a13), _14(a14)
    , _21(a21), _22(a22), _23(a23), _24(a24)
    , _31(a31), _32(a32), _33(a33), _34(a34)
    , _41(a41), _42(a42), _43(a43), _44(a44)
    , _51(a51), _52(a52), _53(a53), _54(a54)
  {}

  bool operator==(const Matrix5x4 &o) const
  {
    return _11 == o._11 && _12 == o._12 && _13 == o._13 && _14 == o._14 &&
           _21 == o._21 && _22 == o._22 && _23 == o._23 && _24 == o._24 &&
           _31 == o._31 && _32 == o._32 && _33 == o._33 && _34 == o._34 &&
           _41 == o._41 && _42 == o._42 && _43 == o._43 && _44 == o._44 &&
           _51 == o._51 && _52 == o._52 && _53 == o._53 && _54 == o._54;
  }

  bool operator!=(const Matrix5x4 &aMatrix) const
  {
    return !(*this == aMatrix);
  }

  Matrix5x4 operator*(const Matrix5x4 &aMatrix) const
  {
    Matrix5x4 resultMatrix;

    resultMatrix._11 = this->_11 * aMatrix._11 + this->_12 * aMatrix._21 + this->_13 * aMatrix._31 + this->_14 * aMatrix._41;
    resultMatrix._12 = this->_11 * aMatrix._12 + this->_12 * aMatrix._22 + this->_13 * aMatrix._32 + this->_14 * aMatrix._42;
    resultMatrix._13 = this->_11 * aMatrix._13 + this->_12 * aMatrix._23 + this->_13 * aMatrix._33 + this->_14 * aMatrix._43;
    resultMatrix._14 = this->_11 * aMatrix._14 + this->_12 * aMatrix._24 + this->_13 * aMatrix._34 + this->_14 * aMatrix._44;
    resultMatrix._21 = this->_21 * aMatrix._11 + this->_22 * aMatrix._21 + this->_23 * aMatrix._31 + this->_24 * aMatrix._41;
    resultMatrix._22 = this->_21 * aMatrix._12 + this->_22 * aMatrix._22 + this->_23 * aMatrix._32 + this->_24 * aMatrix._42;
    resultMatrix._23 = this->_21 * aMatrix._13 + this->_22 * aMatrix._23 + this->_23 * aMatrix._33 + this->_24 * aMatrix._43;
    resultMatrix._24 = this->_21 * aMatrix._14 + this->_22 * aMatrix._24 + this->_23 * aMatrix._34 + this->_24 * aMatrix._44;
    resultMatrix._31 = this->_31 * aMatrix._11 + this->_32 * aMatrix._21 + this->_33 * aMatrix._31 + this->_34 * aMatrix._41;
    resultMatrix._32 = this->_31 * aMatrix._12 + this->_32 * aMatrix._22 + this->_33 * aMatrix._32 + this->_34 * aMatrix._42;
    resultMatrix._33 = this->_31 * aMatrix._13 + this->_32 * aMatrix._23 + this->_33 * aMatrix._33 + this->_34 * aMatrix._43;
    resultMatrix._34 = this->_31 * aMatrix._14 + this->_32 * aMatrix._24 + this->_33 * aMatrix._34 + this->_34 * aMatrix._44;
    resultMatrix._41 = this->_41 * aMatrix._11 + this->_42 * aMatrix._21 + this->_43 * aMatrix._31 + this->_44 * aMatrix._41;
    resultMatrix._42 = this->_41 * aMatrix._12 + this->_42 * aMatrix._22 + this->_43 * aMatrix._32 + this->_44 * aMatrix._42;
    resultMatrix._43 = this->_41 * aMatrix._13 + this->_42 * aMatrix._23 + this->_43 * aMatrix._33 + this->_44 * aMatrix._43;
    resultMatrix._44 = this->_41 * aMatrix._14 + this->_42 * aMatrix._24 + this->_43 * aMatrix._34 + this->_44 * aMatrix._44;
    resultMatrix._51 = this->_51 * aMatrix._11 + this->_52 * aMatrix._21 + this->_53 * aMatrix._31 + this->_54 * aMatrix._41 + aMatrix._51;
    resultMatrix._52 = this->_51 * aMatrix._12 + this->_52 * aMatrix._22 + this->_53 * aMatrix._32 + this->_54 * aMatrix._42 + aMatrix._52;
    resultMatrix._53 = this->_51 * aMatrix._13 + this->_52 * aMatrix._23 + this->_53 * aMatrix._33 + this->_54 * aMatrix._43 + aMatrix._53;
    resultMatrix._54 = this->_51 * aMatrix._14 + this->_52 * aMatrix._24 + this->_53 * aMatrix._34 + this->_54 * aMatrix._44 + aMatrix._54;

    return resultMatrix;
  }

  Matrix5x4& operator*=(const Matrix5x4 &aMatrix)
  {
    *this = *this * aMatrix;
    return *this;
  }

  union {
    struct {
      Float _11, _12, _13, _14;
      Float _21, _22, _23, _24;
      Float _31, _32, _33, _34;
      Float _41, _42, _43, _44;
      Float _51, _52, _53, _54;
    };
    Float components[20];
  };
};

}
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/ScaleFactor.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/ScaleFactor.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxPoint.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxPoint.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSize.h" 1








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/math.h" 1 3
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" 2

# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h" 2
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h"
inline float NS_IEEEPositiveInfinity() {
  union { uint32_t mPRUint32; float mFloat; } pun;
  pun.mPRUint32 = 0x7F800000;
  return pun.mFloat;
}
inline bool NS_IEEEIsNan(float aF) {
  union { uint32_t mBits; float mFloat; } pun;
  pun.mFloat = aF;
  return (pun.mBits & 0x7F800000) == 0x7F800000 &&
    (pun.mBits & 0x007FFFFF) != 0;
}





typedef int32_t nscoord;





inline void VERIFY_COORD(nscoord aCoord) {




}





inline nscoord NSCoordDivRem(nscoord aSpace, size_t aN, nscoord* aQuotient)
{




  div_t result = div(aSpace, aN);
  *aQuotient = nscoord(result.quot);
  return nscoord(result.rem);

}

inline nscoord NSCoordMulDiv(nscoord aMult1, nscoord aMult2, nscoord aDiv) {



  return (int64_t(aMult1) * int64_t(aMult2) / int64_t(aDiv));

}

inline nscoord NSToCoordRound(float aValue)
{



  return nscoord(floorf(aValue + 0.5f));

}

inline nscoord NSToCoordRound(double aValue)
{



  return nscoord(floor(aValue + 0.5f));

}

inline nscoord NSToCoordRoundWithClamp(float aValue)
{


  if (aValue >= nscoord(1 << 30)) {
    return nscoord(1 << 30);
  }
  if (aValue <= (-nscoord(1 << 30))) {
    return (-nscoord(1 << 30));
  }

  return NSToCoordRound(aValue);
}







inline nscoord _nscoordSaturatingMultiply(nscoord aCoord, float aScale,
                                          bool requireNotNegative) {
  VERIFY_COORD(aCoord);
  if (requireNotNegative) {
    do { } while (0);

  }



  float product = aCoord * aScale;
  if (requireNotNegative ? aCoord > 0 : (aCoord > 0) == (aScale > 0))
    return NSToCoordRoundWithClamp(std::min<float>(nscoord(1 << 30), product));
  return NSToCoordRoundWithClamp(std::max<float>((-nscoord(1 << 30)), product));

}







inline nscoord NSCoordSaturatingNonnegativeMultiply(nscoord aCoord, float aScale) {
  return _nscoordSaturatingMultiply(aCoord, aScale, true);
}





inline nscoord NSCoordSaturatingMultiply(nscoord aCoord, float aScale) {
  return _nscoordSaturatingMultiply(aCoord, aScale, false);
}
# 167 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h"
inline nscoord
NSCoordSaturatingAdd(nscoord a, nscoord b)
{
  VERIFY_COORD(a);
  VERIFY_COORD(b);





  if (a == nscoord(1 << 30) || b == nscoord(1 << 30)) {

    return nscoord(1 << 30);
  } else {


    return std::min(nscoord(1 << 30), a + b);
  }

}
# 204 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h"
inline nscoord
NSCoordSaturatingSubtract(nscoord a, nscoord b,
                          nscoord infMinusInfResult)
{
  VERIFY_COORD(a);
  VERIFY_COORD(b);

  if (b == nscoord(1 << 30)) {
    if (a == nscoord(1 << 30)) {

      return infMinusInfResult;
    } else {

      do { } while(0);
      return 0;
    }
  } else {




    if (a == nscoord(1 << 30)) {

      return nscoord(1 << 30);
    } else {


      return std::min(nscoord(1 << 30), a - b);
    }

  }
}

inline float NSCoordToFloat(nscoord aCoord) {
  VERIFY_COORD(aCoord);



  return (float)aCoord;
}




inline nscoord NSToCoordFloor(float aValue)
{
  return nscoord(floorf(aValue));
}

inline nscoord NSToCoordFloor(double aValue)
{
  return nscoord(floor(aValue));
}

inline nscoord NSToCoordFloorClamped(float aValue)
{


  if (aValue >= nscoord(1 << 30)) {
    return nscoord(1 << 30);
  }
  if (aValue <= (-nscoord(1 << 30))) {
    return (-nscoord(1 << 30));
  }

  return NSToCoordFloor(aValue);
}

inline nscoord NSToCoordCeil(float aValue)
{
  return nscoord(ceilf(aValue));
}

inline nscoord NSToCoordCeil(double aValue)
{
  return nscoord(ceil(aValue));
}

inline nscoord NSToCoordCeilClamped(double aValue)
{


  if (aValue >= nscoord(1 << 30)) {
    return nscoord(1 << 30);
  }
  if (aValue <= (-nscoord(1 << 30))) {
    return (-nscoord(1 << 30));
  }

  return NSToCoordCeil(aValue);
}





inline nscoord NSToCoordTrunc(float aValue)
{


  return nscoord(aValue);
}

inline nscoord NSToCoordTrunc(double aValue)
{


  return nscoord(aValue);
}

inline nscoord NSToCoordTruncClamped(float aValue)
{


  if (aValue >= nscoord(1 << 30)) {
    return nscoord(1 << 30);
  }
  if (aValue <= (-nscoord(1 << 30))) {
    return (-nscoord(1 << 30));
  }

  return NSToCoordTrunc(aValue);
}

inline nscoord NSToCoordTruncClamped(double aValue)
{


  if (aValue >= nscoord(1 << 30)) {
    return nscoord(1 << 30);
  }
  if (aValue <= (-nscoord(1 << 30))) {
    return (-nscoord(1 << 30));
  }

  return NSToCoordTrunc(aValue);
}




inline int32_t NSToIntFloor(float aValue)
{
  return int32_t(floorf(aValue));
}

inline int32_t NSToIntCeil(float aValue)
{
  return int32_t(ceilf(aValue));
}

inline int32_t NSToIntRound(float aValue)
{
  return NS_lroundf(aValue);
}

inline int32_t NSToIntRound(double aValue)
{
  return NS_lround(aValue);
}

inline int32_t NSToIntRoundUp(double aValue)
{
  return int32_t(floor(aValue + 0.5));
}




inline nscoord NSFloatPixelsToAppUnits(float aPixels, float aAppUnitsPerPixel)
{
  return NSToCoordRoundWithClamp(aPixels * aAppUnitsPerPixel);
}

inline nscoord NSIntPixelsToAppUnits(int32_t aPixels, int32_t aAppUnitsPerPixel)
{


  nscoord r = aPixels * (nscoord)aAppUnitsPerPixel;
  VERIFY_COORD(r);
  return r;
}

inline float NSAppUnitsToFloatPixels(nscoord aAppUnits, float aAppUnitsPerPixel)
{
  return (float(aAppUnits) / aAppUnitsPerPixel);
}

inline double NSAppUnitsToDoublePixels(nscoord aAppUnits, double aAppUnitsPerPixel)
{
  return (double(aAppUnits) / aAppUnitsPerPixel);
}

inline int32_t NSAppUnitsToIntPixels(nscoord aAppUnits, float aAppUnitsPerPixel)
{
  return NSToIntRound(float(aAppUnits) / aAppUnitsPerPixel);
}

inline float NSCoordScale(nscoord aCoord, int32_t aFromAPP, int32_t aToAPP)
{
  return (NSCoordToFloat(aCoord) * aToAPP) / aFromAPP;
}
# 418 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCoord.h"
inline float NSUnitsToTwips(float aValue, float aPointsPerUnit)
{
  return aValue * aPointsPerUnit * 20.0f;
}

inline float NSTwipsToUnits(float aTwips, float aUnitsPerPoint)
{
  return (aTwips * (aUnitsPerPoint / 20.0f));
}
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSize.h" 2






typedef mozilla::gfx::IntSize nsIntSize;

struct nsSize : public mozilla::gfx::BaseSize<nscoord, nsSize> {
  typedef mozilla::gfx::BaseSize<nscoord, nsSize> Super;

  nsSize() : Super() {}
  nsSize(nscoord aWidth, nscoord aHeight) : Super(aWidth, aHeight) {}

  inline mozilla::gfx::IntSize ScaleToNearestPixels(float aXScale, float aYScale,
                                        nscoord aAppUnitsPerPixel) const;
  inline mozilla::gfx::IntSize ToNearestPixels(nscoord aAppUnitsPerPixel) const;






  __attribute__ ((warn_unused_result)) inline nsSize
    ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const;
};

inline mozilla::gfx::IntSize
nsSize::ScaleToNearestPixels(float aXScale, float aYScale,
                             nscoord aAppUnitsPerPixel) const
{
  return mozilla::gfx::IntSize(
      NSToIntRoundUp(NSAppUnitsToDoublePixels(width, aAppUnitsPerPixel) * aXScale),
      NSToIntRoundUp(NSAppUnitsToDoublePixels(height, aAppUnitsPerPixel) * aYScale));
}

inline mozilla::gfx::IntSize
nsSize::ToNearestPixels(nscoord aAppUnitsPerPixel) const
{
  return ScaleToNearestPixels(1.0f, 1.0f, aAppUnitsPerPixel);
}

inline nsSize
nsSize::ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const {
  if (aFromAPP != aToAPP) {
    nsSize size;
    size.width = NSToCoordRound(NSCoordScale(width, aFromAPP, aToAPP));
    size.height = NSToCoordRound(NSCoordScale(height, aFromAPP, aToAPP));
    return size;
  }
  return *this;
}

inline nsSize
IntSizeToAppUnits(mozilla::gfx::IntSize aSize, nscoord aAppUnitsPerPixel)
{
  return nsSize(NSIntPixelsToAppUnits(aSize.width, aAppUnitsPerPixel),
                NSIntPixelsToAppUnits(aSize.height, aAppUnitsPerPixel));
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxPoint.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPoint.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPoint.h"
typedef mozilla::gfx::IntPoint nsIntPoint;



struct nsPoint : public mozilla::gfx::BasePoint<nscoord, nsPoint> {
  typedef mozilla::gfx::BasePoint<nscoord, nsPoint> Super;

  nsPoint() : Super() {}
  nsPoint(const nsPoint& aPoint) : Super(aPoint) {}
  nsPoint(nscoord aX, nscoord aY) : Super(aX, aY) {}

  inline nsIntPoint ScaleToNearestPixels(float aXScale, float aYScale,
                                         nscoord aAppUnitsPerPixel) const;
  inline nsIntPoint ToNearestPixels(nscoord aAppUnitsPerPixel) const;






  __attribute__ ((warn_unused_result)) inline nsPoint
    ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const;

  __attribute__ ((warn_unused_result)) inline nsPoint
    RemoveResolution(const float resolution) const;
  __attribute__ ((warn_unused_result)) inline nsPoint
    ApplyResolution(const float resolution) const;
};

inline nsPoint ToAppUnits(const nsIntPoint& aPoint, nscoord aAppUnitsPerPixel);

inline nsIntPoint
nsPoint::ScaleToNearestPixels(float aXScale, float aYScale,
                              nscoord aAppUnitsPerPixel) const
{
  return nsIntPoint(
      NSToIntRoundUp(NSAppUnitsToDoublePixels(x, aAppUnitsPerPixel) * aXScale),
      NSToIntRoundUp(NSAppUnitsToDoublePixels(y, aAppUnitsPerPixel) * aYScale));
}

inline nsIntPoint
nsPoint::ToNearestPixels(nscoord aAppUnitsPerPixel) const
{
  return ScaleToNearestPixels(1.0f, 1.0f, aAppUnitsPerPixel);
}

inline nsPoint
nsPoint::ScaleToOtherAppUnits(int32_t aFromAPP, int32_t aToAPP) const
{
  if (aFromAPP != aToAPP) {
    nsPoint point;
    point.x = NSToCoordRound(NSCoordScale(x, aFromAPP, aToAPP));
    point.y = NSToCoordRound(NSCoordScale(y, aFromAPP, aToAPP));
    return point;
  }
  return *this;
}

inline nsPoint
nsPoint::RemoveResolution(const float resolution) const {
  if (resolution != 1.0f) {
    nsPoint point;
    point.x = NSToCoordRound(NSCoordToFloat(x) / resolution);
    point.y = NSToCoordRound(NSCoordToFloat(y) / resolution);
    return point;
  }
  return *this;
}

inline nsPoint
nsPoint::ApplyResolution(const float resolution) const {
  if (resolution != 1.0f) {
    nsPoint point;
    point.x = NSToCoordRound(NSCoordToFloat(x) * resolution);
    point.y = NSToCoordRound(NSCoordToFloat(y) * resolution);
    return point;
  }
  return *this;
}


inline nsPoint
ToAppUnits(const nsIntPoint& aPoint, nscoord aAppUnitsPerPixel)
{
  return nsPoint(NSIntPixelsToAppUnits(aPoint.x, aAppUnitsPerPixel),
                 NSIntPixelsToAppUnits(aPoint.y, aAppUnitsPerPixel));
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxPoint.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxTypes.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxTypes.h"
typedef struct _cairo_surface cairo_surface_t;
typedef struct _cairo_user_data_key cairo_user_data_key_t;

typedef void (*thebes_destroy_func_t) (void *data);





typedef double gfxFloat;
# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxTypes.h"
enum class gfxBreakPriority {
  eNoBreak = 0,
  eWordWrapBreak,
  eNormalBreak
};

enum class gfxSurfaceType {
  Image,
  PDF,
  PS,
  Xlib,
  Xcb,
  Glitz,
  Quartz,
  Win32,
  BeOS,
  DirectFB,
  SVG,
  OS2,
  Win32Printing,
  QuartzImage,
  Script,
  QPainter,
  Recording,
  VG,
  GL,
  DRM,
  Tee,
  XML,
  Skia,
  Subsurface,
  Max
};

enum class gfxContentType {
  COLOR = 0x1000,
  ALPHA = 0x2000,
  COLOR_ALPHA = 0x3000,
  SENTINEL = 0xffff
};

enum class gfxAlphaType {
  Opaque,
  Premult,
  NonPremult,
};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxPoint.h" 2

struct gfxSize : public mozilla::gfx::BaseSize<gfxFloat, gfxSize> {
    typedef mozilla::gfx::BaseSize<gfxFloat, gfxSize> Super;

    gfxSize() : Super() {}
    gfxSize(gfxFloat aWidth, gfxFloat aHeight) : Super(aWidth, aHeight) {}
                 gfxSize(const mozilla::gfx::IntSize& aSize) : Super(aSize.width, aSize.height) {}
};

struct gfxPoint : public mozilla::gfx::BasePoint<gfxFloat, gfxPoint> {
    typedef mozilla::gfx::BasePoint<gfxFloat, gfxPoint> Super;

    gfxPoint() : Super() {}
    gfxPoint(gfxFloat aX, gfxFloat aY) : Super(aX, aY) {}
                 gfxPoint(const nsIntPoint& aPoint) : Super(aPoint.x, aPoint.y) {}

    bool WithinEpsilonOf(const gfxPoint& aPoint, gfxFloat aEpsilon) {
        return fabs(aPoint.x - x) < aEpsilon && fabs(aPoint.y - y) < aEpsilon;
    }

    void Transform(const mozilla::gfx::Matrix4x4 &aMatrix)
    {

      double px = x;
      double py = y;

      x = px * aMatrix._11 + py * aMatrix._21 + aMatrix._41;
      y = px * aMatrix._12 + py * aMatrix._22 + aMatrix._42;

      double w = px * aMatrix._14 + py * aMatrix._24 + aMatrix._44;
      x /= w;
      y /= w;
    }
};

inline gfxPoint
operator*(const gfxPoint& aPoint, const gfxSize& aSize)
{
  return gfxPoint(aPoint.x * aSize.width, aPoint.y * aSize.height);
}

inline gfxPoint
operator/(const gfxPoint& aPoint, const gfxSize& aSize)
{
  return gfxPoint(aPoint.x / aSize.width, aPoint.y / aSize.height);
}

inline gfxSize
operator/(gfxFloat aValue, const gfxSize& aSize)
{
  return gfxSize(aValue / aSize.width, aValue / aSize.height);
}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/ScaleFactor.h" 2

namespace mozilla {
namespace gfx {
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/ScaleFactor.h"
template<class src, class dst>
struct ScaleFactor {
  float scale;

  constexpr ScaleFactor() : scale(1.0) {}
  constexpr ScaleFactor(const ScaleFactor<src, dst>& aCopy) : scale(aCopy.scale) {}
  explicit constexpr ScaleFactor(float aScale) : scale(aScale) {}

  ScaleFactor<dst, src> Inverse() {
    return ScaleFactor<dst, src>(1 / scale);
  }

  bool operator==(const ScaleFactor<src, dst>& aOther) const {
    return scale == aOther.scale;
  }

  bool operator!=(const ScaleFactor<src, dst>& aOther) const {
    return !(*this == aOther);
  }

  bool operator<(const ScaleFactor<src, dst>& aOther) const {
    return scale < aOther.scale;
  }

  bool operator<=(const ScaleFactor<src, dst>& aOther) const {
    return scale <= aOther.scale;
  }

  bool operator>(const ScaleFactor<src, dst>& aOther) const {
    return scale > aOther.scale;
  }

  bool operator>=(const ScaleFactor<src, dst>& aOther) const {
    return scale >= aOther.scale;
  }

  template<class other>
  ScaleFactor<other, dst> operator/(const ScaleFactor<src, other>& aOther) const {
    return ScaleFactor<other, dst>(scale / aOther.scale);
  }

  template<class other>
  ScaleFactor<src, other> operator/(const ScaleFactor<other, dst>& aOther) const {
    return ScaleFactor<src, other>(scale / aOther.scale);
  }

  template<class other>
  ScaleFactor<src, other> operator*(const ScaleFactor<dst, other>& aOther) const {
    return ScaleFactor<src, other>(scale * aOther.scale);
  }

  template<class other>
  ScaleFactor<other, dst> operator*(const ScaleFactor<other, src>& aOther) const {
    return ScaleFactor<other, dst>(scale * aOther.scale);
  }
};

}
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/ScaleFactors2D.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/ScaleFactors2D.h"
namespace mozilla {
namespace gfx {





template<class src, class dst>
struct ScaleFactors2D {
  float xScale;
  float yScale;

  constexpr ScaleFactors2D() : xScale(1.0), yScale(1.0) {}
  constexpr ScaleFactors2D(const ScaleFactors2D<src, dst>& aCopy)
    : xScale(aCopy.xScale), yScale(aCopy.yScale) {}
  constexpr ScaleFactors2D(float aXScale, float aYScale)
    : xScale(aXScale), yScale(aYScale) {}

  explicit constexpr ScaleFactors2D(const gfxSize& aSize)
    : xScale(aSize.width), yScale(aSize.height) {}





  explicit constexpr ScaleFactors2D(const ScaleFactor<src, dst>& aScale)
    : xScale(aScale.scale), yScale(aScale.scale) {}

  bool AreScalesSame() const {
    return FuzzyEqualsMultiplicative(xScale, yScale);
  }


  ScaleFactor<src, dst> ToScaleFactor() const {
    do { } while (0);
    return ScaleFactor<src, dst>(xScale);
  }

  bool operator==(const ScaleFactors2D<src, dst>& aOther) const {
    return xScale == aOther.xScale && yScale == aOther.yScale;
  }

  bool operator!=(const ScaleFactors2D<src, dst>& aOther) const {
    return !(*this == aOther);
  }

  friend std::ostream& operator<<(std::ostream& aStream,
                                  const ScaleFactors2D<src, dst>& aScale) {
    if (aScale.AreScalesSame()) {
      return aStream << aScale.xScale;
    } else {
      return aStream << '(' << aScale.xScale << ',' << aScale.yScale << ')';
    }
  }

  template<class other>
  ScaleFactors2D<other, dst> operator/(const ScaleFactors2D<src, other>& aOther) const {
    return ScaleFactors2D<other, dst>(xScale / aOther.xScale, yScale / aOther.yScale);
  }

  template<class other>
  ScaleFactors2D<src, other> operator/(const ScaleFactors2D<other, dst>& aOther) const {
    return ScaleFactors2D<src, other>(xScale / aOther.xScale, yScale / aOther.yScale);
  }

  template<class other>
  ScaleFactors2D<src, other> operator*(const ScaleFactors2D<dst, other>& aOther) const {
    return ScaleFactors2D<src, other>(xScale * aOther.xScale, yScale * aOther.yScale);
  }

  template<class other>
  ScaleFactors2D<other, dst> operator*(const ScaleFactors2D<other, src>& aOther) const {
    return ScaleFactors2D<other, dst>(xScale * aOther.xScale, yScale * aOther.yScale);
  }

  template<class other>
  ScaleFactors2D<src, other> operator*(const ScaleFactor<dst, other>& aOther) const {
    return *this * ScaleFactors2D<dst, other>(aOther);
  }

  template<class other>
  ScaleFactors2D<other, dst> operator*(const ScaleFactor<other, src>& aOther) const {
    return *this * ScaleFactors2D<other, src>(aOther);
  }

  template<class other>
  ScaleFactors2D<src, other> operator/(const ScaleFactor<other, dst>& aOther) const {
    return *this / ScaleFactors2D<other, dst>(aOther);
  }

  template<class other>
  ScaleFactors2D<other, dst> operator/(const ScaleFactor<src, other>& aOther) const {
    return *this / ScaleFactors2D<src, other>(aOther);
  }

  template<class other>
  friend ScaleFactors2D<other, dst> operator*(const ScaleFactor<other, src>& aA,
                                              const ScaleFactors2D<src, dst>& aB) {
    return ScaleFactors2D<other, src>(aA) * aB;
  }

  template<class other>
  friend ScaleFactors2D<other, src> operator/(const ScaleFactor<other, dst>& aA,
                                              const ScaleFactors2D<src, dst>& aB) {
    return ScaleFactors2D<other, src>(aA) / aB;
  }




  gfxSize operator/(const ScaleFactors2D& aOther) const {
    return gfxSize(xScale / aOther.xScale, yScale / aOther.yScale);
  }
};

}
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMargin.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMargin.h"
struct nsMargin : public mozilla::gfx::BaseMargin<nscoord, nsMargin> {
  typedef mozilla::gfx::BaseMargin<nscoord, nsMargin> Super;


  nsMargin() : Super() {}
  nsMargin(const nsMargin& aMargin) : Super(aMargin) {}
  nsMargin(nscoord aTop, nscoord aRight, nscoord aBottom, nscoord aLeft)
    : Super(aTop, aRight, aBottom, aLeft) {}
};

typedef mozilla::gfx::IntMargin nsIntMargin;
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRect.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRect.h"
typedef mozilla::gfx::IntRect nsIntRect;

struct nsRect :
  public mozilla::gfx::BaseRect<nscoord, nsRect, nsPoint, nsSize, nsMargin> {
  typedef mozilla::gfx::BaseRect<nscoord, nsRect, nsPoint, nsSize, nsMargin> Super;

  static void VERIFY_COORD(nscoord aValue) { ::VERIFY_COORD(aValue); }


  nsRect() : Super()
  {
                          ;
  }
  nsRect(const nsRect& aRect) : Super(aRect)
  {
                          ;
  }
  nsRect(const nsPoint& aOrigin, const nsSize &aSize) : Super(aOrigin, aSize)
  {
                          ;
  }
  nsRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight) :
      Super(aX, aY, aWidth, aHeight)
  {
                          ;
  }
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRect.h"
  __attribute__ ((warn_unused_result)) nsRect SaturatingUnion(const nsRect& aRect) const
  {
    if (IsEmpty()) {
      return aRect;
    } else if (aRect.IsEmpty()) {
      return *static_cast<const nsRect*>(this);
    } else {
      return SaturatingUnionEdges(aRect);
    }
  }

  __attribute__ ((warn_unused_result)) nsRect SaturatingUnionEdges(const nsRect& aRect) const
  {



    nsRect result;
    result.x = std::min(aRect.x, x);
    int64_t w = std::max(int64_t(aRect.x) + aRect.width, int64_t(x) + width) - result.x;
    if ((__builtin_expect(!!(w > nscoord(1 << 30)), 0))) {

      result.x = std::max(result.x, (-nscoord(1 << 30)) / 2);
      w = std::max(int64_t(aRect.x) + aRect.width, int64_t(x) + width) - result.x;
      if ((__builtin_expect(!!(w > nscoord(1 << 30)), 0))) {
        w = nscoord(1 << 30);
      }
    }
    result.width = nscoord(w);

    result.y = std::min(aRect.y, y);
    int64_t h = std::max(int64_t(aRect.y) + aRect.height, int64_t(y) + height) - result.y;
    if ((__builtin_expect(!!(h > nscoord(1 << 30)), 0))) {

      result.y = std::max(result.y, (-nscoord(1 << 30)) / 2);
      h = std::max(int64_t(aRect.y) + aRect.height, int64_t(y) + height) - result.y;
      if ((__builtin_expect(!!(h > nscoord(1 << 30)), 0))) {
        h = nscoord(1 << 30);
      }
    }
    result.height = nscoord(h);
    return result;

  }



  __attribute__ ((warn_unused_result)) nsRect UnionEdges(const nsRect& aRect) const
  {
    return SaturatingUnionEdges(aRect);
  }
  void UnionRectEdges(const nsRect& aRect1, const nsRect& aRect2)
  {
    *this = aRect1.UnionEdges(aRect2);
  }
  __attribute__ ((warn_unused_result)) nsRect Union(const nsRect& aRect) const
  {
    return SaturatingUnion(aRect);
  }
  void UnionRect(const nsRect& aRect1, const nsRect& aRect2)
  {
    *this = aRect1.Union(aRect2);
  }


  void SaturatingUnionRect(const nsRect& aRect1, const nsRect& aRect2)
  {
    *this = aRect1.SaturatingUnion(aRect2);
  }
  void SaturatingUnionRectEdges(const nsRect& aRect1, const nsRect& aRect2)
  {
    *this = aRect1.SaturatingUnionEdges(aRect2);
  }


  bool Overflows() const;
# 144 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRect.h"
  __attribute__ ((warn_unused_result)) inline nsRect
    ScaleToOtherAppUnitsRoundOut(int32_t aFromAPP, int32_t aToAPP) const;
  __attribute__ ((warn_unused_result)) inline nsRect
    ScaleToOtherAppUnitsRoundIn(int32_t aFromAPP, int32_t aToAPP) const;

  __attribute__ ((warn_unused_result)) inline mozilla::gfx::IntRect
  ScaleToNearestPixels(float aXScale, float aYScale,
                       nscoord aAppUnitsPerPixel) const;

  __attribute__ ((warn_unused_result)) inline mozilla::gfx::IntRect
  ToNearestPixels(nscoord aAppUnitsPerPixel) const;


  __attribute__ ((warn_unused_result)) inline mozilla::gfx::IntRect
  ScaleToOutsidePixels(float aXScale, float aYScale,
                       nscoord aAppUnitsPerPixel) const;


  __attribute__ ((warn_unused_result)) inline mozilla::gfx::IntRect
  ToOutsidePixels(nscoord aAppUnitsPerPixel) const;

  __attribute__ ((warn_unused_result)) inline mozilla::gfx::IntRect
  ScaleToInsidePixels(float aXScale, float aYScale,
                      nscoord aAppUnitsPerPixel) const;

  __attribute__ ((warn_unused_result)) inline mozilla::gfx::IntRect
  ToInsidePixels(nscoord aAppUnitsPerPixel) const;


  bool operator==(const nsRect& aRect) const
  {
    return IsEqualEdges(aRect);
  }

  __attribute__ ((warn_unused_result)) inline nsRect RemoveResolution(const float aResolution) const;
};





inline nsRect
nsRect::ScaleToOtherAppUnitsRoundOut(int32_t aFromAPP, int32_t aToAPP) const
{
  if (aFromAPP == aToAPP) {
    return *this;
  }

  nsRect rect;
  nscoord right = NSToCoordCeil(NSCoordScale(XMost(), aFromAPP, aToAPP));
  nscoord bottom = NSToCoordCeil(NSCoordScale(YMost(), aFromAPP, aToAPP));
  rect.x = NSToCoordFloor(NSCoordScale(x, aFromAPP, aToAPP));
  rect.y = NSToCoordFloor(NSCoordScale(y, aFromAPP, aToAPP));
  rect.width = (right - rect.x);
  rect.height = (bottom - rect.y);

  return rect;
}

inline nsRect
nsRect::ScaleToOtherAppUnitsRoundIn(int32_t aFromAPP, int32_t aToAPP) const
{
  if (aFromAPP == aToAPP) {
    return *this;
  }

  nsRect rect;
  nscoord right = NSToCoordFloor(NSCoordScale(XMost(), aFromAPP, aToAPP));
  nscoord bottom = NSToCoordFloor(NSCoordScale(YMost(), aFromAPP, aToAPP));
  rect.x = NSToCoordCeil(NSCoordScale(x, aFromAPP, aToAPP));
  rect.y = NSToCoordCeil(NSCoordScale(y, aFromAPP, aToAPP));
  rect.width = (right - rect.x);
  rect.height = (bottom - rect.y);

  return rect;
}


inline mozilla::gfx::IntRect
nsRect::ScaleToNearestPixels(float aXScale, float aYScale,
                             nscoord aAppUnitsPerPixel) const
{
  mozilla::gfx::IntRect rect;
  rect.x = NSToIntRoundUp(NSAppUnitsToDoublePixels(x, aAppUnitsPerPixel) * aXScale);
  rect.y = NSToIntRoundUp(NSAppUnitsToDoublePixels(y, aAppUnitsPerPixel) * aYScale);

  rect.width = std::max(0, NSToIntRoundUp(NSAppUnitsToDoublePixels(XMost(),
                               aAppUnitsPerPixel) * aXScale) - rect.x);
  rect.height = std::max(0, NSToIntRoundUp(NSAppUnitsToDoublePixels(YMost(),
                               aAppUnitsPerPixel) * aYScale) - rect.y);
  return rect;
}


inline mozilla::gfx::IntRect
nsRect::ScaleToOutsidePixels(float aXScale, float aYScale,
                             nscoord aAppUnitsPerPixel) const
{
  mozilla::gfx::IntRect rect;
  rect.x = NSToIntFloor(NSAppUnitsToFloatPixels(x, float(aAppUnitsPerPixel)) * aXScale);
  rect.y = NSToIntFloor(NSAppUnitsToFloatPixels(y, float(aAppUnitsPerPixel)) * aYScale);

  rect.width = std::max(0, NSToIntCeil(NSAppUnitsToFloatPixels(XMost(),
                            float(aAppUnitsPerPixel)) * aXScale) - rect.x);
  rect.height = std::max(0, NSToIntCeil(NSAppUnitsToFloatPixels(YMost(),
                            float(aAppUnitsPerPixel)) * aYScale) - rect.y);
  return rect;
}


inline mozilla::gfx::IntRect
nsRect::ScaleToInsidePixels(float aXScale, float aYScale,
                            nscoord aAppUnitsPerPixel) const
{
  mozilla::gfx::IntRect rect;
  rect.x = NSToIntCeil(NSAppUnitsToFloatPixels(x, float(aAppUnitsPerPixel)) * aXScale);
  rect.y = NSToIntCeil(NSAppUnitsToFloatPixels(y, float(aAppUnitsPerPixel)) * aYScale);

  rect.width = std::max(0, NSToIntFloor(NSAppUnitsToFloatPixels(XMost(),
                             float(aAppUnitsPerPixel)) * aXScale) - rect.x);
  rect.height = std::max(0, NSToIntFloor(NSAppUnitsToFloatPixels(YMost(),
                             float(aAppUnitsPerPixel)) * aYScale) - rect.y);
  return rect;
}

inline mozilla::gfx::IntRect
nsRect::ToNearestPixels(nscoord aAppUnitsPerPixel) const
{
  return ScaleToNearestPixels(1.0f, 1.0f, aAppUnitsPerPixel);
}

inline mozilla::gfx::IntRect
nsRect::ToOutsidePixels(nscoord aAppUnitsPerPixel) const
{
  return ScaleToOutsidePixels(1.0f, 1.0f, aAppUnitsPerPixel);
}

inline mozilla::gfx::IntRect
nsRect::ToInsidePixels(nscoord aAppUnitsPerPixel) const
{
  return ScaleToInsidePixels(1.0f, 1.0f, aAppUnitsPerPixel);
}

inline nsRect
nsRect::RemoveResolution(const float aResolution) const
{
  do { } while (0);
  nsRect rect;
  rect.x = NSToCoordRound(NSCoordToFloat(x) / aResolution);
  rect.y = NSToCoordRound(NSCoordToFloat(y) / aResolution);


  if (width == 1 && height == 1) {
    rect.width = rect.height = 1;
  } else {
    rect.width = NSToCoordCeil(NSCoordToFloat(width) / aResolution);
    rect.height = NSToCoordCeil(NSCoordToFloat(height) / aResolution);
  }

  return rect;
}

const mozilla::gfx::IntRect& GetMaxSizedIntRect();


template<class units>
nsRect
ToAppUnits(const mozilla::gfx::IntRectTyped<units>& aRect, nscoord aAppUnitsPerPixel)
{
  return nsRect(NSIntPixelsToAppUnits(aRect.x, aAppUnitsPerPixel),
                NSIntPixelsToAppUnits(aRect.y, aAppUnitsPerPixel),
                NSIntPixelsToAppUnits(aRect.width, aAppUnitsPerPixel),
                NSIntPixelsToAppUnits(aRect.height, aAppUnitsPerPixel));
}
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h"
# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h" 2
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayView.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArrayView.h"
namespace mozilla {
namespace gfx {

template<typename T>
class ArrayView
{
    public:
                     ArrayView(const nsTArray<T>& aData) :
            mData(aData.Elements()), mLength(aData.Length())
        {
        }
        ArrayView(const T* aData, const size_t aLength) :
            mData(aData), mLength(aLength)
        {
        }
        const T& operator[](const size_t aIdx) const
        {
            return mData[aIdx];
        }
        size_t Length() const
        {
            return mLength;
        }
        const T* Data() const
        {
            return mData;
        }
    private:
        const T* mData;
        const size_t mLength;
};

}
}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h" 1
# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/cairo/pixman-rename.h" 1
# 74 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman-version.h" 1
# 78 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h" 2
# 87 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h"
extern "C" {
# 118 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h"
typedef int pixman_bool_t;




typedef int64_t pixman_fixed_32_32_t;
typedef pixman_fixed_32_32_t pixman_fixed_48_16_t;
typedef uint32_t pixman_fixed_1_31_t;
typedef uint32_t pixman_fixed_1_16_t;
typedef int32_t pixman_fixed_16_16_t;
typedef pixman_fixed_16_16_t pixman_fixed_t;
# 149 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h"
typedef struct pixman_color pixman_color_t;
typedef struct pixman_point_fixed pixman_point_fixed_t;
typedef struct pixman_line_fixed pixman_line_fixed_t;
typedef struct pixman_vector pixman_vector_t;
typedef struct pixman_transform pixman_transform_t;

struct pixman_color
{
    uint16_t red;
    uint16_t green;
    uint16_t blue;
    uint16_t alpha;
};

struct pixman_point_fixed
{
    pixman_fixed_t x;
    pixman_fixed_t y;
};

struct pixman_line_fixed
{
    pixman_point_fixed_t p1, p2;
};





struct pixman_vector
{
    pixman_fixed_t vector[3];
};

struct pixman_transform
{
    pixman_fixed_t matrix[3][3];
};


struct pixman_box16;
typedef union pixman_image pixman_image_t;

void _moz_pixman_transform_init_identity (struct pixman_transform *matrix);
pixman_bool_t _moz_pixman_transform_point_3d (const struct pixman_transform *transform,
       struct pixman_vector *vector);
pixman_bool_t _moz_pixman_transform_point (const struct pixman_transform *transform,
       struct pixman_vector *vector);
pixman_bool_t _moz_pixman_transform_multiply (struct pixman_transform *dst,
       const struct pixman_transform *l,
       const struct pixman_transform *r);
void _moz_pixman_transform_init_scale (struct pixman_transform *t,
       pixman_fixed_t sx,
       pixman_fixed_t sy);
pixman_bool_t _moz_pixman_transform_scale (struct pixman_transform *forward,
       struct pixman_transform *reverse,
       pixman_fixed_t sx,
       pixman_fixed_t sy);
void _moz_pixman_transform_init_rotate (struct pixman_transform *t,
       pixman_fixed_t cos,
       pixman_fixed_t sin);
pixman_bool_t _moz_pixman_transform_rotate (struct pixman_transform *forward,
       struct pixman_transform *reverse,
       pixman_fixed_t c,
       pixman_fixed_t s);
void _moz_pixman_transform_init_translate (struct pixman_transform *t,
       pixman_fixed_t tx,
       pixman_fixed_t ty);
pixman_bool_t _moz_pixman_transform_translate (struct pixman_transform *forward,
       struct pixman_transform *reverse,
       pixman_fixed_t tx,
       pixman_fixed_t ty);
pixman_bool_t _moz_pixman_transform_bounds (const struct pixman_transform *matrix,
       struct pixman_box16 *b);
pixman_bool_t _moz_pixman_transform_invert (struct pixman_transform *dst,
       const struct pixman_transform *src);
pixman_bool_t _moz_pixman_transform_is_identity (const struct pixman_transform *t);
pixman_bool_t _moz_pixman_transform_is_scale (const struct pixman_transform *t);
pixman_bool_t _moz_pixman_transform_is_int_translate (const struct pixman_transform *t);
pixman_bool_t _moz_pixman_transform_is_inverse (const struct pixman_transform *a,
       const struct pixman_transform *b);




typedef struct pixman_f_transform pixman_f_transform_t;
typedef struct pixman_f_vector pixman_f_vector_t;

struct pixman_f_vector
{
    double v[3];
};

struct pixman_f_transform
{
    double m[3][3];
};

pixman_bool_t _moz_pixman_transform_from_pixman_f_transform (struct pixman_transform *t,
       const struct pixman_f_transform *ft);
void _moz_pixman_f_transform_from_pixman_transform (struct pixman_f_transform *ft,
       const struct pixman_transform *t);
pixman_bool_t _moz_pixman_f_transform_invert (struct pixman_f_transform *dst,
       const struct pixman_f_transform *src);
pixman_bool_t _moz_pixman_f_transform_point (const struct pixman_f_transform *t,
       struct pixman_f_vector *v);
void _moz_pixman_f_transform_point_3d (const struct pixman_f_transform *t,
       struct pixman_f_vector *v);
void _moz_pixman_f_transform_multiply (struct pixman_f_transform *dst,
       const struct pixman_f_transform *l,
       const struct pixman_f_transform *r);
void _moz_pixman_f_transform_init_scale (struct pixman_f_transform *t,
       double sx,
       double sy);
pixman_bool_t _moz_pixman_f_transform_scale (struct pixman_f_transform *forward,
       struct pixman_f_transform *reverse,
       double sx,
       double sy);
void _moz_pixman_f_transform_init_rotate (struct pixman_f_transform *t,
       double cos,
       double sin);
pixman_bool_t _moz_pixman_f_transform_rotate (struct pixman_f_transform *forward,
       struct pixman_f_transform *reverse,
       double c,
       double s);
void _moz_pixman_f_transform_init_translate (struct pixman_f_transform *t,
       double tx,
       double ty);
pixman_bool_t _moz_pixman_f_transform_translate (struct pixman_f_transform *forward,
       struct pixman_f_transform *reverse,
       double tx,
       double ty);
pixman_bool_t _moz_pixman_f_transform_bounds (const struct pixman_f_transform *t,
       struct pixman_box16 *b);
void _moz_pixman_f_transform_init_identity (struct pixman_f_transform *t);

typedef enum
{
    PIXMAN_REPEAT_NONE,
    PIXMAN_REPEAT_NORMAL,
    PIXMAN_REPEAT_PAD,
    PIXMAN_REPEAT_REFLECT
} pixman_repeat_t;

typedef enum
{
    PIXMAN_FILTER_FAST,
    PIXMAN_FILTER_GOOD,
    PIXMAN_FILTER_BEST,
    PIXMAN_FILTER_NEAREST,
    PIXMAN_FILTER_BILINEAR,
    PIXMAN_FILTER_CONVOLUTION,
# 321 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h"
    PIXMAN_FILTER_SEPARABLE_CONVOLUTION
} pixman_filter_t;

typedef enum
{
    PIXMAN_OP_CLEAR = 0x00,
    PIXMAN_OP_SRC = 0x01,
    PIXMAN_OP_DST = 0x02,
    PIXMAN_OP_OVER = 0x03,
    PIXMAN_OP_OVER_REVERSE = 0x04,
    PIXMAN_OP_IN = 0x05,
    PIXMAN_OP_IN_REVERSE = 0x06,
    PIXMAN_OP_OUT = 0x07,
    PIXMAN_OP_OUT_REVERSE = 0x08,
    PIXMAN_OP_ATOP = 0x09,
    PIXMAN_OP_ATOP_REVERSE = 0x0a,
    PIXMAN_OP_XOR = 0x0b,
    PIXMAN_OP_ADD = 0x0c,
    PIXMAN_OP_SATURATE = 0x0d,

    PIXMAN_OP_DISJOINT_CLEAR = 0x10,
    PIXMAN_OP_DISJOINT_SRC = 0x11,
    PIXMAN_OP_DISJOINT_DST = 0x12,
    PIXMAN_OP_DISJOINT_OVER = 0x13,
    PIXMAN_OP_DISJOINT_OVER_REVERSE = 0x14,
    PIXMAN_OP_DISJOINT_IN = 0x15,
    PIXMAN_OP_DISJOINT_IN_REVERSE = 0x16,
    PIXMAN_OP_DISJOINT_OUT = 0x17,
    PIXMAN_OP_DISJOINT_OUT_REVERSE = 0x18,
    PIXMAN_OP_DISJOINT_ATOP = 0x19,
    PIXMAN_OP_DISJOINT_ATOP_REVERSE = 0x1a,
    PIXMAN_OP_DISJOINT_XOR = 0x1b,

    PIXMAN_OP_CONJOINT_CLEAR = 0x20,
    PIXMAN_OP_CONJOINT_SRC = 0x21,
    PIXMAN_OP_CONJOINT_DST = 0x22,
    PIXMAN_OP_CONJOINT_OVER = 0x23,
    PIXMAN_OP_CONJOINT_OVER_REVERSE = 0x24,
    PIXMAN_OP_CONJOINT_IN = 0x25,
    PIXMAN_OP_CONJOINT_IN_REVERSE = 0x26,
    PIXMAN_OP_CONJOINT_OUT = 0x27,
    PIXMAN_OP_CONJOINT_OUT_REVERSE = 0x28,
    PIXMAN_OP_CONJOINT_ATOP = 0x29,
    PIXMAN_OP_CONJOINT_ATOP_REVERSE = 0x2a,
    PIXMAN_OP_CONJOINT_XOR = 0x2b,

    PIXMAN_OP_MULTIPLY = 0x30,
    PIXMAN_OP_SCREEN = 0x31,
    PIXMAN_OP_OVERLAY = 0x32,
    PIXMAN_OP_DARKEN = 0x33,
    PIXMAN_OP_LIGHTEN = 0x34,
    PIXMAN_OP_COLOR_DODGE = 0x35,
    PIXMAN_OP_COLOR_BURN = 0x36,
    PIXMAN_OP_HARD_LIGHT = 0x37,
    PIXMAN_OP_SOFT_LIGHT = 0x38,
    PIXMAN_OP_DIFFERENCE = 0x39,
    PIXMAN_OP_EXCLUSION = 0x3a,
    PIXMAN_OP_HSL_HUE = 0x3b,
    PIXMAN_OP_HSL_SATURATION = 0x3c,
    PIXMAN_OP_HSL_COLOR = 0x3d,
    PIXMAN_OP_HSL_LUMINOSITY = 0x3e






} pixman_op_t;




typedef struct pixman_region16_data pixman_region16_data_t;
typedef struct pixman_box16 pixman_box16_t;
typedef struct pixman_rectangle16 pixman_rectangle16_t;
typedef struct pixman_region16 pixman_region16_t;

struct pixman_region16_data {
    long size;
    long numRects;

};

struct pixman_rectangle16
{
    int16_t x, y;
    uint16_t width, height;
};

struct pixman_box16
{
    int16_t x1, y1, x2, y2;
};

struct pixman_region16
{
    pixman_box16_t extents;
    pixman_region16_data_t *data;
};

typedef enum
{
    PIXMAN_REGION_OUT,
    PIXMAN_REGION_IN,
    PIXMAN_REGION_PART
} pixman_region_overlap_t;




void _moz_pixman_region_set_static_pointers (pixman_box16_t *empty_box,
     pixman_region16_data_t *empty_data,
     pixman_region16_data_t *broken_data);


void _moz_pixman_region_init (pixman_region16_t *region);
void _moz_pixman_region_init_rect (pixman_region16_t *region,
         int x,
         int y,
         unsigned int width,
         unsigned int height);
pixman_bool_t _moz_pixman_region_init_rects (pixman_region16_t *region,
         const pixman_box16_t *boxes,
         int count);
void _moz_pixman_region_init_with_extents (pixman_region16_t *region,
         pixman_box16_t *extents);
void _moz_pixman_region_init_from_image (pixman_region16_t *region,
         pixman_image_t *image);
void _moz_pixman_region_fini (pixman_region16_t *region);



void _moz_pixman_region_translate (pixman_region16_t *region,
         int x,
         int y);
pixman_bool_t _moz_pixman_region_copy (pixman_region16_t *dest,
         pixman_region16_t *source);
pixman_bool_t _moz_pixman_region_intersect (pixman_region16_t *new_reg,
         pixman_region16_t *reg1,
         pixman_region16_t *reg2);
pixman_bool_t _moz_pixman_region_union (pixman_region16_t *new_reg,
         pixman_region16_t *reg1,
         pixman_region16_t *reg2);
pixman_bool_t _moz_pixman_region_union_rect (pixman_region16_t *dest,
         pixman_region16_t *source,
         int x,
         int y,
         unsigned int width,
         unsigned int height);
pixman_bool_t _moz_pixman_region_intersect_rect (pixman_region16_t *dest,
         pixman_region16_t *source,
         int x,
         int y,
         unsigned int width,
         unsigned int height);
pixman_bool_t _moz_pixman_region_subtract (pixman_region16_t *reg_d,
         pixman_region16_t *reg_m,
         pixman_region16_t *reg_s);
pixman_bool_t _moz_pixman_region_inverse (pixman_region16_t *new_reg,
         pixman_region16_t *reg1,
         pixman_box16_t *inv_rect);
pixman_bool_t _moz_pixman_region_contains_point (pixman_region16_t *region,
         int x,
         int y,
         pixman_box16_t *box);
pixman_region_overlap_t _moz_pixman_region_contains_rectangle (pixman_region16_t *region,
         pixman_box16_t *prect);
pixman_bool_t _moz_pixman_region_not_empty (pixman_region16_t *region);
pixman_box16_t * _moz_pixman_region_extents (pixman_region16_t *region);
int _moz_pixman_region_n_rects (pixman_region16_t *region);
pixman_box16_t * _moz_pixman_region_rectangles (pixman_region16_t *region,
         int *n_rects);
pixman_bool_t _moz_pixman_region_equal (pixman_region16_t *region1,
         pixman_region16_t *region2);
pixman_bool_t _moz_pixman_region_selfcheck (pixman_region16_t *region);
void _moz_pixman_region_reset (pixman_region16_t *region,
         pixman_box16_t *box);
void _moz_pixman_region_clear (pixman_region16_t *region);



typedef struct pixman_region32_data pixman_region32_data_t;
typedef struct pixman_box32 pixman_box32_t;
typedef struct pixman_rectangle32 pixman_rectangle32_t;
typedef struct pixman_region32 pixman_region32_t;

struct pixman_region32_data {
    long size;
    long numRects;

};

struct pixman_rectangle32
{
    int32_t x, y;
    uint32_t width, height;
};

struct pixman_box32
{
    int32_t x1, y1, x2, y2;
};

struct pixman_region32
{
    pixman_box32_t extents;
    pixman_region32_data_t *data;
};


void _moz_pixman_region32_init (pixman_region32_t *region);
void _moz_pixman_region32_init_rect (pixman_region32_t *region,
           int x,
           int y,
           unsigned int width,
           unsigned int height);
pixman_bool_t _moz_pixman_region32_init_rects (pixman_region32_t *region,
           const pixman_box32_t *boxes,
           int count);
void _moz_pixman_region32_init_with_extents (pixman_region32_t *region,
           pixman_box32_t *extents);
void _moz_pixman_region32_init_from_image (pixman_region32_t *region,
           pixman_image_t *image);
void _moz_pixman_region32_fini (pixman_region32_t *region);



void _moz_pixman_region32_translate (pixman_region32_t *region,
           int x,
           int y);
pixman_bool_t _moz_pixman_region32_copy (pixman_region32_t *dest,
           pixman_region32_t *source);
pixman_bool_t _moz_pixman_region32_intersect (pixman_region32_t *new_reg,
           pixman_region32_t *reg1,
           pixman_region32_t *reg2);
pixman_bool_t _moz_pixman_region32_union (pixman_region32_t *new_reg,
           pixman_region32_t *reg1,
           pixman_region32_t *reg2);
pixman_bool_t _moz_pixman_region32_intersect_rect (pixman_region32_t *dest,
           pixman_region32_t *source,
           int x,
           int y,
           unsigned int width,
           unsigned int height);
pixman_bool_t _moz_pixman_region32_union_rect (pixman_region32_t *dest,
           pixman_region32_t *source,
           int x,
           int y,
           unsigned int width,
           unsigned int height);
pixman_bool_t _moz_pixman_region32_subtract (pixman_region32_t *reg_d,
           pixman_region32_t *reg_m,
           pixman_region32_t *reg_s);
pixman_bool_t _moz_pixman_region32_inverse (pixman_region32_t *new_reg,
           pixman_region32_t *reg1,
           pixman_box32_t *inv_rect);
pixman_bool_t _moz_pixman_region32_contains_point (pixman_region32_t *region,
           int x,
           int y,
           pixman_box32_t *box);
pixman_region_overlap_t _moz_pixman_region32_contains_rectangle (pixman_region32_t *region,
           pixman_box32_t *prect);
pixman_bool_t _moz_pixman_region32_not_empty (pixman_region32_t *region);
pixman_box32_t * _moz_pixman_region32_extents (pixman_region32_t *region);
int _moz_pixman_region32_n_rects (pixman_region32_t *region);
pixman_box32_t * _moz_pixman_region32_rectangles (pixman_region32_t *region,
           int *n_rects);
pixman_bool_t _moz_pixman_region32_equal (pixman_region32_t *region1,
           pixman_region32_t *region2);
pixman_bool_t _moz_pixman_region32_selfcheck (pixman_region32_t *region);
void _moz_pixman_region32_reset (pixman_region32_t *region,
           pixman_box32_t *box);
void _moz_pixman_region32_clear (pixman_region32_t *region);



pixman_bool_t _moz_pixman_blt (uint32_t *src_bits,
      uint32_t *dst_bits,
      int src_stride,
      int dst_stride,
      int src_bpp,
      int dst_bpp,
      int src_x,
      int src_y,
      int dest_x,
      int dest_y,
      int width,
      int height);
pixman_bool_t _moz_pixman_fill (uint32_t *bits,
      int stride,
      int bpp,
      int x,
      int y,
      int width,
      int height,
      uint32_t _xor);

int _moz_pixman_version (void);
const char* _moz_pixman_version_string (void);




typedef struct pixman_indexed pixman_indexed_t;
typedef struct pixman_gradient_stop pixman_gradient_stop_t;

typedef uint32_t (* pixman_read_memory_func_t) (const void *src, int size);
typedef void (* pixman_write_memory_func_t) (void *dst, uint32_t value, int size);

typedef void (* pixman_image_destroy_func_t) (pixman_image_t *image, void *data);

struct pixman_gradient_stop {
    pixman_fixed_t x;
    pixman_color_t color;
};




typedef uint8_t pixman_index_type;


struct pixman_indexed
{
    pixman_bool_t color;
    uint32_t rgba[256];
    pixman_index_type ent[32768];
};
# 694 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h"
typedef enum {
    PIXMAN_a8r8g8b8 = (((32) << 24) | ((2) << 16) | ((8) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_x8r8g8b8 = (((32) << 24) | ((2) << 16) | ((0) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_a8b8g8r8 = (((32) << 24) | ((3) << 16) | ((8) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_x8b8g8r8 = (((32) << 24) | ((3) << 16) | ((0) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_b8g8r8a8 = (((32) << 24) | ((8) << 16) | ((8) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_b8g8r8x8 = (((32) << 24) | ((8) << 16) | ((0) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_r8g8b8a8 = (((32) << 24) | ((9) << 16) | ((8) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_r8g8b8x8 = (((32) << 24) | ((9) << 16) | ((0) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_x14r6g6b6 = (((32) << 24) | ((2) << 16) | ((0) << 12) | ((6) << 8) | ((6) << 4) | ((6))),
    PIXMAN_x2r10g10b10 = (((32) << 24) | ((2) << 16) | ((0) << 12) | ((10) << 8) | ((10) << 4) | ((10))),
    PIXMAN_a2r10g10b10 = (((32) << 24) | ((2) << 16) | ((2) << 12) | ((10) << 8) | ((10) << 4) | ((10))),
    PIXMAN_x2b10g10r10 = (((32) << 24) | ((3) << 16) | ((0) << 12) | ((10) << 8) | ((10) << 4) | ((10))),
    PIXMAN_a2b10g10r10 = (((32) << 24) | ((3) << 16) | ((2) << 12) | ((10) << 8) | ((10) << 4) | ((10))),


    PIXMAN_a8r8g8b8_sRGB = (((32) << 24) | ((10) << 16) | ((8) << 12) | ((8) << 8) | ((8) << 4) | ((8))),


    PIXMAN_r8g8b8 = (((24) << 24) | ((2) << 16) | ((0) << 12) | ((8) << 8) | ((8) << 4) | ((8))),
    PIXMAN_b8g8r8 = (((24) << 24) | ((3) << 16) | ((0) << 12) | ((8) << 8) | ((8) << 4) | ((8))),


    PIXMAN_r5g6b5 = (((16) << 24) | ((2) << 16) | ((0) << 12) | ((5) << 8) | ((6) << 4) | ((5))),
    PIXMAN_b5g6r5 = (((16) << 24) | ((3) << 16) | ((0) << 12) | ((5) << 8) | ((6) << 4) | ((5))),

    PIXMAN_a1r5g5b5 = (((16) << 24) | ((2) << 16) | ((1) << 12) | ((5) << 8) | ((5) << 4) | ((5))),
    PIXMAN_x1r5g5b5 = (((16) << 24) | ((2) << 16) | ((0) << 12) | ((5) << 8) | ((5) << 4) | ((5))),
    PIXMAN_a1b5g5r5 = (((16) << 24) | ((3) << 16) | ((1) << 12) | ((5) << 8) | ((5) << 4) | ((5))),
    PIXMAN_x1b5g5r5 = (((16) << 24) | ((3) << 16) | ((0) << 12) | ((5) << 8) | ((5) << 4) | ((5))),
    PIXMAN_a4r4g4b4 = (((16) << 24) | ((2) << 16) | ((4) << 12) | ((4) << 8) | ((4) << 4) | ((4))),
    PIXMAN_x4r4g4b4 = (((16) << 24) | ((2) << 16) | ((0) << 12) | ((4) << 8) | ((4) << 4) | ((4))),
    PIXMAN_a4b4g4r4 = (((16) << 24) | ((3) << 16) | ((4) << 12) | ((4) << 8) | ((4) << 4) | ((4))),
    PIXMAN_x4b4g4r4 = (((16) << 24) | ((3) << 16) | ((0) << 12) | ((4) << 8) | ((4) << 4) | ((4))),


    PIXMAN_a8 = (((8) << 24) | ((1) << 16) | ((8) << 12) | ((0) << 8) | ((0) << 4) | ((0))),
    PIXMAN_r3g3b2 = (((8) << 24) | ((2) << 16) | ((0) << 12) | ((3) << 8) | ((3) << 4) | ((2))),
    PIXMAN_b2g3r3 = (((8) << 24) | ((3) << 16) | ((0) << 12) | ((3) << 8) | ((3) << 4) | ((2))),
    PIXMAN_a2r2g2b2 = (((8) << 24) | ((2) << 16) | ((2) << 12) | ((2) << 8) | ((2) << 4) | ((2))),
    PIXMAN_a2b2g2r2 = (((8) << 24) | ((3) << 16) | ((2) << 12) | ((2) << 8) | ((2) << 4) | ((2))),

    PIXMAN_c8 = (((8) << 24) | ((4) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),
    PIXMAN_g8 = (((8) << 24) | ((5) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),

    PIXMAN_x4a4 = (((8) << 24) | ((1) << 16) | ((4) << 12) | ((0) << 8) | ((0) << 4) | ((0))),

    PIXMAN_x4c4 = (((8) << 24) | ((4) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),
    PIXMAN_x4g4 = (((8) << 24) | ((5) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),


    PIXMAN_a4 = (((4) << 24) | ((1) << 16) | ((4) << 12) | ((0) << 8) | ((0) << 4) | ((0))),
    PIXMAN_r1g2b1 = (((4) << 24) | ((2) << 16) | ((0) << 12) | ((1) << 8) | ((2) << 4) | ((1))),
    PIXMAN_b1g2r1 = (((4) << 24) | ((3) << 16) | ((0) << 12) | ((1) << 8) | ((2) << 4) | ((1))),
    PIXMAN_a1r1g1b1 = (((4) << 24) | ((2) << 16) | ((1) << 12) | ((1) << 8) | ((1) << 4) | ((1))),
    PIXMAN_a1b1g1r1 = (((4) << 24) | ((3) << 16) | ((1) << 12) | ((1) << 8) | ((1) << 4) | ((1))),

    PIXMAN_c4 = (((4) << 24) | ((4) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),
    PIXMAN_g4 = (((4) << 24) | ((5) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),


    PIXMAN_a1 = (((1) << 24) | ((1) << 16) | ((1) << 12) | ((0) << 8) | ((0) << 4) | ((0))),

    PIXMAN_g1 = (((1) << 24) | ((5) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),


    PIXMAN_yuy2 = (((16) << 24) | ((6) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0))),
    PIXMAN_yv12 = (((12) << 24) | ((7) << 16) | ((0) << 12) | ((0) << 8) | ((0) << 4) | ((0)))
} pixman_format_code_t;


pixman_bool_t _moz_pixman_format_supported_destination (pixman_format_code_t format);
pixman_bool_t _moz_pixman_format_supported_source (pixman_format_code_t format);


pixman_image_t *_moz_pixman_image_create_solid_fill (const pixman_color_t *color);
pixman_image_t *_moz_pixman_image_create_linear_gradient (const pixman_point_fixed_t *p1,
            const pixman_point_fixed_t *p2,
            const pixman_gradient_stop_t *stops,
            int n_stops);
pixman_image_t *_moz_pixman_image_create_radial_gradient (const pixman_point_fixed_t *inner,
            const pixman_point_fixed_t *outer,
            pixman_fixed_t inner_radius,
            pixman_fixed_t outer_radius,
            const pixman_gradient_stop_t *stops,
            int n_stops);
pixman_image_t *_moz_pixman_image_create_conical_gradient (const pixman_point_fixed_t *center,
            pixman_fixed_t angle,
            const pixman_gradient_stop_t *stops,
            int n_stops);
pixman_image_t *_moz_pixman_image_create_bits (pixman_format_code_t format,
            int width,
            int height,
            uint32_t *bits,
            int rowstride_bytes);
pixman_image_t *pixman_image_create_bits_no_clear (pixman_format_code_t format,
            int width,
            int height,
            uint32_t * bits,
            int rowstride_bytes);


pixman_image_t *_moz_pixman_image_ref (pixman_image_t *image);
pixman_bool_t _moz_pixman_image_unref (pixman_image_t *image);

void _moz_pixman_image_set_destroy_function (pixman_image_t *image,
            pixman_image_destroy_func_t function,
            void *data);
void * _moz_pixman_image_get_destroy_data (pixman_image_t *image);


pixman_bool_t _moz_pixman_image_set_clip_region (pixman_image_t *image,
            pixman_region16_t *region);
pixman_bool_t _moz_pixman_image_set_clip_region32 (pixman_image_t *image,
            pixman_region32_t *region);
void _moz_pixman_image_set_has_client_clip (pixman_image_t *image,
            pixman_bool_t clien_clip);
pixman_bool_t _moz_pixman_image_set_transform (pixman_image_t *image,
            const pixman_transform_t *transform);
void _moz_pixman_image_set_repeat (pixman_image_t *image,
            pixman_repeat_t repeat);
pixman_bool_t _moz_pixman_image_set_filter (pixman_image_t *image,
            pixman_filter_t filter,
            const pixman_fixed_t *filter_params,
            int n_filter_params);
void _moz_pixman_image_set_source_clipping (pixman_image_t *image,
            pixman_bool_t source_clipping);
void _moz_pixman_image_set_alpha_map (pixman_image_t *image,
            pixman_image_t *alpha_map,
            int16_t x,
            int16_t y);
void _moz_pixman_image_set_component_alpha (pixman_image_t *image,
            pixman_bool_t component_alpha);
pixman_bool_t _moz_pixman_image_get_component_alpha (pixman_image_t *image);
void _moz_pixman_image_set_accessors (pixman_image_t *image,
            pixman_read_memory_func_t read_func,
            pixman_write_memory_func_t write_func);
void _moz_pixman_image_set_indexed (pixman_image_t *image,
            const pixman_indexed_t *indexed);
uint32_t *_moz_pixman_image_get_data (pixman_image_t *image);
int _moz_pixman_image_get_width (pixman_image_t *image);
int _moz_pixman_image_get_height (pixman_image_t *image);
int _moz_pixman_image_get_stride (pixman_image_t *image);
int _moz_pixman_image_get_depth (pixman_image_t *image);
pixman_format_code_t _moz_pixman_image_get_format (pixman_image_t *image);

typedef enum
{
    PIXMAN_KERNEL_IMPULSE,
    PIXMAN_KERNEL_BOX,
    PIXMAN_KERNEL_LINEAR,
    PIXMAN_KERNEL_CUBIC,
    PIXMAN_KERNEL_GAUSSIAN,
    PIXMAN_KERNEL_LANCZOS2,
    PIXMAN_KERNEL_LANCZOS3,
    PIXMAN_KERNEL_LANCZOS3_STRETCHED
} pixman_kernel_t;




pixman_fixed_t *
pixman_filter_create_separable_convolution (int *n_values,
         pixman_fixed_t scale_x,
         pixman_fixed_t scale_y,
         pixman_kernel_t reconstruct_x,
         pixman_kernel_t reconstruct_y,
         pixman_kernel_t sample_x,
         pixman_kernel_t sample_y,
         int subsample_bits_x,
         int subsample_bits_y);

pixman_bool_t _moz_pixman_image_fill_rectangles (pixman_op_t op,
            pixman_image_t *image,
            const pixman_color_t *color,
            int n_rects,
            const pixman_rectangle16_t *rects);
pixman_bool_t _moz_pixman_image_fill_boxes (pixman_op_t op,
                                                      pixman_image_t *dest,
                                                      const pixman_color_t *color,
                                                      int n_boxes,
                                                      const pixman_box32_t *boxes);


pixman_bool_t _moz_pixman_compute_composite_region (pixman_region16_t *region,
            pixman_image_t *src_image,
            pixman_image_t *mask_image,
            pixman_image_t *dest_image,
            int16_t src_x,
            int16_t src_y,
            int16_t mask_x,
            int16_t mask_y,
            int16_t dest_x,
            int16_t dest_y,
            uint16_t width,
            uint16_t height);
void _moz_pixman_image_composite (pixman_op_t op,
            pixman_image_t *src,
            pixman_image_t *mask,
            pixman_image_t *dest,
            int16_t src_x,
            int16_t src_y,
            int16_t mask_x,
            int16_t mask_y,
            int16_t dest_x,
            int16_t dest_y,
            uint16_t width,
            uint16_t height);
void _moz_pixman_image_composite32 (pixman_op_t op,
            pixman_image_t *src,
            pixman_image_t *mask,
            pixman_image_t *dest,
            int32_t src_x,
            int32_t src_y,
            int32_t mask_x,
            int32_t mask_y,
            int32_t dest_x,
            int32_t dest_y,
            int32_t width,
            int32_t height);
# 933 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/pixman.h"
void _moz_pixman_disable_out_of_bounds_workaround (void);




typedef struct pixman_glyph_cache_t pixman_glyph_cache_t;
typedef struct
{
    int x, y;
    const void *glyph;
} pixman_glyph_t;

pixman_glyph_cache_t *_moz_pixman_glyph_cache_create (void);
void _moz_pixman_glyph_cache_destroy (pixman_glyph_cache_t *cache);
void _moz_pixman_glyph_cache_freeze (pixman_glyph_cache_t *cache);
void _moz_pixman_glyph_cache_thaw (pixman_glyph_cache_t *cache);
const void * _moz_pixman_glyph_cache_lookup (pixman_glyph_cache_t *cache,
             void *font_key,
             void *glyph_key);
const void * _moz_pixman_glyph_cache_insert (pixman_glyph_cache_t *cache,
             void *font_key,
             void *glyph_key,
             int origin_x,
             int origin_y,
             pixman_image_t *glyph_image);
void _moz_pixman_glyph_cache_remove (pixman_glyph_cache_t *cache,
             void *font_key,
             void *glyph_key);
void _moz_pixman_glyph_get_extents (pixman_glyph_cache_t *cache,
             int n_glyphs,
             pixman_glyph_t *glyphs,
             pixman_box32_t *extents);
pixman_format_code_t _moz_pixman_glyph_get_mask_format (pixman_glyph_cache_t *cache,
             int n_glyphs,
             const pixman_glyph_t *glyphs);
void _moz_pixman_composite_glyphs (pixman_op_t op,
             pixman_image_t *src,
             pixman_image_t *dest,
             pixman_format_code_t mask_format,
             int32_t src_x,
             int32_t src_y,
             int32_t mask_x,
             int32_t mask_y,
             int32_t dest_x,
             int32_t dest_y,
             int32_t width,
             int32_t height,
             pixman_glyph_cache_t *cache,
             int n_glyphs,
             const pixman_glyph_t *glyphs);
void _moz_pixman_composite_glyphs_no_mask (pixman_op_t op,
             pixman_image_t *src,
             pixman_image_t *dest,
             int32_t src_x,
             int32_t src_y,
             int32_t dest_x,
             int32_t dest_y,
             pixman_glyph_cache_t *cache,
             int n_glyphs,
             const pixman_glyph_t *glyphs);




typedef struct pixman_edge pixman_edge_t;
typedef struct pixman_trapezoid pixman_trapezoid_t;
typedef struct pixman_trap pixman_trap_t;
typedef struct pixman_span_fix pixman_span_fix_t;
typedef struct pixman_triangle pixman_triangle_t;






struct pixman_edge
{
    pixman_fixed_t x;
    pixman_fixed_t e;
    pixman_fixed_t stepx;
    pixman_fixed_t signdx;
    pixman_fixed_t dy;
    pixman_fixed_t dx;

    pixman_fixed_t stepx_small;
    pixman_fixed_t stepx_big;
    pixman_fixed_t dx_small;
    pixman_fixed_t dx_big;
};

struct pixman_trapezoid
{
    pixman_fixed_t top, bottom;
    pixman_line_fixed_t left, right;
};

struct pixman_triangle
{
    pixman_point_fixed_t p1, p2, p3;
};







struct pixman_span_fix
{
    pixman_fixed_t l, r, y;
};

struct pixman_trap
{
    pixman_span_fix_t top, bot;
};

pixman_fixed_t _moz_pixman_sample_ceil_y (pixman_fixed_t y,
         int bpp);
pixman_fixed_t _moz_pixman_sample_floor_y (pixman_fixed_t y,
         int bpp);
void _moz_pixman_edge_step (pixman_edge_t *e,
         int n);
void _moz_pixman_edge_init (pixman_edge_t *e,
         int bpp,
         pixman_fixed_t y_start,
         pixman_fixed_t x_top,
         pixman_fixed_t y_top,
         pixman_fixed_t x_bot,
         pixman_fixed_t y_bot);
void _moz_pixman_line_fixed_edge_init (pixman_edge_t *e,
         int bpp,
         pixman_fixed_t y,
         const pixman_line_fixed_t *line,
         int x_off,
         int y_off);
void _moz_pixman_rasterize_edges (pixman_image_t *image,
         pixman_edge_t *l,
         pixman_edge_t *r,
         pixman_fixed_t t,
         pixman_fixed_t b);
void _moz_pixman_add_traps (pixman_image_t *image,
         int16_t x_off,
         int16_t y_off,
         int ntrap,
         const pixman_trap_t *traps);
void _moz_pixman_add_trapezoids (pixman_image_t *image,
         int16_t x_off,
         int y_off,
         int ntraps,
         const pixman_trapezoid_t *traps);
void _moz_pixman_rasterize_trapezoid (pixman_image_t *image,
         const pixman_trapezoid_t *trap,
         int x_off,
         int y_off);
void _moz_pixman_composite_trapezoids (pixman_op_t op,
        pixman_image_t * src,
        pixman_image_t * dst,
        pixman_format_code_t mask_format,
        int x_src,
        int y_src,
        int x_dst,
        int y_dst,
        int n_traps,
        const pixman_trapezoid_t * traps);
void _moz_pixman_composite_triangles (pixman_op_t op,
       pixman_image_t * src,
       pixman_image_t * dst,
       pixman_format_code_t mask_format,
       int x_src,
       int y_src,
       int x_dst,
       int y_dst,
       int n_tris,
       const pixman_triangle_t * tris);
void _moz_pixman_add_triangles (pixman_image_t *image,
       int32_t x_off,
       int32_t y_off,
       int n_tris,
       const pixman_triangle_t *tris);

}
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h" 2
# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h"
enum class VisitSide {
 TOP,
 BOTTOM,
 LEFT,
 RIGHT
};

class nsRegion
{
public:
  typedef nsRect RectType;
  typedef nsPoint PointType;
  typedef nsMargin MarginType;

  nsRegion () { _moz_pixman_region32_init(&mImpl); }
               nsRegion (const nsRect& aRect) { _moz_pixman_region32_init_rect(&mImpl,
                                                                          aRect.x,
                                                                          aRect.y,
                                                                          aRect.width,
                                                                          aRect.height); }
  explicit nsRegion (mozilla::gfx::ArrayView<pixman_box32_t> aRects)
  {
    _moz_pixman_region32_init_rects(&mImpl, aRects.Data(), aRects.Length());
  }
  nsRegion (const nsRegion& aRegion) { _moz_pixman_region32_init(&mImpl); _moz_pixman_region32_copy(&mImpl,aRegion.Impl()); }
  nsRegion (nsRegion&& aRegion) { mImpl = aRegion.mImpl; _moz_pixman_region32_init(&aRegion.mImpl); }
  nsRegion& operator = (nsRegion&& aRegion) {
      _moz_pixman_region32_fini(&mImpl);
      mImpl = aRegion.mImpl;
      _moz_pixman_region32_init(&aRegion.mImpl);
      return *this;
  }
 ~nsRegion () { _moz_pixman_region32_fini(&mImpl); }
  nsRegion& operator = (const nsRect& aRect) { Copy (aRect); return *this; }
  nsRegion& operator = (const nsRegion& aRegion) { Copy (aRegion); return *this; }
  bool operator==(const nsRegion& aRgn) const
  {
    return IsEqual(aRgn);
  }
  bool operator!=(const nsRegion& aRgn) const
  {
    return !(*this == aRgn);
  }

  friend std::ostream& operator<<(std::ostream& stream, const nsRegion& m);

  void Swap(nsRegion* aOther)
  {
    pixman_region32_t tmp = mImpl;
    mImpl = aOther->mImpl;
    aOther->mImpl = tmp;
  }

  static
  nsresult InitStatic()
  {
    return NS_OK;
  }

  static
  void ShutdownStatic() {}

  void AndWith(const nsRegion& aOther)
  {
    And(*this, aOther);
  }
  void AndWith(const nsRect& aOther)
  {
    And(*this, aOther);
  }
  nsRegion& And(const nsRegion& aRgn1, const nsRegion& aRgn2)
  {
    _moz_pixman_region32_intersect(&mImpl, aRgn1.Impl(), aRgn2.Impl());
    return *this;
  }
  nsRegion& And(const nsRect& aRect, const nsRegion& aRegion)
  {
    return And(aRegion, aRect);
  }
  nsRegion& And(const nsRegion& aRegion, const nsRect& aRect)
  {
    _moz_pixman_region32_intersect_rect(&mImpl, aRegion.Impl(), aRect.x, aRect.y, aRect.width, aRect.height);
    return *this;
  }
  nsRegion& And(const nsRect& aRect1, const nsRect& aRect2)
  {
    nsRect TmpRect;

    TmpRect.IntersectRect(aRect1, aRect2);
    return Copy(TmpRect);
  }

  nsRegion& OrWith(const nsRegion& aOther)
  {
    return Or(*this, aOther);
  }
  nsRegion& OrWith(const nsRect& aOther)
  {
    return Or(*this, aOther);
  }
  nsRegion& Or(const nsRegion& aRgn1, const nsRegion& aRgn2)
  {
    _moz_pixman_region32_union(&mImpl, aRgn1.Impl(), aRgn2.Impl());
    return *this;
  }
  nsRegion& Or(const nsRegion& aRegion, const nsRect& aRect)
  {
    _moz_pixman_region32_union_rect(&mImpl, aRegion.Impl(), aRect.x, aRect.y, aRect.width, aRect.height);
    return *this;
  }
  nsRegion& Or(const nsRect& aRect, const nsRegion& aRegion)
  {
    return Or(aRegion, aRect);
  }
  nsRegion& Or(const nsRect& aRect1, const nsRect& aRect2)
  {
    Copy (aRect1);
    return Or (*this, aRect2);
  }

  nsRegion& XorWith(const nsRegion& aOther)
  {
    return Xor(*this, aOther);
  }
  nsRegion& XorWith(const nsRect& aOther)
  {
    return Xor(*this, aOther);
  }
  nsRegion& Xor(const nsRegion& aRgn1, const nsRegion& aRgn2)
  {


    nsRegion p;
    p.Sub(aRgn1, aRgn2);
    nsRegion q;
    q.Sub(aRgn2, aRgn1);
    return Or(p, q);
  }
  nsRegion& Xor(const nsRegion& aRegion, const nsRect& aRect)
  {
    return Xor(aRegion, nsRegion(aRect));
  }
  nsRegion& Xor(const nsRect& aRect, const nsRegion& aRegion)
  {
    return Xor(nsRegion(aRect), aRegion);
  }
  nsRegion& Xor(const nsRect& aRect1, const nsRect& aRect2)
  {
    return Xor(nsRegion(aRect1), nsRegion(aRect2));
  }

  nsRegion ToAppUnits (nscoord aAppUnitsPerPixel) const;

  nsRegion& SubOut(const nsRegion& aOther)
  {
    return Sub(*this, aOther);
  }
  nsRegion& SubOut(const nsRect& aOther)
  {
    return Sub(*this, aOther);
  }
  nsRegion& Sub(const nsRegion& aRgn1, const nsRegion& aRgn2)
  {
    _moz_pixman_region32_subtract(&mImpl, aRgn1.Impl(), aRgn2.Impl());
    return *this;
  }
  nsRegion& Sub(const nsRegion& aRegion, const nsRect& aRect)
  {
    return Sub(aRegion, nsRegion(aRect));
  }
  nsRegion& Sub(const nsRect& aRect, const nsRegion& aRegion)
  {
    return Sub(nsRegion(aRect), aRegion);
  }
  nsRegion& Sub(const nsRect& aRect1, const nsRect& aRect2)
  {
    Copy(aRect1);
    return Sub(*this, aRect2);
  }






  bool Contains (int aX, int aY) const
  {
    return _moz_pixman_region32_contains_point(Impl(), aX, aY, nullptr);
  }
  bool Contains (const nsRect& aRect) const
  {
    pixman_box32_t box = RectToBox(aRect);
    return _moz_pixman_region32_contains_rectangle(Impl(), &box) == PIXMAN_REGION_IN;
  }
  bool Contains (const nsRegion& aRgn) const;
  bool Intersects (const nsRect& aRect) const;

  void MoveBy (int32_t aXOffset, int32_t aYOffset)
  {
    MoveBy (nsPoint (aXOffset, aYOffset));
  }
  void MoveBy (nsPoint aPt) { _moz_pixman_region32_translate(&mImpl, aPt.x, aPt.y); }
  void SetEmpty ()
  {
    _moz_pixman_region32_clear(&mImpl);
  }

  nsRegion MovedBy(int32_t aXOffset, int32_t aYOffset) const
  {
    return MovedBy(nsPoint(aXOffset, aYOffset));
  }
  nsRegion MovedBy(const nsPoint& aPt) const
  {
    nsRegion copy(*this);
    copy.MoveBy(aPt);
    return copy;
  }

  nsRegion Intersect(const nsRegion& aOther) const
  {
    nsRegion intersection;
    intersection.And(*this, aOther);
    return intersection;
  }

  void Inflate(const nsMargin& aMargin);

  nsRegion Inflated(const nsMargin& aMargin) const
  {
    nsRegion copy(*this);
    copy.Inflate(aMargin);
    return copy;
  }

  bool IsEmpty () const { return !_moz_pixman_region32_not_empty(Impl()); }
  bool IsComplex () const { return GetNumRects() > 1; }
  bool IsEqual (const nsRegion& aRegion) const
  {
    return _moz_pixman_region32_equal(Impl(), aRegion.Impl());
  }
  uint32_t GetNumRects () const
  {


    uint32_t result = _moz_pixman_region32_n_rects(Impl());
    return (result == 1 && GetBounds().IsEmpty()) ? 0 : result;
  }
  const nsRect GetBounds () const { return BoxToRect(mImpl.extents); }
  uint64_t Area () const;
# 300 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h"
  __attribute__ ((warn_unused_result)) nsRegion
    ScaleToOtherAppUnitsRoundOut (int32_t aFromAPP, int32_t aToAPP) const;
  __attribute__ ((warn_unused_result)) nsRegion
    ScaleToOtherAppUnitsRoundIn (int32_t aFromAPP, int32_t aToAPP) const;
  nsRegion& ScaleRoundOut(float aXScale, float aYScale);
  nsRegion& ScaleInverseRoundOut(float aXScale, float aYScale);
  nsRegion& Transform (const mozilla::gfx::Matrix4x4 &aTransform);
  nsIntRegion ScaleToOutsidePixels (float aXScale, float aYScale, nscoord aAppUnitsPerPixel) const;
  nsIntRegion ScaleToInsidePixels (float aXScale, float aYScale, nscoord aAppUnitsPerPixel) const;
  nsIntRegion ScaleToNearestPixels (float aXScale, float aYScale, nscoord aAppUnitsPerPixel) const;
  nsIntRegion ToOutsidePixels (nscoord aAppUnitsPerPixel) const;
  nsIntRegion ToNearestPixels (nscoord aAppUnitsPerPixel) const;







  nsRect GetLargestRectangle (const nsRect& aContainingRect = nsRect()) const;







  void SimplifyOutward (uint32_t aMaxRects);






  void SimplifyOutwardByArea(uint32_t aThreshold);





  void SimplifyInward (uint32_t aMaxRects);
# 354 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h"
  typedef void (*visitFn)(void *closure, VisitSide side, int x1, int y1, int x2, int y2);
  void VisitEdges(visitFn, void *closure);

  nsCString ToString() const;

  class RectIterator
  {
    int mCurrent;
    int mLimit;
    mutable nsRect mTmp;
    pixman_box32_t *mBoxes;

  public:
    explicit RectIterator(const nsRegion& aRegion)
    {
      mCurrent = 0;
      mBoxes = _moz_pixman_region32_rectangles(aRegion.Impl(), &mLimit);


      if (mLimit == 1 && nsRegion::BoxToRect(mBoxes[0]).IsEmpty()) {
        mLimit = 0;
      }
    }

    bool Done() const { return mCurrent == mLimit; }

    const nsRect& Get() const
    {
      do { } while (0);
      mTmp = nsRegion::BoxToRect(mBoxes[mCurrent]);
      do { } while(0);
      return mTmp;
    }

    void Next()
    {
      do { } while (0);
      mCurrent++;
    }
  };

  RectIterator RectIter() const { return RectIterator(*this); }

private:
  pixman_region32_t mImpl;
# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsRegion.h"
  nsIntRegion ToPixels(nscoord aAppUnitsPerPixel, bool aOutsidePixels) const;

  nsRegion& Copy (const nsRegion& aRegion)
  {
    _moz_pixman_region32_copy(&mImpl, aRegion.Impl());
    return *this;
  }

  nsRegion& Copy (const nsRect& aRect)
  {





    if (aRect.IsEmpty()) {
      _moz_pixman_region32_clear(&mImpl);
    } else {
      pixman_box32_t box = RectToBox(aRect);
      _moz_pixman_region32_reset(&mImpl, &box);
    }
    return *this;
  }

  static inline pixman_box32_t RectToBox(const nsRect &aRect)
  {
    pixman_box32_t box = { aRect.x, aRect.y, aRect.XMost(), aRect.YMost() };
    return box;
  }

  static inline pixman_box32_t RectToBox(const mozilla::gfx::IntRect &aRect)
  {
    pixman_box32_t box = { aRect.x, aRect.y, aRect.XMost(), aRect.YMost() };
    return box;
  }


  static inline nsRect BoxToRect(const pixman_box32_t &aBox)
  {
    return nsRect(aBox.x1, aBox.y1,
                  aBox.x2 - aBox.x1,
                  aBox.y2 - aBox.y1);
  }

  pixman_region32_t* Impl() const
  {
    return const_cast<pixman_region32_t*>(&mImpl);
  }
};

namespace mozilla {
namespace gfx {




template <typename Derived, typename Rect, typename Point, typename Margin>
class BaseIntRegion
{
  friend class ::nsRegion;



  template <typename units>
  friend class IntRegionTyped;

public:
  typedef Rect RectType;
  typedef Point PointType;
  typedef Margin MarginType;

  BaseIntRegion () {}
               BaseIntRegion (const Rect& aRect) : mImpl (ToRect(aRect)) {}
  explicit BaseIntRegion (mozilla::gfx::ArrayView<pixman_box32_t> aRects) : mImpl (aRects) {}
  BaseIntRegion (const BaseIntRegion& aRegion) : mImpl (aRegion.mImpl) {}
  BaseIntRegion (BaseIntRegion&& aRegion) : mImpl (mozilla::Move(aRegion.mImpl)) {}
  Derived& operator = (const Rect& aRect) { mImpl = ToRect (aRect); return This(); }
  Derived& operator = (const Derived& aRegion) { mImpl = aRegion.mImpl; return This(); }
  Derived& operator = (Derived&& aRegion) { mImpl = mozilla::Move(aRegion.mImpl); return This(); }

  bool operator==(const Derived& aRgn) const
  {
    return IsEqual(aRgn);
  }
  bool operator!=(const Derived& aRgn) const
  {
    return !(*this == aRgn);
  }

  friend std::ostream& operator<<(std::ostream& stream, const Derived& m) {
    return stream << m.mImpl;
  }

  void Swap(Derived* aOther)
  {
    mImpl.Swap(&aOther->mImpl);
  }

  void AndWith(const Derived& aOther)
  {
    And(This(), aOther);
  }
  void AndWith(const Rect& aOther)
  {
    And(This(), aOther);
  }
  Derived& And (const Derived& aRgn1, const Derived& aRgn2)
  {
    mImpl.And (aRgn1.mImpl, aRgn2.mImpl);
    return This();
  }
  Derived& And (const Derived& aRegion, const Rect& aRect)
  {
    mImpl.And (aRegion.mImpl, ToRect (aRect));
    return This();
  }
  Derived& And (const Rect& aRect, const Derived& aRegion)
  {
    return And (aRegion, aRect);
  }
  Derived& And (const Rect& aRect1, const Rect& aRect2)
  {
    Rect TmpRect;

    TmpRect.IntersectRect (aRect1, aRect2);
    mImpl = ToRect (TmpRect);
    return This();
  }

  Derived& OrWith(const Derived& aOther)
  {
    return Or(This(), aOther);
  }
  Derived& OrWith(const Rect& aOther)
  {
    return Or(This(), aOther);
  }
  Derived& Or (const Derived& aRgn1, const Derived& aRgn2)
  {
    mImpl.Or (aRgn1.mImpl, aRgn2.mImpl);
    return This();
  }
  Derived& Or (const Derived& aRegion, const Rect& aRect)
  {
    mImpl.Or (aRegion.mImpl, ToRect (aRect));
    return This();
  }
  Derived& Or (const Rect& aRect, const Derived& aRegion)
  {
    return Or (aRegion, aRect);
  }
  Derived& Or (const Rect& aRect1, const Rect& aRect2)
  {
    mImpl = ToRect (aRect1);
    return Or (This(), aRect2);
  }

  Derived& XorWith(const Derived& aOther)
  {
    return Xor(This(), aOther);
  }
  Derived& XorWith(const Rect& aOther)
  {
    return Xor(This(), aOther);
  }
  Derived& Xor (const Derived& aRgn1, const Derived& aRgn2)
  {
    mImpl.Xor (aRgn1.mImpl, aRgn2.mImpl);
    return This();
  }
  Derived& Xor (const Derived& aRegion, const Rect& aRect)
  {
    mImpl.Xor (aRegion.mImpl, ToRect (aRect));
    return This();
  }
  Derived& Xor (const Rect& aRect, const Derived& aRegion)
  {
    return Xor (aRegion, aRect);
  }
  Derived& Xor (const Rect& aRect1, const Rect& aRect2)
  {
    mImpl = ToRect (aRect1);
    return Xor (This(), aRect2);
  }

  Derived& SubOut(const Derived& aOther)
  {
    return Sub(This(), aOther);
  }
  Derived& SubOut(const Rect& aOther)
  {
    return Sub(This(), aOther);
  }
  Derived& Sub (const Derived& aRgn1, const Derived& aRgn2)
  {
    mImpl.Sub (aRgn1.mImpl, aRgn2.mImpl);
    return This();
  }
  Derived& Sub (const Derived& aRegion, const Rect& aRect)
  {
    mImpl.Sub (aRegion.mImpl, ToRect (aRect));
    return This();
  }
  Derived& Sub (const Rect& aRect, const Derived& aRegion)
  {
    return Sub (Derived (aRect), aRegion);
  }
  Derived& Sub (const Rect& aRect1, const Rect& aRect2)
  {
    mImpl = ToRect (aRect1);
    return Sub (This(), aRect2);
  }






  bool Contains (int aX, int aY) const
  {
    return mImpl.Contains(aX, aY);
  }
  bool Contains (const Rect& aRect) const
  {
    return mImpl.Contains (ToRect (aRect));
  }
  bool Contains (const Derived& aRgn) const
  {
    return mImpl.Contains (aRgn.mImpl);
  }
  bool Intersects (const Rect& aRect) const
  {
    return mImpl.Intersects (ToRect (aRect));
  }

  void MoveBy (int32_t aXOffset, int32_t aYOffset)
  {
    MoveBy (Point (aXOffset, aYOffset));
  }
  void MoveBy (Point aPt)
  {
    mImpl.MoveBy (aPt.x, aPt.y);
  }
  Derived MovedBy(int32_t aXOffset, int32_t aYOffset) const
  {
    return MovedBy(Point(aXOffset, aYOffset));
  }
  Derived MovedBy(const Point& aPt) const
  {
    Derived copy(This());
    copy.MoveBy(aPt);
    return copy;
  }

  Derived Intersect(const Derived& aOther) const
  {
    Derived intersection;
    intersection.And(This(), aOther);
    return intersection;
  }

  void Inflate(const Margin& aMargin)
  {
    mImpl.Inflate(nsMargin(aMargin.top, aMargin.right, aMargin.bottom, aMargin.left));
  }
  Derived Inflated(const Margin& aMargin) const
  {
    Derived copy(This());
    copy.Inflate(aMargin);
    return copy;
  }

  void SetEmpty ()
  {
    mImpl.SetEmpty ();
  }

  bool IsEmpty () const { return mImpl.IsEmpty (); }
  bool IsComplex () const { return mImpl.IsComplex (); }
  bool IsEqual (const Derived& aRegion) const
  {
    return mImpl.IsEqual (aRegion.mImpl);
  }
  uint32_t GetNumRects () const { return mImpl.GetNumRects (); }
  Rect GetBounds () const { return FromRect (mImpl.GetBounds ()); }
  uint64_t Area () const { return mImpl.Area(); }
  nsRegion ToAppUnits (nscoord aAppUnitsPerPixel) const
  {
    nsRegion result;
    for (auto iter = RectIter(); !iter.Done(); iter.Next()) {
      nsRect appRect = ::ToAppUnits(iter.Get(), aAppUnitsPerPixel);
      result.Or(result, appRect);
    }
    return result;
  }
  Rect GetLargestRectangle (const Rect& aContainingRect = Rect()) const
  {
    return FromRect (mImpl.GetLargestRectangle( ToRect(aContainingRect) ));
  }

  Derived& ScaleRoundOut (float aXScale, float aYScale)
  {
    mImpl.ScaleRoundOut(aXScale, aYScale);
    return This();
  }

  Derived& ScaleInverseRoundOut (float aXScale, float aYScale)
  {
    mImpl.ScaleInverseRoundOut(aXScale, aYScale);
    return This();
  }





  Derived& Transform (const mozilla::gfx::Matrix4x4 &aTransform)
  {
    mImpl.Transform(aTransform);
    return This();
  }







  void SimplifyOutward (uint32_t aMaxRects)
  {
    mImpl.SimplifyOutward (aMaxRects);
  }
  void SimplifyOutwardByArea (uint32_t aThreshold)
  {
    mImpl.SimplifyOutwardByArea (aThreshold);
  }





  void SimplifyInward (uint32_t aMaxRects)
  {
    mImpl.SimplifyInward (aMaxRects);
  }

  typedef void (*visitFn)(void *closure, VisitSide side, int x1, int y1, int x2, int y2);
  void VisitEdges (visitFn visit, void *closure)
  {
    mImpl.VisitEdges (visit, closure);
  }

  nsCString ToString() const { return mImpl.ToString(); }

  class RectIterator
  {
    nsRegion::RectIterator mImpl;
    mutable Rect mTmp;

  public:
    explicit RectIterator(const BaseIntRegion& aRegion)
      : mImpl(aRegion.mImpl)
    {}

    bool Done() const { return mImpl.Done(); }

    const Rect& Get() const
    {
      mTmp = FromRect(mImpl.Get());
      return mTmp;
    }

    void Next() { mImpl.Next(); }
  };

  RectIterator RectIter() const { return RectIterator(*this); }

protected:


  explicit BaseIntRegion(const nsRegion& aImpl) : mImpl(aImpl) {}
  const nsRegion& Impl() const { return mImpl; }
private:
  nsRegion mImpl;

  static nsRect ToRect(const Rect& aRect)
  {
    return nsRect (aRect.x, aRect.y, aRect.width, aRect.height);
  }
  static Rect FromRect(const nsRect& aRect)
  {
    return Rect (aRect.x, aRect.y, aRect.width, aRect.height);
  }

  Derived& This()
  {
    return *static_cast<Derived*>(this);
  }
  const Derived& This() const
  {
    return *static_cast<const Derived*>(this);
  }
};

template <class units>
class IntRegionTyped :
    public BaseIntRegion<IntRegionTyped<units>, IntRectTyped<units>, IntPointTyped<units>, IntMarginTyped<units>>
{
  typedef BaseIntRegion<IntRegionTyped<units>, IntRectTyped<units>, IntPointTyped<units>, IntMarginTyped<units>> Super;


  template <typename OtherUnits>
  friend class IntRegionTyped;

  static_assert(IsPixel<units>::value, "'units' must be a coordinate system tag");

public:
  typedef IntRectTyped<units> RectType;
  typedef IntPointTyped<units> PointType;
  typedef IntMarginTyped<units> MarginType;


  IntRegionTyped() {}
               IntRegionTyped(const IntRectTyped<units>& aRect) : Super(aRect) {}
  IntRegionTyped(const IntRegionTyped& aRegion) : Super(aRegion) {}
  explicit IntRegionTyped(mozilla::gfx::ArrayView<pixman_box32_t> aRects) : Super(aRects) {}
  IntRegionTyped(IntRegionTyped&& aRegion) : Super(mozilla::Move(aRegion)) {}



  IntRegionTyped& operator=(const IntRegionTyped& aRegion)
  {
    return Super::operator=(aRegion);
  }
  IntRegionTyped& operator=(IntRegionTyped&& aRegion)
  {
    return Super::operator=(mozilla::Move(aRegion));
  }

  static IntRegionTyped FromUnknownRegion(const IntRegion& aRegion)
  {
    return IntRegionTyped(aRegion.Impl());
  }
  IntRegion ToUnknownRegion() const
  {

    return IntRegion(this->Impl());
  }
private:

  explicit IntRegionTyped(const nsRegion& aRegion) : Super(aRegion) {}
};

}
}

typedef mozilla::gfx::IntRegion nsIntRegion;
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AppUnits.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AppUnits.h"
namespace mozilla {
inline int32_t AppUnitsPerCSSPixel() { return 60; }
inline int32_t AppUnitsPerCSSInch() { return 96 * AppUnitsPerCSSPixel(); }
}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h" 2


namespace mozilla {

template <typename T>
struct IsPixel : FalseType {};


struct CSSPixel;
struct LayoutDevicePixel;
struct LayerPixel;
struct CSSTransformedLayerPixel;
struct RenderTargetPixel;
struct ScreenPixel;
struct ParentLayerPixel;
struct DesktopPixel;

template<> struct IsPixel<CSSPixel> : TrueType {};
template<> struct IsPixel<LayoutDevicePixel> : TrueType {};
template<> struct IsPixel<LayerPixel> : TrueType {};
template<> struct IsPixel<CSSTransformedLayerPixel> : TrueType {};
template<> struct IsPixel<RenderTargetPixel> : TrueType {};
template<> struct IsPixel<ScreenPixel> : TrueType {};
template<> struct IsPixel<ParentLayerPixel> : TrueType {};
template<> struct IsPixel<DesktopPixel> : TrueType {};

typedef gfx::CoordTyped<CSSPixel> CSSCoord;
typedef gfx::IntCoordTyped<CSSPixel> CSSIntCoord;
typedef gfx::PointTyped<CSSPixel> CSSPoint;
typedef gfx::IntPointTyped<CSSPixel> CSSIntPoint;
typedef gfx::SizeTyped<CSSPixel> CSSSize;
typedef gfx::IntSizeTyped<CSSPixel> CSSIntSize;
typedef gfx::RectTyped<CSSPixel> CSSRect;
typedef gfx::IntRectTyped<CSSPixel> CSSIntRect;
typedef gfx::MarginTyped<CSSPixel> CSSMargin;
typedef gfx::IntMarginTyped<CSSPixel> CSSIntMargin;
typedef gfx::IntRegionTyped<CSSPixel> CSSIntRegion;

typedef gfx::CoordTyped<LayoutDevicePixel> LayoutDeviceCoord;
typedef gfx::IntCoordTyped<LayoutDevicePixel> LayoutDeviceIntCoord;
typedef gfx::PointTyped<LayoutDevicePixel> LayoutDevicePoint;
typedef gfx::IntPointTyped<LayoutDevicePixel> LayoutDeviceIntPoint;
typedef gfx::SizeTyped<LayoutDevicePixel> LayoutDeviceSize;
typedef gfx::IntSizeTyped<LayoutDevicePixel> LayoutDeviceIntSize;
typedef gfx::RectTyped<LayoutDevicePixel> LayoutDeviceRect;
typedef gfx::IntRectTyped<LayoutDevicePixel> LayoutDeviceIntRect;
typedef gfx::MarginTyped<LayoutDevicePixel> LayoutDeviceMargin;
typedef gfx::IntMarginTyped<LayoutDevicePixel> LayoutDeviceIntMargin;
typedef gfx::IntRegionTyped<LayoutDevicePixel> LayoutDeviceIntRegion;

typedef gfx::CoordTyped<LayerPixel> LayerCoord;
typedef gfx::IntCoordTyped<LayerPixel> LayerIntCoord;
typedef gfx::PointTyped<LayerPixel> LayerPoint;
typedef gfx::IntPointTyped<LayerPixel> LayerIntPoint;
typedef gfx::SizeTyped<LayerPixel> LayerSize;
typedef gfx::IntSizeTyped<LayerPixel> LayerIntSize;
typedef gfx::RectTyped<LayerPixel> LayerRect;
typedef gfx::IntRectTyped<LayerPixel> LayerIntRect;
typedef gfx::MarginTyped<LayerPixel> LayerMargin;
typedef gfx::IntMarginTyped<LayerPixel> LayerIntMargin;
typedef gfx::IntRegionTyped<LayerPixel> LayerIntRegion;

typedef gfx::CoordTyped<CSSTransformedLayerPixel> CSSTransformedLayerCoord;
typedef gfx::IntCoordTyped<CSSTransformedLayerPixel> CSSTransformedLayerIntCoord;
typedef gfx::PointTyped<CSSTransformedLayerPixel> CSSTransformedLayerPoint;
typedef gfx::IntPointTyped<CSSTransformedLayerPixel> CSSTransformedLayerIntPoint;
typedef gfx::SizeTyped<CSSTransformedLayerPixel> CSSTransformedLayerSize;
typedef gfx::IntSizeTyped<CSSTransformedLayerPixel> CSSTransformedLayerIntSize;
typedef gfx::RectTyped<CSSTransformedLayerPixel> CSSTransformedLayerRect;
typedef gfx::IntRectTyped<CSSTransformedLayerPixel> CSSTransformedLayerIntRect;
typedef gfx::MarginTyped<CSSTransformedLayerPixel> CSSTransformedLayerMargin;
typedef gfx::IntMarginTyped<CSSTransformedLayerPixel> CSSTransformedLayerIntMargin;
typedef gfx::IntRegionTyped<CSSTransformedLayerPixel> CSSTransformedLayerIntRegion;

typedef gfx::PointTyped<RenderTargetPixel> RenderTargetPoint;
typedef gfx::IntPointTyped<RenderTargetPixel> RenderTargetIntPoint;
typedef gfx::SizeTyped<RenderTargetPixel> RenderTargetSize;
typedef gfx::IntSizeTyped<RenderTargetPixel> RenderTargetIntSize;
typedef gfx::RectTyped<RenderTargetPixel> RenderTargetRect;
typedef gfx::IntRectTyped<RenderTargetPixel> RenderTargetIntRect;
typedef gfx::MarginTyped<RenderTargetPixel> RenderTargetMargin;
typedef gfx::IntMarginTyped<RenderTargetPixel> RenderTargetIntMargin;
typedef gfx::IntRegionTyped<RenderTargetPixel> RenderTargetIntRegion;

typedef gfx::CoordTyped<ScreenPixel> ScreenCoord;
typedef gfx::IntCoordTyped<ScreenPixel> ScreenIntCoord;
typedef gfx::PointTyped<ScreenPixel> ScreenPoint;
typedef gfx::IntPointTyped<ScreenPixel> ScreenIntPoint;
typedef gfx::SizeTyped<ScreenPixel> ScreenSize;
typedef gfx::IntSizeTyped<ScreenPixel> ScreenIntSize;
typedef gfx::RectTyped<ScreenPixel> ScreenRect;
typedef gfx::IntRectTyped<ScreenPixel> ScreenIntRect;
typedef gfx::MarginTyped<ScreenPixel> ScreenMargin;
typedef gfx::IntMarginTyped<ScreenPixel> ScreenIntMargin;
typedef gfx::IntRegionTyped<ScreenPixel> ScreenIntRegion;

typedef gfx::CoordTyped<ParentLayerPixel> ParentLayerCoord;
typedef gfx::IntCoordTyped<ParentLayerPixel> ParentLayerIntCoord;
typedef gfx::PointTyped<ParentLayerPixel> ParentLayerPoint;
typedef gfx::IntPointTyped<ParentLayerPixel> ParentLayerIntPoint;
typedef gfx::SizeTyped<ParentLayerPixel> ParentLayerSize;
typedef gfx::IntSizeTyped<ParentLayerPixel> ParentLayerIntSize;
typedef gfx::RectTyped<ParentLayerPixel> ParentLayerRect;
typedef gfx::IntRectTyped<ParentLayerPixel> ParentLayerIntRect;
typedef gfx::MarginTyped<ParentLayerPixel> ParentLayerMargin;
typedef gfx::IntMarginTyped<ParentLayerPixel> ParentLayerIntMargin;
typedef gfx::IntRegionTyped<ParentLayerPixel> ParentLayerIntRegion;

typedef gfx::CoordTyped<DesktopPixel> DesktopCoord;
typedef gfx::IntCoordTyped<DesktopPixel> DesktopIntCoord;
typedef gfx::PointTyped<DesktopPixel> DesktopPoint;
typedef gfx::IntPointTyped<DesktopPixel> DesktopIntPoint;
typedef gfx::SizeTyped<DesktopPixel> DesktopSize;
typedef gfx::IntSizeTyped<DesktopPixel> DesktopIntSize;
typedef gfx::RectTyped<DesktopPixel> DesktopRect;
typedef gfx::IntRectTyped<DesktopPixel> DesktopIntRect;

typedef gfx::ScaleFactor<CSSPixel, LayoutDevicePixel> CSSToLayoutDeviceScale;
typedef gfx::ScaleFactor<CSSPixel, LayerPixel> CSSToLayerScale;
typedef gfx::ScaleFactor<CSSPixel, ScreenPixel> CSSToScreenScale;
typedef gfx::ScaleFactor<CSSPixel, ParentLayerPixel> CSSToParentLayerScale;
typedef gfx::ScaleFactor<LayoutDevicePixel, CSSPixel> LayoutDeviceToCSSScale;
typedef gfx::ScaleFactor<LayoutDevicePixel, LayerPixel> LayoutDeviceToLayerScale;
typedef gfx::ScaleFactor<LayoutDevicePixel, ScreenPixel> LayoutDeviceToScreenScale;
typedef gfx::ScaleFactor<LayoutDevicePixel, ParentLayerPixel> LayoutDeviceToParentLayerScale;
typedef gfx::ScaleFactor<LayerPixel, CSSPixel> LayerToCSSScale;
typedef gfx::ScaleFactor<LayerPixel, LayoutDevicePixel> LayerToLayoutDeviceScale;
typedef gfx::ScaleFactor<LayerPixel, RenderTargetPixel> LayerToRenderTargetScale;
typedef gfx::ScaleFactor<LayerPixel, ScreenPixel> LayerToScreenScale;
typedef gfx::ScaleFactor<LayerPixel, ParentLayerPixel> LayerToParentLayerScale;
typedef gfx::ScaleFactor<RenderTargetPixel, ScreenPixel> RenderTargetToScreenScale;
typedef gfx::ScaleFactor<ScreenPixel, CSSPixel> ScreenToCSSScale;
typedef gfx::ScaleFactor<ScreenPixel, LayoutDevicePixel> ScreenToLayoutDeviceScale;
typedef gfx::ScaleFactor<ScreenPixel, LayerPixel> ScreenToLayerScale;
typedef gfx::ScaleFactor<ScreenPixel, ParentLayerPixel> ScreenToParentLayerScale;
typedef gfx::ScaleFactor<ParentLayerPixel, LayerPixel> ParentLayerToLayerScale;
typedef gfx::ScaleFactor<ParentLayerPixel, ScreenPixel> ParentLayerToScreenScale;
typedef gfx::ScaleFactor<ParentLayerPixel, ParentLayerPixel> ParentLayerToParentLayerScale;
typedef gfx::ScaleFactor<DesktopPixel, LayoutDevicePixel> DesktopToLayoutDeviceScale;

typedef gfx::ScaleFactors2D<CSSPixel, LayoutDevicePixel> CSSToLayoutDeviceScale2D;
typedef gfx::ScaleFactors2D<CSSPixel, LayerPixel> CSSToLayerScale2D;
typedef gfx::ScaleFactors2D<CSSPixel, ScreenPixel> CSSToScreenScale2D;
typedef gfx::ScaleFactors2D<CSSPixel, ParentLayerPixel> CSSToParentLayerScale2D;
typedef gfx::ScaleFactors2D<LayoutDevicePixel, CSSPixel> LayoutDeviceToCSSScale2D;
typedef gfx::ScaleFactors2D<LayoutDevicePixel, LayerPixel> LayoutDeviceToLayerScale2D;
typedef gfx::ScaleFactors2D<LayoutDevicePixel, ScreenPixel> LayoutDeviceToScreenScale2D;
typedef gfx::ScaleFactors2D<LayoutDevicePixel, ParentLayerPixel> LayoutDeviceToParentLayerScale2D;
typedef gfx::ScaleFactors2D<LayerPixel, CSSPixel> LayerToCSSScale2D;
typedef gfx::ScaleFactors2D<LayerPixel, LayoutDevicePixel> LayerToLayoutDeviceScale2D;
typedef gfx::ScaleFactors2D<LayerPixel, RenderTargetPixel> LayerToRenderTargetScale2D;
typedef gfx::ScaleFactors2D<LayerPixel, ScreenPixel> LayerToScreenScale2D;
typedef gfx::ScaleFactors2D<LayerPixel, ParentLayerPixel> LayerToParentLayerScale2D;
typedef gfx::ScaleFactors2D<RenderTargetPixel, ScreenPixel> RenderTargetToScreenScale2D;
typedef gfx::ScaleFactors2D<ScreenPixel, CSSPixel> ScreenToCSSScale2D;
typedef gfx::ScaleFactors2D<ScreenPixel, LayoutDevicePixel> ScreenToLayoutDeviceScale2D;
typedef gfx::ScaleFactors2D<ScreenPixel, LayerPixel> ScreenToLayerScale2D;
typedef gfx::ScaleFactors2D<ScreenPixel, ParentLayerPixel> ScreenToParentLayerScale2D;
typedef gfx::ScaleFactors2D<ParentLayerPixel, LayerPixel> ParentLayerToLayerScale2D;
typedef gfx::ScaleFactors2D<ParentLayerPixel, ScreenPixel> ParentLayerToScreenScale2D;
typedef gfx::ScaleFactors2D<ParentLayerPixel, ParentLayerPixel> ParentLayerToParentLayerScale2D;

typedef gfx::Matrix4x4Typed<LayoutDevicePixel, LayoutDevicePixel> LayoutDeviceToLayoutDeviceMatrix4x4;
typedef gfx::Matrix4x4Typed<LayerPixel, ParentLayerPixel> LayerToParentLayerMatrix4x4;
typedef gfx::Matrix4x4Typed<ScreenPixel, ScreenPixel> ScreenToScreenMatrix4x4;
typedef gfx::Matrix4x4Typed<ScreenPixel, ParentLayerPixel> ScreenToParentLayerMatrix4x4;
typedef gfx::Matrix4x4Typed<ParentLayerPixel, LayerPixel> ParentLayerToLayerMatrix4x4;
typedef gfx::Matrix4x4Typed<ParentLayerPixel, ScreenPixel> ParentLayerToScreenMatrix4x4;
typedef gfx::Matrix4x4Typed<ParentLayerPixel, ParentLayerPixel> ParentLayerToParentLayerMatrix4x4;




struct CSSPixel {



  static CSSCoord FromAppUnits(nscoord aCoord) {
    return NSAppUnitsToFloatPixels(aCoord, float(AppUnitsPerCSSPixel()));
  }

  static CSSPoint FromAppUnits(const nsPoint& aPoint) {
    return CSSPoint(NSAppUnitsToFloatPixels(aPoint.x, float(AppUnitsPerCSSPixel())),
                    NSAppUnitsToFloatPixels(aPoint.y, float(AppUnitsPerCSSPixel())));
  }

  static CSSSize FromAppUnits(const nsSize& aSize) {
    return CSSSize(NSAppUnitsToFloatPixels(aSize.width, float(AppUnitsPerCSSPixel())),
                   NSAppUnitsToFloatPixels(aSize.height, float(AppUnitsPerCSSPixel())));
  }

  static CSSRect FromAppUnits(const nsRect& aRect) {
    return CSSRect(NSAppUnitsToFloatPixels(aRect.x, float(AppUnitsPerCSSPixel())),
                   NSAppUnitsToFloatPixels(aRect.y, float(AppUnitsPerCSSPixel())),
                   NSAppUnitsToFloatPixels(aRect.width, float(AppUnitsPerCSSPixel())),
                   NSAppUnitsToFloatPixels(aRect.height, float(AppUnitsPerCSSPixel())));
  }

  static CSSMargin FromAppUnits(const nsMargin& aMargin) {
    return CSSMargin(NSAppUnitsToFloatPixels(aMargin.top, float(AppUnitsPerCSSPixel())),
                     NSAppUnitsToFloatPixels(aMargin.right, float(AppUnitsPerCSSPixel())),
                     NSAppUnitsToFloatPixels(aMargin.bottom, float(AppUnitsPerCSSPixel())),
                     NSAppUnitsToFloatPixels(aMargin.left, float(AppUnitsPerCSSPixel())));
  }

  static CSSIntPoint FromAppUnitsRounded(const nsPoint& aPoint) {
    return CSSIntPoint(NSAppUnitsToIntPixels(aPoint.x, float(AppUnitsPerCSSPixel())),
                       NSAppUnitsToIntPixels(aPoint.y, float(AppUnitsPerCSSPixel())));
  }

  static CSSIntSize FromAppUnitsRounded(const nsSize& aSize)
  {
    return CSSIntSize(NSAppUnitsToIntPixels(aSize.width, float(AppUnitsPerCSSPixel())),
                      NSAppUnitsToIntPixels(aSize.height, float(AppUnitsPerCSSPixel())));
  }

  static CSSIntRect FromAppUnitsRounded(const nsRect& aRect) {
    return CSSIntRect(NSAppUnitsToIntPixels(aRect.x, float(AppUnitsPerCSSPixel())),
                      NSAppUnitsToIntPixels(aRect.y, float(AppUnitsPerCSSPixel())),
                      NSAppUnitsToIntPixels(aRect.width, float(AppUnitsPerCSSPixel())),
                      NSAppUnitsToIntPixels(aRect.height, float(AppUnitsPerCSSPixel())));
  }



  static nscoord ToAppUnits(CSSCoord aCoord) {
    return NSToCoordRoundWithClamp(aCoord * float(AppUnitsPerCSSPixel()));
  }

  static nsPoint ToAppUnits(const CSSPoint& aPoint) {
    return nsPoint(NSToCoordRoundWithClamp(aPoint.x * float(AppUnitsPerCSSPixel())),
                   NSToCoordRoundWithClamp(aPoint.y * float(AppUnitsPerCSSPixel())));
  }

  static nsPoint ToAppUnits(const CSSIntPoint& aPoint) {
    return nsPoint(NSToCoordRoundWithClamp(float(aPoint.x) * float(AppUnitsPerCSSPixel())),
                   NSToCoordRoundWithClamp(float(aPoint.y) * float(AppUnitsPerCSSPixel())));
  }

  static nsSize ToAppUnits(const CSSSize& aSize) {
    return nsSize(NSToCoordRoundWithClamp(aSize.width * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(aSize.height * float(AppUnitsPerCSSPixel())));
  }

  static nsSize ToAppUnits(const CSSIntSize& aSize) {
    return nsSize(NSToCoordRoundWithClamp(float(aSize.width) * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(float(aSize.height) * float(AppUnitsPerCSSPixel())));
  }

  static nsRect ToAppUnits(const CSSRect& aRect) {
    return nsRect(NSToCoordRoundWithClamp(aRect.x * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(aRect.y * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(aRect.width * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(aRect.height * float(AppUnitsPerCSSPixel())));
  }

  static nsRect ToAppUnits(const CSSIntRect& aRect) {
    return nsRect(NSToCoordRoundWithClamp(float(aRect.x) * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(float(aRect.y) * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(float(aRect.width) * float(AppUnitsPerCSSPixel())),
                  NSToCoordRoundWithClamp(float(aRect.height) * float(AppUnitsPerCSSPixel())));
  }
};
# 292 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h"
struct LayoutDevicePixel {
  static LayoutDeviceRect FromAppUnits(const nsRect& aRect, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceRect(NSAppUnitsToFloatPixels(aRect.x, float(aAppUnitsPerDevPixel)),
                            NSAppUnitsToFloatPixels(aRect.y, float(aAppUnitsPerDevPixel)),
                            NSAppUnitsToFloatPixels(aRect.width, float(aAppUnitsPerDevPixel)),
                            NSAppUnitsToFloatPixels(aRect.height, float(aAppUnitsPerDevPixel)));
  }

  static LayoutDeviceSize FromAppUnits(const nsSize& aSize, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceSize(
      NSAppUnitsToFloatPixels(aSize.width, aAppUnitsPerDevPixel),
      NSAppUnitsToFloatPixels(aSize.height, aAppUnitsPerDevPixel));
  }

  static LayoutDevicePoint FromAppUnits(const nsPoint& aPoint, nscoord aAppUnitsPerDevPixel) {
    return LayoutDevicePoint(NSAppUnitsToFloatPixels(aPoint.x, aAppUnitsPerDevPixel),
                             NSAppUnitsToFloatPixels(aPoint.y, aAppUnitsPerDevPixel));
  }

  static LayoutDeviceMargin FromAppUnits(const nsMargin& aMargin, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceMargin(NSAppUnitsToFloatPixels(aMargin.top, aAppUnitsPerDevPixel),
                              NSAppUnitsToFloatPixels(aMargin.right, aAppUnitsPerDevPixel),
                              NSAppUnitsToFloatPixels(aMargin.bottom, aAppUnitsPerDevPixel),
                              NSAppUnitsToFloatPixels(aMargin.left, aAppUnitsPerDevPixel));
  }

  static LayoutDeviceIntPoint FromAppUnitsRounded(const nsPoint& aPoint, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceIntPoint(NSAppUnitsToIntPixels(aPoint.x, aAppUnitsPerDevPixel),
                                NSAppUnitsToIntPixels(aPoint.y, aAppUnitsPerDevPixel));
  }

  static LayoutDeviceIntPoint FromAppUnitsToNearest(const nsPoint& aPoint, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceIntPoint::FromUnknownPoint(aPoint.ToNearestPixels(aAppUnitsPerDevPixel));
  }

  static LayoutDeviceIntRect FromAppUnitsToNearest(const nsRect& aRect, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceIntRect::FromUnknownRect(aRect.ToNearestPixels(aAppUnitsPerDevPixel));
  }

  static LayoutDeviceIntRect FromAppUnitsToInside(const nsRect& aRect, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceIntRect::FromUnknownRect(aRect.ToInsidePixels(aAppUnitsPerDevPixel));
  }

  static LayoutDeviceIntRect FromAppUnitsToOutside(const nsRect& aRect, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceIntRect::FromUnknownRect(aRect.ToOutsidePixels(aAppUnitsPerDevPixel));
  }

  static LayoutDeviceIntSize FromAppUnitsRounded(const nsSize& aSize, nscoord aAppUnitsPerDevPixel) {
    return LayoutDeviceIntSize(
      NSAppUnitsToIntPixels(aSize.width, aAppUnitsPerDevPixel),
      NSAppUnitsToIntPixels(aSize.height, aAppUnitsPerDevPixel));
  }

  static nsPoint ToAppUnits(const LayoutDeviceIntPoint& aPoint, nscoord aAppUnitsPerDevPixel) {
    return nsPoint(aPoint.x * aAppUnitsPerDevPixel,
                   aPoint.y * aAppUnitsPerDevPixel);
  }

  static nsSize ToAppUnits(const LayoutDeviceIntSize& aSize, nscoord aAppUnitsPerDevPixel) {
    return nsSize(aSize.width * aAppUnitsPerDevPixel,
                  aSize.height * aAppUnitsPerDevPixel);
  }

  static nsSize ToAppUnits(const LayoutDeviceSize& aSize, nscoord aAppUnitsPerDevPixel) {
    return nsSize(NSFloatPixelsToAppUnits(aSize.width, aAppUnitsPerDevPixel),
                  NSFloatPixelsToAppUnits(aSize.height, aAppUnitsPerDevPixel));
  }

  static nsRect ToAppUnits(const LayoutDeviceIntRect& aRect, nscoord aAppUnitsPerDevPixel) {
    return nsRect(aRect.x * aAppUnitsPerDevPixel,
                  aRect.y * aAppUnitsPerDevPixel,
                  aRect.width * aAppUnitsPerDevPixel,
                  aRect.height * aAppUnitsPerDevPixel);
  }

  static nsRect ToAppUnits(const LayoutDeviceRect& aRect, nscoord aAppUnitsPerDevPixel) {
    return nsRect(NSFloatPixelsToAppUnits(aRect.x, aAppUnitsPerDevPixel),
                  NSFloatPixelsToAppUnits(aRect.y, aAppUnitsPerDevPixel),
                  NSFloatPixelsToAppUnits(aRect.width, aAppUnitsPerDevPixel),
                  NSFloatPixelsToAppUnits(aRect.height, aAppUnitsPerDevPixel));
  }
};
# 384 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h"
struct LayerPixel {
};







struct CSSTransformedLayerPixel {

};
# 404 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h"
struct RenderTargetPixel {
};
# 416 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h"
struct ScreenPixel {
};
# 431 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h"
struct ParentLayerPixel {
};
# 448 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Units.h"
struct DesktopPixel {
};



template<class src, class dst>
gfx::CoordTyped<dst> operator*(const gfx::CoordTyped<src>& aCoord, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::CoordTyped<dst>(aCoord.value * aScale.scale);
}

template<class src, class dst>
gfx::CoordTyped<dst> operator/(const gfx::CoordTyped<src>& aCoord, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::CoordTyped<dst>(aCoord.value / aScale.scale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator*(const gfx::PointTyped<src>& aPoint, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::PointTyped<dst>(aPoint.x * aScale.scale,
                              aPoint.y * aScale.scale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator/(const gfx::PointTyped<src>& aPoint, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::PointTyped<dst>(aPoint.x / aScale.scale,
                              aPoint.y / aScale.scale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator*(const gfx::PointTyped<src>& aPoint, const gfx::ScaleFactors2D<src, dst>& aScale) {
  return gfx::PointTyped<dst>(aPoint.x * aScale.xScale,
                              aPoint.y * aScale.yScale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator/(const gfx::PointTyped<src>& aPoint, const gfx::ScaleFactors2D<dst, src>& aScale) {
  return gfx::PointTyped<dst>(aPoint.x / aScale.xScale,
                              aPoint.y / aScale.yScale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator*(const gfx::IntPointTyped<src>& aPoint, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::PointTyped<dst>(float(aPoint.x) * aScale.scale,
                              float(aPoint.y) * aScale.scale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator/(const gfx::IntPointTyped<src>& aPoint, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::PointTyped<dst>(float(aPoint.x) / aScale.scale,
                              float(aPoint.y) / aScale.scale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator*(const gfx::IntPointTyped<src>& aPoint, const gfx::ScaleFactors2D<src, dst>& aScale) {
  return gfx::PointTyped<dst>(float(aPoint.x) * aScale.xScale,
                              float(aPoint.y) * aScale.yScale);
}

template<class src, class dst>
gfx::PointTyped<dst> operator/(const gfx::IntPointTyped<src>& aPoint, const gfx::ScaleFactors2D<dst, src>& aScale) {
  return gfx::PointTyped<dst>(float(aPoint.x) / aScale.xScale,
                              float(aPoint.y) / aScale.yScale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator*(const gfx::RectTyped<src>& aRect, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::RectTyped<dst>(aRect.x * aScale.scale,
                             aRect.y * aScale.scale,
                             aRect.width * aScale.scale,
                             aRect.height * aScale.scale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator/(const gfx::RectTyped<src>& aRect, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::RectTyped<dst>(aRect.x / aScale.scale,
                             aRect.y / aScale.scale,
                             aRect.width / aScale.scale,
                             aRect.height / aScale.scale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator*(const gfx::RectTyped<src>& aRect, const gfx::ScaleFactors2D<src, dst>& aScale) {
  return gfx::RectTyped<dst>(aRect.x * aScale.xScale,
                             aRect.y * aScale.yScale,
                             aRect.width * aScale.xScale,
                             aRect.height * aScale.yScale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator/(const gfx::RectTyped<src>& aRect, const gfx::ScaleFactors2D<dst, src>& aScale) {
  return gfx::RectTyped<dst>(aRect.x / aScale.xScale,
                             aRect.y / aScale.yScale,
                             aRect.width / aScale.xScale,
                             aRect.height / aScale.yScale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator*(const gfx::IntRectTyped<src>& aRect, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::RectTyped<dst>(float(aRect.x) * aScale.scale,
                             float(aRect.y) * aScale.scale,
                             float(aRect.width) * aScale.scale,
                             float(aRect.height) * aScale.scale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator/(const gfx::IntRectTyped<src>& aRect, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::RectTyped<dst>(float(aRect.x) / aScale.scale,
                             float(aRect.y) / aScale.scale,
                             float(aRect.width) / aScale.scale,
                             float(aRect.height) / aScale.scale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator*(const gfx::IntRectTyped<src>& aRect, const gfx::ScaleFactors2D<src, dst>& aScale) {
  return gfx::RectTyped<dst>(float(aRect.x) * aScale.xScale,
                             float(aRect.y) * aScale.yScale,
                             float(aRect.width) * aScale.xScale,
                             float(aRect.height) * aScale.yScale);
}

template<class src, class dst>
gfx::RectTyped<dst> operator/(const gfx::IntRectTyped<src>& aRect, const gfx::ScaleFactors2D<dst, src>& aScale) {
  return gfx::RectTyped<dst>(float(aRect.x) / aScale.xScale,
                             float(aRect.y) / aScale.yScale,
                             float(aRect.width) / aScale.xScale,
                             float(aRect.height) / aScale.yScale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator*(const gfx::SizeTyped<src>& aSize, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::SizeTyped<dst>(aSize.width * aScale.scale,
                             aSize.height * aScale.scale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator/(const gfx::SizeTyped<src>& aSize, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::SizeTyped<dst>(aSize.width / aScale.scale,
                              aSize.height / aScale.scale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator*(const gfx::SizeTyped<src>& aSize, const gfx::ScaleFactors2D<src, dst>& aScale) {
  return gfx::SizeTyped<dst>(aSize.width * aScale.xScale,
                             aSize.height * aScale.yScale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator/(const gfx::SizeTyped<src>& aSize, const gfx::ScaleFactors2D<dst, src>& aScale) {
  return gfx::SizeTyped<dst>(aSize.width / aScale.xScale,
                             aSize.height / aScale.yScale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator*(const gfx::IntSizeTyped<src>& aSize, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::SizeTyped<dst>(float(aSize.width) * aScale.scale,
                             float(aSize.height) * aScale.scale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator/(const gfx::IntSizeTyped<src>& aSize, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::SizeTyped<dst>(float(aSize.width) / aScale.scale,
                             float(aSize.height) / aScale.scale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator*(const gfx::IntSizeTyped<src>& aSize, const gfx::ScaleFactors2D<src, dst>& aScale) {
  return gfx::SizeTyped<dst>(float(aSize.width) * aScale.xScale,
                             float(aSize.height) * aScale.yScale);
}

template<class src, class dst>
gfx::SizeTyped<dst> operator/(const gfx::IntSizeTyped<src>& aSize, const gfx::ScaleFactors2D<dst, src>& aScale) {
  return gfx::SizeTyped<dst>(float(aSize.width) / aScale.xScale,
                             float(aSize.height) / aScale.yScale);
}

template<class src, class dst>
gfx::MarginTyped<dst> operator*(const gfx::MarginTyped<src>& aMargin, const gfx::ScaleFactor<src, dst>& aScale) {
  return gfx::MarginTyped<dst>(aMargin.top * aScale.scale,
                               aMargin.right * aScale.scale,
                               aMargin.bottom * aScale.scale,
                               aMargin.left * aScale.scale);
}

template<class src, class dst>
gfx::MarginTyped<dst> operator/(const gfx::MarginTyped<src>& aMargin, const gfx::ScaleFactor<dst, src>& aScale) {
  return gfx::MarginTyped<dst>(aMargin.top / aScale.scale,
                               aMargin.right / aScale.scale,
                               aMargin.bottom / aScale.scale,
                               aMargin.left / aScale.scale);
}

template<class src, class dst>
gfx::MarginTyped<dst> operator*(const gfx::MarginTyped<src>& aMargin, const gfx::ScaleFactors2D<src, dst>& aScale) {
  return gfx::MarginTyped<dst>(aMargin.top * aScale.yScale,
                               aMargin.right * aScale.xScale,
                               aMargin.bottom * aScale.yScale,
                               aMargin.left * aScale.xScale);
}

template<class src, class dst>
gfx::MarginTyped<dst> operator/(const gfx::MarginTyped<src>& aMargin, const gfx::ScaleFactors2D<dst, src>& aScale) {
  return gfx::MarginTyped<dst>(aMargin.top / aScale.yScale,
                               aMargin.right / aScale.xScale,
                               aMargin.bottom / aScale.yScale,
                               aMargin.left / aScale.xScale);
}




template<class src, class dst>
gfx::ScaleFactor<src, dst> MaxScaleRatio(const gfx::SizeTyped<dst>& aDestSize, const gfx::SizeTyped<src>& aSrcSize) {
  return gfx::ScaleFactor<src, dst>(std::max(aDestSize.width / aSrcSize.width,
                                             aDestSize.height / aSrcSize.height));
}

template<class src, class dst>
gfx::ScaleFactor<src, dst> MinScaleRatio(const gfx::SizeTyped<dst>& aDestSize, const gfx::SizeTyped<src>& aSrcSize) {
  return gfx::ScaleFactor<src, dst>(std::min(aDestSize.width / aSrcSize.width,
                                             aDestSize.height / aSrcSize.height));
}

}
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsContentListDeclarations.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsContentListDeclarations.h"
class nsContentList;
class nsIAtom;
class nsIContent;
class nsINode;

class nsString;
class nsAString;

namespace mozilla {
namespace dom {
class Element;
}
}
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsContentListDeclarations.h"
typedef bool (*nsContentListMatchFunc)(mozilla::dom::Element* aElement,
                                       int32_t aNamespaceID,
                                       nsIAtom* aAtom,
                                       void* aData);

typedef void (*nsContentListDestroyFunc)(void* aData);






typedef void* (*nsFuncStringContentListDataAllocator)(nsINode* aRootNode,
                                                      const nsString* aString);






already_AddRefed<nsContentList>
NS_GetContentList(nsINode* aRootNode,
                  int32_t aMatchNameSpaceId,
                  const nsAString& aTagname);

already_AddRefed<nsContentList>
NS_GetFuncStringNodeList(nsINode* aRootNode,
                         nsContentListMatchFunc aFunc,
                         nsContentListDestroyFunc aDestroyFunc,
                         nsFuncStringContentListDataAllocator aDataAllocator,
                         const nsAString& aString);
already_AddRefed<nsContentList>
NS_GetFuncStringHTMLCollection(nsINode* aRootNode,
                               nsContentListMatchFunc aFunc,
                               nsContentListDestroyFunc aDestroyFunc,
                               nsFuncStringContentListDataAllocator aDataAllocator,
                               const nsAString& aString);
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Logging.h" 1
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Logging.h"
namespace mozilla {
# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Logging.h"
enum class LogLevel {
  Disabled = 0,
  Error,
  Warning,
  Info,
  Debug,
  Verbose,
};




LogLevel ToLogLevel(int32_t aLevel);

class LogModule
{
public:
  ~LogModule() { ::free(mName); }
# 77 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Logging.h"
  static LogModule* Get(const char* aName);

  static void Init();




  static void SetLogFile(const char* aFilename);







  static uint32_t GetLogFile(char *aBuffer, size_t aLength);




  static void SetAddTimestamp(bool aAddTimestamp);




  static void SetIsSync(bool aIsSync);




  bool ShouldLog(LogLevel aLevel) const { return mLevel >= aLevel; }




  LogLevel Level() const { return mLevel; }




  void SetLevel(LogLevel level) { mLevel = level; }




  void Printv(LogLevel aLevel, const char* aFmt, va_list aArgs) const;




  const char* Name() const { return mName; }

private:
  friend class LogModuleManager;

  explicit LogModule(const char* aName, LogLevel aLevel)
    : mName(strdup(aName)), mLevel(aLevel)
  {
  }

  LogModule(LogModule&) = delete;
  LogModule& operator=(const LogModule&) = delete;

  char* mName;
  Atomic<LogLevel, Relaxed> mLevel;
};
# 156 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Logging.h"
class LazyLogModule final
{
public:
  explicit constexpr LazyLogModule(const char* aLogName)
    : mLogName(aLogName)
    , mLog(nullptr)
  {
  }

  operator LogModule*()
  {




    LogModule* tmp = mLog;
    if ((__builtin_expect(!!(!tmp), 0))) {
      tmp = LogModule::Get(mLogName);
      mLog = tmp;
    }

    return tmp;
  }

private:
  const char* const mLogName;
  Atomic<LogModule*, ReleaseAcquire> mLog;
};

namespace detail {

inline bool log_test(const LogModule* module, LogLevel level) {
  do { } while (0);
  return module && module->ShouldLog(level);
}

void log_print(const LogModule* aModule,
               LogLevel aLevel,
               const char* aFmt, ...) __attribute__ ((format (printf, 3, 4)));
}

}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimer.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimer.h"
class nsIObserver;

class nsIEventTarget;
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimer.h"
class nsITimer;
typedef void (*nsTimerCallbackFunc) (nsITimer *aTimer, void *aClosure);
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimer.h"
typedef void (*nsTimerNameCallbackFunc) (nsITimer *aTimer,
                                         bool aAnonymize,
                                         void *aClosure,
                                         char *aBuf, size_t aLen);
class nsITimer;
# 58 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimer.h"
class nsITimerCallback : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Notify(nsITimer *timer) = 0;

};

  template<typename T> struct nsITimerCallback::COMTypeInfo<nsITimerCallback, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsITimerCallback::COMTypeInfo<nsITimerCallback, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xa796816d, 0x7d47, 0x4348, { 0x9a, 0xb8, 0xc7, 0xae, 0xb3, 0x21, 0x6a, 0x7d }};
# 138 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimer.h"
class nsITimer : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    TYPE_ONE_SHOT = 0,
    TYPE_REPEATING_SLACK = 1,
    TYPE_REPEATING_PRECISE = 2,
    TYPE_REPEATING_PRECISE_CAN_SKIP = 3
  };


  virtual nsresult Init(nsIObserver *aObserver, uint32_t aDelay, uint32_t aType) = 0;


  virtual nsresult InitWithFuncCallback(nsTimerCallbackFunc aCallback, void *aClosure, uint32_t aDelay, uint32_t aType) = 0;


  virtual nsresult InitWithCallback(nsITimerCallback *aCallback, uint32_t aDelay, uint32_t aType) = 0;


  virtual nsresult Cancel(void) = 0;


  virtual nsresult InitWithNamedFuncCallback(nsTimerCallbackFunc aCallback, void *aClosure, uint32_t aDelay, uint32_t aType, const char * aName) = 0;


  virtual nsresult InitWithNameableFuncCallback(nsTimerCallbackFunc aCallback, void *aClosure, uint32_t aDelay, uint32_t aType, nsTimerNameCallbackFunc aNameCallback) = 0;


  virtual nsresult GetDelay(uint32_t *aDelay) = 0;
  virtual nsresult SetDelay(uint32_t aDelay) = 0;


  virtual nsresult GetType(uint32_t *aType) = 0;
  virtual nsresult SetType(uint32_t aType) = 0;


  virtual nsresult GetClosure(void **aClosure) = 0;


  virtual nsresult GetCallback(nsITimerCallback * *aCallback) = 0;


  virtual nsresult GetTarget(nsIEventTarget * *aTarget) = 0;
  virtual nsresult SetTarget(nsIEventTarget *aTarget) = 0;

   virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const = 0;
};

  template<typename T> struct nsITimer::COMTypeInfo<nsITimer, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsITimer::COMTypeInfo<nsITimer, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x3de4b105, 0x363c, 0x482c, { 0xa4, 0x09, 0xba, 0xac, 0x83, 0xa0, 0x1b, 0xfc }};
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h" 2





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIObserverService.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIObserverService.h"
class nsIObserver;

class nsISimpleEnumerator;
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIObserverService.h"
class nsIObserverService : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult AddObserver(nsIObserver *anObserver, const char * aTopic, bool ownsWeak) = 0;


  virtual nsresult RemoveObserver(nsIObserver *anObserver, const char * aTopic) = 0;


  virtual nsresult NotifyObservers(nsISupports *aSubject, const char * aTopic, const char16_t * someData) = 0;


  virtual nsresult EnumerateObservers(const char * aTopic, nsISimpleEnumerator * *_retval) = 0;

};

  template<typename T> struct nsIObserverService::COMTypeInfo<nsIObserverService, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIObserverService::COMTypeInfo<nsIObserverService, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xd07f5192, 0xe3d1, 0x11d2, { 0x8a, 0xcd, 0x00, 0x10, 0x5a, 0x1b, 0x88, 0x60 }};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Services.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Services.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServiceList.h" 1







class nsIChromeRegistry;

class nsIToolkitChromeRegistry;

class nsIXULChromeRegistry;

class nsIXULOverlayProvider;

class nsIIOService;

class nsIObserverService;

class nsIStringBundleService;

class nsIXPConnect;

class inIDOMUtils;

class nsIPermissionManager;;

class nsIServiceWorkerManager;;

class nsIAsyncShutdownService;

class nsIUUIDGenerator;;

class nsIGfxInfo;;



namespace mozilla {


class IHistory;



}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Services.h" 2



namespace mozilla {
namespace services {






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServiceList.h" 1







already_AddRefed<nsIChromeRegistry> GetChromeRegistryService();

already_AddRefed<nsIToolkitChromeRegistry> GetToolkitChromeRegistryService();

already_AddRefed<nsIXULChromeRegistry> GetXULChromeRegistryService();

already_AddRefed<nsIXULOverlayProvider> GetXULOverlayProviderService();

already_AddRefed<nsIIOService> GetIOService();

already_AddRefed<nsIObserverService> GetObserverService();

already_AddRefed<nsIStringBundleService> GetStringBundleService();

already_AddRefed<nsIXPConnect> GetXPConnect();

already_AddRefed<inIDOMUtils> GetInDOMUtils();

already_AddRefed<nsIPermissionManager> GetPermissionManager();;

already_AddRefed<nsIServiceWorkerManager> GetServiceWorkerManager();;

already_AddRefed<nsIAsyncShutdownService> GetAsyncShutdown();

already_AddRefed<nsIUUIDGenerator> GetUUIDGenerator();;

already_AddRefed<nsIGfxInfo> GetGfxInfo();;






already_AddRefed<IHistory> GetHistoryService();
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Services.h" 2



}
}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h" 2






struct nsExpirationState
{
  enum
  {
    NOT_TRACKED = (1U << 4) - 1,
    MAX_INDEX_IN_GENERATION = (1U << 28) - 1
  };

  nsExpirationState() : mGeneration(NOT_TRACKED) {}
  bool IsTracked() { return mGeneration != NOT_TRACKED; }




  uint32_t mGeneration:4;
  uint32_t mIndexInGeneration:28;
};
# 91 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h"
template<typename T, uint32_t K, typename Mutex, typename AutoLock>
class ExpirationTrackerImpl
{
public:
# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h"
  ExpirationTrackerImpl(uint32_t aTimerPeriod,
                        const char* aName,
                        nsIEventTarget* aEventTarget = nullptr)
    : mTimerPeriod(aTimerPeriod)
    , mNewestGeneration(0)
    , mInAgeOneGeneration(false)
    , mName(aName)
    , mEventTarget(aEventTarget)
  {
    static_assert(K >= 2 && K <= nsExpirationState::NOT_TRACKED,
                  "Unsupported number of generations (must be 2 <= K <= 15)");
    do { } while (0);
    if (mEventTarget) {
      bool current = false;




      if ((__builtin_expect(!!(((bool)(__builtin_expect(!!(NS_FAILED_impl(mEventTarget->IsOnCurrentThread(&current))), 0))) || !current), 0))) {

        do { AnnotateMozCrashReason("MOZ_CRASH(" "Provided event target must be on the main thread" ")"); do { *((volatile int*) __null) = 126; ::abort(); } while (0); } while (0);
      }
    }
    mObserver = new ExpirationTrackerObserver();
    mObserver->Init(this);
  }

  virtual ~ExpirationTrackerImpl()
  {
    do { } while (0);
    if (mTimer) {
      mTimer->Cancel();
    }
    mObserver->Destroy();
  }






  nsresult AddObjectLocked(T* aObj, const AutoLock& aAutoLock)
  {
    nsExpirationState* state = aObj->GetExpirationState();
    do { } while(0);

    nsTArray<T*>& generation = mGenerations[mNewestGeneration];
    uint32_t index = generation.Length();
    if (index > nsExpirationState::MAX_INDEX_IN_GENERATION) {
      do { } while(0);
      return NS_ERROR_OUT_OF_MEMORY;
    }
    if (index == 0) {

      nsresult rv = CheckStartTimerLocked(aAutoLock);
      if (((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
        return rv;
      }
    }
    if (!generation.AppendElement(aObj)) {
      return NS_ERROR_OUT_OF_MEMORY;
    }
    state->mGeneration = mNewestGeneration;
    state->mIndexInGeneration = index;
    return NS_OK;
  }




  void RemoveObjectLocked(T* aObj, const AutoLock& aAutoLock)
  {
    nsExpirationState* state = aObj->GetExpirationState();
    do { } while(0);
    nsTArray<T*>& generation = mGenerations[state->mGeneration];
    uint32_t index = state->mIndexInGeneration;
    do { } while(0);


    uint32_t last = generation.Length() - 1;
    T* lastObj = generation[last];
    generation[index] = lastObj;
    lastObj->GetExpirationState()->mIndexInGeneration = index;
    generation.RemoveElementAt(last);
    state->mGeneration = nsExpirationState::NOT_TRACKED;





  }





  nsresult MarkUsedLocked(T* aObj, const AutoLock& aAutoLock)
  {
    nsExpirationState* state = aObj->GetExpirationState();
    if (mNewestGeneration == state->mGeneration) {
      return NS_OK;
    }
    RemoveObjectLocked(aObj, aAutoLock);
    return AddObjectLocked(aObj, aAutoLock);
  }





  void AgeOneGenerationLocked(const AutoLock& aAutoLock)
  {
    if (mInAgeOneGeneration) {
      do { } while(0);
      return;
    }

    mInAgeOneGeneration = true;
    uint32_t reapGeneration =
      mNewestGeneration > 0 ? mNewestGeneration - 1 : K - 1;
    nsTArray<T*>& generation = mGenerations[reapGeneration];
# 235 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h"
    size_t index = generation.Length();
    for (;;) {


      index = XPCOM_MIN(index, generation.Length());
      if (index == 0) {
        break;
      }
      --index;
      NotifyExpiredLocked(generation[index], aAutoLock);
    }


    if (!generation.IsEmpty()) {
      do { } while(0);
    }


    generation.Compact();
    mNewestGeneration = reapGeneration;
    mInAgeOneGeneration = false;
  }
# 265 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h"
  void AgeAllGenerationsLocked(const AutoLock& aAutoLock)
  {
    uint32_t i;
    for (i = 0; i < K; ++i) {
      AgeOneGenerationLocked(aAutoLock);
    }
  }

  class Iterator
  {
  private:
    ExpirationTrackerImpl<T, K, Mutex, AutoLock>* mTracker;
    uint32_t mGeneration;
    uint32_t mIndex;
  public:
    Iterator(ExpirationTrackerImpl<T, K, Mutex, AutoLock>* aTracker,
             AutoLock& aAutoLock)
      : mTracker(aTracker)
      , mGeneration(0)
      , mIndex(0)
    {
    }

    T* Next()
    {
      while (mGeneration < K) {
        nsTArray<T*>* generation = &mTracker->mGenerations[mGeneration];
        if (mIndex < generation->Length()) {
          ++mIndex;
          return (*generation)[mIndex - 1];
        }
        ++mGeneration;
        mIndex = 0;
      }
      return nullptr;
    }
  };

  friend class Iterator;

  bool IsEmptyLocked(const AutoLock& aAutoLock)
  {
    for (uint32_t i = 0; i < K; ++i) {
      if (!mGenerations[i].IsEmpty()) {
        return false;
      }
    }
    return true;
  }

protected:
# 342 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsExpirationTracker.h"
  virtual void NotifyExpiredLocked(T*, const AutoLock&) = 0;

  virtual Mutex& GetMutex() = 0;

private:
  class ExpirationTrackerObserver;
  RefPtr<ExpirationTrackerObserver> mObserver;
  nsTArray<T*> mGenerations[K];
  nsCOMPtr<nsITimer> mTimer;
  uint32_t mTimerPeriod;
  uint32_t mNewestGeneration;
  bool mInAgeOneGeneration;
  const char* const mName;
  const nsCOMPtr<nsIEventTarget> mEventTarget;





  class ExpirationTrackerObserver final : public nsIObserver
  {
  public:
    void Init(ExpirationTrackerImpl<T, K, Mutex, AutoLock>* aObj)
    {
      mOwner = aObj;
      nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
      if (obs) {
        obs->AddObserver(this, "memory-pressure", false);
      }
    }
    void Destroy()
    {
      mOwner = nullptr;
      nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
      if (obs) {
        obs->RemoveObserver(this, "memory-pressure");
      }
    }
    public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:
    virtual nsresult Observe(nsISupports *aSubject, const char * aTopic, const char16_t * aData) override;
  private:
    ExpirationTrackerImpl<T, K, Mutex, AutoLock>* mOwner;
  };

  void HandleLowMemory() {
    AutoLock lock(GetMutex());
    AgeAllGenerationsLocked(lock);
  }

  void HandleTimeout() {
    AutoLock lock(GetMutex());
    AgeOneGenerationLocked(lock);

    if (IsEmptyLocked(lock)) {
      mTimer->Cancel();
      mTimer = nullptr;
    }
  }

  static void TimerCallback(nsITimer* aTimer, void* aThis)
  {
    ExpirationTrackerImpl* tracker = static_cast<ExpirationTrackerImpl*>(aThis);
    tracker->HandleTimeout();
  }

  nsresult CheckStartTimerLocked(const AutoLock& aAutoLock)
  {
    if (mTimer || !mTimerPeriod) {
      return NS_OK;
    }
    mTimer = do_CreateInstance("@mozilla.org/timer;1");
    if (!mTimer) {
      return NS_ERROR_OUT_OF_MEMORY;
    }
    if (mEventTarget) {
      mTimer->SetTarget(mEventTarget);
    } else if (!NS_IsMainThread()) {


      nsCOMPtr<nsIEventTarget> target = do_GetMainThread();
      do { if ((__builtin_expect(!!(!(target)), 0))) { do { } while(0); return NS_ERROR_UNEXPECTED; } } while(0);
      mTimer->SetTarget(target);
    }
    mTimer->InitWithNamedFuncCallback(TimerCallback, this, mTimerPeriod,
                                      nsITimer::TYPE_REPEATING_SLACK, mName);
    return NS_OK;
  }
};

namespace detail {

class PlaceholderLock {
public:
  void Lock() {}
  void Unlock() {}
};

class PlaceholderAutoLock {
public:
  explicit PlaceholderAutoLock(PlaceholderLock&) { }
  ~PlaceholderAutoLock() = default;

};

template<typename T, uint32_t K>
using SingleThreadedExpirationTracker =
  ExpirationTrackerImpl<T, K, PlaceholderLock, PlaceholderAutoLock>;

}

template<typename T, uint32_t K>
class nsExpirationTracker : protected ::detail::SingleThreadedExpirationTracker<T, K>
{
  typedef ::detail::PlaceholderLock Lock;
  typedef ::detail::PlaceholderAutoLock AutoLock;

  Lock mLock;

  AutoLock FakeLock() {
    return AutoLock(mLock);
  }

  Lock& GetMutex() override
  {
    return mLock;
  }

  void NotifyExpiredLocked(T* aObject, const AutoLock&) override
  {
    NotifyExpired(aObject);
  }

protected:
  virtual void NotifyExpired(T* aObj) = 0;

public:
  nsExpirationTracker(uint32_t aTimerPeriod,
                      const char* aName,
                      nsIEventTarget* aEventTarget = nullptr)
    : ::detail::SingleThreadedExpirationTracker<T, K>(aTimerPeriod,
                                                      aName,
                                                      aEventTarget)
  { }

  virtual ~nsExpirationTracker()
  { }

  nsresult AddObject(T* aObj)
  {
    return this->AddObjectLocked(aObj, FakeLock());
  }

  void RemoveObject(T* aObj)
  {
    this->RemoveObjectLocked(aObj, FakeLock());
  }

  nsresult MarkUsed(T* aObj)
  {
    return this->MarkUsedLocked(aObj, FakeLock());
  }

  void AgeOneGeneration()
  {
    this->AgeOneGenerationLocked(FakeLock());
  }

  void AgeAllGenerations()
  {
    this->AgeAllGenerationsLocked(FakeLock());
  }

  class Iterator
  {
  private:
    AutoLock mAutoLock;
    typename ExpirationTrackerImpl<T, K, Lock, AutoLock>::Iterator mIterator;
  public:
    explicit Iterator(nsExpirationTracker<T, K>* aTracker)
      : mAutoLock(aTracker->GetMutex())
      , mIterator(aTracker, mAutoLock)
    {
    }

    T* Next()
    {
      return mIterator.Next();
    }
  };

  friend class Iterator;

  bool IsEmpty()
  {
    return this->IsEmptyLocked(FakeLock());
  }
};

template<typename T, uint32_t K, typename Mutex, typename AutoLock>
nsresult
ExpirationTrackerImpl<T, K, Mutex, AutoLock>::
ExpirationTrackerObserver::Observe(
    nsISupports* aSubject, const char* aTopic, const char16_t* aData)
{
  if (!strcmp(aTopic, "memory-pressure") && mOwner) {
    mOwner->HandleLowMemory();
  }
  return NS_OK;
}

template<class T, uint32_t K, typename Mutex, typename AutoLock>
MozExternalRefCountType
ExpirationTrackerImpl<T, K, Mutex, AutoLock>::
ExpirationTrackerObserver::AddRef(void)
{
  do { } while (0);
  ((void)0);
  ++mRefCnt;
                                                                          ;
  return mRefCnt;
}

template<class T, uint32_t K, typename Mutex, typename AutoLock>
MozExternalRefCountType
ExpirationTrackerImpl<T, K, Mutex, AutoLock>::
ExpirationTrackerObserver::Release(void)
{
  do { } while (0);
  ((void)0);
  --mRefCnt;
                                                            ;
  if (mRefCnt == 0) {
    ((void)0);
    mRefCnt = 1;
    delete (this);
    return 0;
  }
  return mRefCnt;
}

template<class T, uint32_t K, typename Mutex, typename AutoLock>
nsresult
ExpirationTrackerImpl<T, K, Mutex, AutoLock>::
ExpirationTrackerObserver::QueryInterface(
    const nsIID& aIID, void** aInstancePtr)
{
  do { } while(0);

  nsresult rv = NS_ERROR_FAILURE;
  static_assert( sizeof("(nsIObserver)") != sizeof("()") && (11) > 10 && (int)(0.01) == 0, "MOZ_STATIC_ASSERT_VALID_ARG_COUNT requires 1 to 50 arguments"); static const QITableEntry table[] = { { &(nsIObserver::COMTypeInfo<nsIObserver, void>::kIID), int32_t(reinterpret_cast<char*>( static_cast<nsIObserver*>((ExpirationTrackerObserver*) 0x1000)) - reinterpret_cast<char*>((ExpirationTrackerObserver*) 0x1000)) }, { &(nsISupports::COMTypeInfo<nsISupports, void>::kIID), int32_t(reinterpret_cast<char*>( static_cast<nsISupports*>( static_cast<nsIObserver*>( (ExpirationTrackerObserver*) 0x1000))) - reinterpret_cast<char*>((ExpirationTrackerObserver*) 0x1000)) }, { nullptr, 0 } }; static_assert((sizeof(table)/sizeof(table[0])) > 1, "need at least 1 interface"); rv = NS_TableDrivenQI(static_cast<void*>(this), aIID, aInstancePtr, table);
  return rv;
}
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsClassHashtable.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsClassHashtable.h"
template<class KeyClass, class T>
class nsClassHashtable
  : public nsBaseHashtable<KeyClass, nsAutoPtr<T>, T*>
{
public:
  typedef typename KeyClass::KeyType KeyType;
  typedef T* UserDataType;
  typedef nsBaseHashtable<KeyClass, nsAutoPtr<T>, T*> base_type;

  using base_type::IsEmpty;

  nsClassHashtable() {}
  explicit nsClassHashtable(uint32_t aInitLength)
    : nsBaseHashtable<KeyClass, nsAutoPtr<T>, T*>(aInitLength)
  {
  }





  template<typename... Args>
  UserDataType LookupOrAdd(KeyType aKey, Args&&... aConstructionArgs);





  bool Get(KeyType aKey, UserDataType* aData) const;





  UserDataType Get(KeyType aKey) const;
# 70 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsClassHashtable.h"
  void RemoveAndForget(KeyType aKey, nsAutoPtr<T>& aOut);
};





template<class KeyClass, class T>
template<typename... Args>
T*
nsClassHashtable<KeyClass, T>::LookupOrAdd(KeyType aKey,
                                           Args&&... aConstructionArgs)
{
  typename base_type::EntryType* ent = this->PutEntry(aKey);
  if (!ent->mData) {
    ent->mData = new T(mozilla::Forward<Args>(aConstructionArgs)...);
  }
  return ent->mData;
}

template<class KeyClass, class T>
bool
nsClassHashtable<KeyClass, T>::Get(KeyType aKey, T** aRetVal) const
{
  typename base_type::EntryType* ent = this->GetEntry(aKey);

  if (ent) {
    if (aRetVal) {
      *aRetVal = ent->mData;
    }

    return true;
  }

  if (aRetVal) {
    *aRetVal = nullptr;
  }

  return false;
}

template<class KeyClass, class T>
T*
nsClassHashtable<KeyClass, T>::Get(KeyType aKey) const
{
  typename base_type::EntryType* ent = this->GetEntry(aKey);
  if (!ent) {
    return nullptr;
  }

  return ent->mData;
}

template<class KeyClass, class T>
void
nsClassHashtable<KeyClass, T>::RemoveAndForget(KeyType aKey, nsAutoPtr<T>& aOut)
{
  aOut = nullptr;

  typename base_type::EntryType* ent = this->GetEntry(aKey);
  if (!ent) {
    return;
  }


  aOut = mozilla::Move(ent->mData);

  this->Remove(aKey);
}
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prclist.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prclist.h"
typedef struct PRCListStr PRCList;




struct PRCListStr {
    PRCList *next;
    PRCList *prev;
};
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2







# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 1 3
# 46 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
# 60 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
namespace std __attribute__ ((__visibility__ ("default")))
{
# 70 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
  template<size_t _Nw>
    struct _Base_bitset
    {
      typedef unsigned long _WordT;


      _WordT _M_w[_Nw];

      constexpr _Base_bitset() noexcept
      : _M_w() { }


      constexpr _Base_bitset(unsigned long long __val) noexcept
      : _M_w{ _WordT(__val)



       } { }






      static constexpr size_t
      _S_whichword(size_t __pos) noexcept
      { return __pos / (8 * 8); }

      static constexpr size_t
      _S_whichbyte(size_t __pos) noexcept
      { return (__pos % (8 * 8)) / 8; }

      static constexpr size_t
      _S_whichbit(size_t __pos) noexcept
      { return __pos % (8 * 8); }

      static constexpr _WordT
      _S_maskbit(size_t __pos) noexcept
      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }

      _WordT&
      _M_getword(size_t __pos) noexcept
      { return _M_w[_S_whichword(__pos)]; }

      constexpr _WordT
      _M_getword(size_t __pos) const noexcept
      { return _M_w[_S_whichword(__pos)]; }


      const _WordT*
      _M_getdata() const noexcept
      { return _M_w; }


      _WordT&
      _M_hiword() noexcept
      { return _M_w[_Nw - 1]; }

      constexpr _WordT
      _M_hiword() const noexcept
      { return _M_w[_Nw - 1]; }

      void
      _M_do_and(const _Base_bitset<_Nw>& __x) noexcept
      {
 for (size_t __i = 0; __i < _Nw; __i++)
   _M_w[__i] &= __x._M_w[__i];
      }

      void
      _M_do_or(const _Base_bitset<_Nw>& __x) noexcept
      {
 for (size_t __i = 0; __i < _Nw; __i++)
   _M_w[__i] |= __x._M_w[__i];
      }

      void
      _M_do_xor(const _Base_bitset<_Nw>& __x) noexcept
      {
 for (size_t __i = 0; __i < _Nw; __i++)
   _M_w[__i] ^= __x._M_w[__i];
      }

      void
      _M_do_left_shift(size_t __shift) noexcept;

      void
      _M_do_right_shift(size_t __shift) noexcept;

      void
      _M_do_flip() noexcept
      {
 for (size_t __i = 0; __i < _Nw; __i++)
   _M_w[__i] = ~_M_w[__i];
      }

      void
      _M_do_set() noexcept
      {
 for (size_t __i = 0; __i < _Nw; __i++)
   _M_w[__i] = ~static_cast<_WordT>(0);
      }

      void
      _M_do_reset() noexcept
      { __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT)); }

      bool
      _M_is_equal(const _Base_bitset<_Nw>& __x) const noexcept
      {
 for (size_t __i = 0; __i < _Nw; ++__i)
   if (_M_w[__i] != __x._M_w[__i])
     return false;
 return true;
      }

      template<size_t _Nb>
        bool
        _M_are_all() const noexcept
        {
   for (size_t __i = 0; __i < _Nw - 1; __i++)
     if (_M_w[__i] != ~static_cast<_WordT>(0))
       return false;
   return _M_hiword() == (~static_cast<_WordT>(0)
     >> (_Nw * (8 * 8)
         - _Nb));
 }

      bool
      _M_is_any() const noexcept
      {
 for (size_t __i = 0; __i < _Nw; __i++)
   if (_M_w[__i] != static_cast<_WordT>(0))
     return true;
 return false;
      }

      size_t
      _M_do_count() const noexcept
      {
 size_t __result = 0;
 for (size_t __i = 0; __i < _Nw; __i++)
   __result += __builtin_popcountl(_M_w[__i]);
 return __result;
      }

      unsigned long
      _M_do_to_ulong() const;


      unsigned long long
      _M_do_to_ullong() const;



      size_t
      _M_do_find_first(size_t) const noexcept;


      size_t
      _M_do_find_next(size_t, size_t) const noexcept;
    };


  template<size_t _Nw>
    void
    _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) noexcept
    {
      if (__builtin_expect(__shift != 0, 1))
 {
   const size_t __wshift = __shift / (8 * 8);
   const size_t __offset = __shift % (8 * 8);

   if (__offset == 0)
     for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
       _M_w[__n] = _M_w[__n - __wshift];
   else
     {
       const size_t __sub_offset = ((8 * 8)
        - __offset);
       for (size_t __n = _Nw - 1; __n > __wshift; --__n)
  _M_w[__n] = ((_M_w[__n - __wshift] << __offset)
        | (_M_w[__n - __wshift - 1] >> __sub_offset));
       _M_w[__wshift] = _M_w[0] << __offset;
     }

   std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0));
 }
    }

  template<size_t _Nw>
    void
    _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) noexcept
    {
      if (__builtin_expect(__shift != 0, 1))
 {
   const size_t __wshift = __shift / (8 * 8);
   const size_t __offset = __shift % (8 * 8);
   const size_t __limit = _Nw - __wshift - 1;

   if (__offset == 0)
     for (size_t __n = 0; __n <= __limit; ++__n)
       _M_w[__n] = _M_w[__n + __wshift];
   else
     {
       const size_t __sub_offset = ((8 * 8)
        - __offset);
       for (size_t __n = 0; __n < __limit; ++__n)
  _M_w[__n] = ((_M_w[__n + __wshift] >> __offset)
        | (_M_w[__n + __wshift + 1] << __sub_offset));
       _M_w[__limit] = _M_w[_Nw-1] >> __offset;
     }

   std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0));
 }
    }

  template<size_t _Nw>
    unsigned long
    _Base_bitset<_Nw>::_M_do_to_ulong() const
    {
      for (size_t __i = 1; __i < _Nw; ++__i)
 if (_M_w[__i])
   __throw_overflow_error(("_Base_bitset::_M_do_to_ulong"));
      return _M_w[0];
    }


  template<size_t _Nw>
    unsigned long long
    _Base_bitset<_Nw>::_M_do_to_ullong() const
    {
      const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long);
      for (size_t __i = 1 + __dw; __i < _Nw; ++__i)
 if (_M_w[__i])
   __throw_overflow_error(("_Base_bitset::_M_do_to_ullong"));

      if (__dw)
 return _M_w[0] + (static_cast<unsigned long long>(_M_w[1])
     << (8 * 8));
      return _M_w[0];
    }


  template<size_t _Nw>
    size_t
    _Base_bitset<_Nw>::
    _M_do_find_first(size_t __not_found) const noexcept
    {
      for (size_t __i = 0; __i < _Nw; __i++)
 {
   _WordT __thisword = _M_w[__i];
   if (__thisword != static_cast<_WordT>(0))
     return (__i * (8 * 8)
      + __builtin_ctzl(__thisword));
 }

      return __not_found;
    }

  template<size_t _Nw>
    size_t
    _Base_bitset<_Nw>::
    _M_do_find_next(size_t __prev, size_t __not_found) const noexcept
    {

      ++__prev;


      if (__prev >= _Nw * (8 * 8))
 return __not_found;


      size_t __i = _S_whichword(__prev);
      _WordT __thisword = _M_w[__i];


      __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);

      if (__thisword != static_cast<_WordT>(0))
 return (__i * (8 * 8)
  + __builtin_ctzl(__thisword));


      __i++;
      for (; __i < _Nw; __i++)
 {
   __thisword = _M_w[__i];
   if (__thisword != static_cast<_WordT>(0))
     return (__i * (8 * 8)
      + __builtin_ctzl(__thisword));
 }

      return __not_found;
    }






  template<>
    struct _Base_bitset<1>
    {
      typedef unsigned long _WordT;
      _WordT _M_w;

      constexpr _Base_bitset() noexcept
      : _M_w(0)
      { }


      constexpr _Base_bitset(unsigned long long __val) noexcept



      : _M_w(__val)
      { }

      static constexpr size_t
      _S_whichword(size_t __pos) noexcept
      { return __pos / (8 * 8); }

      static constexpr size_t
      _S_whichbyte(size_t __pos) noexcept
      { return (__pos % (8 * 8)) / 8; }

      static constexpr size_t
      _S_whichbit(size_t __pos) noexcept
      { return __pos % (8 * 8); }

      static constexpr _WordT
      _S_maskbit(size_t __pos) noexcept
      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }

      _WordT&
      _M_getword(size_t) noexcept
      { return _M_w; }

      constexpr _WordT
      _M_getword(size_t) const noexcept
      { return _M_w; }


      const _WordT*
      _M_getdata() const noexcept
      { return &_M_w; }


      _WordT&
      _M_hiword() noexcept
      { return _M_w; }

      constexpr _WordT
      _M_hiword() const noexcept
      { return _M_w; }

      void
      _M_do_and(const _Base_bitset<1>& __x) noexcept
      { _M_w &= __x._M_w; }

      void
      _M_do_or(const _Base_bitset<1>& __x) noexcept
      { _M_w |= __x._M_w; }

      void
      _M_do_xor(const _Base_bitset<1>& __x) noexcept
      { _M_w ^= __x._M_w; }

      void
      _M_do_left_shift(size_t __shift) noexcept
      { _M_w <<= __shift; }

      void
      _M_do_right_shift(size_t __shift) noexcept
      { _M_w >>= __shift; }

      void
      _M_do_flip() noexcept
      { _M_w = ~_M_w; }

      void
      _M_do_set() noexcept
      { _M_w = ~static_cast<_WordT>(0); }

      void
      _M_do_reset() noexcept
      { _M_w = 0; }

      bool
      _M_is_equal(const _Base_bitset<1>& __x) const noexcept
      { return _M_w == __x._M_w; }

      template<size_t _Nb>
        bool
        _M_are_all() const noexcept
        { return _M_w == (~static_cast<_WordT>(0)
     >> ((8 * 8) - _Nb)); }

      bool
      _M_is_any() const noexcept
      { return _M_w != 0; }

      size_t
      _M_do_count() const noexcept
      { return __builtin_popcountl(_M_w); }

      unsigned long
      _M_do_to_ulong() const noexcept
      { return _M_w; }


      unsigned long long
      _M_do_to_ullong() const noexcept
      { return _M_w; }


      size_t
      _M_do_find_first(size_t __not_found) const noexcept
      {
        if (_M_w != 0)
          return __builtin_ctzl(_M_w);
        else
          return __not_found;
      }


      size_t
      _M_do_find_next(size_t __prev, size_t __not_found) const
 noexcept
      {
 ++__prev;
 if (__prev >= ((size_t) (8 * 8)))
   return __not_found;

 _WordT __x = _M_w >> __prev;
 if (__x != 0)
   return __builtin_ctzl(__x) + __prev;
 else
   return __not_found;
      }
    };






  template<>
    struct _Base_bitset<0>
    {
      typedef unsigned long _WordT;

      constexpr _Base_bitset() noexcept
      { }


      constexpr _Base_bitset(unsigned long long) noexcept



      { }

      static constexpr size_t
      _S_whichword(size_t __pos) noexcept
      { return __pos / (8 * 8); }

      static constexpr size_t
      _S_whichbyte(size_t __pos) noexcept
      { return (__pos % (8 * 8)) / 8; }

      static constexpr size_t
      _S_whichbit(size_t __pos) noexcept
      { return __pos % (8 * 8); }

      static constexpr _WordT
      _S_maskbit(size_t __pos) noexcept
      { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); }
# 556 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      _WordT&
      _M_getword(size_t) noexcept
      {
 __throw_out_of_range(("_Base_bitset::_M_getword"));
 return *new _WordT;
      }

      constexpr _WordT
      _M_getword(size_t __pos) const noexcept
      { return 0; }

      constexpr _WordT
      _M_hiword() const noexcept
      { return 0; }

      void
      _M_do_and(const _Base_bitset<0>&) noexcept
      { }

      void
      _M_do_or(const _Base_bitset<0>&) noexcept
      { }

      void
      _M_do_xor(const _Base_bitset<0>&) noexcept
      { }

      void
      _M_do_left_shift(size_t) noexcept
      { }

      void
      _M_do_right_shift(size_t) noexcept
      { }

      void
      _M_do_flip() noexcept
      { }

      void
      _M_do_set() noexcept
      { }

      void
      _M_do_reset() noexcept
      { }




      bool
      _M_is_equal(const _Base_bitset<0>&) const noexcept
      { return true; }

      template<size_t _Nb>
        bool
        _M_are_all() const noexcept
        { return true; }

      bool
      _M_is_any() const noexcept
      { return false; }

      size_t
      _M_do_count() const noexcept
      { return 0; }

      unsigned long
      _M_do_to_ulong() const noexcept
      { return 0; }


      unsigned long long
      _M_do_to_ullong() const noexcept
      { return 0; }




      size_t
      _M_do_find_first(size_t) const noexcept
      { return 0; }

      size_t
      _M_do_find_next(size_t, size_t) const noexcept
      { return 0; }
    };



  template<size_t _Extrabits>
    struct _Sanitize
    {
      typedef unsigned long _WordT;

      static void
      _S_do_sanitize(_WordT& __val) noexcept
      { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); }
    };

  template<>
    struct _Sanitize<0>
    {
      typedef unsigned long _WordT;

      static void
      _S_do_sanitize(_WordT) noexcept { }
    };


  template<size_t _Nb, bool = (_Nb < (8 * 8))>
    struct _Sanitize_val
    {
      static constexpr unsigned long long
      _S_do_sanitize_val(unsigned long long __val)
      { return __val; }
    };

  template<size_t _Nb>
    struct _Sanitize_val<_Nb, true>
    {
      static constexpr unsigned long long
      _S_do_sanitize_val(unsigned long long __val)
      { return __val & ~((~static_cast<unsigned long long>(0)) << _Nb); }
    };
# 746 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
  template<size_t _Nb>
    class bitset
    : private _Base_bitset<((_Nb) / (8 * 8) + ((_Nb) % (8 * 8) == 0 ? 0 : 1))>
    {
    private:
      typedef _Base_bitset<((_Nb) / (8 * 8) + ((_Nb) % (8 * 8) == 0 ? 0 : 1))> _Base;
      typedef unsigned long _WordT;

      template<class _CharT, class _Traits, class _Alloc>
      void
      _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
    size_t __position) const
      {
 if (__position > __s.size())
   __throw_out_of_range_fmt(("bitset::bitset: __position " "(which is %zu) > __s.size() " "(which is %zu)"),


       __position, __s.size());
      }

      void _M_check(size_t __position, const char *__s) const
      {
 if (__position >= _Nb)
   __throw_out_of_range_fmt(("%s: __position (which is %zu) " ">= _Nb (which is %zu)"),

       __s, __position, _Nb);
      }

      void
      _M_do_sanitize() noexcept
      {
 typedef _Sanitize<_Nb % (8 * 8)> __sanitize_type;
 __sanitize_type::_S_do_sanitize(this->_M_hiword());
      }


      template<typename> friend struct hash;


    public:
# 798 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      class reference
      {
 friend class bitset;

 _WordT* _M_wp;
 size_t _M_bpos;


 reference();

      public:
 reference(bitset& __b, size_t __pos) noexcept
 {
   _M_wp = &__b._M_getword(__pos);
   _M_bpos = _Base::_S_whichbit(__pos);
 }

 ~reference() noexcept
 { }


 reference&
 operator=(bool __x) noexcept
 {
   if (__x)
     *_M_wp |= _Base::_S_maskbit(_M_bpos);
   else
     *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
   return *this;
 }


 reference&
 operator=(const reference& __j) noexcept
 {
   if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos)))
     *_M_wp |= _Base::_S_maskbit(_M_bpos);
   else
     *_M_wp &= ~_Base::_S_maskbit(_M_bpos);
   return *this;
 }


 bool
 operator~() const noexcept
 { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; }


 operator bool() const noexcept
 { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; }


 reference&
 flip() noexcept
 {
   *_M_wp ^= _Base::_S_maskbit(_M_bpos);
   return *this;
 }
      };
      friend class reference;



      constexpr bitset() noexcept
      { }



      constexpr bitset(unsigned long long __val) noexcept
      : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { }
# 883 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      template<class _CharT, class _Traits, class _Alloc>
 explicit
 bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
        size_t __position = 0)
 : _Base()
 {
   _M_check_initial_position(__s, __position);
   _M_copy_from_string(__s, __position,
         std::basic_string<_CharT, _Traits, _Alloc>::npos,
         _CharT('0'), _CharT('1'));
 }
# 905 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      template<class _CharT, class _Traits, class _Alloc>
 bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
        size_t __position, size_t __n)
 : _Base()
 {
   _M_check_initial_position(__s, __position);
   _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1'));
 }



      template<class _CharT, class _Traits, class _Alloc>
 bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s,
        size_t __position, size_t __n,
        _CharT __zero, _CharT __one = _CharT('1'))
 : _Base()
 {
   _M_check_initial_position(__s, __position);
   _M_copy_from_string(__s, __position, __n, __zero, __one);
 }
# 936 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      template<typename _CharT>
        explicit
        bitset(const _CharT* __str,
        typename std::basic_string<_CharT>::size_type __n
        = std::basic_string<_CharT>::npos,
        _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
        : _Base()
        {
   if (!__str)
     __throw_logic_error(("bitset::bitset(const _CharT*, ...)"));

   if (__n == std::basic_string<_CharT>::npos)
     __n = std::char_traits<_CharT>::length(__str);
   _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0,
            __n, __zero,
            __one);
 }
# 963 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      bitset<_Nb>&
      operator&=(const bitset<_Nb>& __rhs) noexcept
      {
 this->_M_do_and(__rhs);
 return *this;
      }

      bitset<_Nb>&
      operator|=(const bitset<_Nb>& __rhs) noexcept
      {
 this->_M_do_or(__rhs);
 return *this;
      }

      bitset<_Nb>&
      operator^=(const bitset<_Nb>& __rhs) noexcept
      {
 this->_M_do_xor(__rhs);
 return *this;
      }
# 992 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      bitset<_Nb>&
      operator<<=(size_t __position) noexcept
      {
 if (__builtin_expect(__position < _Nb, 1))
   {
     this->_M_do_left_shift(__position);
     this->_M_do_sanitize();
   }
 else
   this->_M_do_reset();
 return *this;
      }

      bitset<_Nb>&
      operator>>=(size_t __position) noexcept
      {
 if (__builtin_expect(__position < _Nb, 1))
   {
     this->_M_do_right_shift(__position);
     this->_M_do_sanitize();
   }
 else
   this->_M_do_reset();
 return *this;
      }
# 1025 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      bitset<_Nb>&
      _Unchecked_set(size_t __pos) noexcept
      {
 this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
 return *this;
      }

      bitset<_Nb>&
      _Unchecked_set(size_t __pos, int __val) noexcept
      {
 if (__val)
   this->_M_getword(__pos) |= _Base::_S_maskbit(__pos);
 else
   this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
 return *this;
      }

      bitset<_Nb>&
      _Unchecked_reset(size_t __pos) noexcept
      {
 this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);
 return *this;
      }

      bitset<_Nb>&
      _Unchecked_flip(size_t __pos) noexcept
      {
 this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);
 return *this;
      }

      constexpr bool
      _Unchecked_test(size_t __pos) const noexcept
      { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos))
  != static_cast<_WordT>(0)); }






      bitset<_Nb>&
      set() noexcept
      {
 this->_M_do_set();
 this->_M_do_sanitize();
 return *this;
      }







      bitset<_Nb>&
      set(size_t __position, bool __val = true)
      {
 this->_M_check(__position, ("bitset::set"));
 return _Unchecked_set(__position, __val);
      }




      bitset<_Nb>&
      reset() noexcept
      {
 this->_M_do_reset();
 return *this;
      }
# 1104 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      bitset<_Nb>&
      reset(size_t __position)
      {
 this->_M_check(__position, ("bitset::reset"));
 return _Unchecked_reset(__position);
      }




      bitset<_Nb>&
      flip() noexcept
      {
 this->_M_do_flip();
 this->_M_do_sanitize();
 return *this;
      }






      bitset<_Nb>&
      flip(size_t __position)
      {
 this->_M_check(__position, ("bitset::flip"));
 return _Unchecked_flip(__position);
      }


      bitset<_Nb>
      operator~() const noexcept
      { return bitset<_Nb>(*this).flip(); }
# 1154 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      reference
      operator[](size_t __position)
      { return reference(*this, __position); }

      constexpr bool
      operator[](size_t __position) const
      { return _Unchecked_test(__position); }
# 1169 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      unsigned long
      to_ulong() const
      { return this->_M_do_to_ulong(); }


      unsigned long long
      to_ullong() const
      { return this->_M_do_to_ullong(); }
# 1187 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      template<class _CharT, class _Traits, class _Alloc>
 std::basic_string<_CharT, _Traits, _Alloc>
 to_string() const
 {
   std::basic_string<_CharT, _Traits, _Alloc> __result;
   _M_copy_to_string(__result, _CharT('0'), _CharT('1'));
   return __result;
 }



      template<class _CharT, class _Traits, class _Alloc>
 std::basic_string<_CharT, _Traits, _Alloc>
 to_string(_CharT __zero, _CharT __one = _CharT('1')) const
 {
   std::basic_string<_CharT, _Traits, _Alloc> __result;
   _M_copy_to_string(__result, __zero, __one);
   return __result;
 }



      template<class _CharT, class _Traits>
 std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
 to_string() const
 { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }



      template<class _CharT, class _Traits>
 std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
 to_string(_CharT __zero, _CharT __one = _CharT('1')) const
 { return to_string<_CharT, _Traits,
                    std::allocator<_CharT> >(__zero, __one); }

      template<class _CharT>
 std::basic_string<_CharT, std::char_traits<_CharT>,
                   std::allocator<_CharT> >
 to_string() const
 {
   return to_string<_CharT, std::char_traits<_CharT>,
                    std::allocator<_CharT> >();
 }

      template<class _CharT>
 std::basic_string<_CharT, std::char_traits<_CharT>,
                   std::allocator<_CharT> >
 to_string(_CharT __zero, _CharT __one = _CharT('1')) const
 {
   return to_string<_CharT, std::char_traits<_CharT>,
                    std::allocator<_CharT> >(__zero, __one);
 }

      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
      to_string() const
      {
 return to_string<char, std::char_traits<char>,
                  std::allocator<char> >();
      }

      std::basic_string<char, std::char_traits<char>, std::allocator<char> >
      to_string(char __zero, char __one = '1') const
      {
 return to_string<char, std::char_traits<char>,
                  std::allocator<char> >(__zero, __one);
      }


      template<class _CharT, class _Traits>
        void
        _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t,
    _CharT, _CharT);

      template<class _CharT, class _Traits, class _Alloc>
 void
 _M_copy_from_string(const std::basic_string<_CharT,
       _Traits, _Alloc>& __s, size_t __pos, size_t __n,
       _CharT __zero, _CharT __one)
 { _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n,
         __zero, __one); }

      template<class _CharT, class _Traits, class _Alloc>
 void
        _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&,
     _CharT, _CharT) const;


      template<class _CharT, class _Traits, class _Alloc>
 void
 _M_copy_from_string(const std::basic_string<_CharT,
       _Traits, _Alloc>& __s, size_t __pos, size_t __n)
 { _M_copy_from_string(__s, __pos, __n, _CharT('0'), _CharT('1')); }

      template<class _CharT, class _Traits, class _Alloc>
 void
        _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const
 { _M_copy_to_string(__s, _CharT('0'), _CharT('1')); }


      size_t
      count() const noexcept
      { return this->_M_do_count(); }


      constexpr size_t
      size() const noexcept
      { return _Nb; }



      bool
      operator==(const bitset<_Nb>& __rhs) const noexcept
      { return this->_M_is_equal(__rhs); }

      bool
      operator!=(const bitset<_Nb>& __rhs) const noexcept
      { return !this->_M_is_equal(__rhs); }
# 1312 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      bool
      test(size_t __position) const
      {
 this->_M_check(__position, ("bitset::test"));
 return _Unchecked_test(__position);
      }







      bool
      all() const noexcept
      { return this->template _M_are_all<_Nb>(); }





      bool
      any() const noexcept
      { return this->_M_is_any(); }





      bool
      none() const noexcept
      { return !this->_M_is_any(); }



      bitset<_Nb>
      operator<<(size_t __position) const noexcept
      { return bitset<_Nb>(*this) <<= __position; }

      bitset<_Nb>
      operator>>(size_t __position) const noexcept
      { return bitset<_Nb>(*this) >>= __position; }
# 1362 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      size_t
      _Find_first() const noexcept
      { return this->_M_do_find_first(_Nb); }
# 1373 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
      size_t
      _Find_next(size_t __prev) const noexcept
      { return this->_M_do_find_next(__prev, _Nb); }
    };


  template<size_t _Nb>
    template<class _CharT, class _Traits>
      void
      bitset<_Nb>::
      _M_copy_from_ptr(const _CharT* __s, size_t __len,
         size_t __pos, size_t __n, _CharT __zero, _CharT __one)
      {
 reset();
 const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos)));
 for (size_t __i = __nbits; __i > 0; --__i)
   {
     const _CharT __c = __s[__pos + __nbits - __i];
     if (_Traits::eq(__c, __zero))
       ;
     else if (_Traits::eq(__c, __one))
       _Unchecked_set(__i - 1);
     else
       __throw_invalid_argument(("bitset::_M_copy_from_ptr"));
   }
      }

  template<size_t _Nb>
    template<class _CharT, class _Traits, class _Alloc>
      void
      bitset<_Nb>::
      _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s,
   _CharT __zero, _CharT __one) const
      {
 __s.assign(_Nb, __zero);
 for (size_t __i = _Nb; __i > 0; --__i)
   if (_Unchecked_test(__i - 1))
     _Traits::assign(__s[_Nb - __i], __one);
      }
# 1423 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
  template<size_t _Nb>
    inline bitset<_Nb>
    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) noexcept
    {
      bitset<_Nb> __result(__x);
      __result &= __y;
      return __result;
    }

  template<size_t _Nb>
    inline bitset<_Nb>
    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) noexcept
    {
      bitset<_Nb> __result(__x);
      __result |= __y;
      return __result;
    }

  template <size_t _Nb>
    inline bitset<_Nb>
    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) noexcept
    {
      bitset<_Nb> __result(__x);
      __result ^= __y;
      return __result;
    }
# 1460 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
  template<class _CharT, class _Traits, size_t _Nb>
    std::basic_istream<_CharT, _Traits>&
    operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
    {
      typedef typename _Traits::char_type char_type;
      typedef std::basic_istream<_CharT, _Traits> __istream_type;
      typedef typename __istream_type::ios_base __ios_base;

      std::basic_string<_CharT, _Traits> __tmp;
      __tmp.reserve(_Nb);



      const char_type __zero = __is.widen('0');
      const char_type __one = __is.widen('1');

      typename __ios_base::iostate __state = __ios_base::goodbit;
      typename __istream_type::sentry __sentry(__is);
      if (__sentry)
 {
   try
     {
       for (size_t __i = _Nb; __i > 0; --__i)
  {
    static typename _Traits::int_type __eof = _Traits::eof();

    typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc();
    if (_Traits::eq_int_type(__c1, __eof))
      {
        __state |= __ios_base::eofbit;
        break;
      }
    else
      {
        const char_type __c2 = _Traits::to_char_type(__c1);
        if (_Traits::eq(__c2, __zero))
   __tmp.push_back(__zero);
        else if (_Traits::eq(__c2, __one))
   __tmp.push_back(__one);
        else if (_Traits::
          eq_int_type(__is.rdbuf()->sputbackc(__c2),
        __eof))
   {
     __state |= __ios_base::failbit;
     break;
   }
      }
  }
     }
   catch(__cxxabiv1::__forced_unwind&)
     {
       __is._M_setstate(__ios_base::badbit);
       throw;
     }
   catch(...)
     { __is._M_setstate(__ios_base::badbit); }
 }

      if (__tmp.empty() && _Nb)
 __state |= __ios_base::failbit;
      else
 __x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb,
    __zero, __one);
      if (__state)
 __is.setstate(__state);
      return __is;
    }

  template <class _CharT, class _Traits, size_t _Nb>
    std::basic_ostream<_CharT, _Traits>&
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
        const bitset<_Nb>& __x)
    {
      std::basic_string<_CharT, _Traits> __tmp;



      const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__os.getloc());
      __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1'));
      return __os << __tmp;
    }



}
# 1554 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bitset" 3
namespace std __attribute__ ((__visibility__ ("default")))
{




  template<size_t _Nb>
    struct hash<std::bitset<_Nb>>
    : public __hash_base<size_t, std::bitset<_Nb>>
    {
      size_t
      operator()(const std::bitset<_Nb>& __b) const noexcept
      {
 const size_t __clength = (_Nb + 8 - 1) / 8;
 return std::_Hash_impl::hash(__b._M_getdata(), __clength);
      }
    };

  template<>
    struct hash<std::bitset<0>>
    : public __hash_base<size_t, std::bitset<0>>
    {
      size_t
      operator()(const std::bitset<0>&) const noexcept
      { return 0; }
    };


}
# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DocumentBinding.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DocumentBinding.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionMember.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionMember.h"
namespace mozilla {
namespace dom {



template<class T>
class UnionMember
{
  AlignedStorage2<T> mStorage;



  UnionMember(const UnionMember&) = delete;

public:
  UnionMember() = default;
  ~UnionMember() = default;

  T& SetValue()
  {
    new (mStorage.addr()) T();
    return *mStorage.addr();
  }
  template <typename T1>
  T& SetValue(const T1& aValue)
  {
    new (mStorage.addr()) T(aValue);
    return *mStorage.addr();
  }
  template<typename T1, typename T2>
  T& SetValue(const T1& aValue1, const T2& aValue2)
  {
    new (mStorage.addr()) T(aValue1, aValue2);
    return *mStorage.addr();
  }
  T& Value()
  {
    return *mStorage.addr();
  }
  const T& Value() const
  {
    return *mStorage.addr();
  }
  void Destroy()
  {
    mStorage.addr()->~T();
  }
};

}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DocumentBinding.h" 2

class nsIDocument;
struct nsIDocumentAtoms;

namespace mozilla {
namespace dom {

struct ElementCreationOptionsAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

enum class VisibilityState : uint8_t {
  Hidden,
  Visible,
  Prerender,
  EndGuard_
};

namespace VisibilityStateValues {
extern const EnumEntry strings[4];
}

bool
ToJSValue(JSContext* aCx, VisibilityState aArgument, JS::MutableHandle<JS::Value> aValue);


enum class FlashClassification : uint8_t {
  Unclassified,
  Unknown,
  Allowed,
  Denied,
  EndGuard_
};

namespace FlashClassificationValues {
extern const EnumEntry strings[5];
}

bool
ToJSValue(JSContext* aCx, FlashClassification aArgument, JS::MutableHandle<JS::Value> aValue);


struct ElementCreationOptions : public DictionaryBase
{
                        Optional<nsString> mIs;
                        Optional<nsString> mPseudo;

  ElementCreationOptions();

  explicit inline ElementCreationOptions(const FastDictionaryInitializer& )
  {

  }

  explicit inline ElementCreationOptions(const ElementCreationOptions& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  ElementCreationOptions&
  operator=(const ElementCreationOptions& aOther);

private:
  static bool
  InitIds(JSContext* cx, ElementCreationOptionsAtoms* atomsCache);
};

namespace binding_detail {
struct FastElementCreationOptions : public ElementCreationOptions
{
  inline FastElementCreationOptions()
    : ElementCreationOptions(FastDictionaryInitializer())
  {

  }
};
}


class ElementCreationOptionsOrString
{
  friend class ElementCreationOptionsOrStringArgument;
  enum Type
  {
    eUninitialized,
    eElementCreationOptions,
    eString
  };

  union Value
  {
    UnionMember<binding_detail::FastElementCreationOptions > mElementCreationOptions;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  ElementCreationOptionsOrString(const ElementCreationOptionsOrString&) = delete;
  ElementCreationOptionsOrString& operator=(const ElementCreationOptionsOrString&) = delete;
public:
  explicit inline ElementCreationOptionsOrString()
    : mType(eUninitialized)
  {
  }

  inline ~ElementCreationOptionsOrString()
  {
    Uninit();
  }

  inline binding_detail::FastElementCreationOptions&
  RawSetAsElementCreationOptions()
  {
    if (mType == eElementCreationOptions) {
      return mValue.mElementCreationOptions.Value();
    }
    do { } while (0);
    mType = eElementCreationOptions;
    return mValue.mElementCreationOptions.SetValue();
  }

  inline binding_detail::FastElementCreationOptions&
  SetAsElementCreationOptions()
  {
    if (mType == eElementCreationOptions) {
      return mValue.mElementCreationOptions.Value();
    }
    Uninit();
    mType = eElementCreationOptions;
    return mValue.mElementCreationOptions.SetValue();
  }

  inline bool
  IsElementCreationOptions() const
  {
    return mType == eElementCreationOptions;
  }

  inline binding_detail::FastElementCreationOptions&
  GetAsElementCreationOptions()
  {
    do { } while (0);
    return mValue.mElementCreationOptions.Value();
  }

  inline const ElementCreationOptions&
  GetAsElementCreationOptions() const
  {
    do { } while (0);
    return mValue.mElementCreationOptions.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eElementCreationOptions: {
        DestroyElementCreationOptions();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyElementCreationOptions()
  {
    do { } while (0);
    mValue.mElementCreationOptions.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};


class OwningElementCreationOptionsOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningElementCreationOptionsOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eElementCreationOptions,
    eString
  };

  union Value
  {
    UnionMember<ElementCreationOptions > mElementCreationOptions;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningElementCreationOptionsOrString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningElementCreationOptionsOrString(const OwningElementCreationOptionsOrString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningElementCreationOptionsOrString()
  {
    Uninit();
  }

  ElementCreationOptions&
  RawSetAsElementCreationOptions();

  ElementCreationOptions&
  SetAsElementCreationOptions();

  bool
  TrySetToElementCreationOptions(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsElementCreationOptions() const
  {
    return mType == eElementCreationOptions;
  }

  inline ElementCreationOptions&
  GetAsElementCreationOptions()
  {
    do { } while (0);
    return mValue.mElementCreationOptions.Value();
  }

  inline ElementCreationOptions const &
  GetAsElementCreationOptions() const
  {
    do { } while (0);
    return mValue.mElementCreationOptions.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningElementCreationOptionsOrString&
  operator=(const OwningElementCreationOptionsOrString& aOther);

private:
  void
  DestroyElementCreationOptions();

  void
  DestroyString();
};


namespace DocumentBinding {

  typedef nsIDocument NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, nsIDocument* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 419 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DocumentBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JSObject*
  GetProtoObject(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2








class gfxUserFontSet;
class imgIRequest;
class nsAString;
class nsBindingManager;
class nsIDocShell;
class nsDocShell;
class nsDOMNavigationTiming;
class nsFrameLoader;
class nsHTMLCSSStyleSheet;
class nsHTMLDocument;
class nsHTMLStyleSheet;
class nsIAtom;
class nsIBFCacheEntry;
class nsIChannel;
class nsIContent;
class nsIContentSink;
class nsIDocShell;
class nsIDocShellTreeItem;
class nsIDocumentEncoder;
class nsIDocumentObserver;
class nsIDOMDocument;
class nsIDOMDocumentType;
class nsIDOMElement;
class nsIDOMNodeFilter;
class nsIDOMNodeList;
class nsIHTMLCollection;
class nsILayoutHistoryState;
class nsILoadContext;
class nsIObjectLoadingContent;
class nsIObserver;
class nsIPresShell;
class nsIPrincipal;
class nsIRequest;
class nsIRunnable;
class nsIStreamListener;
class nsIStructuredCloneContainer;
class nsIURI;
class nsIVariant;
class nsViewManager;
class nsPresContext;
class nsRange;
class nsScriptLoader;
class nsSMILAnimationController;
class nsSVGElement;
class nsTextNode;
class nsWindowSizes;
class nsDOMCaretPosition;
class nsViewportInfo;
class nsIGlobalObject;
struct nsCSSSelectorList;

namespace mozilla {
class AbstractThread;
class CSSStyleSheet;
class ErrorResult;
class EventStates;
class PendingAnimationTracker;
class StyleSetHandle;
template<typename> class OwningNonNull;
struct URLExtraData;

namespace css {
class Loader;
class ImageLoader;
class Rule;
}

namespace dom {
class Animation;
class AnonymousContent;
class Attr;
class BoxObject;
class CDATASection;
class Comment;
struct CustomElementDefinition;
class DocGroup;
class DocumentFragment;
class DocumentTimeline;
class DocumentType;
class DOMImplementation;
class DOMIntersectionObserver;
class DOMStringList;
class Element;
struct ElementCreationOptions;
struct ElementRegistrationOptions;
class Event;
class EventTarget;
class FontFaceSet;
class FrameRequestCallback;
struct FullscreenRequest;
class ImageTracker;
class ImportManager;
class HTMLBodyElement;
struct LifecycleCallbackArgs;
class Link;
class Location;
class MediaQueryList;
class GlobalObject;
class NodeFilter;
class NodeIterator;
enum class OrientationType : uint8_t;
class ProcessingInstruction;
class Promise;
class StyleSheetList;
class SVGDocument;
class SVGSVGElement;
class Touch;
class TouchList;
class TreeWalker;
class XPathEvaluator;
class XPathExpression;
class XPathNSResolver;
class XPathResult;
template<typename> class Sequence;

template<typename, typename> class CallbackObjectHolder;
typedef CallbackObjectHolder<NodeFilter, nsIDOMNodeFilter> NodeFilterHolder;

enum class CallerType : uint32_t;

}
}






enum DocumentFlavor {
  DocumentFlavorLegacyGuess,
  DocumentFlavorHTML,
  DocumentFlavorSVG,
  DocumentFlavorPlain,
};


enum class HSTSPrimingState {
  eNO_HSTS_PRIMING = 0,
  eHSTS_PRIMING_ALLOW = 1,
  eHSTS_PRIMING_BLOCK = 2
};
# 204 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
class nsContentList;





class nsIDocument : public nsINode,
                    public mozilla::dom::DispatcherTrait
{
  typedef mozilla::dom::GlobalObject GlobalObject;

public:
  typedef mozilla::net::ReferrerPolicy ReferrerPolicyEnum;
  typedef mozilla::dom::Element Element;
  typedef mozilla::dom::FullscreenRequest FullscreenRequest;

  template<typename T, typename U> struct COMTypeInfo;


  nsIDocument();




  class PageUnloadingEventTimeStamp
  {
    nsCOMPtr<nsIDocument> mDocument;
    bool mSet;

  public:
    explicit PageUnloadingEventTimeStamp(nsIDocument* aDocument)
      : mDocument(aDocument)
      , mSet(false)
    {
      do { } while (0);
      if (mDocument->mPageUnloadingEventTimeStamp.IsNull()) {
        mDocument->SetPageUnloadingEventTimeStamp();
        mSet = true;
      }
    }

    ~PageUnloadingEventTimeStamp()
    {
      if (mSet) {
        mDocument->CleanUnloadEventsTimeStamp();
      }
    }
  };
# 286 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual nsresult StartDocumentLoad(const char* aCommand,
                                     nsIChannel* aChannel,
                                     nsILoadGroup* aLoadGroup,
                                     nsISupports* aContainer,
                                     nsIStreamListener **aDocListener,
                                     bool aReset,
                                     nsIContentSink* aSink = nullptr) = 0;
  virtual void StopDocumentLoad() = 0;

  virtual void SetSuppressParserErrorElement(bool aSuppress) {}
  virtual bool SuppressParserErrorElement() { return false; }

  virtual void SetSuppressParserErrorConsoleMessages(bool aSuppress) {}
  virtual bool SuppressParserErrorConsoleMessages() { return false; }







  virtual void NotifyPossibleTitleChange(bool aBoundTitleElement) = 0;
# 319 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  nsIURI* GetDocumentURI() const
  {
    return mDocumentURI;
  }
# 335 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  nsIURI* GetOriginalURI() const
  {
    return mOriginalURI;
  }





  virtual void SetDocumentURI(nsIURI* aURI) = 0;





  virtual void SetChromeXHRDocURI(nsIURI* aURI) = 0;





  virtual void SetChromeXHRDocBaseURI(nsIURI* aURI) = 0;




  virtual void ApplySettingsFromCSP(bool aSpeculative) = 0;

  virtual already_AddRefed<nsIParser> CreatorParserOrNull() = 0;





  ReferrerPolicyEnum GetReferrerPolicy() const
  {
    return mReferrerPolicy;
  }




  uint32_t ReferrerPolicy() const
  {
    return GetReferrerPolicy();
  }






  bool GetBlockAllMixedContent(bool aPreload) const
  {
    if (aPreload) {
      return mBlockAllMixedContentPreloads;
    }
    return mBlockAllMixedContent;
  }
# 402 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  bool GetUpgradeInsecureRequests(bool aPreload) const
  {
    if (aPreload) {
      return mUpgradeInsecurePreloads;
    }
    return mUpgradeInsecureRequests;
  }

  void SetReferrer(const nsACString& aReferrer) {
    mReferrer = aReferrer;
  }





  HSTSPrimingState GetHSTSPrimingStateForLocation(nsIURI* aContentLocation) const
  {
    HSTSPrimingState state;
    if (mHSTSPrimingURIList.Get(aContentLocation, &state)) {
      return state;
    }
    return HSTSPrimingState::eNO_HSTS_PRIMING;
  }






  void AddHSTSPrimingLocation(nsIURI* aContentLocation, HSTSPrimingState aState)
  {
    mHSTSPrimingURIList.Put(aContentLocation, aState);
  }

  void ClearHSTSPrimingLocation(nsIURI* aContentLocation)
  {
    mHSTSPrimingURIList.Remove(aContentLocation);
  }




  virtual void SetPrincipal(nsIPrincipal *aPrincipal) = 0;




  already_AddRefed<nsILoadGroup> GetDocumentLoadGroup() const
  {
    nsCOMPtr<nsILoadGroup> group = do_QueryReferent(mDocumentLoadGroup);
    return group.forget();
  }







  nsIURI* GetFallbackBaseURI() const
  {
    if (mIsSrcdocDocument && mParentDocument) {
      return mParentDocument->GetDocBaseURI();
    }
    return mDocumentURI;
  }
# 477 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  nsIURI* GetDocBaseURI() const
  {
    if (mDocumentBaseURI) {
      return mDocumentBaseURI;
    }
    return GetFallbackBaseURI();
  }
  virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const override;

  virtual void SetBaseURI(nsIURI* aURI) = 0;
# 495 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  mozilla::URLExtraData* DefaultStyleAttrURLData();




  virtual void GetBaseTarget(nsAString &aBaseTarget) = 0;
  void SetBaseTarget(const nsString& aBaseTarget) {
    mBaseTarget = aBaseTarget;
  }




  const nsCString& GetDocumentCharacterSet() const
  {
    return mCharacterSet;
  }





  virtual void SetDocumentCharacterSet(const nsACString& aCharSetID) = 0;

  int32_t GetDocumentCharacterSetSource() const
  {
    return mCharacterSetSource;
  }



  void SetDocumentCharacterSetSource(int32_t aCharsetSource)
  {
    mCharacterSetSource = aCharsetSource;
  }




  virtual nsresult AddCharSetObserver(nsIObserver* aObserver) = 0;




  virtual void RemoveCharSetObserver(nsIObserver* aObserver) = 0;
# 549 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  typedef bool (* IDTargetObserver)(Element* aOldElement,
                                      Element* aNewelement, void* aData);
# 563 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual Element* AddIDTargetObserver(nsIAtom* aID, IDTargetObserver aObserver,
                                       void* aData, bool aForImage) = 0;




  virtual void RemoveIDTargetObserver(nsIAtom* aID, IDTargetObserver aObserver,
                                      void* aData, bool aForImage) = 0;






  virtual nsresult GetContentType(nsAString& aContentType) = 0;




  virtual void SetContentType(const nsAString& aContentType) = 0;




  void GetContentLanguage(nsAString& aContentLanguage) const
  {
    CopyASCIItoUTF16(mContentLanguage, aContentLanguage);
  }
# 599 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  bool GetBidiEnabled() const
  {
    return mBidiEnabled;
  }







  void SetBidiEnabled()
  {
    mBidiEnabled = true;
  }




  bool GetMathMLEnabled() const
  {
    return mMathMLEnabled;
  }

  void SetMathMLEnabled()
  {
    mMathMLEnabled = true;
  }




  bool IsInitialDocument() const
  {
    return mIsInitialDocumentInWindow;
  }





  void SetIsInitialDocument(bool aIsInitialDocument)
  {
    mIsInitialDocumentInWindow = aIsInitialDocument;
  }






  void IgnoreDocGroupMismatches()
  {
    mIgnoreDocGroupMismatches = true;
  }





  uint32_t GetBidiOptions() const
  {
    return mBidiOptions;
  }







  void SetBidiOptions(uint32_t aBidiOptions)
  {
    mBidiOptions = aBidiOptions;
  }




  bool GetHasMixedActiveContentLoaded()
  {
    return mHasMixedActiveContentLoaded;
  }




  void SetHasMixedActiveContentLoaded(bool aHasMixedActiveContentLoaded)
  {
    mHasMixedActiveContentLoaded = aHasMixedActiveContentLoaded;
  }




  bool GetHasMixedActiveContentBlocked()
  {
    return mHasMixedActiveContentBlocked;
  }




  void SetHasMixedActiveContentBlocked(bool aHasMixedActiveContentBlocked)
  {
    mHasMixedActiveContentBlocked = aHasMixedActiveContentBlocked;
  }




  bool GetHasMixedDisplayContentLoaded()
  {
    return mHasMixedDisplayContentLoaded;
  }




  void SetHasMixedDisplayContentLoaded(bool aHasMixedDisplayContentLoaded)
  {
    mHasMixedDisplayContentLoaded = aHasMixedDisplayContentLoaded;
  }




  bool GetHasMixedDisplayContentBlocked()
  {
    return mHasMixedDisplayContentBlocked;
  }




  void SetHasReferrerPolicyCSP(bool aHasReferrerPolicyCSP)
  {
    mHasReferrerPolicyCSP = aHasReferrerPolicyCSP;
  }




  void SetHasMixedDisplayContentBlocked(bool aHasMixedDisplayContentBlocked)
  {
    mHasMixedDisplayContentBlocked = aHasMixedDisplayContentBlocked;
  }




  void SetHasMixedContentObjectSubrequest(bool aHasMixedContentObjectSubrequest)
  {
    mHasMixedContentObjectSubrequest = aHasMixedContentObjectSubrequest;
  }




  void SetHasCSP(bool aHasCSP)
  {
    mHasCSP = aHasCSP;
  }




  void SetHasUnsafeInlineCSP(bool aHasUnsafeInlineCSP)
  {
    mHasUnsafeInlineCSP = aHasUnsafeInlineCSP;
  }




  void SetHasUnsafeEvalCSP(bool aHasUnsafeEvalCSP)
  {
    mHasUnsafeEvalCSP = aHasUnsafeEvalCSP;
  }




  bool GetHasTrackingContentBlocked()
  {
    return mHasTrackingContentBlocked;
  }




  void SetHasTrackingContentBlocked(bool aHasTrackingContentBlocked)
  {
    mHasTrackingContentBlocked = aHasTrackingContentBlocked;
  }




  bool GetHasTrackingContentLoaded()
  {
    return mHasTrackingContentLoaded;
  }




  void SetHasTrackingContentLoaded(bool aHasTrackingContentLoaded)
  {
    mHasTrackingContentLoaded = aHasTrackingContentLoaded;
  }





  uint32_t GetSandboxFlags() const
  {
    return mSandboxFlags;
  }




  void GetSandboxFlagsAsString(nsAString& aFlags);





  void SetSandboxFlags(uint32_t sandboxFlags)
  {
    mSandboxFlags = sandboxFlags;
  }





  virtual void GetHeaderData(nsIAtom* aHeaderField, nsAString& aData) const = 0;
  virtual void SetHeaderData(nsIAtom* aheaderField, const nsAString& aData) = 0;
# 848 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual already_AddRefed<nsIPresShell> CreateShell(
      nsPresContext* aContext,
      nsViewManager* aViewManager,
      mozilla::StyleSetHandle aStyleSet) = 0;
  virtual void DeleteShell() = 0;

  nsIPresShell* GetShell() const
  {
    return GetBFCacheEntry() ? nullptr : mPresShell;
  }



  void DisallowBFCaching()
  {
    do { } while(0);
    mBFCacheDisallowed = true;
  }

  bool IsBFCachingAllowed() const
  {
    return !mBFCacheDisallowed;
  }

  void SetBFCacheEntry(nsIBFCacheEntry* aEntry)
  {
    do { } while(0);


    mBFCacheEntry = aEntry;
  }

  nsIBFCacheEntry* GetBFCacheEntry() const
  {
    return mBFCacheEntry;
  }






  nsIDocument *GetParentDocument() const
  {
    return mParentDocument;
  }




  void SetParentDocument(nsIDocument* aParent)
  {
    mParentDocument = aParent;
    if (aParent) {
      mIgnoreDocGroupMismatches = aParent->mIgnoreDocGroupMismatches;
    }
  }




  virtual bool GetAllowPlugins () = 0;




  virtual nsresult SetSubDocumentFor(Element* aContent,
                                     nsIDocument* aSubDoc) = 0;




  virtual nsIDocument *GetSubDocumentFor(nsIContent *aContent) const = 0;




  virtual Element* FindContentForSubDocument(nsIDocument* aDocument) const = 0;




  mozilla::dom::DocumentType* GetDoctype() const;




  Element* GetRootElement() const;
# 950 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual nsViewportInfo GetViewportInfo(const mozilla::ScreenIntSize& aDisplaySize) = 0;




  virtual bool WillIgnoreCharsetOverride() {
    return true;
  }




  bool IsSrcdocDocument() const {
    return mIsSrcdocDocument;
  }




  void SetIsSrcdocDocument(bool aIsSrcdocDocument) {
    mIsSrcdocDocument = aIsSrcdocDocument;
  }






  nsresult GetSrcdocData(nsAString& aSrcdocData);

  bool DidDocumentOpen() {
    return mDidDocumentOpen;
  }

  already_AddRefed<mozilla::dom::AnonymousContent>
  InsertAnonymousContent(mozilla::dom::Element& aElement,
                         mozilla::ErrorResult& aError);
  void RemoveAnonymousContent(mozilla::dom::AnonymousContent& aContent,
                              mozilla::ErrorResult& aError);






  Element* GetAnonRootIfInAnonymousContentContainer(nsINode* aNode) const;
  nsTArray<RefPtr<mozilla::dom::AnonymousContent>>& GetAnonymousContents() {
    return mAnonymousContents;
  }

  static nsresult GenerateDocumentId(nsAString& aId);
  nsresult GetOrCreateId(nsAString& aId);
  void SetId(const nsAString& aId);

  mozilla::TimeStamp GetPageUnloadingEventTimeStamp() const
  {
    if (!mParentDocument) {
      return mPageUnloadingEventTimeStamp;
    }

    mozilla::TimeStamp parentTimeStamp(mParentDocument->GetPageUnloadingEventTimeStamp());
    if (parentTimeStamp.IsNull()) {
      return mPageUnloadingEventTimeStamp;
    }

    if (!mPageUnloadingEventTimeStamp ||
        parentTimeStamp < mPageUnloadingEventTimeStamp) {
      return parentTimeStamp;
    }

    return mPageUnloadingEventTimeStamp;
  }

  virtual void NotifyLayerManagerRecreated() = 0;
# 1032 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void ScheduleSVGForPresAttrEvaluation(nsSVGElement* aSVG) = 0;

  virtual void UnscheduleSVGForPresAttrEvaluation(nsSVGElement* aSVG) = 0;


  virtual void ResolveScheduledSVGPresAttrs() = 0;

protected:
  virtual Element *GetRootElementInternal() const = 0;

  void SetPageUnloadingEventTimeStamp()
  {
    do { } while (0);
    mPageUnloadingEventTimeStamp = mozilla::TimeStamp::NowLoRes();
  }

  void CleanUnloadEventsTimeStamp()
  {
    do { } while (0);
    mPageUnloadingEventTimeStamp = mozilla::TimeStamp();
  }

private:
  class SelectorCacheKey
  {
    public:
      explicit SelectorCacheKey(const nsAString& aString) : mKey(aString)
      {
                                        ;
      }

      nsString mKey;
      nsExpirationState mState;

      nsExpirationState* GetExpirationState() { return &mState; }

      ~SelectorCacheKey()
      {
                                        ;
      }
  };

  class SelectorCacheKeyDeleter;

public:
  class SelectorCache final
    : public nsExpirationTracker<SelectorCacheKey, 4>
  {
    public:
      explicit SelectorCache(nsIEventTarget* aEventTarget);


      void CacheList(const nsAString& aSelector, nsCSSSelectorList* aSelectorList);

      virtual void NotifyExpired(SelectorCacheKey* aSelector) override;






      bool GetList(const nsAString& aSelector, nsCSSSelectorList** aList)
      {
        return mTable.Get(aSelector, aList);
      }

      ~SelectorCache();

    private:
      nsClassHashtable<nsStringHashKey, nsCSSSelectorList> mTable;
  };

  SelectorCache& GetSelectorCache() {
    if (!mSelectorCache) {
      mSelectorCache =
        new SelectorCache(EventTargetFor(mozilla::TaskCategory::Other));
    }
    return *mSelectorCache;
  }


  Element* GetHtmlElement() const;


  Element* GetHtmlChildElement(nsIAtom* aTag);


  mozilla::dom::HTMLBodyElement* GetBodyElement();


  Element* GetHeadElement() {
    return GetHtmlChildElement(nsGkAtoms::head);
  }
# 1151 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void EnsureOnDemandBuiltInUASheet(mozilla::StyleSheet* aSheet) = 0;







  virtual int32_t GetNumberOfStyleSheets() const = 0;







  virtual mozilla::StyleSheet* GetStyleSheetAt(int32_t aIndex) const = 0;
# 1176 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void InsertStyleSheetAt(mozilla::StyleSheet* aSheet,
                                  int32_t aIndex) = 0;







  virtual int32_t GetIndexOfStyleSheet(
      const mozilla::StyleSheet* aSheet) const = 0;
# 1196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void UpdateStyleSheets(
      nsTArray<RefPtr<mozilla::StyleSheet>>& aOldSheets,
      nsTArray<RefPtr<mozilla::StyleSheet>>& aNewSheets) = 0;




  virtual void AddStyleSheet(mozilla::StyleSheet* aSheet) = 0;




  virtual void RemoveStyleSheet(mozilla::StyleSheet* aSheet) = 0;





  virtual void SetStyleSheetApplicableState(mozilla::StyleSheet* aSheet,
                                            bool aApplicable) = 0;

  enum additionalSheetType {
    eAgentSheet,
    eUserSheet,
    eAuthorSheet,
    AdditionalSheetTypeCount
  };

  virtual nsresult LoadAdditionalStyleSheet(additionalSheetType aType,
                                            nsIURI* aSheetURI) = 0;
  virtual nsresult AddAdditionalStyleSheet(additionalSheetType aType,
                                           mozilla::StyleSheet* aSheet) = 0;
  virtual void RemoveAdditionalStyleSheet(additionalSheetType aType,
                                          nsIURI* sheetURI) = 0;
  virtual mozilla::StyleSheet* GetFirstAdditionalAuthorSheet() = 0;
# 1239 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  template<typename T>
  size_t FindDocStyleSheetInsertionPoint(const nsTArray<RefPtr<T>>& aDocSheets,
                                         T* aSheet);




  mozilla::css::Loader* CSSLoader() const {
    return mCSSLoader;
  }

  mozilla::StyleBackendType GetStyleBackendType() const {
    if (mStyleBackendType == mozilla::StyleBackendType::None) {
      const_cast<nsIDocument*>(this)->UpdateStyleBackendType();
    }
    do { } while (0);
    return mStyleBackendType;
  }

  void UpdateStyleBackendType();

  bool IsStyledByServo() const {
    return GetStyleBackendType() == mozilla::StyleBackendType::Servo;
  }




  mozilla::css::ImageLoader* StyleImageLoader() const {
    return mStyleImageLoader;
  }






  virtual nsIChannel* GetChannel() const = 0;





  nsHTMLStyleSheet* GetAttributeStyleSheet() const {
    return mAttrStyleSheet;
  }





  nsHTMLCSSStyleSheet* GetInlineStyleSheet() const {
    return mStyleAttrStyleSheet;
  }

  virtual void SetScriptGlobalObject(nsIScriptGlobalObject* aGlobalObject) = 0;
# 1305 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  nsIScriptGlobalObject*
    GetScriptHandlingObject(bool& aHasHadScriptHandlingObject) const
  {
    aHasHadScriptHandlingObject = mHasHadScriptHandlingObject;
    return mScriptGlobalObject ? mScriptGlobalObject.get() :
                                 GetScriptHandlingObjectInternal();
  }
  virtual void SetScriptHandlingObject(nsIScriptGlobalObject* aScriptObject) = 0;
# 1321 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual nsIGlobalObject* GetScopeObject() const = 0;
  virtual void SetScopeObject(nsIGlobalObject* aGlobal) = 0;




  nsPIDOMWindowOuter *GetWindow() const
  {
    return mWindow ? mWindow->GetOuterWindow() : GetWindowInternal();
  }

  bool IsInBackgroundWindow() const
  {
    auto* outer = mWindow ? mWindow->GetOuterWindow() : nullptr;
    return outer && outer->IsBackground();
  }






  nsPIDOMWindowInner* GetInnerWindow() const
  {
    return mRemovedFromDocShell ? nullptr : mWindow;
  }




  uint64_t OuterWindowID() const
  {
    nsPIDOMWindowOuter* window = GetWindow();
    return window ? window->WindowID() : 0;
  }




  uint64_t InnerWindowID() const
  {
    nsPIDOMWindowInner* window = GetInnerWindow();
    return window ? window->WindowID() : 0;
  }




  virtual nsScriptLoader* ScriptLoader() = 0;




  virtual void AddToIdTable(Element* aElement, nsIAtom* aId) = 0;
  virtual void RemoveFromIdTable(Element* aElement, nsIAtom* aId) = 0;
  virtual void AddToNameTable(Element* aElement, nsIAtom* aName) = 0;
  virtual void RemoveFromNameTable(Element* aElement, nsIAtom* aName) = 0;




  virtual nsTArray<Element*> GetFullscreenStack() const = 0;
# 1395 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void AsyncRequestFullScreen(
    mozilla::UniquePtr<FullscreenRequest>&& aRequest) = 0;







  virtual nsresult
    RemoteFrameFullscreenChanged(nsIDOMElement* aFrameElement) = 0;
# 1416 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
   virtual nsresult RemoteFrameFullscreenReverted() = 0;






  virtual void RestorePreviousFullScreenState() = 0;





  virtual bool IsFullscreenLeaf() = 0;






  virtual nsIDocument* GetFullscreenRoot() = 0;





  virtual void SetFullscreenRoot(nsIDocument* aRoot) = 0;
# 1456 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  static void ExitFullscreenInDocTree(nsIDocument* aDocument);
# 1467 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  static void AsyncExitFullscreen(nsIDocument* aDocument);






  static bool HandlePendingFullscreenRequests(nsIDocument* aDocument);





  void DispatchFullscreenError(const char* aMessage);

  virtual void RequestPointerLock(Element* aElement,
                                  mozilla::dom::CallerType aCallerType) = 0;

  static void UnlockPointer(nsIDocument* aDoc = nullptr);



  virtual void SetCurrentOrientation(mozilla::dom::OrientationType aType,
                                     uint16_t aAngle) = 0;
  virtual uint16_t CurrentOrientationAngle() const = 0;
  virtual mozilla::dom::OrientationType CurrentOrientationType() const = 0;
  virtual void SetOrientationPendingPromise(mozilla::dom::Promise* aPromise) = 0;
  virtual mozilla::dom::Promise* GetOrientationPendingPromise() const = 0;
# 1506 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void AddObserver(nsIDocumentObserver* aObserver) = 0;





  virtual bool RemoveObserver(nsIDocumentObserver* aObserver) = 0;





  virtual void BeginUpdate(nsUpdateType aUpdateType) = 0;
  virtual void EndUpdate(nsUpdateType aUpdateType) = 0;
  virtual void BeginLoad() = 0;
  virtual void EndLoad() = 0;

  enum ReadyState { READYSTATE_UNINITIALIZED = 0, READYSTATE_LOADING = 1, READYSTATE_INTERACTIVE = 3, READYSTATE_COMPLETE = 4};
  virtual void SetReadyStateInternal(ReadyState rs) = 0;
  ReadyState GetReadyStateEnum()
  {
    return mReadyState;
  }



  virtual void ContentStateChanged(nsIContent* aContent,
                                   mozilla::EventStates aStateMask) = 0;




  virtual void DocumentStatesChanged(mozilla::EventStates aStateMask) = 0;



  virtual void StyleRuleChanged(mozilla::StyleSheet* aStyleSheet,
                                mozilla::css::Rule* aStyleRule) = 0;
  virtual void StyleRuleAdded(mozilla::StyleSheet* aStyleSheet,
                              mozilla::css::Rule* aStyleRule) = 0;
  virtual void StyleRuleRemoved(mozilla::StyleSheet* aStyleSheet,
                                mozilla::css::Rule* aStyleRule) = 0;





  virtual void FlushPendingNotifications(mozilla::FlushType aType) = 0;







  virtual void FlushExternalResources(mozilla::FlushType aType) = 0;

  nsBindingManager* BindingManager() const
  {
    return mNodeInfoManager->GetBindingManager();
  }





  nsNodeInfoManager* NodeInfoManager() const
  {
    return mNodeInfoManager;
  }






  virtual void Reset(nsIChannel* aChannel, nsILoadGroup* aLoadGroup) = 0;






  virtual void ResetToURI(nsIURI *aURI, nsILoadGroup* aLoadGroup,
                          nsIPrincipal* aPrincipal) = 0;





  virtual void SetContainer(nsDocShell* aContainer);




  virtual nsISupports* GetContainer() const;




  nsILoadContext* GetLoadContext() const;




  nsIDocShell* GetDocShell() const;







  virtual void SetXMLDeclaration(const char16_t *aVersion,
                                 const char16_t *aEncoding,
                                 const int32_t aStandalone) = 0;
  virtual void GetXMLDeclaration(nsAString& aVersion,
                                 nsAString& aEncoding,
                                 nsAString& Standalone) = 0;







  bool IsHTMLDocument() const
  {
    return mType == eHTML;
  }
  bool IsHTMLOrXHTML() const
  {
    return mType == eHTML || mType == eXHTML;
  }
  bool IsXMLDocument() const
  {
    return !IsHTMLDocument();
  }
  bool IsSVGDocument() const
  {
    return mType == eSVG;
  }
  bool IsXULDocument() const
  {
    return mType == eXUL;
  }
  bool IsUnstyledDocument()
  {
    return IsLoadedAsData() || IsLoadedAsInteractiveData();
  }
  bool LoadsFullXULStyleSheetUpFront()
  {
    return IsXULDocument() || AllowXULXBL();
  }

  virtual bool IsScriptEnabled() = 0;





  virtual already_AddRefed<Element> CreateElem(const nsAString& aName,
                                               nsIAtom* aPrefix,
                                               int32_t aNamespaceID,
                                               const nsAString* aIs = nullptr) = 0;
# 1679 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  nsISupports *GetSecurityInfo()
  {
    return mSecurityInfo;
  }





  virtual nsIChannel* GetFailedChannel() const = 0;





  virtual void SetFailedChannel(nsIChannel* aChannel) = 0;





  int32_t GetDefaultNamespaceID() const
  {
    return mDefaultElementType;
  }

  void DeleteAllProperties();
  void DeleteAllPropertiesFor(nsINode* aNode);

  nsPropertyTable* PropertyTable(uint16_t aCategory) {
    if (aCategory == 0)
      return &mPropertyTable;
    return GetExtraPropertyTable(aCategory);
  }
  uint32_t GetPropertyTableCount()
  { return mExtraPropertyTables.Length() + 1; }




  void SetPartID(uint32_t aID) {
    mPartID = aID;
  }




  uint32_t GetPartID() const {
    return mPartID;
  }





  virtual void Sanitize() = 0;






  typedef bool (*nsSubDocEnumFunc)(nsIDocument *aDocument, void *aData);
  virtual void EnumerateSubDocuments(nsSubDocEnumFunc aCallback,
                                     void *aData) = 0;
# 1762 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual bool CanSavePresentation(nsIRequest *aNewRequest) = 0;






  virtual void Destroy() = 0;







  virtual void RemovedFromDocShell() = 0;






  virtual already_AddRefed<nsILayoutHistoryState> GetLayoutHistoryState() const = 0;
# 1793 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void BlockOnload() = 0;






  virtual void UnblockOnload(bool aFireSync) = 0;

  void BlockDOMContentLoaded()
  {
    ++mBlockDOMContentLoaded;
  }

  virtual void UnblockDOMContentLoaded() = 0;
# 1821 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void OnPageShow(bool aPersisted,
                          mozilla::dom::EventTarget* aDispatchStartTarget) = 0;
# 1836 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void OnPageHide(bool aPersisted,
                          mozilla::dom::EventTarget* aDispatchStartTarget) = 0;
# 1846 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void AddStyleRelevantLink(mozilla::dom::Link* aLink) = 0;






  virtual void ForgetLink(mozilla::dom::Link* aLink) = 0;






  virtual void ClearBoxObjectFor(nsIContent *aContent) = 0;





  virtual already_AddRefed<mozilla::dom::BoxObject>
    GetBoxObjectFor(mozilla::dom::Element* aElement,
                    mozilla::ErrorResult& aRv) = 0;





  already_AddRefed<mozilla::dom::MediaQueryList>
    MatchMedia(const nsAString& aMediaQueryList);

  const PRCList* MediaQueryLists() const {
    return &mDOMMediaQueryLists;
  }




  nsCompatibility GetCompatibilityMode() const {
    return mCompatMode;
  }





  bool HaveFiredDOMTitleChange() const {
    return mHaveFiredTitleChange;
  }




  virtual Element*
    GetAnonymousElementByAttribute(nsIContent* aElement,
                                   nsIAtom* aAttrName,
                                   const nsAString& aAttrValue) const = 0;







  virtual Element* ElementFromPointHelper(float aX, float aY,
                                          bool aIgnoreRootScrollFrame,
                                          bool aFlushLayout) = 0;

  enum ElementsFromPointFlags {
    IGNORE_ROOT_SCROLL_FRAME = 1,
    FLUSH_LAYOUT = 2,
    IS_ELEMENT_FROM_POINT = 4
  };

  virtual void ElementsFromPointHelper(float aX, float aY,
                                       uint32_t aFlags,
                                       nsTArray<RefPtr<mozilla::dom::Element>>& aElements) = 0;

  virtual nsresult NodesFromRectHelper(float aX, float aY,
                                       float aTopSize, float aRightSize,
                                       float aBottomSize, float aLeftSize,
                                       bool aIgnoreRootScrollFrame,
                                       bool aFlushLayout,
                                       nsIDOMNodeList** aReturn) = 0;




  virtual void FlushSkinBindings() = 0;
# 1943 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  void MayDispatchMutationEvent(nsINode* aTarget)
  {
    if (mSubtreeModifiedDepth > 0) {
      mSubtreeModifiedTargets.AppendObject(aTarget);
    }
  }





  void MarkUncollectableForCCGeneration(uint32_t aGeneration)
  {
    mMarkedCCGeneration = aGeneration;
  }




  uint32_t GetMarkedCCGeneration()
  {
    return mMarkedCCGeneration;
  }

  bool IsLoadedAsData()
  {
    return mLoadedAsData;
  }

  bool IsLoadedAsInteractiveData()
  {
    return mLoadedAsInteractiveData;
  }

  bool MayStartLayout()
  {
    return mMayStartLayout;
  }

  virtual void SetMayStartLayout(bool aMayStartLayout)
  {
    mMayStartLayout = aMayStartLayout;
  }

  already_AddRefed<nsIDocumentEncoder> GetCachedEncoder();

  void SetCachedEncoder(already_AddRefed<nsIDocumentEncoder> aEncoder);


  virtual nsresult InitializeFrameLoader(nsFrameLoader* aLoader) = 0;


  virtual nsresult FinalizeFrameLoader(nsFrameLoader* aLoader, nsIRunnable* aFinalizer) = 0;

  virtual void TryCancelFrameLoaderInitialization(nsIDocShell* aShell) = 0;





  bool IsRootDisplayDocument() const
  {
    return !mParentDocument && !mDisplayDocument;
  }

  bool IsBeingUsedAsImage() const {
    return mIsBeingUsedAsImage;
  }

  void SetIsBeingUsedAsImage() {
    mIsBeingUsedAsImage = true;
  }

  bool IsResourceDoc() const {
    return IsBeingUsedAsImage() ||
      mHasDisplayDocument;
  }







  nsIDocument* GetDisplayDocument() const
  {
    return mDisplayDocument;
  }





  void SetDisplayDocument(nsIDocument* aDisplayDocument)
  {
    do { } while (0);




    do { } while (0);
    do { } while (0);
    do { } while (0);

    mDisplayDocument = aDisplayDocument;
    mHasDisplayDocument = !!aDisplayDocument;
  }
# 2061 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  class ExternalResourceLoad : public nsISupports
  {
  public:
    virtual ~ExternalResourceLoad() {}

    void AddObserver(nsIObserver* aObserver) {
      do { } while (0);
      mObservers.AppendElement(aObserver);
    }

    const nsTArray< nsCOMPtr<nsIObserver> > & Observers() {
      return mObservers;
    }
  protected:
    AutoTArray< nsCOMPtr<nsIObserver>, 8 > mObservers;
  };
# 2091 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual nsIDocument*
    RequestExternalResource(nsIURI* aURI,
                            nsINode* aRequestingNode,
                            ExternalResourceLoad** aPendingLoad) = 0;






  virtual void EnumerateExternalResources(nsSubDocEnumFunc aCallback,
                                          void* aData) = 0;






  bool IsShowing() const { return mIsShowing; }




  bool IsVisible() const { return mVisible; }





  bool IsVisibleConsideringAncestors() const;







  bool IsActive() const { return mDocumentContainer && !mRemovedFromDocShell; }
# 2137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  bool IsCurrentActiveDocument() const
  {
    nsPIDOMWindowInner* inner = GetInnerWindow();
    return inner && inner->IsCurrentInnerWindow() && inner->GetDoc() == this;
  }







  void RegisterActivityObserver(nsISupports* aSupports);
  bool UnregisterActivityObserver(nsISupports* aSupports);

  typedef void (* ActivityObserverEnumerator)(nsISupports*, void*);
  void EnumerateActivityObservers(ActivityObserverEnumerator aEnumerator,
                                  void* aData);




  bool HasAnimationController() { return !!mAnimationController; }




  virtual nsSMILAnimationController* GetAnimationController() = 0;





  virtual mozilla::PendingAnimationTracker* GetPendingAnimationTracker() = 0;




  virtual mozilla::PendingAnimationTracker*
  GetOrCreatePendingAnimationTracker() = 0;





  virtual void SuppressEventHandling(uint32_t aIncrease = 1) = 0;






  virtual void UnsuppressEventHandlingAndFireEvents(bool aFireEvents) = 0;

  uint32_t EventHandlingSuppressed() const { return mEventsSuppressed; }

  bool IsEventHandlingEnabled() {
    return !EventHandlingSuppressed() && mScriptGlobalObject;
  }




  void BeginEvaluatingExternalScript() { ++mExternalScriptsBeingEvaluated; }




  void EndEvaluatingExternalScript() { --mExternalScriptsBeingEvaluated; }

  bool IsDNSPrefetchAllowed() const { return mAllowDNSPrefetch; }





  bool AllowXULXBL() {
    return mAllowXULXBL == eTriTrue ? true :
           mAllowXULXBL == eTriFalse ? false :
           InternalAllowXULXBL();
  }

  void ForceEnableXULXBL() {
    mAllowXULXBL = eTriTrue;
  }





  virtual nsIDocument* GetTemplateContentsOwner() = 0;
# 2238 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  bool IsStaticDocument() { return mIsStaticDocument; }
# 2251 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual already_AddRefed<nsIDocument>
  CreateStaticClone(nsIDocShell* aCloneContainer);





  nsIDocument* GetOriginalDocument()
  {
    do { } while (0);
    return mOriginalDocument;
  }





  void UnlinkOriginalDocumentIfStatic();
# 2282 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual void PreloadPictureOpened() = 0;

  virtual void PreloadPictureClosed() = 0;

  virtual void PreloadPictureImageSource(const nsAString& aSrcsetAttr,
                                         const nsAString& aSizesAttr,
                                         const nsAString& aTypeAttr,
                                         const nsAString& aMediaAttr) = 0;
# 2298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual already_AddRefed<nsIURI>
    ResolvePreloadImage(nsIURI *aBaseURI,
                        const nsAString& aSrcAttr,
                        const nsAString& aSrcsetAttr,
                        const nsAString& aSizesAttr) = 0;






  virtual void MaybePreLoadImage(nsIURI* uri,
                                 const nsAString& aCrossOriginAttr,
                                 ReferrerPolicyEnum aReferrerPolicy) = 0;





  virtual void ForgetImagePreload(nsIURI* aURI) = 0;






  virtual void PreloadStyle(nsIURI* aURI, const nsAString& aCharset,
                            const nsAString& aCrossOriginAttr,
                            ReferrerPolicyEnum aReferrerPolicy,
                            const nsAString& aIntegrity) = 0;
# 2337 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual nsresult LoadChromeSheetSync(nsIURI* aURI, bool aIsAgentSheet,
                                       RefPtr<mozilla::StyleSheet>* aSheet) = 0;
# 2347 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual bool IsDocumentRightToLeft() { return false; }




  virtual void MaybePreconnect(nsIURI* uri,
                               mozilla::CORSMode aCORSMode) = 0;

  enum DocumentTheme {
    Doc_Theme_Uninitialized,
    Doc_Theme_None,
    Doc_Theme_Neutral,
    Doc_Theme_Dark,
    Doc_Theme_Bright
  };





  void SetStateObject(nsIStructuredCloneContainer *scContainer);







  virtual int GetDocumentLWTheme() { return Doc_Theme_None; }






  virtual mozilla::EventStates GetDocumentState() = 0;
  virtual mozilla::EventStates ThreadSafeGetDocumentState() const = 0;

  virtual nsISupports* GetCurrentContentSink() = 0;

  virtual void SetScrollToRef(nsIURI *aDocumentURI) = 0;
  virtual void ScrollToRef() = 0;
  virtual void ResetScrolledToRefAlready() = 0;
  virtual void SetChangeScrollPosWhenScrollingToRef(bool aValue) = 0;







  virtual Element* GetElementById(const nsAString& aElementId) = 0;





  virtual const nsTArray<Element*>* GetAllElementsForId(const nsAString& aElementId) const = 0;
# 2413 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  virtual Element* LookupImageElement(const nsAString& aElementId) = 0;

  virtual mozilla::dom::DocumentTimeline* Timeline() = 0;
  virtual mozilla::LinkedList<mozilla::dom::DocumentTimeline>& Timelines() = 0;

  virtual void GetAnimations(
      nsTArray<RefPtr<mozilla::dom::Animation>>& aAnimations) = 0;

  mozilla::dom::SVGSVGElement* GetSVGRootElement() const;

  nsresult ScheduleFrameRequestCallback(mozilla::dom::FrameRequestCallback& aCallback,
                                        int32_t *aHandle);
  void CancelFrameRequestCallback(int32_t aHandle);

  typedef nsTArray<RefPtr<mozilla::dom::FrameRequestCallback>> FrameRequestCallbackList;




  void TakeFrameRequestCallbacks(FrameRequestCallbackList& aCallbacks);






  bool ShouldThrottleFrameRequests();


  bool InUnlinkOrDeletion() { return mInUnlinkOrDeletion; }

  mozilla::dom::ImageTracker* ImageTracker();

  virtual nsresult AddPlugin(nsIObjectLoadingContent* aPlugin) = 0;
  virtual void RemovePlugin(nsIObjectLoadingContent* aPlugin) = 0;
  virtual void GetPlugins(nsTArray<nsIObjectLoadingContent*>& aPlugins) = 0;

  virtual nsresult AddResponsiveContent(nsIContent* aContent) = 0;
  virtual void RemoveResponsiveContent(nsIContent* aContent) = 0;
  virtual void NotifyMediaFeatureValuesChanged() = 0;

  virtual nsresult GetStateObject(nsIVariant** aResult) = 0;

  virtual nsDOMNavigationTiming* GetNavigationTiming() const = 0;

  virtual nsresult SetNavigationTiming(nsDOMNavigationTiming* aTiming) = 0;

  virtual Element* FindImageMap(const nsAString& aNormalizedMapName) = 0;


  void RegisterPendingLinkUpdate(mozilla::dom::Link* aLink);



  void UnregisterPendingLinkUpdate(mozilla::dom::Link* aElement);



  void FlushPendingLinkUpdates();


  enum DeprecatedOperations {

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDeprecatedOperationList.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDeprecatedOperationList.h"
eGetAttributeNode,
eSetAttributeNode,
eGetAttributeNodeNS,
eSetAttributeNodeNS,
eRemoveAttributeNode,
eCreateAttribute,
eCreateAttributeNS,
eNodeValue,
eTextContent,
eEnablePrivilege,
eDOMExceptionCode,
eNoExposedProps,
eMutationEvent,
eComponents,
ePrefixedVisibilityAPI,
eNodeIteratorDetach,
eLenientThis,
eGetPreventDefault,
eGetSetUserData,
eMozGetAsFile,
eUseOfCaptureEvents,
eUseOfReleaseEvents,
eUseOfDOM3LoadMethod,
eChromeUseOfDOM3LoadMethod,
eShowModalDialog,
eWindow_Content,
eSyncXMLHttpRequest,
eDataContainerEvent,
eWindow_Controllers,
eImportXULIntoContent,
ePannerNodeDoppler,
eNavigatorGetUserMedia,
eWebrtcDeprecatedPrefix,
eRTCPeerConnectionGetStreams,
eAppCache,
ePrefixedImageSmoothingEnabled,
ePrefixedFullscreenAPI,
eLenientSetter,
eFileLastModifiedDate,
eImageBitmapRenderingContext_TransferImageBitmap,
eURLCreateObjectURL_MediaStream,
eXMLBaseAttribute,
eXMLBaseAttributeForStyleAttr,
# 2476 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
 eDeprecatedOperationCount
  };

  bool HasWarnedAbout(DeprecatedOperations aOperation) const;
  void WarnOnceAbout(DeprecatedOperations aOperation,
                     bool asError = false) const;


  enum DocumentWarnings {

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDocumentWarningList.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDocumentWarningList.h"
eIgnoringWillChangeOverBudget,
ePreventDefaultFromPassiveListener,
eSVGReferenceLoop,
eSVGReferenceChainLengthExceeded,
# 2486 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h" 2
 eDocumentWarningCount
  };

  bool HasWarnedAbout(DocumentWarnings aWarning) const;
  void WarnOnceAbout(DocumentWarnings aWarning,
                     bool asError = false,
                     const char16_t **aParams = nullptr,
                     uint32_t aParamsLength = 0) const;

  virtual void PostVisibilityUpdateEvent() = 0;

  bool IsSyntheticDocument() const { return mIsSyntheticDocument; }





  virtual void DocAddSizeOfExcludingThis(nsWindowSizes* aWindowSizes) const;



  virtual void DocAddSizeOfIncludingThis(nsWindowSizes* aWindowSizes) const;

  bool MayHaveDOMMutationObservers()
  {
    return mMayHaveDOMMutationObservers;
  }

  void SetMayHaveDOMMutationObservers()
  {
    mMayHaveDOMMutationObservers = true;
  }

  bool MayHaveAnimationObservers()
  {
    return mMayHaveAnimationObservers;
  }

  void SetMayHaveAnimationObservers()
  {
    mMayHaveAnimationObservers = true;
  }

  bool IsInSyncOperation()
  {
    return mInSyncOperationCount != 0;
  }

  void SetIsInSyncOperation(bool aSync)
  {
    if (aSync) {
      ++mInSyncOperationCount;
    } else {
      --mInSyncOperationCount;
    }
  }

  bool CreatingStaticClone() const
  {
    return mCreatingStaticClone;
  }





  already_AddRefed<Element> CreateHTMLElement(nsIAtom* aTag);


  nsIGlobalObject* GetParentObject() const
  {
    return GetScopeObject();
  }
  static already_AddRefed<nsIDocument>
    Constructor(const GlobalObject& aGlobal,
                mozilla::ErrorResult& rv);
  virtual mozilla::dom::DOMImplementation*
    GetImplementation(mozilla::ErrorResult& rv) = 0;
  __attribute__ ((warn_unused_result)) nsresult GetURL(nsString& retval) const;
  __attribute__ ((warn_unused_result)) nsresult GetDocumentURI(nsString& retval) const;




  void GetDocumentURIFromJS(nsString& aDocumentURI,
                            mozilla::dom::CallerType aCallerType,
                            mozilla::ErrorResult& aRv) const;
  void GetCompatMode(nsString& retval) const;
  void GetCharacterSet(nsAString& retval) const;


  Element* GetDocumentElement() const
  {
    return GetRootElement();
  }

  enum ElementCallbackType {
    eCreated,
    eAttached,
    eDetached,
    eAttributeChanged
  };

  nsIDocument* GetTopLevelContentDocument();

  virtual void
    RegisterElement(JSContext* aCx, const nsAString& aName,
                    const mozilla::dom::ElementRegistrationOptions& aOptions,
                    JS::MutableHandle<JSObject*> aRetval,
                    mozilla::ErrorResult& rv) = 0;
  virtual already_AddRefed<mozilla::dom::CustomElementRegistry>
    GetCustomElementRegistry() = 0;

  already_AddRefed<nsContentList>
  GetElementsByTagName(const nsAString& aTagName)
  {
    return NS_GetContentList(this, -1, aTagName);
  }
  already_AddRefed<nsContentList>
    GetElementsByTagNameNS(const nsAString& aNamespaceURI,
                           const nsAString& aLocalName,
                           mozilla::ErrorResult& aResult);
  already_AddRefed<nsContentList>
    GetElementsByClassName(const nsAString& aClasses);

  virtual already_AddRefed<Element>
    CreateElement(const nsAString& aTagName,
                  const mozilla::dom::ElementCreationOptionsOrString& aOptions,
                  mozilla::ErrorResult& rv) = 0;
  virtual already_AddRefed<Element>
    CreateElementNS(const nsAString& aNamespaceURI,
                    const nsAString& aQualifiedName,
                    const mozilla::dom::ElementCreationOptionsOrString& aOptions,
                    mozilla::ErrorResult& rv) = 0;
  already_AddRefed<mozilla::dom::DocumentFragment>
    CreateDocumentFragment() const;
  already_AddRefed<nsTextNode> CreateTextNode(const nsAString& aData) const;
  already_AddRefed<mozilla::dom::Comment>
    CreateComment(const nsAString& aData) const;
  already_AddRefed<mozilla::dom::ProcessingInstruction>
    CreateProcessingInstruction(const nsAString& target, const nsAString& data,
                                mozilla::ErrorResult& rv) const;
  already_AddRefed<nsINode>
    ImportNode(nsINode& aNode, bool aDeep, mozilla::ErrorResult& rv) const;
  nsINode* AdoptNode(nsINode& aNode, mozilla::ErrorResult& rv);
  already_AddRefed<mozilla::dom::Event>
    CreateEvent(const nsAString& aEventType, mozilla::ErrorResult& rv) const;
  already_AddRefed<nsRange> CreateRange(mozilla::ErrorResult& rv);
  already_AddRefed<mozilla::dom::NodeIterator>
    CreateNodeIterator(nsINode& aRoot, uint32_t aWhatToShow,
                       mozilla::dom::NodeFilter* aFilter,
                       mozilla::ErrorResult& rv) const;
  already_AddRefed<mozilla::dom::NodeIterator>
    CreateNodeIterator(nsINode& aRoot, uint32_t aWhatToShow,
                       mozilla::dom::NodeFilterHolder aFilter,
                       mozilla::ErrorResult& rv) const;
  already_AddRefed<mozilla::dom::TreeWalker>
    CreateTreeWalker(nsINode& aRoot, uint32_t aWhatToShow,
                     mozilla::dom::NodeFilter* aFilter, mozilla::ErrorResult& rv) const;
  already_AddRefed<mozilla::dom::TreeWalker>
    CreateTreeWalker(nsINode& aRoot, uint32_t aWhatToShow,
                     mozilla::dom::NodeFilterHolder aFilter,
                     mozilla::ErrorResult& rv) const;


  already_AddRefed<mozilla::dom::CDATASection>
    CreateCDATASection(const nsAString& aData, mozilla::ErrorResult& rv);
  already_AddRefed<mozilla::dom::Attr>
    CreateAttribute(const nsAString& aName, mozilla::ErrorResult& rv);
  already_AddRefed<mozilla::dom::Attr>
    CreateAttributeNS(const nsAString& aNamespaceURI,
                      const nsAString& aQualifiedName,
                      mozilla::ErrorResult& rv);
  void GetInputEncoding(nsAString& aInputEncoding) const;
  already_AddRefed<mozilla::dom::Location> GetLocation() const;
  void GetReferrer(nsAString& aReferrer) const;
  void GetLastModified(nsAString& aLastModified) const;
  void GetReadyState(nsAString& aReadyState) const;



  virtual void GetTitle(nsString& aTitle) = 0;
  virtual void SetTitle(const nsAString& aTitle, mozilla::ErrorResult& rv) = 0;
  void GetDir(nsAString& aDirection) const;
  void SetDir(const nsAString& aDirection);
  nsPIDOMWindowOuter* GetDefaultView() const
  {
    return GetWindow();
  }
  Element* GetActiveElement();
  bool HasFocus(mozilla::ErrorResult& rv) const;
  mozilla::TimeStamp LastFocusTime() const;
  void SetLastFocusTime(const mozilla::TimeStamp& aFocusTime);

  bool MozSyntheticDocument() const
  {
    return IsSyntheticDocument();
  }
  Element* GetCurrentScript();
  void ReleaseCapture() const;
  virtual void MozSetImageElement(const nsAString& aImageElementId,
                                  Element* aElement) = 0;
  nsIURI* GetDocumentURIObject() const;

  virtual bool FullscreenEnabled(mozilla::dom::CallerType aCallerType) = 0;
  virtual Element* GetFullscreenElement() = 0;
  bool Fullscreen()
  {
    return !!GetFullscreenElement();
  }
  void ExitFullscreen();
  Element* GetPointerLockElement();
  void ExitPointerLock()
  {
    UnlockPointer(this);
  }

  bool Hidden() const
  {
    return mVisibilityState != mozilla::dom::VisibilityState::Visible;
  }
  mozilla::dom::VisibilityState VisibilityState() const
  {
    return mVisibilityState;
  }

  virtual mozilla::dom::StyleSheetList* StyleSheets() = 0;
  void GetSelectedStyleSheetSet(nsAString& aSheetSet);
  virtual void SetSelectedStyleSheetSet(const nsAString& aSheetSet) = 0;
  virtual void GetLastStyleSheetSet(nsString& aSheetSet) = 0;
  void GetPreferredStyleSheetSet(nsAString& aSheetSet);
  virtual mozilla::dom::DOMStringList* StyleSheetSets() = 0;
  virtual void EnableStyleSheetsForSet(const nsAString& aSheetSet) = 0;
  Element* ElementFromPoint(float aX, float aY);
  void ElementsFromPoint(float aX,
                         float aY,
                         nsTArray<RefPtr<mozilla::dom::Element>>& aElements);
# 2733 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  already_AddRefed<nsDOMCaretPosition>
    CaretPositionFromPoint(float aX, float aY);

  Element* GetScrollingElement();


  nsINodeList* GetAnonymousNodes(Element& aElement);
  Element* GetAnonymousElementByAttribute(Element& aElement,
                                          const nsAString& aAttrName,
                                          const nsAString& aAttrValue);
  Element* GetBindingParent(nsINode& aNode);
  void LoadBindingDocument(const nsAString& aURI,
                           nsIPrincipal& aSubjectPrincipal,
                           mozilla::ErrorResult& rv);
  void LoadBindingDocument(const nsAString& aURI,
                           const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                           mozilla::ErrorResult& rv);
  mozilla::dom::XPathExpression*
    CreateExpression(const nsAString& aExpression,
                     mozilla::dom::XPathNSResolver* aResolver,
                     mozilla::ErrorResult& rv);
  nsINode* CreateNSResolver(nsINode& aNodeResolver);
  already_AddRefed<mozilla::dom::XPathResult>
    Evaluate(JSContext* aCx, const nsAString& aExpression, nsINode& aContextNode,
             mozilla::dom::XPathNSResolver* aResolver, uint16_t aType,
             JS::Handle<JSObject*> aResult, mozilla::ErrorResult& rv);

  already_AddRefed<mozilla::dom::Touch>
    CreateTouch(nsGlobalWindow* aView, mozilla::dom::EventTarget* aTarget,
                int32_t aIdentifier, int32_t aPageX, int32_t aPageY,
                int32_t aScreenX, int32_t aScreenY, int32_t aClientX,
                int32_t aClientY, int32_t aRadiusX, int32_t aRadiusY,
                float aRotationAngle, float aForce);
  already_AddRefed<mozilla::dom::TouchList> CreateTouchList();
  already_AddRefed<mozilla::dom::TouchList>
    CreateTouchList(mozilla::dom::Touch& aTouch,
                    const mozilla::dom::Sequence<mozilla::OwningNonNull<mozilla::dom::Touch> >& aTouches);
  already_AddRefed<mozilla::dom::TouchList>
    CreateTouchList(const mozilla::dom::Sequence<mozilla::OwningNonNull<mozilla::dom::Touch> >& aTouches);

  void SetStyleSheetChangeEventsEnabled(bool aValue)
  {
    mStyleSheetChangeEventsEnabled = aValue;
  }

  bool StyleSheetChangeEventsEnabled() const
  {
    return mStyleSheetChangeEventsEnabled;
  }

  void ObsoleteSheet(nsIURI *aSheetURI, mozilla::ErrorResult& rv);

  void ObsoleteSheet(const nsAString& aSheetURI, mozilla::ErrorResult& rv);

  already_AddRefed<mozilla::dom::Promise> BlockParsing(mozilla::dom::Promise& aPromise,
                                                       mozilla::ErrorResult& aRv);

  already_AddRefed<nsIURI> GetMozDocumentURIIfNotForErrorPages();


  nsIHTMLCollection* Children();
  uint32_t ChildElementCount();

  virtual nsHTMLDocument* AsHTMLDocument() { return nullptr; }
  virtual mozilla::dom::SVGDocument* AsSVGDocument() { return nullptr; }



  virtual nsIDocument* MasterDocument() = 0;
  virtual void SetMasterDocument(nsIDocument* master) = 0;
  virtual bool IsMasterDocument() = 0;
  virtual mozilla::dom::ImportManager* ImportManager() = 0;

  virtual bool HasSubImportLink(nsINode* aLink) = 0;
  virtual uint32_t IndexOfSubImportLink(nsINode* aLink) = 0;
  virtual void AddSubImportLink(nsINode* aLink) = 0;
  virtual nsINode* GetSubImportLink(uint32_t aIdx) = 0;






  void AddBlockedTrackingNode(nsINode *node)
  {
    if (!node) {
      return;
    }

    nsWeakPtr weakNode = do_GetWeakReference(node);

    if (weakNode) {
      mBlockedTrackingNodes.AppendElement(weakNode);
    }
  }

  gfxUserFontSet* GetUserFontSet(bool aFlushUserFontSet = true);
  void FlushUserFontSet();
  void RebuildUserFontSet();
  mozilla::dom::FontFaceSet* GetFonts() { return mFontFaceSet; }


  mozilla::dom::FontFaceSet* Fonts();

  bool DidFireDOMContentLoaded() const { return mDidFireDOMContentLoaded; }

  void SetDocumentUseCounter(mozilla::UseCounter aUseCounter)
  {
    if (!mUseCounters[aUseCounter]) {
      mUseCounters[aUseCounter] = true;
    }
  }

  void SetPageUseCounter(mozilla::UseCounter aUseCounter);

  void SetDocumentAndPageUseCounter(mozilla::UseCounter aUseCounter)
  {
    SetDocumentUseCounter(aUseCounter);
    SetPageUseCounter(aUseCounter);
  }

  void PropagateUseCounters(nsIDocument* aParentDocument);

  void SetUserHasInteracted(bool aUserHasInteracted)
  {
    mUserHasInteracted = aUserHasInteracted;
  }

  bool UserHasInteracted()
  {
    return mUserHasInteracted;
  }

  bool HasScriptsBlockedBySandbox();

  bool InlineScriptAllowedByCSP();

  void ReportHasScrollLinkedEffect();
  bool HasScrollLinkedEffect() const
  {
    return mHasScrollLinkedEffect;
  }

  mozilla::dom::DocGroup* GetDocGroup() const;

  virtual void AddIntersectionObserver(
    mozilla::dom::DOMIntersectionObserver* aObserver) = 0;
  virtual void RemoveIntersectionObserver(
    mozilla::dom::DOMIntersectionObserver* aObserver) = 0;

  virtual void UpdateIntersectionObservations() = 0;
  virtual void ScheduleIntersectionObserverNotification() = 0;
  virtual void NotifyIntersectionObservers() = 0;


  virtual nsresult Dispatch(const char* aName,
                            mozilla::TaskCategory aCategory,
                            already_AddRefed<nsIRunnable>&& aRunnable) override;

  virtual nsIEventTarget*
  EventTargetFor(mozilla::TaskCategory aCategory) const override;

  virtual mozilla::AbstractThread*
  AbstractMainThreadFor(mozilla::TaskCategory aCategory) override;




  void NoteScriptTrackingStatus(const nsACString& aURL, bool isTracking);
  bool IsScriptTracking(const nsACString& aURL) const;

  bool PrerenderHref(nsIURI* aHref);



  virtual mozilla::dom::FlashClassification DocumentFlashClassification() = 0;
  virtual bool IsThirdParty() = 0;

protected:
  bool GetUseCounter(mozilla::UseCounter aUseCounter)
  {
    return mUseCounters[aUseCounter];
  }

  void SetChildDocumentUseCounter(mozilla::UseCounter aUseCounter)
  {
    if (!mChildDocumentUseCounters[aUseCounter]) {
      mChildDocumentUseCounters[aUseCounter] = true;
    }
  }

  bool GetChildDocumentUseCounter(mozilla::UseCounter aUseCounter)
  {
    return mChildDocumentUseCounters[aUseCounter];
  }

private:
  mutable std::bitset<eDeprecatedOperationCount> mDeprecationWarnedAbout;
  mutable std::bitset<eDocumentWarningCount> mDocWarningWarnedAbout;

  nsAutoPtr<SelectorCache> mSelectorCache;

protected:
  ~nsIDocument();
  nsPropertyTable* GetExtraPropertyTable(uint16_t aCategory);


  virtual nsPIDOMWindowOuter* GetWindowInternal() const = 0;


  virtual nsIScriptGlobalObject* GetScriptHandlingObjectInternal() const = 0;


  virtual bool InternalAllowXULXBL() = 0;






  virtual void WillDispatchMutationEvent(nsINode* aTarget) = 0;
  virtual void MutationEventDispatched(nsINode* aTarget) = 0;
  friend class mozAutoSubtreeModified;

  virtual Element* GetNameSpaceElement() override
  {
    return GetRootElement();
  }

  void SetContentTypeInternal(const nsACString& aType);

  nsCString GetContentTypeInternal() const
  {
    return mContentType;
  }

  mozilla::dom::XPathEvaluator* XPathEvaluator();

  void HandleRebuildUserFontSet() {
    mPostedFlushUserFontSet = false;
    FlushUserFontSet();
  }

  const nsString& GetId() const
  {
    return mId;
  }






  void UpdateFrameRequestCallbackSchedulingState(nsIPresShell* aOldShell = nullptr);

  nsCString mReferrer;
  nsString mLastModified;

  nsCOMPtr<nsIURI> mDocumentURI;
  nsCOMPtr<nsIURI> mOriginalURI;
  nsCOMPtr<nsIURI> mChromeXHRDocURI;
  nsCOMPtr<nsIURI> mDocumentBaseURI;
  nsCOMPtr<nsIURI> mChromeXHRDocBaseURI;



  RefPtr<mozilla::URLExtraData> mCachedURLData;


  nsWeakPtr mDocumentLoadGroup;

  bool mReferrerPolicySet;
  ReferrerPolicyEnum mReferrerPolicy;

  bool mBlockAllMixedContent;
  bool mBlockAllMixedContentPreloads;
  bool mUpgradeInsecureRequests;
  bool mUpgradeInsecurePreloads;




  nsDataHashtable<nsURIHashKey, HSTSPrimingState> mHSTSPrimingURIList;

  mozilla::WeakPtr<nsDocShell> mDocumentContainer;

  nsCString mCharacterSet;
  int32_t mCharacterSetSource;


  nsIDocument* mParentDocument;


  mozilla::dom::Element* mCachedRootElement;



  nsNodeInfoManager* mNodeInfoManager;
  RefPtr<mozilla::css::Loader> mCSSLoader;
  RefPtr<mozilla::css::ImageLoader> mStyleImageLoader;
  RefPtr<nsHTMLStyleSheet> mAttrStyleSheet;
  RefPtr<nsHTMLCSSStyleSheet> mStyleAttrStyleSheet;


  RefPtr<mozilla::dom::ImageTracker> mImageTracker;






  nsAutoPtr<nsTHashtable<nsPtrHashKey<nsISupports> > > mActivityObservers;




  nsTHashtable<nsPtrHashKey<mozilla::dom::Link> > mLinksToUpdate;


  RefPtr<nsSMILAnimationController> mAnimationController;


  nsPropertyTable mPropertyTable;
  nsTArray<nsAutoPtr<nsPropertyTable> > mExtraPropertyTables;


  nsCOMPtr<nsIHTMLCollection> mChildrenCollection;


  RefPtr<mozilla::dom::FontFaceSet> mFontFaceSet;



  mozilla::TimeStamp mLastFocusTime;


  bool mBidiEnabled : 1;

  bool mMathMLEnabled : 1;





  bool mIsInitialDocumentInWindow : 1;

  bool mIgnoreDocGroupMismatches : 1;



  bool mLoadedAsData : 1;




  bool mLoadedAsInteractiveData : 1;



  bool mMayStartLayout : 1;


  bool mHaveFiredTitleChange : 1;





  bool mIsShowing : 1;




  bool mVisible : 1;


  bool mHasReferrerPolicyCSP : 1;




  bool mRemovedFromDocShell : 1;



  bool mAllowDNSPrefetch : 1;


  bool mIsStaticDocument : 1;


  bool mCreatingStaticClone : 1;


  bool mInUnlinkOrDeletion : 1;


  bool mHasHadScriptHandlingObject : 1;


  bool mIsBeingUsedAsImage : 1;



  bool mIsSyntheticDocument : 1;


  bool mHasLinksToUpdate : 1;


  bool mMayHaveDOMMutationObservers : 1;


  bool mMayHaveAnimationObservers : 1;


  bool mHasMixedActiveContentLoaded : 1;


  bool mHasMixedActiveContentBlocked : 1;


  bool mHasMixedDisplayContentLoaded : 1;


  bool mHasMixedDisplayContentBlocked : 1;


  bool mHasMixedContentObjectSubrequest : 1;


  bool mHasCSP : 1;


  bool mHasUnsafeEvalCSP : 1;


  bool mHasUnsafeInlineCSP : 1;


  bool mHasTrackingContentBlocked : 1;


  bool mHasTrackingContentLoaded : 1;


  bool mBFCacheDisallowed : 1;

  bool mHasHadDefaultView : 1;


  bool mStyleSheetChangeEventsEnabled : 1;


  bool mIsSrcdocDocument : 1;




  bool mDidDocumentOpen : 1;





  bool mHasDisplayDocument : 1;


  bool mFontFaceSetDirty : 1;


  bool mGetUserFontSetCalled : 1;


  bool mPostedFlushUserFontSet : 1;



  bool mDidFireDOMContentLoaded : 1;


  bool mHasScrollLinkedEffect : 1;




  bool mFrameRequestCallbacksScheduled : 1;


  nsCompatibility mCompatMode;


  ReadyState mReadyState;



  mozilla::StyleBackendType mStyleBackendType;



  mozilla::dom::VisibilityState mVisibilityState;
  static_assert(sizeof(mozilla::dom::VisibilityState) == sizeof(uint8_t),
                "Error size of mVisibilityState and mDummy");




  enum Type {
    eUnknown,
    eHTML,
    eXHTML,
    eGenericXML,
    eSVG,
    eXUL
  };

  Type mType;

  uint8_t mDefaultElementType;

  enum Tri {
    eTriUnset = 0,
    eTriFalse,
    eTriTrue
  };

  Tri mAllowXULXBL;
# 3272 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDocument.h"
  nsCOMPtr<nsIScriptGlobalObject> mScriptGlobalObject;



  nsCOMPtr<nsIDocument> mOriginalDocument;



  uint32_t mBidiOptions;




  uint32_t mSandboxFlags;

  nsCString mContentLanguage;


  nsCOMPtr<nsIChannel> mChannel;
private:
  nsCString mContentType;
  nsString mId;
protected:


  nsCOMPtr<nsISupports> mSecurityInfo;



  nsCOMPtr<nsIChannel> mFailedChannel;



  uint32_t mPartID;



  uint32_t mMarkedCCGeneration;

  nsIPresShell* mPresShell;

  nsCOMArray<nsINode> mSubtreeModifiedTargets;
  uint32_t mSubtreeModifiedDepth;




  nsCOMPtr<nsIDocument> mDisplayDocument;

  uint32_t mEventsSuppressed;





  uint32_t mExternalScriptsBeingEvaluated;




  int32_t mFrameRequestCallbackCounter;


  uint32_t mStaticCloneCount;






  nsTArray<nsWeakPtr> mBlockedTrackingNodes;



  nsPIDOMWindowInner* mWindow;

  nsCOMPtr<nsIDocumentEncoder> mCachedEncoder;

  struct FrameRequest;

  nsTArray<FrameRequest> mFrameRequestCallbacks;



  nsIBFCacheEntry *mBFCacheEntry;


  nsString mBaseTarget;

  nsCOMPtr<nsIStructuredCloneContainer> mStateObjectContainer;
  nsCOMPtr<nsIVariant> mStateObjectCached;

  uint32_t mInSyncOperationCount;

  RefPtr<mozilla::dom::XPathEvaluator> mXPathEvaluator;

  nsTArray<RefPtr<mozilla::dom::AnonymousContent>> mAnonymousContents;

  uint32_t mBlockDOMContentLoaded;


  PRCList mDOMMediaQueryLists;


  std::bitset<mozilla::eUseCounter_Count> mUseCounters;

  std::bitset<mozilla::eUseCounter_Count> mChildDocumentUseCounters;


  std::bitset<mozilla::eUseCounter_Count> mNotifiedPageForUseCounter;


  bool mUserHasInteracted;

  mozilla::TimeStamp mPageUnloadingEventTimeStamp;

  RefPtr<mozilla::dom::DocGroup> mDocGroup;




  nsTHashtable<nsCStringHashKey> mTrackingScripts;
};

template<typename T> struct nsIDocument::COMTypeInfo<nsIDocument, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDocument::COMTypeInfo<nsIDocument, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xce1f7627, 0x7109, 0x4977, { 0xba, 0x77, 0x49, 0x0f, 0xfd, 0xe0, 0x7a, 0xaa } };






class mozAutoSubtreeModified
{
public:






  mozAutoSubtreeModified(nsIDocument* aSubtreeOwner, nsINode* aTarget)
  {
    UpdateTarget(aSubtreeOwner, aTarget);
  }

  ~mozAutoSubtreeModified()
  {
    UpdateTarget(nullptr, nullptr);
  }

  void UpdateTarget(nsIDocument* aSubtreeOwner, nsINode* aTarget)
  {
    if (mSubtreeOwner) {
      mSubtreeOwner->MutationEventDispatched(mTarget);
    }

    mTarget = aTarget;
    mSubtreeOwner = aSubtreeOwner;
    if (mSubtreeOwner) {
      mSubtreeOwner->WillDispatchMutationEvent(mTarget);
    }
  }

private:
  nsCOMPtr<nsINode> mTarget;
  nsCOMPtr<nsIDocument> mSubtreeOwner;
};

class nsAutoSyncOperation
{
public:
  explicit nsAutoSyncOperation(nsIDocument* aDocument);
  ~nsAutoSyncOperation();
private:
  nsCOMArray<nsIDocument> mDocuments;
  uint32_t mMicroTaskLevel;
};


nsresult
NS_NewHTMLDocument(nsIDocument** aInstancePtrResult, bool aLoadedAsData = false);

nsresult
NS_NewXMLDocument(nsIDocument** aInstancePtrResult, bool aLoadedAsData = false,
                  bool aIsPlainDocument = false);

nsresult
NS_NewSVGDocument(nsIDocument** aInstancePtrResult);

nsresult
NS_NewImageDocument(nsIDocument** aInstancePtrResult);

nsresult
NS_NewVideoDocument(nsIDocument** aInstancePtrResult);




nsresult
NS_NewDOMDocument(nsIDOMDocument** aInstancePtrResult,
                  const nsAString& aNamespaceURI,
                  const nsAString& aQualifiedName,
                  nsIDOMDocumentType* aDoctype,
                  nsIURI* aDocumentURI,
                  nsIURI* aBaseURI,
                  nsIPrincipal* aPrincipal,
                  bool aLoadedAsData,
                  nsIGlobalObject* aEventObject,
                  DocumentFlavor aFlavor);



nsresult
NS_NewXBLDocument(nsIDOMDocument** aInstancePtrResult,
                  nsIURI* aDocumentURI,
                  nsIURI* aBaseURI,
                  nsIPrincipal* aPrincipal);

nsresult
NS_NewPluginDocument(nsIDocument** aInstancePtrResult);

inline nsIDocument*
nsINode::GetOwnerDocument() const
{
  nsIDocument* ownerDoc = OwnerDoc();

  return ownerDoc != this ? ownerDoc : nullptr;
}

inline nsINode*
nsINode::OwnerDocAsNode() const
{
  return OwnerDoc();
}

inline mozilla::dom::ParentObject
nsINode::GetParentObject() const
{
  mozilla::dom::ParentObject p(OwnerDoc());


  p.mUseXBLScope = IsInAnonymousSubtree() && !IsAnonymousContentInSVGUseSubtree();
  return p;
}
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSUtils.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h" 1
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
namespace mozilla {
class TimeStamp;

namespace dom {
class Promise;
}

}

class nsIProfilerStartParams;

enum TracingKind {
  TRACING_EVENT,
  TRACING_INTERVAL_START,
  TRACING_INTERVAL_END,
};

class ProfilerBacktrace;

struct ProfilerBacktraceDestructor
{
  void operator()(ProfilerBacktrace*);
};
using UniqueProfilerBacktrace =
  mozilla::UniquePtr<ProfilerBacktrace, ProfilerBacktraceDestructor>;
# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
void profiler_tracing(const char* aCategory, const char* aInfo, TracingKind aKind = TRACING_EVENT);

void profiler_tracing(const char* aCategory, const char* aInfo, UniqueProfilerBacktrace aCause, TracingKind aKind = TRACING_EVENT);






void profiler_init(void* stackTop);




void profiler_shutdown();







void profiler_start(int aEntries, double aInterval, const char** aFeatures, uint32_t aFeatureCount, const char** aThreadNameFilters, uint32_t aFilterCount);







void profiler_stop();







void profiler_pause();
void profiler_resume();


bool profiler_is_paused();



UniqueProfilerBacktrace profiler_get_backtrace();

void profiler_get_backtrace_noalloc(char *output, size_t outputSize);
# 201 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
bool profiler_is_active();





bool profiler_feature_active(const char*);



void profiler_set_frame_number(int frameNumber);



mozilla::UniquePtr<char[]> profiler_get_profile(double aSinceTime = 0);




void profiler_get_start_params(int* aEntrySize, double* aInterval, mozilla::Vector<const char*>* aFeatures, mozilla::Vector<const char*>* aFilters);
# 231 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
extern "C" {
void profiler_save_profile_to_file(const char* aFilename);
}




const char** profiler_get_features();




void profiler_get_buffer_info_helper(uint32_t* aCurrentPosition, uint32_t* aEntries, uint32_t* aGeneration);
# 254 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
static inline void profiler_get_buffer_info(uint32_t* aCurrentPosition,
                                            uint32_t* aEntries,
                                            uint32_t* aGeneration)
{
  *aCurrentPosition = 0;
  *aEntries = 0;
  *aGeneration = 0;

  profiler_get_buffer_info_helper(aCurrentPosition, aEntries, aGeneration);
}



void profiler_register_thread(const char* name, void* guessStackTop);

void profiler_unregister_thread();





void profiler_thread_sleep();
void profiler_thread_wake();
bool profiler_thread_is_sleeping();




void profiler_js_interrupt_callback();



double profiler_time();

void profiler_log(const char *str);






# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 295 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/ProfilingStack.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/ProfilingStack.h"
struct JSRuntime;
class JSTracer;

namespace js {






class ProfileEntry
{
# 42 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/js/ProfilingStack.h"
    const char * volatile string;


    const char * volatile dynamicString;


    void * volatile spOrScript;


    int32_t volatile lineOrPcOffset;


    uint32_t volatile flags_;

  public:

    enum Flags : uint32_t {




        IS_CPP_ENTRY = 0x01,



        FRAME_LABEL_COPY = 0x02,



        BEGIN_PSEUDO_JS = 0x04,



        OSR = 0x08,


        ALL = IS_CPP_ENTRY|FRAME_LABEL_COPY|BEGIN_PSEUDO_JS|OSR,


        CATEGORY_MASK = ~ALL
    };


    enum class Category : uint32_t {
        OTHER = 0x10,
        CSS = 0x20,
        JS = 0x40,
        GC = 0x80,
        CC = 0x100,
        NETWORK = 0x200,
        GRAPHICS = 0x400,
        STORAGE = 0x800,
        EVENTS = 0x1000,

        FIRST = OTHER,
        LAST = EVENTS
    };

    static_assert((static_cast<int>(Category::FIRST) & Flags::ALL) == 0,
                  "The category bitflags should not intersect with the other flags!");






    bool isCpp() const volatile { return hasFlag(IS_CPP_ENTRY); }
    bool isJs() const volatile { return !isCpp(); }

    bool isCopyLabel() const volatile { return hasFlag(FRAME_LABEL_COPY); }

    void setLabel(const char* aString) volatile { string = aString; }
    const char* label() const volatile { return string; }

    void setDynamicString(const char* aDynamicString) volatile { dynamicString = aDynamicString; }
    const char* getDynamicString() const volatile { return dynamicString; }

    void initJsFrame(JSScript* aScript, jsbytecode* aPc) volatile {
        flags_ = 0;
        spOrScript = aScript;
        setPC(aPc);
    }
    void initCppFrame(void* aSp, uint32_t aLine) volatile {
        flags_ = IS_CPP_ENTRY;
        spOrScript = aSp;
        lineOrPcOffset = static_cast<int32_t>(aLine);
    }

    void setFlag(uint32_t flag) volatile {
        do { } while (0);
        flags_ |= flag;
    }
    void unsetFlag(uint32_t flag) volatile {
        do { } while (0);
        flags_ &= ~flag;
    }
    bool hasFlag(uint32_t flag) const volatile {
        return bool(flags_ & flag);
    }

    uint32_t flags() const volatile {
        return flags_;
    }

    uint32_t category() const volatile {
        return flags_ & CATEGORY_MASK;
    }
    void setCategory(Category c) volatile {
        do { } while (0);
        do { } while (0);
        flags_ &= ~CATEGORY_MASK;
        setFlag(static_cast<uint32_t>(c));
    }

    void setOSR() volatile {
        do { } while (0);
        setFlag(OSR);
    }
    void unsetOSR() volatile {
        do { } while (0);
        unsetFlag(OSR);
    }
    bool isOSR() const volatile {
        return hasFlag(OSR);
    }

    void* stackAddress() const volatile {
        do { } while (0);
        return spOrScript;
    }
    JSScript* script() const volatile;
    uint32_t line() const volatile {
        do { } while (0);
        return static_cast<uint32_t>(lineOrPcOffset);
    }


    JSScript* rawScript() const volatile {
        do { } while (0);
        return (JSScript*)spOrScript;
    }


    jsbytecode* pc() const volatile;
    void setPC(jsbytecode* pc) volatile;

    void trace(JSTracer* trc);




    static const int32_t NullPCOffset = -1;

    static size_t offsetOfLabel() { return __builtin_offsetof(ProfileEntry, string); }
    static size_t offsetOfSpOrScript() { return __builtin_offsetof(ProfileEntry, spOrScript); }
    static size_t offsetOfLineOrPcOffset() { return __builtin_offsetof(ProfileEntry, lineOrPcOffset); }
    static size_t offsetOfFlags() { return __builtin_offsetof(ProfileEntry, flags_); }
};

void
SetContextProfilingStack(JSContext* cx, ProfileEntry* stack, uint32_t* size,
                         uint32_t max);

void
EnableContextProfilingStack(JSContext* cx, bool enabled);

void
RegisterContextProfilingEventMarker(JSContext* cx, void (*fn)(const char*));

jsbytecode*
ProfilingGetPC(JSContext* cx, JSScript* script, void* ip);

}
# 297 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Sprintf.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Sprintf.h"
template <size_t N>
int VsprintfLiteral(char (&buffer)[N], const char* format, va_list args)
{
    do { } while (0);
    int result = vsnprintf(buffer, N, format, args);
    buffer[N - 1] = '\0';
    return result;
}

template <size_t N>
__attribute__ ((format (printf, 2, 3)))
int SprintfLiteral(char (&buffer)[N], const char* format, ...)
{
  va_list args;
  __builtin_va_start(args, format);
  int result = VsprintfLiteral(buffer, format, args);
  __builtin_va_end(args);
  return result;
}
# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h" 1
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h"
namespace mozilla {







typedef sig_atomic_t sig_safe_t;


namespace detail {
# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h"
template<typename T>
class ThreadLocal
{
# 117 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h"
  bool initialized() const {

    return true;



  }

public:
# 134 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h"
  __attribute__ ((warn_unused_result)) inline bool init();

  inline T get() const;

  inline void set(const T aValue);

private:

  T mValue;




};

template<typename T>
inline bool
ThreadLocal<T>::init()
{
  static_assert(mozilla::IsPointer<T>::value || mozilla::IsIntegral<T>::value,
                "mozilla::ThreadLocal must be used with a pointer or "
                "integral type");
  static_assert(sizeof(T) <= sizeof(void*),
                "mozilla::ThreadLocal can't be used for types larger than "
                "a pointer");


  return true;
# 173 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h"
}

template<typename T>
inline T
ThreadLocal<T>::get() const
{

  return mValue;
# 191 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h"
}

template<typename T>
inline void
ThreadLocal<T>::set(const T aValue)
{

  mValue = aValue;
# 211 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ThreadLocal.h"
}







}
}
# 299 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h" 2



# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h" 2
# 52 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h"
class ProfilerMarkerPayload;
template<typename T>
class ProfilerLinkedList;
class SpliceableJSONWriter;
class UniqueStacks;

class ProfilerMarker
{
  friend class ProfilerLinkedList<ProfilerMarker>;

public:
  explicit ProfilerMarker(const char* aMarkerName,
                          ProfilerMarkerPayload* aPayload = nullptr,
                          double aTime = 0);
  ~ProfilerMarker();

  const char* GetMarkerName() const { return mMarkerName; }

  void StreamJSON(SpliceableJSONWriter& aWriter,
                  const mozilla::TimeStamp& aStartTime,
                  UniqueStacks& aUniqueStacks) const;

  void SetGeneration(uint32_t aGenID);

  bool HasExpired(uint32_t aGenID) const { return mGenID + 2 <= aGenID; }

  double GetTime() const;

private:
  char* mMarkerName;
  ProfilerMarkerPayload* mPayload;
  ProfilerMarker* mNext;
  double mTime;
  uint32_t mGenID;
};

template<typename T>
class ProfilerLinkedList
{
public:
  ProfilerLinkedList()
    : mHead(nullptr)
    , mTail(nullptr)
  {}

  void insert(T* aElem)
  {
    if (!mTail) {
      mHead = aElem;
      mTail = aElem;
    } else {
      mTail->mNext = aElem;
      mTail = aElem;
    }
    aElem->mNext = nullptr;
  }

  T* popHead()
  {
    if (!mHead) {
      do { } while (0);
      return nullptr;
    }

    T* head = mHead;

    mHead = head->mNext;
    if (!mHead) {
      mTail = nullptr;
    }

    return head;
  }

  const T* peek() {
    return mHead;
  }

private:
  T* mHead;
  T* mTail;
};

typedef ProfilerLinkedList<ProfilerMarker> ProfilerMarkerLinkedList;

template<typename T>
class ProfilerSignalSafeLinkedList {
public:
  ProfilerSignalSafeLinkedList()
    : mSignalLock(false)
  {}

  ~ProfilerSignalSafeLinkedList()
  {
    if (mSignalLock) {


      abort();
    }

    while (mList.peek()) {
      delete mList.popHead();
    }
  }






  void insert(T* aElement)
  {
    do { } while (0);

    mSignalLock = true;
    asm volatile("" ::: "memory");;

    mList.insert(aElement);

    asm volatile("" ::: "memory");;
    mSignalLock = false;
  }





  ProfilerLinkedList<T>* accessList()
  {
    return mSignalLock ? nullptr : &mList;
  }

private:
  ProfilerLinkedList<T> mList;



  volatile bool mSignalLock;
};


void ProfilerJSEventMarker(const char* aEvent);






struct PseudoStack
{
public:
  PseudoStack()
    : mStackPointer(0)
    , mSleep(AWAKE)
    , mContext(nullptr)
    , mJSSampling(INACTIVE)
  {
                               ;
  }

  ~PseudoStack()
  {
                               ;




    do { static_assert(mozilla::detail::AssertionConditionType<decltype(mStackPointer == 0)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mStackPointer == 0))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mStackPointer == 0" ")"); do { *((volatile int*) __null) = 219; ::abort(); } while (0); } } while (0);
  }



  void reinitializeOnResume()
  {




    (void)mSleep.compareExchange(SLEEPING_OBSERVED, SLEEPING_NOT_OBSERVED);
  }

  void addMarker(const char* aMarkerStr, ProfilerMarkerPayload* aPayload,
                 double aTime)
  {
    ProfilerMarker* marker = new ProfilerMarker(aMarkerStr, aPayload, aTime);
    mPendingMarkers.insert(marker);
  }


  ProfilerMarkerLinkedList* getPendingMarkers()
  {



    return mPendingMarkers.accessList();
  }

  void push(const char* aName, js::ProfileEntry::Category aCategory,
            uint32_t line)
  {
    push(aName, aCategory, nullptr, false, line, nullptr);
  }

  void push(const char* aName, js::ProfileEntry::Category aCategory,
            void* aStackAddress, bool aCopy, uint32_t line,
            const char* aDynamicString)
  {
    if (size_t(mStackPointer) >= mozilla::ArrayLength(mStack)) {
      mStackPointer++;
      return;
    }

    volatile js::ProfileEntry& entry = mStack[mStackPointer];



    entry.initCppFrame(aStackAddress, line);
    entry.setLabel(aName);
    entry.setDynamicString(aDynamicString);
    do { } while (0);
    entry.setCategory(aCategory);


    if (aCopy) {
      entry.setFlag(js::ProfileEntry::FRAME_LABEL_COPY);
    } else {
      entry.unsetFlag(js::ProfileEntry::FRAME_LABEL_COPY);
    }


    asm volatile("" ::: "memory");;
    mStackPointer++;
  }


  void pop() { mStackPointer--; }

  uint32_t stackSize() const
  {
    return std::min(mStackPointer,
                    mozilla::sig_safe_t(mozilla::ArrayLength(mStack)));
  }



  void setJSContext(JSContext* aContext)
  {


    do { } while (0);

    mContext = aContext;

    js::SetContextProfilingStack(aContext,
                                 (js::ProfileEntry*) mStack,
                                 (uint32_t*) &mStackPointer,
                                 (uint32_t) mozilla::ArrayLength(mStack));
    pollJSSampling();
  }




  void startJSSampling()
  {


    do { static_assert(mozilla::detail::AssertionConditionType<decltype(mJSSampling == INACTIVE || mJSSampling == INACTIVE_REQUESTED)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mJSSampling == INACTIVE || mJSSampling == INACTIVE_REQUESTED))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mJSSampling == INACTIVE || mJSSampling == INACTIVE_REQUESTED" ")"); do { *((volatile int*) __null) = 320; ::abort(); } while (0); } } while (0);

    mJSSampling = ACTIVE_REQUESTED;
  }



  void stopJSSampling()
  {


    do { static_assert(mozilla::detail::AssertionConditionType<decltype(mJSSampling == ACTIVE || mJSSampling == ACTIVE_REQUESTED)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(mJSSampling == ACTIVE || mJSSampling == ACTIVE_REQUESTED))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "mJSSampling == ACTIVE || mJSSampling == ACTIVE_REQUESTED" ")"); do { *((volatile int*) __null) = 331; ::abort(); } while (0); } } while (0);

    mJSSampling = INACTIVE_REQUESTED;
  }


  void pollJSSampling()
  {



    if (mContext) {
# 351 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h"
      if (mJSSampling.compareExchange(ACTIVE_REQUESTED, ACTIVE)) {
        js::EnableContextProfilingStack(mContext, true);
        js::RegisterContextProfilingEventMarker(mContext,
                                                &ProfilerJSEventMarker);

      } else if (mJSSampling.compareExchange(INACTIVE_REQUESTED, INACTIVE)) {
        js::EnableContextProfilingStack(mContext, false);
      }
    }
  }

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
  {
    size_t n = aMallocSizeOf(this);
# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h"
    return n;
  }


  bool CanDuplicateLastSampleDueToSleep()
  {
    if (mSleep == AWAKE) {
      return false;
    }

    if (mSleep.compareExchange(SLEEPING_NOT_OBSERVED, SLEEPING_OBSERVED)) {
      return false;
    }

    return true;
  }



  void setSleeping()
  {
    do { } while (0);
    mSleep = SLEEPING_NOT_OBSERVED;
  }



  void setAwake()
  {
    do { } while (0);
    mSleep = AWAKE;
  }

  bool isSleeping() { return mSleep != AWAKE; }

private:

  PseudoStack(const PseudoStack&) = delete;
  void operator=(const PseudoStack&) = delete;

  void flushSamplerOnJSShutdown();

public:

  js::ProfileEntry volatile mStack[1024];

private:

  ProfilerSignalSafeLinkedList<ProfilerMarker> mPendingMarkers;



  mozilla::sig_safe_t mStackPointer;
# 463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h"
  static const int AWAKE = 0;
  static const int SLEEPING_NOT_OBSERVED = 1;
  static const int SLEEPING_OBSERVED = 2;
  mozilla::Atomic<int> mSleep;

public:


  JSContext* mContext;

private:
# 514 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/PseudoStack.h"
  static const int INACTIVE = 0;
  static const int ACTIVE_REQUESTED = 1;
  static const int ACTIVE = 2;
  static const int INACTIVE_REQUESTED = 3;
  mozilla::Atomic<int> mJSSampling;
};
# 301 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMemoryReporter.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMemoryReporter.h"
class mozIDOMWindowProxy;

class nsIRunnable;

class nsISimpleEnumerator;
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMemoryReporter.h"
class nsIMemoryReporterCallback : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Callback(const nsACString & process, const nsACString & path, int32_t kind, int32_t units, int64_t amount, const nsACString & description, nsISupports *data) = 0;

};

  template<typename T> struct nsIMemoryReporterCallback::COMTypeInfo<nsIMemoryReporterCallback, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMemoryReporterCallback::COMTypeInfo<nsIMemoryReporterCallback, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x62ef0e1c, 0xdbd6, 0x11e3, { 0xaa, 0x75, 0x3c, 0x97, 0x0e, 0x9f, 0x42, 0x38 }};
# 113 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMemoryReporter.h"
class nsIMemoryReporter : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult CollectReports(nsIMemoryReporterCallback *callback, nsISupports *data, bool anonymize) = 0;

  enum {
    KIND_NONHEAP = 0,
    KIND_HEAP = 1,
    KIND_OTHER = 2,
    UNITS_BYTES = 0,
    UNITS_COUNT = 1,
    UNITS_COUNT_CUMULATIVE = 2,
    UNITS_PERCENTAGE = 3
  };

};

  template<typename T> struct nsIMemoryReporter::COMTypeInfo<nsIMemoryReporter, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMemoryReporter::COMTypeInfo<nsIMemoryReporter, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x92a36db1, 0x46bd, 0x4fe6, { 0x98, 0x8e, 0x47, 0xdb, 0x47, 0x23, 0x6d, 0x8b }};
# 201 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMemoryReporter.h"
class nsIFinishReportingCallback : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Callback(nsISupports *data) = 0;

};

  template<typename T> struct nsIFinishReportingCallback::COMTypeInfo<nsIFinishReportingCallback, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIFinishReportingCallback::COMTypeInfo<nsIFinishReportingCallback, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x548b3909, 0xc04d, 0x4ca6, { 0x84, 0x66, 0xb8, 0xbe, 0xe3, 0x83, 0x74, 0x57 }};
# 279 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMemoryReporter.h"
class nsIMemoryReporterManager : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  __attribute__ ((warn_unused_result)) virtual nsresult Init(void) = 0;


  virtual nsresult RegisterStrongReporter(nsIMemoryReporter *reporter) = 0;


  virtual nsresult RegisterStrongAsyncReporter(nsIMemoryReporter *reporter) = 0;


  virtual nsresult RegisterWeakReporter(nsIMemoryReporter *reporter) = 0;


  virtual nsresult RegisterWeakAsyncReporter(nsIMemoryReporter *reporter) = 0;


  virtual nsresult UnregisterStrongReporter(nsIMemoryReporter *reporter) = 0;


  virtual nsresult UnregisterWeakReporter(nsIMemoryReporter *reporter) = 0;


  virtual nsresult BlockRegistrationAndHideExistingReporters(void) = 0;


  virtual nsresult UnblockRegistrationAndRestoreOriginalReporters(void) = 0;


  virtual nsresult RegisterStrongReporterEvenIfBlocked(nsIMemoryReporter *aReporter) = 0;


  virtual nsresult GetReports(nsIMemoryReporterCallback *handleReport, nsISupports *handleReportData, nsIFinishReportingCallback *finishReporting, nsISupports *finishReportingData, bool anonymize) = 0;


  virtual nsresult GetReportsExtended(nsIMemoryReporterCallback *handleReport, nsISupports *handleReportData, nsIFinishReportingCallback *finishReporting, nsISupports *finishReportingData, bool anonymize, bool minimizeMemoryUsage, const nsAString & DMDDumpIdent) = 0;


  virtual nsresult GetReportsForThisProcessExtended(nsIMemoryReporterCallback *handleReport, nsISupports *handleReportData, bool anonymize, FILE *DMDFile, nsIFinishReportingCallback *finishReporting, nsISupports *finishReportingData) = 0;


  virtual nsresult EndReport(void) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetVsize(int64_t *aVsize) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetVsizeMaxContiguous(int64_t *aVsizeMaxContiguous) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetResident(int64_t *aResident) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetResidentFast(int64_t *aResidentFast) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetResidentPeak(int64_t *aResidentPeak) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetResidentUnique(int64_t *aResidentUnique) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetHeapAllocated(int64_t *aHeapAllocated) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetHeapOverheadFraction(int64_t *aHeapOverheadFraction) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetJSMainRuntimeGCHeap(int64_t *aJSMainRuntimeGCHeap) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetJSMainRuntimeTemporaryPeak(int64_t *aJSMainRuntimeTemporaryPeak) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetJSMainRuntimeCompartmentsSystem(int64_t *aJSMainRuntimeCompartmentsSystem) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetJSMainRuntimeCompartmentsUser(int64_t *aJSMainRuntimeCompartmentsUser) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetImagesContentUsedUncompressed(int64_t *aImagesContentUsedUncompressed) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetStorageSQLite(int64_t *aStorageSQLite) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetLowMemoryEventsVirtual(int64_t *aLowMemoryEventsVirtual) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetLowMemoryEventsPhysical(int64_t *aLowMemoryEventsPhysical) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetGhostWindows(int64_t *aGhostWindows) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetPageFaultsHard(int64_t *aPageFaultsHard) = 0;


  virtual nsresult GetHasMozMallocUsableSize(bool *aHasMozMallocUsableSize) = 0;
  inline bool GetHasMozMallocUsableSize()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetHasMozMallocUsableSize(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsDMDEnabled(bool *aIsDMDEnabled) = 0;
  inline bool GetIsDMDEnabled()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsDMDEnabled(&result);
    do { } while (0);
    return result;
  }


  virtual nsresult GetIsDMDRunning(bool *aIsDMDRunning) = 0;
  inline bool GetIsDMDRunning()
  {
    bool result;
    mozilla::DebugOnly<nsresult> rv = GetIsDMDRunning(&result);
    do { } while (0);
    return result;
  }


  __attribute__ ((warn_unused_result)) virtual nsresult MinimizeMemoryUsage(nsIRunnable *callback) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult SizeOfTab(mozIDOMWindowProxy *window, int64_t *jsObjectsSize, int64_t *jsStringsSize, int64_t *jsOtherSize, int64_t *domSize, int64_t *styleSize, int64_t *otherSize, int64_t *totalSize, double *jsMilliseconds, double *nonJSMilliseconds) = 0;

};

  template<typename T> struct nsIMemoryReporterManager::COMTypeInfo<nsIMemoryReporterManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMemoryReporterManager::COMTypeInfo<nsIMemoryReporterManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x2998574d, 0x8993, 0x407a, { 0xb1, 0xa5, 0x8a, 0xd7, 0x41, 0x76, 0x53, 0xe1 }};
# 851 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMemoryReporter.h"
class nsPIDOMWindowOuter;


typedef nsIMemoryReporterCallback nsIHandleReportCallback;
namespace mozilla {




extern "C" nsresult RegisterStrongMemoryReporter(nsIMemoryReporter* aReporter);
extern "C" nsresult RegisterStrongAsyncMemoryReporter(nsIMemoryReporter* aReporter);


extern "C" nsresult RegisterWeakMemoryReporter(nsIMemoryReporter* aReporter);
extern "C" nsresult RegisterWeakAsyncMemoryReporter(nsIMemoryReporter* aReporter);

extern "C" nsresult UnregisterStrongMemoryReporter(nsIMemoryReporter* aReporter);

extern "C" nsresult UnregisterWeakMemoryReporter(nsIMemoryReporter* aReporter);





typedef int64_t (*InfallibleAmountFn)();




nsresult RegisterJSMainRuntimeGCHeapDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult RegisterJSMainRuntimeTemporaryPeakDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult RegisterJSMainRuntimeCompartmentsSystemDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult RegisterJSMainRuntimeCompartmentsUserDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult RegisterImagesContentUsedUncompressedDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult UnregisterImagesContentUsedUncompressedDistinguishedAmount();
nsresult RegisterStorageSQLiteDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult UnregisterStorageSQLiteDistinguishedAmount();
nsresult RegisterLowMemoryEventsVirtualDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult RegisterLowMemoryEventsPhysicalDistinguishedAmount(InfallibleAmountFn aAmountFn);
nsresult RegisterGhostWindowsDistinguishedAmount(InfallibleAmountFn aAmountFn);



typedef __attribute__ ((warn_unused_result)) nsresult (*JSSizeOfTabFn)(JSObject* aObj,
                                               size_t* aJsObjectsSize,
                                               size_t* aJsStringSize,
                                               size_t* aJsPrivateSize,
                                               size_t* aJsOtherSize);
typedef __attribute__ ((warn_unused_result)) nsresult (*NonJSSizeOfTabFn)(nsPIDOMWindowOuter* aWindow,
                                                  size_t* aDomSize,
                                                  size_t* aStyleSize,
                                                  size_t* aOtherSize);
nsresult RegisterJSSizeOfTab(JSSizeOfTabFn aSizeOfTabFn);
nsresult RegisterNonJSSizeOfTab(NonJSSizeOfTabFn aSizeOfTabFn);
}
# 302 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h" 2






class nsISupports;
class ProfilerMarkerPayload;
# 322 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
extern __thread mozilla::detail::ThreadLocal<PseudoStack*> tlsPseudoStack;

class ProfilerState;





extern ProfilerState* gPS;
# 342 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
static inline void*
profiler_call_enter(const char* aInfo,
                    js::ProfileEntry::Category aCategory,
                    void *aFrameAddress, bool aCopy, uint32_t line,
                    const char* aDynamicString = nullptr)
{


  do { static_assert(mozilla::detail::AssertionConditionType<decltype(gPS)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(gPS))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "gPS" ")"); do { *((volatile int*) __null) = 350; ::abort(); } while (0); } } while (0);

  PseudoStack* stack = tlsPseudoStack.get();
  if (!stack) {
    return stack;
  }
  stack->push(aInfo, aCategory, aFrameAddress, aCopy, line, aDynamicString);



  return stack;
}

static inline void
profiler_call_exit(void* aHandle)
{


  do { static_assert(mozilla::detail::AssertionConditionType<decltype(gPS)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(gPS))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "gPS" ")"); do { *((volatile int*) __null) = 368; ::abort(); } while (0); } } while (0);

  if (!aHandle) {
    return;
  }

  PseudoStack *stack = (PseudoStack*)aHandle;
  stack->pop();
}



void profiler_add_marker(const char *aMarker,
                         ProfilerMarkerPayload *aPayload = nullptr);
# 447 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/GeckoProfiler.h"
namespace mozilla {

class SamplerStackFrameRAII {
public:


  SamplerStackFrameRAII(const char *aInfo,
    js::ProfileEntry::Category aCategory, uint32_t line
                                   )
  {
    do { } while (0);
    mHandle = profiler_call_enter(aInfo, aCategory, this, false, line);
  }
  ~SamplerStackFrameRAII() {
    profiler_call_exit(mHandle);
  }
private:

  void* mHandle;
};

class SamplerStackFrameDynamicRAII {
public:
  SamplerStackFrameDynamicRAII(const char* aInfo,
    js::ProfileEntry::Category aCategory, uint32_t aLine,
    const char* aDynamicString)
  {
    mHandle = profiler_call_enter(aInfo, aCategory, this, true, aLine,
                                  aDynamicString);
  }

  ~SamplerStackFrameDynamicRAII() {
    profiler_call_exit(mHandle);
  }

private:
  void* mHandle;
};

}

inline PseudoStack*
profiler_get_pseudo_stack(void)
{


  do { static_assert(mozilla::detail::AssertionConditionType<decltype(gPS)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(gPS))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "gPS" ")"); do { *((volatile int*) __null) = 493; ::abort(); } while (0); } } while (0);

  return tlsPseudoStack.get();
}

void profiler_set_js_context(JSContext* aCx);
void profiler_clear_js_context();

class GeckoProfilerReporter final : public nsIMemoryReporter
{
public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  GeckoProfilerReporter() {}

  virtual nsresult
  CollectReports(nsIHandleReportCallback* aHandleReport,
                 nsISupports* aData, bool aAnonymize) override;

private:
  ~GeckoProfilerReporter() {}
};



namespace mozilla {

class GeckoProfilerInitRAII {
public:
  explicit GeckoProfilerInitRAII(void* stackTop) {
    profiler_init(stackTop);
  }
  ~GeckoProfilerInitRAII() {
    profiler_shutdown();
  }
};

class GeckoProfilerThreadSleepRAII {
public:
  GeckoProfilerThreadSleepRAII() {
    profiler_thread_sleep();
  }
  ~GeckoProfilerThreadSleepRAII() {
    profiler_thread_wake();
  }
};



class GeckoProfilerThreadWakeRAII {
public:
  GeckoProfilerThreadWakeRAII()
    : mIssuedWake(profiler_thread_is_sleeping())
  {
    if (mIssuedWake) {
      profiler_thread_wake();
    }
  }
  ~GeckoProfilerThreadWakeRAII() {
    if (mIssuedWake) {
      do { } while (0);
      profiler_thread_sleep();
    }
  }
private:
  bool mIssuedWake;
};

class GeckoProfilerTracingRAII {
public:
  GeckoProfilerTracingRAII(const char* aCategory, const char* aInfo,
                           UniqueProfilerBacktrace aBacktrace
                                                          )
    : mCategory(aCategory)
    , mInfo(aInfo)
  {
    do { } while (0);
    profiler_tracing(mCategory, mInfo, Move(aBacktrace), TRACING_INTERVAL_START);
  }

  GeckoProfilerTracingRAII(const char* aCategory, const char* aInfo
                                                          )
    : mCategory(aCategory)
    , mInfo(aInfo)
  {
    do { } while (0);
    profiler_tracing(mCategory, mInfo, TRACING_INTERVAL_START);
  }

  ~GeckoProfilerTracingRAII() {
    profiler_tracing(mCategory, mInfo, TRACING_INTERVAL_END);
  }

protected:

  const char* mCategory;
  const char* mInfo;
};



class AutoProfilerRegister final
{
public:
  explicit AutoProfilerRegister(const char* aName)
  {
    profiler_register_thread(aName, this);
  }
  ~AutoProfilerRegister()
  {
    profiler_unregister_thread();
  }
private:
  AutoProfilerRegister(const AutoProfilerRegister&) = delete;
  AutoProfilerRegister& operator=(const AutoProfilerRegister&) = delete;
};

}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSUtils.h" 2





class nsIScriptContext;
class nsIScriptGlobalObject;

namespace mozilla {
namespace dom {
class AutoJSAPI;
class Element;
}
}

class nsJSUtils
{
public:
  static bool GetCallingLocation(JSContext* aContext, nsACString& aFilename,
                                 uint32_t* aLineno = nullptr,
                                 uint32_t* aColumn = nullptr);
  static bool GetCallingLocation(JSContext* aContext, nsAString& aFilename,
                                 uint32_t* aLineno = nullptr,
                                 uint32_t* aColumn = nullptr);

  static nsIScriptGlobalObject *GetStaticScriptGlobal(JSObject* aObj);

  static nsIScriptContext *GetStaticScriptContext(JSObject* aObj);
# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSUtils.h"
  static uint64_t GetCurrentlyRunningCodeInnerWindowID(JSContext *aContext);

  static nsresult CompileFunction(mozilla::dom::AutoJSAPI& jsapi,
                                  JS::AutoObjectVector& aScopeChain,
                                  JS::CompileOptions& aOptions,
                                  const nsACString& aName,
                                  uint32_t aArgCount,
                                  const char** aArgArray,
                                  const nsAString& aBody,
                                  JSObject** aFunctionObject);



  class ExecutionContext {


    mozilla::SamplerStackFrameRAII mSamplerRAII;


    JSContext* mCx;


    JSAutoCompartment mCompartment;


    JS::Rooted<JS::Value> mRetValue;


    JS::AutoObjectVector mScopeChain;



    nsresult mRv;



    bool mSkip;


    bool mCoerceToString;
# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSUtils.h"
   public:




    ExecutionContext(JSContext* aCx, JS::Handle<JSObject*> aGlobal);

    ExecutionContext(const ExecutionContext&) = delete;
    ExecutionContext(ExecutionContext&&) = delete;

    ~ExecutionContext() {

      do { } while (0);
    }



    ExecutionContext& SetCoerceToString(bool aCoerceToString) {
      mCoerceToString = aCoerceToString;
      return *this;
    }


    void SetScopeChain(const JS::AutoObjectVector& aScopeChain);
# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsJSUtils.h"
    __attribute__ ((warn_unused_result)) nsresult
    ExtractReturnValue(JS::MutableHandle<JS::Value> aRetValue);






    __attribute__ ((warn_unused_result)) nsresult SyncAndExec(void **aOffThreadToken,
                                      JS::MutableHandle<JSScript*> aScript);


    nsresult CompileAndExec(JS::CompileOptions& aCompileOptions,
                            JS::SourceBufferHolder& aSrcBuf);


    nsresult CompileAndExec(JS::CompileOptions& aCompileOptions,
                            const nsAString& aScript);
  };

  static nsresult CompileModule(JSContext* aCx,
                                JS::SourceBufferHolder& aSrcBuf,
                                JS::Handle<JSObject*> aEvaluationGlobal,
                                JS::CompileOptions &aCompileOptions,
                                JS::MutableHandle<JSObject*> aModule);

  static nsresult ModuleDeclarationInstantiation(JSContext* aCx,
                                                 JS::Handle<JSObject*> aModule);

  static nsresult ModuleEvaluation(JSContext* aCx,
                                   JS::Handle<JSObject*> aModule);



  static bool GetScopeChainForElement(JSContext* aCx,
                                      mozilla::dom::Element* aElement,
                                      JS::AutoObjectVector& aScopeChain);

  static void ResetTimeZone();
};

template<typename T>
inline bool
AssignJSString(JSContext *cx, T &dest, JSString *s)
{
  size_t len = js::GetStringLength(s);
  static_assert(js::MaxStringLength < (1 << 28),
                "Shouldn't overflow here or in SetCapacity");
  if ((__builtin_expect(!!(!dest.SetLength(len, mozilla::fallible)), 0))) {
    JS_ReportOutOfMemory(cx);
    return false;
  }
  return js::CopyStringChars(cx, dest.BeginWriting(), s, len);
}

inline void
AssignJSFlatString(nsAString &dest, JSFlatString *s)
{
  size_t len = js::GetFlatStringLength(s);
  static_assert(js::MaxStringLength < (1 << 28),
                "Shouldn't overflow here or in SetCapacity");
  dest.SetLength(len);
  js::CopyFlatStringChars(dest.BeginWriting(), s, len);
}

class nsAutoJSString : public nsAutoString
{
public:





  nsAutoJSString() {}

  bool init(JSContext* aContext, JSString* str)
  {
    return AssignJSString(aContext, *this, str);
  }

  bool init(JSContext* aContext, const JS::Value &v)
  {
    if (v.isString()) {
      return init(aContext, v.toString());
    }


    JS::Rooted<JSString*> str(aContext);
    if (v.isObject()) {
      str = JS_NewStringCopyZ(aContext, "[Object]");
    } else {
      JS::Rooted<JS::Value> rootedVal(aContext, v);
      str = JS::ToString(aContext, rootedVal);
    }

    return str && init(aContext, str);
  }

  bool init(JSContext* aContext, jsid id)
  {
    JS::Rooted<JS::Value> v(aContext);
    return JS_IdToValue(aContext, id, &v) && init(aContext, v);
  }

  bool init(const JS::Value &v);

  ~nsAutoJSString() {}
};
# 36 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/qsObjectHelper.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/qsObjectHelper.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcObjectHelper.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcObjectHelper.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIClassInfo.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIClassInfo.h"
class nsIXPCScriptable;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIClassInfo.h"
class nsIClassInfo : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetInterfaces(uint32_t *count, nsIID ***array) = 0;


  virtual nsresult GetScriptableHelper(nsIXPCScriptable * *_retval) = 0;


  virtual nsresult GetContractID(char * *aContractID) = 0;


  virtual nsresult GetClassDescription(char * *aClassDescription) = 0;


  virtual nsresult GetClassID(nsCID **aClassID) = 0;

  enum {
    SINGLETON = 1U,
    THREADSAFE = 2U,
    MAIN_THREAD_ONLY = 4U,
    DOM_OBJECT = 8U,
    PLUGIN_OBJECT = 16U,
    SINGLETON_CLASSINFO = 32U,
    CONTENT_NODE = 64U,
    RESERVED = 2147483648U
  };


  virtual nsresult GetFlags(uint32_t *aFlags) = 0;


  virtual nsresult GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) = 0;

};

  template<typename T> struct nsIClassInfo::COMTypeInfo<nsIClassInfo, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIClassInfo::COMTypeInfo<nsIClassInfo, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xa60569d7, 0xd401, 0x4677, { 0xba, 0x63, 0x2a, 0xa5, 0x97, 0x1a, 0xf2, 0x5d }};
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcObjectHelper.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPCScriptable.h" 1
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPCScriptable.h"
struct JSFreeOp;
namespace js {
struct Class;
}
class nsIXPConnectWrappedNative;
# 63 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPCScriptable.h"
class nsIXPCScriptable : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetClassName(char * *aClassName) = 0;


  virtual uint32_t GetScriptableFlags(void) = 0;


  virtual const js::Class * GetClass(void) = 0;


  virtual const JSClass * GetJSClass(void) = 0;


  virtual nsresult PreCreate(nsISupports *nativeObj, JSContext *cx, JSObject *globalObj, JSObject **parentObj) = 0;


  virtual nsresult GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsid id, JS::Value *vp, bool *_retval) = 0;


  virtual nsresult SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsid id, JS::Value *vp, bool *_retval) = 0;


  virtual nsresult Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, bool *_retval) = 0;


  virtual nsresult NewEnumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, JS::AutoIdVector & properties, bool *_retval) = 0;


  virtual nsresult Resolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsid id, bool *resolvedp, bool *_retval) = 0;


  virtual nsresult Finalize(nsIXPConnectWrappedNative *wrapper, JSFreeOp *fop, JSObject *obj) = 0;


  virtual nsresult Call(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, const JS::CallArgs & args, bool *_retval) = 0;


  virtual nsresult Construct(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, const JS::CallArgs & args, bool *_retval) = 0;


  virtual nsresult HasInstance(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, JS::HandleValue val, bool *bp, bool *_retval) = 0;


  virtual nsresult PostCreatePrototype(JSContext *cx, JSObject *proto) = 0;





    bool WantPreCreate() { return 0 != (GetScriptableFlags() & (1 << 0)); }
    bool WantGetProperty() { return 0 != (GetScriptableFlags() & (1 << 1)); }
    bool WantSetProperty() { return 0 != (GetScriptableFlags() & (1 << 2)); }
    bool WantEnumerate() { return 0 != (GetScriptableFlags() & (1 << 3)); }
    bool WantNewEnumerate() { return 0 != (GetScriptableFlags() & (1 << 4)); }
    bool WantResolve() { return 0 != (GetScriptableFlags() & (1 << 5)); }
    bool WantFinalize() { return 0 != (GetScriptableFlags() & (1 << 6)); }
    bool WantCall() { return 0 != (GetScriptableFlags() & (1 << 7)); }
    bool WantConstruct() { return 0 != (GetScriptableFlags() & (1 << 8)); }
    bool WantHasInstance() { return 0 != (GetScriptableFlags() & (1 << 9)); }
    bool UseJSStubForAddProperty() { return 0 != (GetScriptableFlags() & (1 << 10)); }
    bool UseJSStubForDelProperty() { return 0 != (GetScriptableFlags() & (1 << 11)); }
    bool UseJSStubForSetProperty() { return 0 != (GetScriptableFlags() & (1 << 12)); }
    bool DontEnumQueryInterface() { return 0 != (GetScriptableFlags() & (1 << 13)); }
    bool DontAskInstanceForScriptable() { return 0 != (GetScriptableFlags() & (1 << 14)); }
    bool ClassInfoInterfacesOnly() { return 0 != (GetScriptableFlags() & (1 << 15)); }
    bool AllowPropModsDuringResolve() { return 0 != (GetScriptableFlags() & (1 << 16)); }
    bool AllowPropModsToPrototype() { return 0 != (GetScriptableFlags() & (1 << 17)); }
    bool IsGlobalObject() { return 0 != (GetScriptableFlags() & (1 << 18)); }
    bool DontReflectInterfaceNames() { return 0 != (GetScriptableFlags() & (1 << 19)); }

};

  template<typename T> struct nsIXPCScriptable::COMTypeInfo<nsIXPCScriptable, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIXPCScriptable::COMTypeInfo<nsIXPCScriptable, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x19b70b26, 0x7c3f, 0x437f, { 0xa0, 0x4a, 0x2a, 0x8f, 0x9e, 0x28, 0xb6, 0x17 }};
# 345 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIXPCScriptable.h"
class nsXPCClassInfo : public nsIClassInfo,
                                    public nsIXPCScriptable
{
public:
  template<typename T, typename U> struct COMTypeInfo;
  virtual MozExternalRefCountType AddRef() override = 0;
  virtual MozExternalRefCountType Release() override = 0;
  virtual void PreserveWrapper(nsISupports *aNative) = 0;
};
template<typename T> struct nsXPCClassInfo::COMTypeInfo<nsXPCClassInfo, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsXPCClassInfo::COMTypeInfo<nsXPCClassInfo, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x43b67f01, 0xd4ce, 0x4b82, { 0xb3, 0xf8, 0xeb, 0xf2, 0x13, 0x60, 0xfb, 0x7e } };
inline
nsresult
CallQueryInterface(nsISupports* aSourcePtr,
                   RefPtrGetterAddRefs<nsXPCClassInfo> aDestPtr)
{
  return CallQueryInterface(aSourcePtr,
                            static_cast<nsXPCClassInfo**>(aDestPtr));
}
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xpcObjectHelper.h" 2


class xpcObjectHelper
{
public:
    explicit xpcObjectHelper(nsISupports* aObject, nsWrapperCache* aCache = nullptr)
      : mCanonical(nullptr)
      , mObject(aObject)
      , mCache(aCache)
    {
        if (!mCache) {
            if (aObject)
                CallQueryInterface(aObject, &mCache);
            else
                mCache = nullptr;
        }
    }

    nsISupports* Object()
    {
        return mObject;
    }

    nsISupports* GetCanonical()
    {
        if (!mCanonical) {
            mCanonicalStrong = do_QueryInterface(mObject);
            mCanonical = mCanonicalStrong;
        }
        return mCanonical;
    }

    already_AddRefed<nsISupports> forgetCanonical()
    {
        do { } while (0);

        if (!mCanonicalStrong)
            mCanonicalStrong = mCanonical;
        mCanonical = nullptr;
        return mCanonicalStrong.forget();
    }

    nsIClassInfo* GetClassInfo()
    {
        if (mXPCClassInfo)
          return mXPCClassInfo;
        if (!mClassInfo)
            mClassInfo = do_QueryInterface(mObject);
        return mClassInfo;
    }
    nsXPCClassInfo* GetXPCClassInfo()
    {
        if (!mXPCClassInfo) {
            CallQueryInterface(mObject, getter_AddRefs(mXPCClassInfo));
        }
        return mXPCClassInfo;
    }

    already_AddRefed<nsXPCClassInfo> forgetXPCClassInfo()
    {
        GetXPCClassInfo();

        return mXPCClassInfo.forget();
    }


    uint32_t GetScriptableFlags()
    {

        nsCOMPtr<nsIXPCScriptable> sinfo = GetXPCClassInfo();


        if (!sinfo)
            sinfo = do_QueryInterface(GetCanonical());


        do { } while (0);


        return sinfo->GetScriptableFlags();
    }

    nsWrapperCache* GetWrapperCache()
    {
        return mCache;
    }

protected:
    xpcObjectHelper(nsISupports* aObject, nsISupports* aCanonical,
                    nsWrapperCache* aCache)
      : mCanonical(aCanonical)
      , mObject(aObject)
      , mCache(aCache)
    {
        if (!mCache && aObject)
            CallQueryInterface(aObject, &mCache);
    }

    nsCOMPtr<nsISupports> mCanonicalStrong;
    nsISupports* mCanonical;



private:
    xpcObjectHelper(xpcObjectHelper& aOther) = delete;

    nsISupports* mObject;


    nsWrapperCache* mCache;
    nsCOMPtr<nsIClassInfo> mClassInfo;
    RefPtr<nsXPCClassInfo> mXPCClassInfo;
};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/qsObjectHelper.h" 2





class qsObjectHelper : public xpcObjectHelper
{
public:
    template <class T>
    inline
    qsObjectHelper(T* aObject, nsWrapperCache* aCache)
        : xpcObjectHelper(ToSupports(aObject), ToCanonicalSupports(aObject),
                          aCache)
    {}

    template <class T>
    inline
    qsObjectHelper(nsCOMPtr<T>& aObject, nsWrapperCache* aCache)
        : xpcObjectHelper(ToSupports(aObject.get()),
                          ToCanonicalSupports(aObject.get()), aCache)
    {
        if (mCanonical) {

            mCanonicalStrong = dont_AddRef(mCanonical);
            aObject.forget();
        }
    }

    template <class T>
    inline
    qsObjectHelper(RefPtr<T>& aObject, nsWrapperCache* aCache)
        : xpcObjectHelper(ToSupports(aObject.get()),
                          ToCanonicalSupports(aObject.get()), aCache)
    {
        if (mCanonical) {

            mCanonicalStrong = dont_AddRef(mCanonical);
            aObject.forget();
        }
    }
};
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCacheInlines.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsWrapperCacheInlines.h"
inline JSObject*
nsWrapperCache::GetWrapper() const
{
    JSObject* obj = GetWrapperPreserveColor();
    if (obj) {
      JS::ExposeObjectToActiveJS(obj);
    }
    return obj;
}

inline bool
nsWrapperCache::HasKnownLiveWrapper() const
{





  JSObject* o = GetWrapperPreserveColor();
  return o && !JS::ObjectIsMarkedGray(o);
}

static void
SearchGray(JS::GCCellPtr aGCThing, const char* aName, void* aClosure)
{
  bool* hasGrayObjects = static_cast<bool*>(aClosure);
  if (!*hasGrayObjects && aGCThing && JS::GCThingIsMarkedGray(aGCThing)) {
    *hasGrayObjects = true;
  }
}

inline bool
nsWrapperCache::HasNothingToTrace(nsISupports* aThis)
{
  nsXPCOMCycleCollectionParticipant* participant = nullptr;
  CallQueryInterface(aThis, &participant);
  bool hasGrayObjects = false;
  participant->Trace(aThis, TraceCallbackFunc(SearchGray), &hasGrayObjects);
  return !hasGrayObjects;
}

inline bool
nsWrapperCache::HasKnownLiveWrapperAndDoesNotNeedTracing(nsISupports* aThis)
{
  return HasKnownLiveWrapper() && HasNothingToTrace(aThis);
}

inline void
nsWrapperCache::MarkWrapperLive()
{


  GetWrapper();
}
# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h" 2

class nsGenericHTMLElement;
class nsIJSID;

namespace mozilla {

enum UseCounter : int16_t;

namespace dom {
template<typename KeyType, typename ValueType> class Record;

nsresult
UnwrapArgImpl(JSContext* cx, JS::Handle<JSObject*> src, const nsIID& iid,
              void** ppArg);

nsresult
UnwrapWindowProxyImpl(JSContext* cx, JS::Handle<JSObject*> src,
                      nsPIDOMWindowOuter** ppArg);


template <class Interface>
inline nsresult
UnwrapArg(JSContext* cx, JS::Handle<JSObject*> src, Interface** ppArg)
{
  return UnwrapArgImpl(cx, src, (Interface::template COMTypeInfo<Interface, void>::kIID),
                       reinterpret_cast<void**>(ppArg));
}

template <>
inline nsresult
UnwrapArg<nsPIDOMWindowOuter>(JSContext* cx, JS::Handle<JSObject*> src,
                              nsPIDOMWindowOuter** ppArg)
{
  return UnwrapWindowProxyImpl(cx, src, ppArg);
}

bool
ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
                 bool aSecurityError, const char* aInterfaceName);

bool
ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
                 bool aSecurityError, prototypes::ID aProtoId);


inline bool
IsDOMClass(const JSClass* clasp)
{
  return clasp->flags & JSCLASS_IS_DOMJSCLASS;
}

inline bool
IsDOMClass(const js::Class* clasp)
{
  return IsDOMClass(Jsvalify(clasp));
}


inline bool
IsNonProxyDOMClass(const js::Class* clasp)
{
  return IsDOMClass(clasp) && !clasp->isProxy();
}

inline bool
IsNonProxyDOMClass(const JSClass* clasp)
{
  return IsNonProxyDOMClass(js::Valueify(clasp));
}



inline bool
IsDOMIfaceAndProtoClass(const JSClass* clasp)
{
  return clasp->flags & JSCLASS_USERBIT2;
}

inline bool
IsDOMIfaceAndProtoClass(const js::Class* clasp)
{
  return IsDOMIfaceAndProtoClass(Jsvalify(clasp));
}

static_assert(0 == 0,
              "DOM_OBJECT_SLOT doesn't match the proxy private slot.  "
              "Expect bad things");
template <class T>
inline T*
UnwrapDOMObject(JSObject* obj)
{
  do { } while (0);


  JS::Value val = js::GetReservedOrProxyPrivateSlot(obj, 0);
  return static_cast<T*>(val.toPrivate());
}

template <class T>
inline T*
UnwrapPossiblyNotInitializedDOMObject(JSObject* obj)
{




  do { } while (0);


  JS::Value val = js::GetReservedOrProxyPrivateSlot(obj, 0);
  if (val.isUndefined()) {
    return nullptr;
  }
  return static_cast<T*>(val.toPrivate());
}

inline const DOMJSClass*
GetDOMClass(const js::Class* clasp)
{
  return IsDOMClass(clasp) ? DOMJSClass::FromJSClass(clasp) : nullptr;
}

inline const DOMJSClass*
GetDOMClass(JSObject* obj)
{
  return GetDOMClass(js::GetObjectClass(obj));
}

inline nsISupports*
UnwrapDOMObjectToISupports(JSObject* aObject)
{
  const DOMJSClass* clasp = GetDOMClass(aObject);
  if (!clasp || !clasp->mDOMObjectIsISupports) {
    return nullptr;
  }

  return UnwrapPossiblyNotInitializedDOMObject<nsISupports>(aObject);
}

inline bool
IsDOMObject(JSObject* obj)
{
  return IsDOMClass(js::GetObjectClass(obj));
}
# 196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
template <class T, typename U>
__attribute__((always_inline)) inline nsresult
UnwrapObject(JSObject* obj, U& value, prototypes::ID protoID,
             uint32_t protoDepth)
{

  const DOMJSClass* domClass = GetDOMClass(obj);
  if (!domClass) {

    if (!js::IsWrapper(obj)) {

      return NS_ERROR_XPC_BAD_CONVERT_JS;
    }

    obj = js::CheckedUnwrap(obj, false);
    if (!obj) {
      return NS_ERROR_XPC_SECURITY_MANAGER_VETO;
    }
    do { } while (0);
    domClass = GetDOMClass(obj);
    if (!domClass) {

      return NS_ERROR_XPC_BAD_CONVERT_JS;
    }
  }




  if (domClass->mInterfaceChain[protoDepth] == protoID) {
    value = UnwrapDOMObject<T>(obj);
    return NS_OK;
  }


  return NS_ERROR_XPC_BAD_CONVERT_JS;
}

template <prototypes::ID PrototypeID, class T, typename U>
__attribute__((always_inline)) inline nsresult
UnwrapObject(JSObject* obj, U& value)
{
  return UnwrapObject<T>(obj, value, PrototypeID,
                         PrototypeTraits<PrototypeID>::Depth);
}

__attribute__((always_inline)) inline bool
IsConvertibleToDictionary(JS::Handle<JS::Value> val)
{
  return val.isNullOrUndefined() || val.isObject();
}






static_assert((size_t)constructors::id::_ID_Start ==
              (size_t)prototypes::id::_ID_Count &&
              (size_t)namedpropertiesobjects::id::_ID_Start ==
              (size_t)constructors::id::_ID_Count,
              "Overlapping or discontiguous indexes.");
const size_t kProtoAndIfaceCacheCount = namedpropertiesobjects::id::_ID_Count;

class ProtoAndIfaceCache
{






  class ArrayCache : public Array<JS::Heap<JSObject*>, kProtoAndIfaceCacheCount>
  {
  public:
    JSObject* EntrySlotIfExists(size_t i) {
      return (*this)[i];
    }

    JS::Heap<JSObject*>& EntrySlotOrCreate(size_t i) {
      return (*this)[i];
    }

    JS::Heap<JSObject*>& EntrySlotMustExist(size_t i) {
      return (*this)[i];
    }

    void Trace(JSTracer* aTracer) {
      for (size_t i = 0; i < ArrayLength(*this); ++i) {
        JS::TraceEdge(aTracer, &(*this)[i], "protoAndIfaceCache[i]");
      }
    }

    size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) {
      return aMallocSizeOf(this);
    }
  };

  class PageTableCache
  {
  public:
    PageTableCache() {
      memset(&mPages, 0, sizeof(mPages));
    }

    ~PageTableCache() {
      for (size_t i = 0; i < ArrayLength(mPages); ++i) {
        delete mPages[i];
      }
    }

    JSObject* EntrySlotIfExists(size_t i) {
      do { } while (0);
      size_t pageIndex = i / kPageSize;
      size_t leafIndex = i % kPageSize;
      Page* p = mPages[pageIndex];
      if (!p) {
        return nullptr;
      }
      return (*p)[leafIndex];
    }

    JS::Heap<JSObject*>& EntrySlotOrCreate(size_t i) {
      do { } while (0);
      size_t pageIndex = i / kPageSize;
      size_t leafIndex = i % kPageSize;
      Page* p = mPages[pageIndex];
      if (!p) {
        p = new Page;
        mPages[pageIndex] = p;
      }
      return (*p)[leafIndex];
    }

    JS::Heap<JSObject*>& EntrySlotMustExist(size_t i) {
      do { } while (0);
      size_t pageIndex = i / kPageSize;
      size_t leafIndex = i % kPageSize;
      Page* p = mPages[pageIndex];
      do { } while (0);
      return (*p)[leafIndex];
    }

    void Trace(JSTracer* trc) {
      for (size_t i = 0; i < ArrayLength(mPages); ++i) {
        Page* p = mPages[i];
        if (p) {
          for (size_t j = 0; j < ArrayLength(*p); ++j) {
            JS::TraceEdge(trc, &(*p)[j], "protoAndIfaceCache[i]");
          }
        }
      }
    }

    size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) {
      size_t n = aMallocSizeOf(this);
      for (size_t i = 0; i < ArrayLength(mPages); ++i) {
        n += aMallocSizeOf(mPages[i]);
      }
      return n;
    }

  private:
    static const size_t kPageSize = 16;
    typedef Array<JS::Heap<JSObject*>, kPageSize> Page;
    static const size_t kNPages = kProtoAndIfaceCacheCount / kPageSize +
      size_t(bool(kProtoAndIfaceCacheCount % kPageSize));
    Array<Page*, kNPages> mPages;
  };

public:
  enum Kind {
    WindowLike,
    NonWindowLike
  };

  explicit ProtoAndIfaceCache(Kind aKind) : mKind(aKind) {
                                      ;
    if (aKind == WindowLike) {
      mArrayCache = new ArrayCache();
    } else {
      mPageTableCache = new PageTableCache();
    }
  }

  ~ProtoAndIfaceCache() {
    if (mKind == WindowLike) {
      delete mArrayCache;
    } else {
      delete mPageTableCache;
    }
                                      ;
  }
# 401 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
  JSObject* EntrySlotIfExists(size_t i) {
    do { if (mKind == WindowLike) { return mArrayCache->EntrySlotIfExists (i); } else { return mPageTableCache->EntrySlotIfExists (i); } } while(0);
  }



  JS::Heap<JSObject*>& EntrySlotOrCreate(size_t i) {
    do { if (mKind == WindowLike) { return mArrayCache->EntrySlotOrCreate (i); } else { return mPageTableCache->EntrySlotOrCreate (i); } } while(0);
  }




  JS::Heap<JSObject*>& EntrySlotMustExist(size_t i) {
    do { if (mKind == WindowLike) { return mArrayCache->EntrySlotMustExist (i); } else { return mPageTableCache->EntrySlotMustExist (i); } } while(0);
  }

  void Trace(JSTracer *aTracer) {
    do { if (mKind == WindowLike) { return mArrayCache->Trace (aTracer); } else { return mPageTableCache->Trace (aTracer); } } while(0);
  }

  size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) {
    size_t n = aMallocSizeOf(this);
    n += (mKind == WindowLike
          ? mArrayCache->SizeOfIncludingThis(aMallocSizeOf)
          : mPageTableCache->SizeOfIncludingThis(aMallocSizeOf));
    return n;
  }


private:
  union {
    ArrayCache *mArrayCache;
    PageTableCache *mPageTableCache;
  };
  Kind mKind;
};

inline void
AllocateProtoAndIfaceCache(JSObject* obj, ProtoAndIfaceCache::Kind aKind)
{
  do { } while (0);
  do { } while (0);

  ProtoAndIfaceCache* protoAndIfaceCache = new ProtoAndIfaceCache(aKind);

  js::SetReservedSlot(obj, JSCLASS_GLOBAL_SLOT_COUNT,
                      JS::PrivateValue(protoAndIfaceCache));
}
# 469 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
inline void
TraceProtoAndIfaceCache(JSTracer* trc, JSObject* obj)
{
  do { } while (0);
# 485 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
  if (!DOMGlobalHasProtoAndIFaceCache(obj))
    return;
  ProtoAndIfaceCache* protoAndIfaceCache = GetProtoAndIfaceCache(obj);
  protoAndIfaceCache->Trace(trc);
}

inline void
DestroyProtoAndIfaceCache(JSObject* obj)
{
  do { } while (0);

  if (!DOMGlobalHasProtoAndIFaceCache(obj)) {
    return;
  }

  ProtoAndIfaceCache* protoAndIfaceCache = GetProtoAndIfaceCache(obj);

  delete protoAndIfaceCache;
}




bool
DefineConstants(JSContext* cx, JS::Handle<JSObject*> obj,
                const ConstantSpec* cs);

struct JSNativeHolder
{
  JSNative mNative;
  const NativePropertyHooks* mPropertyHooks;
};

struct NamedConstructor
{
  const char* mName;
  const JSNativeHolder mHolder;
  unsigned mNargs;
};
# 575 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
void
CreateInterfaceObjects(JSContext* cx, JS::Handle<JSObject*> global,
                       JS::Handle<JSObject*> protoProto,
                       const js::Class* protoClass, JS::Heap<JSObject*>* protoCache,
                       JS::Handle<JSObject*> interfaceProto,
                       const js::Class* constructorClass,
                       unsigned ctorNargs, const NamedConstructor* namedConstructors,
                       JS::Heap<JSObject*>* constructorCache,
                       const NativeProperties* regularProperties,
                       const NativeProperties* chromeOnlyProperties,
                       const char* name, bool defineOnGlobal,
                       const char* const* unscopableNames,
                       bool isGlobal);
# 602 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
DefineProperties(JSContext* cx, JS::Handle<JSObject*> obj,
                 const NativeProperties* properties,
                 const NativeProperties* chromeOnlyProperties);




bool
DefineUnforgeableMethods(JSContext* cx, JS::Handle<JSObject*> obj,
                         const Prefable<const JSFunctionSpec>* props);




bool
DefineUnforgeableAttributes(JSContext* cx, JS::Handle<JSObject*> obj,
                            const Prefable<const JSPropertySpec>* props);
# 643 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
template<class T>
struct NativeHasMember
{
  private: typedef char yes[1]; typedef char no[2];

  private: template<typename V> static yes& CheckGetParentObject(char (*)[sizeof(&V::GetParentObject) + 1]); template<typename V> static no& CheckGetParentObject(...); public: static bool const GetParentObject = sizeof(CheckGetParentObject<T>(nullptr)) == sizeof(yes);
  private: template<typename V> static yes& CheckWrapObject(char (*)[sizeof(&V::WrapObject) + 1]); template<typename V> static no& CheckWrapObject(...); public: static bool const WrapObject = sizeof(CheckWrapObject<T>(nullptr)) == sizeof(yes);
};

template<class T>
struct IsSmartPtr
{
  private: typedef char yes[1]; typedef char no[2];

  private: template<typename V> static yes& Checkget(char (*)[sizeof(&V::get) + 1]); template<typename V> static no& Checkget(...); public: static bool const value = sizeof(Checkget<T>(nullptr)) == sizeof(yes);
};

template<class T>
struct IsRefcounted
{
  private: typedef char yes[1]; typedef char no[2];

  private: template<typename V> static yes& CheckAddRef(char (*)[sizeof(&V::AddRef) + 1]); template<typename V> static no& CheckAddRef(...); public: static bool const HasAddref = sizeof(CheckAddRef<T>(nullptr)) == sizeof(yes);
  private: template<typename V> static yes& CheckRelease(char (*)[sizeof(&V::Release) + 1]); template<typename V> static no& CheckRelease(...); public: static bool const HasRelease = sizeof(CheckRelease<T>(nullptr)) == sizeof(yes);

public:
  static bool const value = HasAddref && HasRelease;

private:



  static_assert(!IsBaseOf<nsISupports, T>::value || IsRefcounted::value,
                "Classes derived from nsISupports are refcounted!");

};
# 707 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
__attribute__((always_inline)) inline bool
CouldBeDOMBinding(void*)
{
  return true;
}

__attribute__((always_inline)) inline bool
CouldBeDOMBinding(nsWrapperCache* aCache)
{
  return aCache->IsDOMBinding();
}

inline bool
TryToOuterize(JS::MutableHandle<JS::Value> rval)
{
  if (js::IsWindow(&rval.toObject())) {
    JSObject* obj = js::ToWindowProxyIfWindow(&rval.toObject());
    do { } while (0);
    rval.set(JS::ObjectValue(*obj));
  }

  return true;
}



__attribute__((always_inline)) inline
bool
MaybeWrapStringValue(JSContext* cx, JS::MutableHandle<JS::Value> rval)
{
  do { } while (0);
  JSString* str = rval.toString();
  if (JS::GetStringZone(str) != js::GetContextZone(cx)) {
    return JS_WrapValue(cx, rval);
  }
  return true;
}



__attribute__((always_inline)) inline
bool
MaybeWrapObjectValue(JSContext* cx, JS::MutableHandle<JS::Value> rval)
{
  do { } while (0);


  JSObject* obj = &rval.toObject();
  if (js::GetObjectCompartment(obj) != js::GetContextCompartment(cx)) {
    return JS_WrapValue(cx, rval);
  }



  if (IsDOMObject(obj)) {
    return TryToOuterize(rval);
  }



  return true;
}


__attribute__((always_inline)) inline
bool
MaybeWrapObjectOrNullValue(JSContext* cx, JS::MutableHandle<JS::Value> rval)
{
  do { } while (0);
  if (rval.isNull()) {
    return true;
  }
  return MaybeWrapObjectValue(cx, rval);
}


__attribute__((always_inline)) inline
bool
MaybeWrapNonDOMObjectValue(JSContext* cx, JS::MutableHandle<JS::Value> rval)
{
  do { } while (0);
  do { } while (0);
  do { } while (0);


  JSObject* obj = &rval.toObject();
  if (js::GetObjectCompartment(obj) == js::GetContextCompartment(cx)) {
    return true;
  }
  return JS_WrapValue(cx, rval);
}


__attribute__((always_inline)) inline
bool
MaybeWrapNonDOMObjectOrNullValue(JSContext* cx, JS::MutableHandle<JS::Value> rval)
{
  do { } while (0);
  if (rval.isNull()) {
    return true;
  }
  return MaybeWrapNonDOMObjectValue(cx, rval);
}




__attribute__((always_inline)) inline bool
MaybeWrapValue(JSContext* cx, JS::MutableHandle<JS::Value> rval)
{
  if (rval.isGCThing()) {
    if (rval.isString()) {
      return MaybeWrapStringValue(cx, rval);
    }
    if (rval.isObject()) {
      return MaybeWrapObjectValue(cx, rval);
    }
    do { } while (0);
    JS_MarkCrossZoneId(cx, SYMBOL_TO_JSID(rval.toSymbol()));
  }
  return true;
}

namespace binding_detail {
enum GetOrCreateReflectorWrapBehavior {
  eWrapIntoContextCompartment,
  eDontWrapIntoContextCompartment
};

template <class T>
struct TypeNeedsOuterization
{


  static const bool value =
    IsBaseOf<nsGlobalWindow, T>::value || IsSame<EventTarget, T>::value;
};
# 898 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
template <class T, GetOrCreateReflectorWrapBehavior wrapBehavior>
__attribute__((always_inline)) inline bool
DoGetOrCreateDOMReflector(JSContext* cx, T* value,
                          JS::Handle<JSObject*> givenProto,
                          JS::MutableHandle<JS::Value> rval)
{
  do { } while (0);
  do { } while (0);

  bool couldBeDOMBinding = CouldBeDOMBinding(value);
  JSObject* obj = value->GetWrapper();
  if (obj) {






  } else {

    if (!couldBeDOMBinding) {
      return false;
    }

    obj = value->WrapObject(cx, givenProto);
    if (!obj) {



      return false;
    }






  }
# 953 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
  rval.set(JS::ObjectValue(*obj));

  bool sameCompartment =
    js::GetObjectCompartment(obj) == js::GetContextCompartment(cx);
  if (sameCompartment && couldBeDOMBinding) {
    return TypeNeedsOuterization<T>::value ? TryToOuterize(rval) : true;
  }

  if (wrapBehavior == eDontWrapIntoContextCompartment) {
    if (TypeNeedsOuterization<T>::value) {
      JSAutoCompartment ac(cx, obj);
      return TryToOuterize(rval);
    }

    return true;
  }

  return JS_WrapValue(cx, rval);
}

}
# 984 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
template <class T>
__attribute__((always_inline)) inline bool
GetOrCreateDOMReflector(JSContext* cx, T* value,
                        JS::MutableHandle<JS::Value> rval,
                        JS::Handle<JSObject*> givenProto = nullptr)
{
  using namespace binding_detail;
  return DoGetOrCreateDOMReflector<T, eWrapIntoContextCompartment>(cx, value,
                                                                   givenProto,
                                                                   rval);
}



template <class T>
__attribute__((always_inline)) inline bool
GetOrCreateDOMReflectorNoWrap(JSContext* cx, T* value,
                              JS::MutableHandle<JS::Value> rval)
{
  using namespace binding_detail;
  return DoGetOrCreateDOMReflector<T, eDontWrapIntoContextCompartment>(cx,
                                                                       value,
                                                                       nullptr,
                                                                       rval);
}




template <class T>
inline bool
WrapNewBindingNonWrapperCachedObject(JSContext* cx,
                                     JS::Handle<JSObject*> scopeArg,
                                     T* value,
                                     JS::MutableHandle<JS::Value> rval,
                                     JS::Handle<JSObject*> givenProto = nullptr)
{
  static_assert(IsRefcounted<T>::value, "Don't pass owned classes in here.");
  do { } while (0);

  JS::Rooted<JSObject*> obj(cx);
  {


    Maybe<JSAutoCompartment> ac;



    JS::Rooted<JSObject*> scope(cx, scopeArg);
    JS::Rooted<JSObject*> proto(cx, givenProto);
    if (js::IsWrapper(scope)) {
      scope = js::CheckedUnwrap(scope, false);
      if (!scope)
        return false;
      ac.emplace(cx, scope);
      if (!JS_WrapObject(cx, &proto)) {
        return false;
      }
    }

    do { } while (0);
    if (!value->WrapObject(cx, proto, &obj)) {
      return false;
    }
  }



  rval.set(JS::ObjectValue(*obj));
  return MaybeWrapObjectValue(cx, rval);
}





template <class T>
inline bool
WrapNewBindingNonWrapperCachedObject(JSContext* cx,
                                     JS::Handle<JSObject*> scopeArg,
                                     nsAutoPtr<T>& value,
                                     JS::MutableHandle<JS::Value> rval,
                                     JS::Handle<JSObject*> givenProto = nullptr)
{
  static_assert(!IsRefcounted<T>::value, "Only pass owned classes in here.");


  if (!value) {
    do { AnnotateMozCrashReason("MOZ_CRASH(" "Don't try to wrap null objects" ")"); do { *((volatile int*) __null) = 1072; ::abort(); } while (0); } while (0);
  }

  JS::Rooted<JSObject*> obj(cx);
  {


    Maybe<JSAutoCompartment> ac;



    JS::Rooted<JSObject*> scope(cx, scopeArg);
    JS::Rooted<JSObject*> proto(cx, givenProto);
    if (js::IsWrapper(scope)) {
      scope = js::CheckedUnwrap(scope, false);
      if (!scope)
        return false;
      ac.emplace(cx, scope);
      if (!JS_WrapObject(cx, &proto)) {
        return false;
      }
    }

    do { } while (0);
    if (!value->WrapObject(cx, proto, &obj)) {
      return false;
    }

    value.forget();
  }



  rval.set(JS::ObjectValue(*obj));
  return MaybeWrapObjectValue(cx, rval);
}


template <template <typename> class SmartPtr, typename T,
          typename U=typename EnableIf<IsRefcounted<T>::value, T>::Type,
          typename V=typename EnableIf<IsSmartPtr<SmartPtr<T>>::value, T>::Type>
inline bool
WrapNewBindingNonWrapperCachedObject(JSContext* cx, JS::Handle<JSObject*> scope,
                                     const SmartPtr<T>& value,
                                     JS::MutableHandle<JS::Value> rval,
                                     JS::Handle<JSObject*> givenProto = nullptr)
{
  return WrapNewBindingNonWrapperCachedObject(cx, scope, value.get(), rval,
                                              givenProto);
}


template <typename T,
          typename U=typename EnableIf<!IsSmartPtr<T>::value, T>::Type>
inline bool
WrapNewBindingNonWrapperCachedObject(JSContext* cx, JS::Handle<JSObject*> scope,
                                     T& value,
                                     JS::MutableHandle<JS::Value> rval,
                                     JS::Handle<JSObject*> givenProto = nullptr)
{
  return WrapNewBindingNonWrapperCachedObject(cx, scope, &value, rval,
                                              givenProto);
}



bool
NativeInterface2JSObjectAndThrowIfFailed(JSContext* aCx,
                                         JS::Handle<JSObject*> aScope,
                                         JS::MutableHandle<JS::Value> aRetval,
                                         xpcObjectHelper& aHelper,
                                         const nsIID* aIID,
                                         bool aAllowNativeWrapper);





template <class T>
__attribute__((always_inline)) inline bool
HandleNewBindingWrappingFailure(JSContext* cx, JS::Handle<JSObject*> scope,
                                T* value, JS::MutableHandle<JS::Value> rval)
{
  if (JS_IsExceptionPending(cx)) {
    return false;
  }

  qsObjectHelper helper(value, GetWrapperCache(value));
  return NativeInterface2JSObjectAndThrowIfFailed(cx, scope, rval,
                                                  helper, nullptr, true);
}




template <class T, bool isSmartPtr=IsSmartPtr<T>::value>
struct HandleNewBindingWrappingFailureHelper
{
  static inline bool Wrap(JSContext* cx, JS::Handle<JSObject*> scope,
                          const T& value, JS::MutableHandle<JS::Value> rval)
  {
    return HandleNewBindingWrappingFailure(cx, scope, value.get(), rval);
  }
};

template <class T>
struct HandleNewBindingWrappingFailureHelper<T, false>
{
  static inline bool Wrap(JSContext* cx, JS::Handle<JSObject*> scope, T& value,
                          JS::MutableHandle<JS::Value> rval)
  {
    return HandleNewBindingWrappingFailure(cx, scope, &value, rval);
  }
};

template<class T>
inline bool
HandleNewBindingWrappingFailure(JSContext* cx, JS::Handle<JSObject*> scope,
                                T& value, JS::MutableHandle<JS::Value> rval)
{
  return HandleNewBindingWrappingFailureHelper<T>::Wrap(cx, scope, value, rval);
}

template<bool Fatal>
inline bool
EnumValueNotFound(JSContext* cx, JS::HandleString str, const char* type,
                  const char* sourceDescription);

template<>
inline bool
EnumValueNotFound<false>(JSContext* cx, JS::HandleString str, const char* type,
                         const char* sourceDescription)
{

  return true;
}

template<>
inline bool
EnumValueNotFound<true>(JSContext* cx, JS::HandleString str, const char* type,
                        const char* sourceDescription)
{
  JSAutoByteString deflated;
  if (!deflated.encodeUtf8(cx, str)) {
    return false;
  }
  return ThrowErrorMessage(cx, MSG_INVALID_ENUM_VALUE, sourceDescription,
                           deflated.ptr(), type);
}

template<typename CharT>
inline int
FindEnumStringIndexImpl(const CharT* chars, size_t length, const EnumEntry* values)
{
  int i = 0;
  for (const EnumEntry* value = values; value->value; ++value, ++i) {
    if (length != value->length) {
      continue;
    }

    bool equal = true;
    const char* val = value->value;
    for (size_t j = 0; j != length; ++j) {
      if (unsigned(val[j]) != unsigned(chars[j])) {
        equal = false;
        break;
      }
    }

    if (equal) {
      return i;
    }
  }

  return -1;
}

template<bool InvalidValueFatal>
inline bool
FindEnumStringIndex(JSContext* cx, JS::Handle<JS::Value> v, const EnumEntry* values,
                    const char* type, const char* sourceDescription, int* index)
{

  JS::RootedString str(cx, JS::ToString(cx, v));
  if (!str) {
    return false;
  }

  {
    size_t length;
    JS::AutoCheckCannotGC nogc;
    if (js::StringHasLatin1Chars(str)) {
      const JS::Latin1Char* chars = JS_GetLatin1StringCharsAndLength(cx, nogc, str,
                                                                     &length);
      if (!chars) {
        return false;
      }
      *index = FindEnumStringIndexImpl(chars, length, values);
    } else {
      const char16_t* chars = JS_GetTwoByteStringCharsAndLength(cx, nogc, str,
                                                                &length);
      if (!chars) {
        return false;
      }
      *index = FindEnumStringIndexImpl(chars, length, values);
    }
    if (*index >= 0) {
      return true;
    }
  }

  return EnumValueNotFound<InvalidValueFatal>(cx, str, type, sourceDescription);
}

inline nsWrapperCache*
GetWrapperCache(const ParentObject& aParentObject)
{
  return aParentObject.mWrapperCache;
}

template<class T>
inline T*
GetParentPointer(T* aObject)
{
  return aObject;
}

inline nsISupports*
GetParentPointer(const ParentObject& aObject)
{
  return aObject.mObject;
}

template <typename T>
inline bool
GetUseXBLScope(T* aParentObject)
{
  return false;
}

inline bool
GetUseXBLScope(const ParentObject& aParentObject)
{
  return aParentObject.mUseXBLScope;
}

template<class T>
inline void
ClearWrapper(T* p, nsWrapperCache* cache)
{
  cache->ClearWrapper();
}

template<class T>
inline void
ClearWrapper(T* p, void*)
{
  nsWrapperCache* cache;
  CallQueryInterface(p, &cache);
  ClearWrapper(p, cache);
}

template<class T>
inline void
UpdateWrapper(T* p, nsWrapperCache* cache, JSObject* obj, const JSObject* old)
{
  JS::AutoAssertGCCallback inCallback(obj);
  cache->UpdateWrapper(obj, old);
}

template<class T>
inline void
UpdateWrapper(T* p, void*, JSObject* obj, const JSObject* old)
{
  JS::AutoAssertGCCallback inCallback(obj);
  nsWrapperCache* cache;
  CallQueryInterface(p, &cache);
  UpdateWrapper(p, cache, obj, old);
}
# 1360 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
TryPreserveWrapper(JSObject* obj);


bool
InstanceClassHasProtoAtDepth(const js::Class* clasp,
                             uint32_t protoID, uint32_t depth);



bool
XPCOMObjectToJsval(JSContext* cx, JS::Handle<JSObject*> scope,
                   xpcObjectHelper& helper, const nsIID* iid,
                   bool allowNativeWrapper, JS::MutableHandle<JS::Value> rval);


bool
VariantToJsval(JSContext* aCx, nsIVariant* aVariant,
               JS::MutableHandle<JS::Value> aRetval);





template<class T>
inline bool
WrapObject(JSContext* cx, T* p, nsWrapperCache* cache, const nsIID* iid,
           JS::MutableHandle<JS::Value> rval)
{
  if (xpc_FastGetCachedWrapper(cx, cache, rval))
    return true;
  qsObjectHelper helper(p, cache);
  JS::Rooted<JSObject*> scope(cx, JS::CurrentGlobalOrNull(cx));
  return XPCOMObjectToJsval(cx, scope, helper, iid, true, rval);
}



template<>
inline bool
WrapObject<nsIVariant>(JSContext* cx, nsIVariant* p,
                       nsWrapperCache* cache, const nsIID* iid,
                       JS::MutableHandle<JS::Value> rval)
{
  do { } while (0);
  do { } while (0);
  return VariantToJsval(cx, p, rval);
}




template<class T>
inline bool
WrapObject(JSContext* cx, T* p, const nsIID* iid,
           JS::MutableHandle<JS::Value> rval)
{
  return WrapObject(cx, p, GetWrapperCache(p), iid, rval);
}




template<class T>
inline bool
WrapObject(JSContext* cx, T* p, JS::MutableHandle<JS::Value> rval)
{
  return WrapObject(cx, p, nullptr, rval);
}


template<class T>
inline bool
WrapObject(JSContext* cx, const nsCOMPtr<T>& p,
           const nsIID* iid, JS::MutableHandle<JS::Value> rval)
{
  return WrapObject(cx, p.get(), iid, rval);
}


template<class T>
inline bool
WrapObject(JSContext* cx, const nsCOMPtr<T>& p,
           JS::MutableHandle<JS::Value> rval)
{
  return WrapObject(cx, p, nullptr, rval);
}


template<class T>
inline bool
WrapObject(JSContext* cx, const RefPtr<T>& p,
           const nsIID* iid, JS::MutableHandle<JS::Value> rval)
{
  return WrapObject(cx, p.get(), iid, rval);
}


template<class T>
inline bool
WrapObject(JSContext* cx, const RefPtr<T>& p,
           JS::MutableHandle<JS::Value> rval)
{
  return WrapObject(cx, p, nullptr, rval);
}


template<>
inline bool
WrapObject<JSObject>(JSContext* cx, JSObject* p,
                     JS::MutableHandle<JS::Value> rval)
{
  rval.set(JS::ObjectOrNullValue(p));
  return true;
}

inline bool
WrapObject(JSContext* cx, JSObject& p, JS::MutableHandle<JS::Value> rval)
{
  rval.set(JS::ObjectValue(p));
  return true;
}





template<typename T>
static inline JSObject*
WrapNativeISupports(JSContext* cx, T* p, nsWrapperCache* cache)
{
  qsObjectHelper helper(ToSupports(p), cache);
  JS::Rooted<JSObject*> scope(cx, JS::CurrentGlobalOrNull(cx));
  JS::Rooted<JS::Value> v(cx);
  return XPCOMObjectToJsval(cx, scope, helper, nullptr, false, &v) ?
         v.toObjectOrNull() :
         nullptr;
}



template<typename T, bool isISupports=IsBaseOf<nsISupports, T>::value>
struct WrapNativeFallback
{
  static inline JSObject* Wrap(JSContext* cx, T* parent, nsWrapperCache* cache)
  {
    return nullptr;
  }
};



template<typename T >
struct WrapNativeFallback<T, true >
{
  static inline JSObject* Wrap(JSContext* cx, T* parent, nsWrapperCache* cache)
  {
    return WrapNativeISupports(cx, parent, cache);
  }
};



template<typename T, bool hasWrapObject=NativeHasMember<T>::WrapObject>
struct WrapNativeHelper
{
  static inline JSObject* Wrap(JSContext* cx, T* parent, nsWrapperCache* cache)
  {
    do { } while (0);

    JSObject* obj;
    if ((obj = cache->GetWrapper())) {

      do { } while (0);
      return obj;
    }


    if (!CouldBeDOMBinding(parent)) {

      obj = WrapNativeFallback<T>::Wrap(cx, parent, cache);
      do { } while (0);
    } else {

      obj = parent->WrapObject(cx, nullptr);
      do { } while (0);
    }

    return obj;
  }
};



template<typename T>
struct WrapNativeHelper<T, false>
{
  static inline JSObject* Wrap(JSContext* cx, T* parent, nsWrapperCache* cache)
  {
    JSObject* obj;
    if (cache && (obj = cache->GetWrapper())) {






      do { } while (0);
      return obj;
    }

    obj = WrapNativeISupports(cx, parent, cache);
    do { } while (0);
    return obj;
  }
};


template<typename T>
static inline JSObject*
FindAssociatedGlobal(JSContext* cx, T* p, nsWrapperCache* cache,
                     bool useXBLScope = false)
{
  if (!p) {
    return JS::CurrentGlobalOrNull(cx);
  }

  JSObject* obj = WrapNativeHelper<T>::Wrap(cx, p, cache);
  if (!obj) {
    return nullptr;
  }
  do { } while (0);

  obj = js::GetGlobalForObjectCrossCompartment(obj);

  if (!useXBLScope) {
    return obj;
  }




  if (xpc::IsInContentXBLScope(obj)) {
    return obj;
  }
  JS::Rooted<JSObject*> rootedObj(cx, obj);
  JSObject* xblScope = xpc::GetXBLScope(cx, rootedObj);
  do { } while (0);
  do { } while (0);
  return xblScope;
}



template<typename T>
static inline JSObject*
FindAssociatedGlobal(JSContext* cx, const T& p)
{
  return FindAssociatedGlobal(cx, GetParentPointer(p), GetWrapperCache(p), GetUseXBLScope(p));
}



template<>
inline JSObject*
FindAssociatedGlobal(JSContext* cx, nsIGlobalObject* const& p)
{
  if (!p) {
    return JS::CurrentGlobalOrNull(cx);
  }

  JSObject* global = p->GetGlobalJSObject();
  if (!global) {
    return nullptr;
  }

  do { } while (0);


  JS::ExposeObjectToActiveJS(global);
  return global;
}

template<typename T,
         bool hasAssociatedGlobal=NativeHasMember<T>::GetParentObject>
struct FindAssociatedGlobalForNative
{
  static JSObject* Get(JSContext* cx, JS::Handle<JSObject*> obj)
  {
    do { } while (0);
    T* native = UnwrapDOMObject<T>(obj);
    return FindAssociatedGlobal(cx, native->GetParentObject());
  }
};

template<typename T>
struct FindAssociatedGlobalForNative<T, false>
{
  static JSObject* Get(JSContext* cx, JS::Handle<JSObject*> obj)
  {
    do { AnnotateMozCrashReason("MOZ_CRASH(" ")"); do { *((volatile int*) __null) = 1660; ::abort(); } while (0); } while (0);
    return nullptr;
  }
};



template <class T, bool isSmartPtr=IsSmartPtr<T>::value>
struct GetOrCreateDOMReflectorHelper
{
  static inline bool GetOrCreate(JSContext* cx, const T& value,
                                 JS::Handle<JSObject*> givenProto,
                                 JS::MutableHandle<JS::Value> rval)
  {
    return GetOrCreateDOMReflector(cx, value.get(), rval, givenProto);
  }
};

template <class T>
struct GetOrCreateDOMReflectorHelper<T, false>
{
  static inline bool GetOrCreate(JSContext* cx, T& value,
                                 JS::Handle<JSObject*> givenProto,
                                 JS::MutableHandle<JS::Value> rval)
  {
    static_assert(IsRefcounted<T>::value, "Don't pass owned classes in here.");
    return GetOrCreateDOMReflector(cx, &value, rval, givenProto);
  }
};

template<class T>
inline bool
GetOrCreateDOMReflector(JSContext* cx, T& value,
                        JS::MutableHandle<JS::Value> rval,
                        JS::Handle<JSObject*> givenProto = nullptr)
{
  return GetOrCreateDOMReflectorHelper<T>::GetOrCreate(cx, value, givenProto,
                                                       rval);
}



template <class T, bool isSmartPtr=IsSmartPtr<T>::value>
struct GetOrCreateDOMReflectorNoWrapHelper
{
  static inline bool GetOrCreate(JSContext* cx, const T& value,
                                 JS::MutableHandle<JS::Value> rval)
  {
    return GetOrCreateDOMReflectorNoWrap(cx, value.get(), rval);
  }
};

template <class T>
struct GetOrCreateDOMReflectorNoWrapHelper<T, false>
{
  static inline bool GetOrCreate(JSContext* cx, T& value,
                                 JS::MutableHandle<JS::Value> rval)
  {
    return GetOrCreateDOMReflectorNoWrap(cx, &value, rval);
  }
};

template<class T>
inline bool
GetOrCreateDOMReflectorNoWrap(JSContext* cx, T& value,
                              JS::MutableHandle<JS::Value> rval)
{
  return
    GetOrCreateDOMReflectorNoWrapHelper<T>::GetOrCreate(cx, value, rval);
}

template <class T>
inline JSObject*
GetCallbackFromCallbackObject(T* aObj)
{
  return aObj->CallbackOrNull();
}




template <class T, bool isSmartPtr=IsSmartPtr<T>::value>
struct GetCallbackFromCallbackObjectHelper
{
  static inline JSObject* Get(const T& aObj)
  {
    return GetCallbackFromCallbackObject(aObj.get());
  }
};

template <class T>
struct GetCallbackFromCallbackObjectHelper<T, false>
{
  static inline JSObject* Get(T& aObj)
  {
    return GetCallbackFromCallbackObject(&aObj);
  }
};

template<class T>
inline JSObject*
GetCallbackFromCallbackObject(T& aObj)
{
  return GetCallbackFromCallbackObjectHelper<T>::Get(aObj);
}

static inline bool
AtomizeAndPinJSString(JSContext* cx, jsid& id, const char* chars)
{
  if (JSString *str = ::JS_AtomizeAndPinString(cx, chars)) {
    id = INTERNED_STRING_TO_JSID(cx, str);
    return true;
  }
  return false;
}


template <typename Spec>
static bool
InitIds(JSContext* cx, const Prefable<Spec>* prefableSpecs, jsid* ids)
{
  do { } while (0);
  do { } while (0);
  do {


    Spec* spec = prefableSpecs->specs;
    do {
      if (!JS::PropertySpecNameToPermanentId(cx, spec->name, ids)) {
        return false;
      }
    } while (++ids, (++spec)->name);



    *ids = JSID_VOID;
    ++ids;
  } while ((++prefableSpecs)->specs);

  return true;
}

bool
QueryInterface(JSContext* cx, unsigned argc, JS::Value* vp);

template <class T>
struct
WantsQueryInterface
{
  static_assert(IsBaseOf<nsISupports, T>::value,
                "QueryInterface can't work without an nsISupports.");
  static bool Enabled(JSContext* aCx, JSObject* aGlobal)
  {
    return NS_IsMainThread() && IsChromeOrXBL(aCx, aGlobal);
  }
};

void
GetInterfaceImpl(JSContext* aCx, nsIInterfaceRequestor* aRequestor,
                 nsWrapperCache* aCache, nsIJSID* aIID,
                 JS::MutableHandle<JS::Value> aRetval, ErrorResult& aError);

template<class T>
void
GetInterface(JSContext* aCx, T* aThis, nsIJSID* aIID,
             JS::MutableHandle<JS::Value> aRetval, ErrorResult& aError)
{
  GetInterfaceImpl(aCx, aThis, aThis, aIID, aRetval, aError);
}

bool
ThrowingConstructor(JSContext* cx, unsigned argc, JS::Value* vp);

bool
ThrowConstructorWithoutNew(JSContext* cx, const char* name);

bool
GetPropertyOnPrototype(JSContext* cx, JS::Handle<JSObject*> proxy,
                       JS::Handle<JS::Value> receiver, JS::Handle<jsid> id,
                       bool* found, JS::MutableHandle<JS::Value> vp);


bool
HasPropertyOnPrototype(JSContext* cx, JS::Handle<JSObject*> proxy,
                       JS::Handle<jsid> id, bool* has);






bool
AppendNamedPropertyIds(JSContext* cx, JS::Handle<JSObject*> proxy,
                       nsTArray<nsString>& names,
                       bool shadowPrototypeProperties, JS::AutoIdVector& props);

enum StringificationBehavior {
  eStringify,
  eEmpty,
  eNull
};

template<typename T>
static inline bool
ConvertJSValueToString(JSContext* cx, JS::Handle<JS::Value> v,
                       StringificationBehavior nullBehavior,
                       StringificationBehavior undefinedBehavior,
                       T& result)
{
  JSString *s;
  if (v.isString()) {
    s = v.toString();
  } else {
    StringificationBehavior behavior;
    if (v.isNull()) {
      behavior = nullBehavior;
    } else if (v.isUndefined()) {
      behavior = undefinedBehavior;
    } else {
      behavior = eStringify;
    }

    if (behavior != eStringify) {
      if (behavior == eEmpty) {
        result.Truncate();
      } else {
        result.SetIsVoid(true);
      }
      return true;
    }

    s = JS::ToString(cx, v);
    if (!s) {
      return false;
    }
  }

  return AssignJSString(cx, result, s);
}

template<typename T>
static inline bool
ConvertJSValueToString(JSContext* cx, JS::Handle<JS::Value> v, T& result)
{
  return ConvertJSValueToString(cx, v, eStringify, eStringify, result);
}

void
NormalizeUSVString(nsAString& aString);

void
NormalizeUSVString(binding_detail::FakeString& aString);

template<typename T>
static inline bool
ConvertJSValueToUSVString(JSContext* cx, JS::Handle<JS::Value> v, T& result)
{
  if (!ConvertJSValueToString(cx, v, eStringify, eStringify, result)) {
    return false;
  }

  NormalizeUSVString(result);
  return true;
}

template<typename T>
inline bool
ConvertIdToString(JSContext* cx, JS::HandleId id, T& result, bool& isSymbol)
{
  if ((__builtin_expect(!!(JSID_IS_STRING(id)), 1))) {
    if (!AssignJSString(cx, result, JSID_TO_STRING(id))) {
      return false;
    }
  } else if (JSID_IS_SYMBOL(id)) {
    isSymbol = true;
    return true;
  } else {
    JS::RootedValue nameVal(cx, js::IdToValue(id));
    if (!ConvertJSValueToString(cx, nameVal, eStringify, eStringify, result)) {
      return false;
    }
  }
  isSymbol = false;
  return true;
}

bool
ConvertJSValueToByteString(JSContext* cx, JS::Handle<JS::Value> v,
                           bool nullable, nsACString& result);

inline bool
ConvertJSValueToByteString(JSContext* cx, JS::Handle<JS::Value> v,
                           nsACString& result)
{
  return ConvertJSValueToByteString(cx, v, false, result);
}

template<typename T>
void DoTraceSequence(JSTracer* trc, FallibleTArray<T>& seq);
template<typename T>
void DoTraceSequence(JSTracer* trc, InfallibleTArray<T>& seq);



template<typename T,
         bool isDictionary=IsBaseOf<DictionaryBase, T>::value,
         bool isTypedArray=IsBaseOf<AllTypedArraysBase, T>::value,
         bool isOwningUnion=IsBaseOf<AllOwningUnionBase, T>::value>
class SequenceTracer
{
  explicit SequenceTracer() = delete;
};


template<>
class SequenceTracer<JSObject*, false, false, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, JSObject** objp, JSObject** end) {
    for (; objp != end; ++objp) {
      JS::UnsafeTraceRoot(trc, objp, "sequence<object>");
    }
  }
};


template<>
class SequenceTracer<JS::Value, false, false, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, JS::Value* valp, JS::Value* end) {
    for (; valp != end; ++valp) {
      JS::UnsafeTraceRoot(trc, valp, "sequence<any>");
    }
  }
};


template<typename T>
class SequenceTracer<Sequence<T>, false, false, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, Sequence<T>* seqp, Sequence<T>* end) {
    for (; seqp != end; ++seqp) {
      DoTraceSequence(trc, *seqp);
    }
  }
};


template<typename T>
class SequenceTracer<nsTArray<T>, false, false, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, nsTArray<T>* seqp, nsTArray<T>* end) {
    for (; seqp != end; ++seqp) {
      DoTraceSequence(trc, *seqp);
    }
  }
};


template<typename T>
class SequenceTracer<T, true, false, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, T* dictp, T* end) {
    for (; dictp != end; ++dictp) {
      dictp->TraceDictionary(trc);
    }
  }
};


template<typename T>
class SequenceTracer<T, false, true, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, T* arrayp, T* end) {
    for (; arrayp != end; ++arrayp) {
      arrayp->TraceSelf(trc);
    }
  }
};


template<typename T>
class SequenceTracer<T, false, false, true>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, T* arrayp, T* end) {
    for (; arrayp != end; ++arrayp) {
      arrayp->TraceUnion(trc);
    }
  }
};


template<typename T>
class SequenceTracer<Nullable<T>, false, false, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, Nullable<T>* seqp,
                            Nullable<T>* end) {
    for (; seqp != end; ++seqp) {
      if (!seqp->IsNull()) {


        T& val = seqp->Value();
        T* ptr = &val;
        SequenceTracer<T>::TraceSequence(trc, ptr, ptr+1);
      }
    }
  }
};

template<typename K, typename V>
void TraceRecord(JSTracer* trc, Record<K, V>& record)
{
  for (auto& entry : record.Entries()) {

    SequenceTracer<V>::TraceSequence(trc, &entry.mValue, &entry.mValue + 1);
  }
}


template<typename K, typename V>
class SequenceTracer<Record<K, V>, false, false, false>
{
  explicit SequenceTracer() = delete;

public:
  static void TraceSequence(JSTracer* trc, Record<K, V>* seqp,
                            Record<K, V>* end) {
    for (; seqp != end; ++seqp) {
      TraceRecord(trc, *seqp);
    }
  }
};

template<typename T>
void DoTraceSequence(JSTracer* trc, FallibleTArray<T>& seq)
{
  SequenceTracer<T>::TraceSequence(trc, seq.Elements(),
                                   seq.Elements() + seq.Length());
}

template<typename T>
void DoTraceSequence(JSTracer* trc, InfallibleTArray<T>& seq)
{
  SequenceTracer<T>::TraceSequence(trc, seq.Elements(),
                                   seq.Elements() + seq.Length());
}


template<typename T>
class SequenceRooter final : private JS::CustomAutoRooter
{
public:
  SequenceRooter(JSContext *aCx, FallibleTArray<T>* aSequence
                                                )
    : JS::CustomAutoRooter(aCx ),
      mFallibleArray(aSequence),
      mSequenceType(eFallibleArray)
  {
  }

  SequenceRooter(JSContext *aCx, InfallibleTArray<T>* aSequence
                                                )
    : JS::CustomAutoRooter(aCx ),
      mInfallibleArray(aSequence),
      mSequenceType(eInfallibleArray)
  {
  }

  SequenceRooter(JSContext *aCx, Nullable<nsTArray<T> >* aSequence
                                                )
    : JS::CustomAutoRooter(aCx ),
      mNullableArray(aSequence),
      mSequenceType(eNullableArray)
  {
  }

 private:
  enum SequenceType {
    eInfallibleArray,
    eFallibleArray,
    eNullableArray
  };

  virtual void trace(JSTracer *trc) override
  {
    if (mSequenceType == eFallibleArray) {
      DoTraceSequence(trc, *mFallibleArray);
    } else if (mSequenceType == eInfallibleArray) {
      DoTraceSequence(trc, *mInfallibleArray);
    } else {
      do { } while (0);
      if (!mNullableArray->IsNull()) {
        DoTraceSequence(trc, mNullableArray->Value());
      }
    }
  }

  union {
    InfallibleTArray<T>* mInfallibleArray;
    FallibleTArray<T>* mFallibleArray;
    Nullable<nsTArray<T> >* mNullableArray;
  };

  SequenceType mSequenceType;
};


template<typename K, typename V>
class RecordRooter final : private JS::CustomAutoRooter
{
public:
  RecordRooter(JSContext *aCx, Record<K, V>* aRecord
                                              )
    : JS::CustomAutoRooter(aCx ),
      mRecord(aRecord),
      mRecordType(eRecord)
  {
  }

  RecordRooter(JSContext *aCx, Nullable<Record<K, V>>* aRecord
                                                )
    : JS::CustomAutoRooter(aCx ),
      mNullableRecord(aRecord),
      mRecordType(eNullableRecord)
  {
  }

private:
  enum RecordType {
    eRecord,
    eNullableRecord
  };

  virtual void trace(JSTracer *trc) override
  {
    if (mRecordType == eRecord) {
      TraceRecord(trc, *mRecord);
    } else {
      do { } while (0);
      if (!mNullableRecord->IsNull()) {
        TraceRecord(trc, mNullableRecord->Value());
      }
    }
  }

  union {
    Record<K, V>* mRecord;
    Nullable<Record<K, V>>* mNullableRecord;
  };

  RecordType mRecordType;
};

template<typename T>
class RootedUnion : public T,
                             private JS::CustomAutoRooter
{
public:
  explicit RootedUnion(JSContext* cx ) :
    T(),
    JS::CustomAutoRooter(cx )
  {
  }

  virtual void trace(JSTracer *trc) override
  {
    this->TraceUnion(trc);
  }
};

template<typename T>
class NullableRootedUnion : public Nullable<T>,
                                            private JS::CustomAutoRooter
{
public:
  explicit NullableRootedUnion(JSContext* cx ) :
    Nullable<T>(),
    JS::CustomAutoRooter(cx )
  {
  }

  virtual void trace(JSTracer *trc) override
  {
    if (!this->IsNull()) {
      this->Value().TraceUnion(trc);
    }
  }
};

inline bool
IdEquals(jsid id, const char* string)
{
  return JSID_IS_STRING(id) &&
         JS_FlatStringEqualsAscii(JSID_TO_FLAT_STRING(id), string);
}

inline bool
AddStringToIDVector(JSContext* cx, JS::AutoIdVector& vector, const char* name)
{
  return vector.growBy(1) &&
         AtomizeAndPinJSString(cx, *(vector[vector.length() - 1]).address(), name);
}
# 2295 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
enum {
  CONSTRUCTOR_NATIVE_HOLDER_RESERVED_SLOT = 0
};

bool
Constructor(JSContext* cx, unsigned argc, JS::Value* vp);
# 2311 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
XrayResolveOwnProperty(JSContext* cx, JS::Handle<JSObject*> wrapper,
                       JS::Handle<JSObject*> obj,
                       JS::Handle<jsid> id,
                       JS::MutableHandle<JS::PropertyDescriptor> desc,
                       bool& cacheOnHolder);
# 2329 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
XrayDefineProperty(JSContext* cx, JS::Handle<JSObject*> wrapper,
                   JS::Handle<JSObject*> obj, JS::Handle<jsid> id,
                   JS::Handle<JS::PropertyDescriptor> desc,
                   JS::ObjectOpResult &result,
                   bool *defined);
# 2345 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
XrayOwnPropertyKeys(JSContext* cx, JS::Handle<JSObject*> wrapper,
                    JS::Handle<JSObject*> obj,
                    unsigned flags, JS::AutoIdVector& props);
# 2360 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
inline bool
XrayGetNativeProto(JSContext* cx, JS::Handle<JSObject*> obj,
                   JS::MutableHandle<JSObject*> protop)
{
  JS::Rooted<JSObject*> global(cx, js::GetGlobalForObjectCrossCompartment(obj));
  {
    JSAutoCompartment ac(cx, global);
    const DOMJSClass* domClass = GetDOMClass(obj);
    if (domClass) {
      ProtoHandleGetter protoGetter = domClass->mGetProto;
      if (protoGetter) {
        protop.set(protoGetter(cx));
      } else {
        protop.set(JS::GetRealmObjectPrototype(cx));
      }
    } else if (JS_ObjectIsFunction(cx, obj)) {
      do { } while (0);
      protop.set(JS::GetRealmFunctionPrototype(cx));
    } else {
      const js::Class* clasp = js::GetObjectClass(obj);
      do { } while (0);
      ProtoGetter protoGetter =
        DOMIfaceAndProtoJSClass::FromJSClass(clasp)->mGetParentProto;
      protop.set(protoGetter(cx));
    }
  }

  return JS_WrapObject(cx, protop);
}




const JSClass*
XrayGetExpandoClass(JSContext* cx, JS::Handle<JSObject*> obj);
# 2404 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
XrayDeleteNamedProperty(JSContext* cx, JS::Handle<JSObject*> wrapper,
                        JS::Handle<JSObject*> obj, JS::Handle<jsid> id,
                        JS::ObjectOpResult& opresult);
# 2423 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
JSObject*
GetCachedSlotStorageObjectSlow(JSContext* cx, JS::Handle<JSObject*> obj,
                               bool* isXray);

inline JSObject*
GetCachedSlotStorageObject(JSContext* cx, JS::Handle<JSObject*> obj,
                           bool* isXray) {
  if (IsDOMObject(obj)) {
    *isXray = false;
    return obj;
  }

  return GetCachedSlotStorageObjectSlow(cx, obj, isXray);
}

extern NativePropertyHooks sEmptyNativePropertyHooks;

extern const js::ClassOps sBoringInterfaceObjectClassClassOps;

extern const js::ObjectOps sInterfaceObjectClassObjectOps;

inline bool
UseDOMXray(JSObject* obj)
{
  const js::Class* clasp = js::GetObjectClass(obj);
  return IsDOMClass(clasp) ||
         JS_IsNativeFunction(obj, Constructor) ||
         IsDOMIfaceAndProtoClass(clasp);
}
# 2463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
template<typename T>
const T& Constify(T& arg)
{
  return arg;
}


template<typename T>
T& NonNullHelper(T& aArg)
{
  return aArg;
}

template<typename T>
T& NonNullHelper(NonNull<T>& aArg)
{
  return aArg;
}

template<typename T>
const T& NonNullHelper(const NonNull<T>& aArg)
{
  return aArg;
}

template<typename T>
T& NonNullHelper(OwningNonNull<T>& aArg)
{
  return aArg;
}

template<typename T>
const T& NonNullHelper(const OwningNonNull<T>& aArg)
{
  return aArg;
}

inline
void NonNullHelper(NonNull<binding_detail::FakeString>& aArg)
{




}

inline
void NonNullHelper(const NonNull<binding_detail::FakeString>& aArg)
{




}

inline
void NonNullHelper(binding_detail::FakeString& aArg)
{




}

__attribute__((always_inline)) inline
const nsAString& NonNullHelper(const binding_detail::FakeString& aArg)
{
  return aArg;
}



nsresult
ReparentWrapper(JSContext* aCx, JS::Handle<JSObject*> aObj);




bool
InterfaceHasInstance(JSContext* cx, unsigned argc, JS::Value* vp);

bool
InterfaceHasInstance(JSContext* cx, int prototypeID, int depth,
                     JS::Handle<JSObject*> instance,
                     bool* bp);



bool
ReportLenientThisUnwrappingFailure(JSContext* cx, JSObject* obj);




bool
GetContentGlobalForJSImplementedObject(JSContext* cx, JS::Handle<JSObject*> obj,
                                       nsIGlobalObject** global);

void
ConstructJSImplementation(const char* aContractId,
                          nsIGlobalObject* aGlobal,
                          JS::MutableHandle<JSObject*> aObject,
                          ErrorResult& aRv);

already_AddRefed<nsIGlobalObject>
ConstructJSImplementation(const char* aContractId,
                          const GlobalObject& aGlobal,
                          JS::MutableHandle<JSObject*> aObject,
                          ErrorResult& aRv);







bool NonVoidByteStringToJsval(JSContext *cx, const nsACString &str,
                              JS::MutableHandle<JS::Value> rval);
inline bool ByteStringToJsval(JSContext *cx, const nsACString &str,
                              JS::MutableHandle<JS::Value> rval)
{
    if (str.IsVoid()) {
        rval.setNull();
        return true;
    }
    return NonVoidByteStringToJsval(cx, str, rval);
}

template<class T, bool isISupports=IsBaseOf<nsISupports, T>::value>
struct PreserveWrapperHelper
{
  static void PreserveWrapper(T* aObject)
  {
    aObject->PreserveWrapper(aObject, T::cycleCollection::GetParticipant());
  }
};

template<class T>
struct PreserveWrapperHelper<T, true>
{
  static void PreserveWrapper(T* aObject)
  {
    aObject->PreserveWrapper(reinterpret_cast<nsISupports*>(aObject));
  }
};

template<class T>
void PreserveWrapper(T* aObject)
{
  PreserveWrapperHelper<T>::PreserveWrapper(aObject);
}

template<class T, bool isISupports=IsBaseOf<nsISupports, T>::value>
struct CastingAssertions
{
  static bool ToSupportsIsCorrect(T*)
  {
    return true;
  }
  static bool ToSupportsIsOnPrimaryInheritanceChain(T*, nsWrapperCache*)
  {
    return true;
  }
};

template<class T>
struct CastingAssertions<T, true>
{
  static bool ToSupportsIsCorrect(T* aObject)
  {
    return ToSupports(aObject) == reinterpret_cast<nsISupports*>(aObject);
  }
  static bool ToSupportsIsOnPrimaryInheritanceChain(T* aObject,
                                                    nsWrapperCache* aCache)
  {
    return reinterpret_cast<void*>(aObject) != aCache;
  }
};

template<class T>
bool
ToSupportsIsCorrect(T* aObject)
{
  return CastingAssertions<T>::ToSupportsIsCorrect(aObject);
}

template<class T>
bool
ToSupportsIsOnPrimaryInheritanceChain(T* aObject, nsWrapperCache* aCache)
{
  return CastingAssertions<T>::ToSupportsIsOnPrimaryInheritanceChain(aObject,
                                                                     aCache);
}
# 2667 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
template<class T>
class BindingJSObjectCreator
{
public:
  explicit BindingJSObjectCreator(JSContext* aCx)
    : mReflector(aCx)
  {
  }

  ~BindingJSObjectCreator()
  {
    if (mReflector) {
      js::SetReservedOrProxyPrivateSlot(mReflector, 0,
                                        JS::UndefinedValue());
    }
  }

  void
  CreateProxyObject(JSContext* aCx, const js::Class* aClass,
                    const DOMProxyHandler* aHandler,
                    JS::Handle<JSObject*> aProto, T* aNative,
                    JS::MutableHandle<JSObject*> aReflector)
  {
    js::ProxyOptions options;
    options.setClass(aClass);
    JS::Rooted<JS::Value> proxyPrivateVal(aCx, JS::PrivateValue(aNative));
    aReflector.set(js::NewProxyObject(aCx, aHandler, proxyPrivateVal, aProto,
                                      options));
    if (aReflector) {
      mNative = aNative;
      mReflector = aReflector;
    }
  }

  void
  CreateObject(JSContext* aCx, const JSClass* aClass,
               JS::Handle<JSObject*> aProto,
               T* aNative, JS::MutableHandle<JSObject*> aReflector)
  {
    aReflector.set(JS_NewObjectWithGivenProto(aCx, aClass, aProto));
    if (aReflector) {
      js::SetReservedSlot(aReflector, 0, JS::PrivateValue(aNative));
      mNative = aNative;
      mReflector = aReflector;
    }
  }

  void
  InitializationSucceeded()
  {
    void* dummy;
    mNative.forget(&dummy);
    mReflector = nullptr;
  }

private:
  struct OwnedNative
  {


    static_assert(IsBaseOf<NonRefcountedDOMObject, T>::value,
                  "Non-refcounted objects with DOM bindings should inherit "
                  "from NonRefcountedDOMObject.");

    OwnedNative&
    operator=(T* aNative)
    {
      return *this;
    }



    void
    forget(void**)
    {
    }
  };

  JS::Rooted<JSObject*> mReflector;
  typename Conditional<IsRefcounted<T>::value, RefPtr<T>, OwnedNative>::Type mNative;
};

template<class T>
struct DeferredFinalizerImpl
{
  typedef typename Conditional<IsSame<T, nsISupports>::value,
                               nsCOMPtr<T>,
                               typename Conditional<IsRefcounted<T>::value,
                                                    RefPtr<T>,
                                                    nsAutoPtr<T>>::Type>::Type SmartPtr;
  typedef SegmentedVector<SmartPtr> SmartPtrArray;

  static_assert(IsSame<T, nsISupports>::value || !IsBaseOf<nsISupports, T>::value,
                "nsISupports classes should all use the nsISupports instantiation");

  static inline void
  AppendAndTake(SegmentedVector<nsCOMPtr<nsISupports>>& smartPtrArray, nsISupports* ptr)
  {
    smartPtrArray.InfallibleAppend(dont_AddRef(ptr));
  }
  template<class U>
  static inline void
  AppendAndTake(SegmentedVector<RefPtr<U>>& smartPtrArray, U* ptr)
  {
    smartPtrArray.InfallibleAppend(dont_AddRef(ptr));
  }
  template<class U>
  static inline void
  AppendAndTake(SegmentedVector<nsAutoPtr<U>>& smartPtrArray, U* ptr)
  {
    smartPtrArray.InfallibleAppend(ptr);
  }

  static void*
  AppendDeferredFinalizePointer(void* aData, void* aObject)
  {
    SmartPtrArray* pointers = static_cast<SmartPtrArray*>(aData);
    if (!pointers) {
      pointers = new SmartPtrArray();
    }
    AppendAndTake(*pointers, static_cast<T*>(aObject));
    return pointers;
  }
  static bool
  DeferredFinalize(uint32_t aSlice, void* aData)
  {
    do { } while (0);
    SmartPtrArray* pointers = static_cast<SmartPtrArray*>(aData);
    uint32_t oldLen = pointers->Length();
    if (oldLen < aSlice) {
      aSlice = oldLen;
    }
    uint32_t newLen = oldLen - aSlice;
    pointers->PopLastN(aSlice);
    if (newLen == 0) {
      delete pointers;
      return true;
    }
    return false;
  }
};

template<class T,
         bool isISupports=IsBaseOf<nsISupports, T>::value>
struct DeferredFinalizer
{
  static void
  AddForDeferredFinalization(T* aObject)
  {
    typedef DeferredFinalizerImpl<T> Impl;
    DeferredFinalize(Impl::AppendDeferredFinalizePointer,
                     Impl::DeferredFinalize, aObject);
  }
};

template<class T>
struct DeferredFinalizer<T, true>
{
  static void
  AddForDeferredFinalization(T* aObject)
  {
    DeferredFinalize(reinterpret_cast<nsISupports*>(aObject));
  }
};

template<class T>
static void
AddForDeferredFinalization(T* aObject)
{
  DeferredFinalizer<T>::AddForDeferredFinalization(aObject);
}




template<class T, bool isISupports=IsBaseOf<nsISupports, T>::value>
class GetCCParticipant
{

  template<class U>
  static constexpr nsCycleCollectionParticipant*
  GetHelper(int, typename U::cycleCollection* dummy=nullptr)
  {
    return T::cycleCollection::GetParticipant();
  }

  template<class U>
  static constexpr nsCycleCollectionParticipant*
  GetHelper(double)
  {
    return nullptr;
  }

public:
  static constexpr nsCycleCollectionParticipant*
  Get()
  {




    return GetHelper<T>(int());
  }
};

template<class T>
class GetCCParticipant<T, true>
{
public:
  static constexpr nsCycleCollectionParticipant*
  Get()
  {
    return nullptr;
  }
};

void
FinalizeGlobal(JSFreeOp* aFop, JSObject* aObj);

bool
ResolveGlobal(JSContext* aCx, JS::Handle<JSObject*> aObj,
              JS::Handle<jsid> aId, bool* aResolvedp);

bool
MayResolveGlobal(const JSAtomState& aNames, jsid aId, JSObject* aMaybeObj);

bool
EnumerateGlobal(JSContext* aCx, JS::Handle<JSObject*> aObj);

template <class T>
struct CreateGlobalOptions
{
  static constexpr ProtoAndIfaceCache::Kind ProtoAndIfaceCacheKind =
    ProtoAndIfaceCache::NonWindowLike;
  static void TraceGlobal(JSTracer* aTrc, JSObject* aObj)
  {
    mozilla::dom::TraceProtoAndIfaceCache(aTrc, aObj);
  }
  static bool PostCreateGlobal(JSContext* aCx, JS::Handle<JSObject*> aGlobal)
  {
    do { if ((TryPreserveWrapper(aGlobal))) { } } while (0);

    return true;
  }
};

template <>
struct CreateGlobalOptions<nsGlobalWindow>
{
  static constexpr ProtoAndIfaceCache::Kind ProtoAndIfaceCacheKind =
    ProtoAndIfaceCache::WindowLike;
  static void TraceGlobal(JSTracer* aTrc, JSObject* aObj);
  static bool PostCreateGlobal(JSContext* aCx, JS::Handle<JSObject*> aGlobal);
};

nsresult
RegisterDOMNames();
# 2932 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
template <class T, ProtoHandleGetter GetProto>
bool
CreateGlobal(JSContext* aCx, T* aNative, nsWrapperCache* aCache,
             const JSClass* aClass, JS::CompartmentOptions& aOptions,
             JSPrincipals* aPrincipal, bool aInitStandardClasses,
             JS::MutableHandle<JSObject*> aGlobal)
{
  aOptions.creationOptions().setTrace(CreateGlobalOptions<T>::TraceGlobal);
  if (xpc::SharedMemoryEnabled()) {
    aOptions.creationOptions().setSharedMemoryAndAtomicsEnabled(true);
  }

  aGlobal.set(JS_NewGlobalObject(aCx, aClass, aPrincipal,
                                 JS::DontFireOnNewGlobalHook, aOptions));
  if (!aGlobal) {
    do { } while(0);
    return false;
  }

  JSAutoCompartment ac(aCx, aGlobal);

  {
    js::SetReservedSlot(aGlobal, 0, JS::PrivateValue(aNative));
    (aNative)->AddRef();

    aCache->SetWrapper(aGlobal);

    dom::AllocateProtoAndIfaceCache(aGlobal,
                                    CreateGlobalOptions<T>::ProtoAndIfaceCacheKind);

    if (!CreateGlobalOptions<T>::PostCreateGlobal(aCx, aGlobal)) {
      return false;
    }
  }

  if (aInitStandardClasses &&
      !JS_InitStandardClasses(aCx, aGlobal)) {
    do { } while(0);
    return false;
  }

  JS::Handle<JSObject*> proto = GetProto(aCx);
  if (!proto || !JS_SplicePrototype(aCx, aGlobal, proto)) {
    do { } while(0);
    return false;
  }

  bool succeeded;
  if (!JS_SetImmutablePrototype(aCx, aGlobal, &succeeded)) {
    return false;
  }
  do { } while (0);



  return true;
}





class PinnedStringId
{
  jsid id;

 public:
  PinnedStringId() : id(JSID_VOID) {}

  bool init(JSContext *cx, const char *string) {
    JSString* str = JS_AtomizeAndPinString(cx, string);
    if (!str)
      return false;
    id = INTERNED_STRING_TO_JSID(cx, str);
    return true;
  }

  operator const jsid& () {
    return id;
  }

  operator JS::Handle<jsid> () {

    return JS::Handle<jsid>::fromMarkedLocation(&id);
  }
};

bool
GenericBindingGetter(JSContext* cx, unsigned argc, JS::Value* vp);

bool
GenericPromiseReturningBindingGetter(JSContext* cx, unsigned argc, JS::Value* vp);

bool
GenericBindingSetter(JSContext* cx, unsigned argc, JS::Value* vp);

bool
GenericBindingMethod(JSContext* cx, unsigned argc, JS::Value* vp);

bool
GenericPromiseReturningBindingMethod(JSContext* cx, unsigned argc, JS::Value* vp);

bool
StaticMethodPromiseWrapper(JSContext* cx, unsigned argc, JS::Value* vp);
# 3045 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
ConvertExceptionToPromise(JSContext* cx,
                          JSObject* promiseScope,
                          JS::MutableHandle<JS::Value> rval);
# 3062 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool
EnforceNotInPrerendering(JSContext* aCx, JSObject* aObj);




void
HandlePrerenderingViolation(nsPIDOMWindowInner* aWindow);

bool
CallerSubsumes(JSObject* aObject);

__attribute__((always_inline)) inline bool
CallerSubsumes(JS::Handle<JS::Value> aValue)
{
  if (!aValue.isObject()) {
    return true;
  }
  return CallerSubsumes(&aValue.toObject());
}

template<class T>
inline bool
WrappedJSToDictionary(JSContext* aCx, nsISupports* aObject, T& aDictionary)
{
  nsCOMPtr<nsIXPConnectWrappedJS> wrappedObj = do_QueryInterface(aObject);
  if (!wrappedObj) {
    return false;
  }

  JS::Rooted<JSObject*> obj(aCx, wrappedObj->GetJSObject());
  if (!obj) {
    return false;
  }

  JSAutoCompartment ac(aCx, obj);
  JS::Rooted<JS::Value> v(aCx, JS::ObjectValue(*obj));
  return aDictionary.Init(aCx, v);
}

template<class T>
inline bool
WrappedJSToDictionary(nsISupports* aObject, T& aDictionary)
{
  nsCOMPtr<nsIXPConnectWrappedJS> wrappedObj = do_QueryInterface(aObject);
  do { if ((__builtin_expect(!!(!(wrappedObj)), 0))) { do { } while(0); return false; } } while(0);
  JS::Rooted<JSObject*> obj(RootingCx(), wrappedObj->GetJSObject());
  do { if ((__builtin_expect(!!(!(obj)), 0))) { do { } while(0); return false; } } while(0);

  nsIGlobalObject* global = xpc::NativeGlobal(obj);
  do { if ((__builtin_expect(!!(!(global)), 0))) { do { } while(0); return false; } } while(0);



  AutoEntryScript aes(global, "WebIDL dictionary creation");

  JS::Rooted<JS::Value> v(aes.cx(), JS::ObjectValue(*obj));
  return aDictionary.Init(aes.cx(), v);
}


template<class T, class S>
inline RefPtr<T>
StrongOrRawPtr(already_AddRefed<S>&& aPtr)
{
  return aPtr.template downcast<T>();
}

template<class T,
         class ReturnType=typename Conditional<IsRefcounted<T>::value, T*,
                                               nsAutoPtr<T>>::Type>
inline ReturnType
StrongOrRawPtr(T* aPtr)
{
  return ReturnType(aPtr);
}

template<class T, template<typename> class SmartPtr, class S>
inline void
StrongOrRawPtr(SmartPtr<S>&& aPtr) = delete;

template<class T>
struct StrongPtrForMember
{
  typedef typename Conditional<IsRefcounted<T>::value,
                               RefPtr<T>, nsAutoPtr<T>>::Type Type;
};

namespace binding_detail {
inline
JSObject*
GetHackedNamespaceProtoObject(JSContext* aCx)
{
  return JS_NewPlainObject(aCx);
}
}




bool SystemGlobalResolve(JSContext* cx, JS::Handle<JSObject*> obj,
                         JS::Handle<jsid> id, bool* resolvedp);




bool SystemGlobalEnumerate(JSContext* cx, JS::Handle<JSObject*> obj);
# 3177 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
bool ForEachHandler(JSContext* aCx, unsigned aArgc, JS::Value* aVp);






bool GetMaplikeBackingObject(JSContext* aCx, JS::Handle<JSObject*> aObj,
                             size_t aSlotIndex,
                             JS::MutableHandle<JSObject*> aBackingObj,
                             bool* aBackingObjCreated);
bool GetSetlikeBackingObject(JSContext* aCx, JS::Handle<JSObject*> aObj,
                             size_t aSlotIndex,
                             JS::MutableHandle<JSObject*> aBackingObj,
                             bool* aBackingObjCreated);



bool
GetDesiredProto(JSContext* aCx, const JS::CallArgs& aCallArgs,
                JS::MutableHandle<JSObject*> aDesiredProto);




already_AddRefed<nsGenericHTMLElement>
CreateHTMLElement(const GlobalObject& aGlobal, const JS::CallArgs& aCallArgs,
                  ErrorResult& aRv);

void
SetDocumentAndPageUseCounter(JSContext* aCx, JSObject* aObject,
                             UseCounter aUseCounter);


void
DeprecationWarning(JSContext* aCx, JSObject* aObject,
                   nsIDocument::DeprecatedOperations aOperation);

void
DeprecationWarning(const GlobalObject& aGlobal,
                   nsIDocument::DeprecatedOperations aOperation);


JSString*
InterfaceObjectToString(JSContext* aCx, JS::Handle<JSObject*> aObject,
                        unsigned );

namespace binding_detail {
# 3240 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BindingUtils.h"
JSObject* UnprivilegedJunkScopeOrWorkerGlobal();
}

}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ToJSValue.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/TypedArray.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/TypedArray.h"
namespace mozilla {
namespace dom {




struct TypedArrayObjectStorage : AllTypedArraysBase {
protected:
  JSObject* mTypedObj;
  JSObject* mWrappedObj;

  TypedArrayObjectStorage()
    : mTypedObj(nullptr),
      mWrappedObj(nullptr)
  {
  }

  TypedArrayObjectStorage(TypedArrayObjectStorage&& aOther)
    : mTypedObj(aOther.mTypedObj),
      mWrappedObj(aOther.mWrappedObj)
  {
    aOther.mTypedObj = nullptr;
    aOther.mWrappedObj = nullptr;
  }

public:
  inline void TraceSelf(JSTracer* trc)
  {
    JS::UnsafeTraceRoot(trc, &mTypedObj, "TypedArray.mTypedObj");
    JS::UnsafeTraceRoot(trc, &mTypedObj, "TypedArray.mWrappedObj");
  }

private:
  TypedArrayObjectStorage(const TypedArrayObjectStorage&) = delete;
};







template<typename T,
         JSObject* UnwrapArray(JSObject*),
         void GetLengthAndDataAndSharedness(JSObject*, uint32_t*, bool*, T**)>
struct TypedArray_base : public TypedArrayObjectStorage {
  typedef T element_type;

  TypedArray_base()
    : mData(nullptr),
      mLength(0),
      mShared(false),
      mComputed(false)
  {
  }

  TypedArray_base(TypedArray_base&& aOther)
    : TypedArrayObjectStorage(Move(aOther)),
      mData(aOther.mData),
      mLength(aOther.mLength),
      mShared(aOther.mShared),
      mComputed(aOther.mComputed)
  {
    aOther.mData = nullptr;
    aOther.mLength = 0;
    aOther.mShared = false;
    aOther.mComputed = false;
  }

private:
  mutable T* mData;
  mutable uint32_t mLength;
  mutable bool mShared;
  mutable bool mComputed;

public:
  inline bool Init(JSObject* obj)
  {
    do { } while (0);
    mTypedObj = mWrappedObj = UnwrapArray(obj);
    return inited();
  }

  inline bool inited() const {
    return !!mTypedObj;
  }
# 147 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/TypedArray.h"
  inline bool IsShared() const {
    do { } while (0);
    return mShared;
  }

  inline T *Data() const {
    do { } while (0);
    if (mShared)
      return nullptr;
    return mData;
  }

  inline T *DataAllowShared() const {
    do { } while (0);
    return mData;
  }

  inline uint32_t Length() const {
    do { } while (0);
    if (mShared)
      return 0;
    return mLength;
  }

  inline uint32_t LengthAllowShared() const {
    do { } while (0);
    return mLength;
  }

  inline JSObject *Obj() const {
    do { } while (0);
    return mWrappedObj;
  }

  inline bool WrapIntoNewCompartment(JSContext* cx)
  {
    return JS_WrapObject(cx,
      JS::MutableHandle<JSObject*>::fromMarkedLocation(&mWrappedObj));
  }

  inline void ComputeLengthAndData() const
  {
    do { } while (0);
    do { } while (0);
    GetLengthAndDataAndSharedness(mTypedObj, &mLength, &mShared, &mData);
    mComputed = true;
  }

private:
  TypedArray_base(const TypedArray_base&) = delete;
};

template<typename T,
         JSObject* UnwrapArray(JSObject*),
         T* GetData(JSObject*, bool* isShared, const JS::AutoCheckCannotGC&),
         void GetLengthAndDataAndSharedness(JSObject*, uint32_t*, bool*, T**),
         JSObject* CreateNew(JSContext*, uint32_t)>
struct TypedArray
  : public TypedArray_base<T, UnwrapArray, GetLengthAndDataAndSharedness>
{
private:
  typedef TypedArray_base<T, UnwrapArray, GetLengthAndDataAndSharedness> Base;

public:
  TypedArray()
    : Base()
  {}

  TypedArray(TypedArray&& aOther)
    : Base(Move(aOther))
  {
  }

  static inline JSObject*
  Create(JSContext* cx, nsWrapperCache* creator, uint32_t length,
         const T* data = nullptr) {
    JS::Rooted<JSObject*> creatorWrapper(cx);
    Maybe<JSAutoCompartment> ac;
    if (creator && (creatorWrapper = creator->GetWrapperPreserveColor())) {
      ac.emplace(cx, creatorWrapper);
    }

    return CreateCommon(cx, length, data);
  }

  static inline JSObject*
  Create(JSContext* cx, uint32_t length, const T* data = nullptr) {
    return CreateCommon(cx, length, data);
  }

private:
  static inline JSObject*
  CreateCommon(JSContext* cx, uint32_t length, const T* data) {
    JSObject* obj = CreateNew(cx, length);
    if (!obj) {
      return nullptr;
    }
    if (data) {
      JS::AutoCheckCannotGC nogc;
      bool isShared;
      T* buf = static_cast<T*>(GetData(obj, &isShared, nogc));


      do { } while (0);
      memcpy(buf, data, length*sizeof(T));
    }
    return obj;
  }

  TypedArray(const TypedArray&) = delete;
};

template<JSObject* UnwrapArray(JSObject*),
         void GetLengthAndDataAndSharedness(JSObject*, uint32_t*, bool*,
                                            uint8_t**),
         js::Scalar::Type GetViewType(JSObject*)>
struct ArrayBufferView_base
  : public TypedArray_base<uint8_t, UnwrapArray, GetLengthAndDataAndSharedness>
{
private:
  typedef TypedArray_base<uint8_t, UnwrapArray, GetLengthAndDataAndSharedness>
          Base;

public:
  ArrayBufferView_base()
    : Base()
  {
  }

  ArrayBufferView_base(ArrayBufferView_base&& aOther)
    : Base(Move(aOther)),
      mType(aOther.mType)
  {
    aOther.mType = js::Scalar::MaxTypedArrayViewType;
  }

private:
  js::Scalar::Type mType;

public:
  inline bool Init(JSObject* obj)
  {
    if (!Base::Init(obj)) {
      return false;
    }

    mType = GetViewType(this->Obj());
    return true;
  }

  inline js::Scalar::Type Type() const
  {
    do { } while (0);
    return mType;
  }
};

typedef TypedArray<int8_t, js::UnwrapInt8Array, JS_GetInt8ArrayData,
                   js::GetInt8ArrayLengthAndData, JS_NewInt8Array>
        Int8Array;
typedef TypedArray<uint8_t, js::UnwrapUint8Array, JS_GetUint8ArrayData,
                   js::GetUint8ArrayLengthAndData, JS_NewUint8Array>
        Uint8Array;
typedef TypedArray<uint8_t, js::UnwrapUint8ClampedArray, JS_GetUint8ClampedArrayData,
                   js::GetUint8ClampedArrayLengthAndData, JS_NewUint8ClampedArray>
        Uint8ClampedArray;
typedef TypedArray<int16_t, js::UnwrapInt16Array, JS_GetInt16ArrayData,
                   js::GetInt16ArrayLengthAndData, JS_NewInt16Array>
        Int16Array;
typedef TypedArray<uint16_t, js::UnwrapUint16Array, JS_GetUint16ArrayData,
                   js::GetUint16ArrayLengthAndData, JS_NewUint16Array>
        Uint16Array;
typedef TypedArray<int32_t, js::UnwrapInt32Array, JS_GetInt32ArrayData,
                   js::GetInt32ArrayLengthAndData, JS_NewInt32Array>
        Int32Array;
typedef TypedArray<uint32_t, js::UnwrapUint32Array, JS_GetUint32ArrayData,
                   js::GetUint32ArrayLengthAndData, JS_NewUint32Array>
        Uint32Array;
typedef TypedArray<float, js::UnwrapFloat32Array, JS_GetFloat32ArrayData,
                   js::GetFloat32ArrayLengthAndData, JS_NewFloat32Array>
        Float32Array;
typedef TypedArray<double, js::UnwrapFloat64Array, JS_GetFloat64ArrayData,
                   js::GetFloat64ArrayLengthAndData, JS_NewFloat64Array>
        Float64Array;
typedef ArrayBufferView_base<js::UnwrapArrayBufferView,
                             js::GetArrayBufferViewLengthAndData,
                             JS_GetArrayBufferViewType>
        ArrayBufferView;
typedef TypedArray<uint8_t, js::UnwrapArrayBuffer, JS_GetArrayBufferData,
                   js::GetArrayBufferLengthAndData, JS_NewArrayBuffer>
        ArrayBuffer;

typedef TypedArray<uint8_t, js::UnwrapSharedArrayBuffer, JS_GetSharedArrayBufferData,
                   js::GetSharedArrayBufferLengthAndData, JS_NewSharedArrayBuffer>
        SharedArrayBuffer;





template<typename TypedArrayType>
class TypedArrayCreator
{
  typedef nsTArray<typename TypedArrayType::element_type> ArrayType;

  public:
    explicit TypedArrayCreator(const ArrayType& aArray)
      : mArray(aArray)
    {}

    JSObject* Create(JSContext* aCx) const
    {
      return TypedArrayType::Create(aCx, mArray.Length(), mArray.Elements());
    }

  private:
    const ArrayType& mArray;
};


template<typename ArrayType>
class TypedArrayRooter : private JS::CustomAutoRooter
{
public:
  template <typename CX>
  TypedArrayRooter(const CX& cx,
                   ArrayType* aArray ) :
    JS::CustomAutoRooter(cx ),
    mArray(aArray)
  {
  }

  virtual void trace(JSTracer* trc) override
  {
    mArray->TraceSelf(trc);
  }

private:
  TypedArrayObjectStorage* const mArray;
};


template<typename Inner> struct Nullable;
template<typename ArrayType>
class TypedArrayRooter<Nullable<ArrayType> > :
    private JS::CustomAutoRooter
{
public:
  template <typename CX>
  TypedArrayRooter(const CX& cx,
                   Nullable<ArrayType>* aArray ) :
    JS::CustomAutoRooter(cx ),
    mArray(aArray)
  {
  }

  virtual void trace(JSTracer* trc) override
  {
    if (!mArray->IsNull()) {
      mArray->Value().TraceSelf(trc);
    }
  }

private:
  Nullable<ArrayType>* const mArray;
};


template<typename ArrayType>
class RootedTypedArray final : public ArrayType,
                                        private TypedArrayRooter<ArrayType>
{
public:
  template <typename CX>
  explicit RootedTypedArray(const CX& cx ) :
    ArrayType(),
    TypedArrayRooter<ArrayType>(cx, this
                                                                         )
  {
  }

  template <typename CX>
  RootedTypedArray(const CX& cx, JSObject* obj ) :
    ArrayType(obj),
    TypedArrayRooter<ArrayType>(cx, this
                                                                         )
  {
  }
};

}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ToJSValue.h" 2





namespace mozilla {
namespace dom {

class Promise;





__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          const nsAString& aArgument,
          JS::MutableHandle<JS::Value> aValue);






template<typename T>
__attribute__ ((warn_unused_result))
typename EnableIf<IsSame<T, bool>::value, bool>::Type
ToJSValue(JSContext* aCx,
          T aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setBoolean(aArgument);
  return true;
}


inline bool
ToJSValue(JSContext* aCx,
          int32_t aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setInt32(aArgument);
  return true;
}

inline bool
ToJSValue(JSContext* aCx,
          uint32_t aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setNumber(aArgument);
  return true;
}

inline bool
ToJSValue(JSContext* aCx,
          int64_t aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setNumber(double(aArgument));
  return true;
}

inline bool
ToJSValue(JSContext* aCx,
          uint64_t aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setNumber(double(aArgument));
  return true;
}


inline bool
ToJSValue(JSContext* aCx,
          float aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setNumber(aArgument);
  return true;
}

inline bool
ToJSValue(JSContext* aCx,
          double aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setNumber(aArgument);
  return true;
}


__attribute__ ((warn_unused_result)) inline bool
ToJSValue(JSContext* aCx,
          CallbackObject& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  aValue.setObjectOrNull(aArgument.CallbackOrNull());

  return MaybeWrapValue(aCx, aValue);
}



template <class T>
__attribute__ ((warn_unused_result))
typename EnableIf<IsBaseOf<nsWrapperCache, T>::value, bool>::Type
ToJSValue(JSContext* aCx,
          T& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  do { } while (0);

  return GetOrCreateDOMReflector(aCx, aArgument, aValue);
}


template<typename T>
__attribute__ ((warn_unused_result))
typename EnableIf<IsBaseOf<AllTypedArraysBase, T>::value, bool>::Type
ToJSValue(JSContext* aCx,
          const TypedArrayCreator<T>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  JSObject* obj = aArgument.Create(aCx);
  if (!obj) {
    return false;
  }
  aValue.setObject(*obj);
  return true;
}



template <class T>
__attribute__ ((warn_unused_result))
typename EnableIf<!IsBaseOf<nsWrapperCache, T>::value &&
                  !IsBaseOf<CallbackObject, T>::value &&
                  IsBaseOf<nsISupports, T>::value, bool>::Type
ToJSValue(JSContext* aCx,
          T& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  qsObjectHelper helper(ToSupports(&aArgument), nullptr);
  JS::Rooted<JSObject*> scope(aCx, JS::CurrentGlobalOrNull(aCx));
  return XPCOMObjectToJsval(aCx, scope, helper, nullptr, true, aValue);
}


template <typename T>
__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          const nsCOMPtr<T>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  return ToJSValue(aCx, *aArgument.get(), aValue);
}

template <typename T>
__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          const RefPtr<T>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  return ToJSValue(aCx, *aArgument.get(), aValue);
}

template <typename T>
__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          const NonNull<T>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  return ToJSValue(aCx, *aArgument.get(), aValue);
}


template <class T>
__attribute__ ((warn_unused_result))
typename EnableIf<IsBaseOf<DictionaryBase, T>::value, bool>::Type
ToJSValue(JSContext* aCx,
          const T& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  return aArgument.ToObjectInternal(aCx, aValue);
}


__attribute__ ((warn_unused_result)) inline bool
ToJSValue(JSContext* aCx, JS::Handle<JS::Value> aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  aValue.set(aArgument);
  return MaybeWrapValue(aCx, aValue);
}


__attribute__ ((warn_unused_result)) inline bool
ToJSValue(JSContext* aCx, const JS::Heap<JS::Value>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  aValue.set(aArgument);
  return MaybeWrapValue(aCx, aValue);
}


__attribute__ ((warn_unused_result)) inline bool
ToJSValue(JSContext* aCx, const JS::Rooted<JS::Value>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  aValue.set(aArgument);
  return MaybeWrapValue(aCx, aValue);
}



__attribute__ ((warn_unused_result)) inline bool
ToJSValue(JSContext* aCx, const JS::Rooted<JSObject*>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  aValue.setObjectOrNull(aArgument);
  return MaybeWrapObjectOrNullValue(aCx, aValue);
}



__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          nsresult aArgument,
          JS::MutableHandle<JS::Value> aValue);




__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          ErrorResult& aArgument,
          JS::MutableHandle<JS::Value> aValue);


template <typename T>
__attribute__ ((warn_unused_result))
typename EnableIf<IsBaseOf<AllOwningUnionBase, T>::value, bool>::Type
ToJSValue(JSContext* aCx,
          const T& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx));
  return aArgument.ToJSVal(aCx, global, aValue);
}


template <typename T>
__attribute__ ((warn_unused_result))
typename EnableIf<IsPointer<T>::value, bool>::Type
ToJSValue(JSContext* aCx,
          T aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  return ToJSValue(aCx, *aArgument, aValue);
}


__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          Promise& aArgument,
          JS::MutableHandle<JS::Value> aValue);


template <typename T>
__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          T* aArguments,
          size_t aLength,
          JS::MutableHandle<JS::Value> aValue)
{

  do { } while (0);

  JS::AutoValueVector v(aCx);
  if (!v.resize(aLength)) {
    return false;
  }
  for (size_t i = 0; i < aLength; ++i) {
    if (!ToJSValue(aCx, aArguments[i], v[i])) {
      return false;
    }
  }
  JSObject* arrayObj = JS_NewArrayObject(aCx, v);
  if (!arrayObj) {
    return false;
  }
  aValue.setObject(*arrayObj);
  return true;
}

template <typename T>
__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          const nsTArray<T>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  return ToJSValue(aCx, aArgument.Elements(),
                   aArgument.Length(), aValue);
}

template <typename T>
__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          const FallibleTArray<T>& aArgument,
          JS::MutableHandle<JS::Value> aValue)
{
  return ToJSValue(aCx, aArgument.Elements(),
                   aArgument.Length(), aValue);
}

template <typename T, int N>
__attribute__ ((warn_unused_result)) bool
ToJSValue(JSContext* aCx,
          const T(&aArgument)[N],
          JS::MutableHandle<JS::Value> aValue)
{
  return ToJSValue(aCx, aArgument, N, aValue);
}

}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/EventHandlerBinding.h" 2


namespace mozilla {
namespace dom {

class Event;
class EventHandlerNonNull;
class EventOrString;
struct NativePropertyHooks;
class OnBeforeUnloadEventHandlerNonNull;
class OnErrorEventHandlerNonNull;
class OwningEventOrString;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningEventOrString& aUnion, const char* aName, uint32_t aFlags = 0);


void
ImplCycleCollectionUnlink(OwningEventOrString& aUnion);


class EventOrString
{
  friend class EventOrStringArgument;
  enum Type
  {
    eUninitialized,
    eEvent,
    eString
  };

  union Value
  {
    UnionMember<NonNull<mozilla::dom::Event> > mEvent;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  EventOrString(const EventOrString&) = delete;
  EventOrString& operator=(const EventOrString&) = delete;
public:
  explicit inline EventOrString()
    : mType(eUninitialized)
  {
  }

  inline ~EventOrString()
  {
    Uninit();
  }

  inline NonNull<mozilla::dom::Event>&
  RawSetAsEvent()
  {
    if (mType == eEvent) {
      return mValue.mEvent.Value();
    }
    do { } while (0);
    mType = eEvent;
    return mValue.mEvent.SetValue();
  }

  inline NonNull<mozilla::dom::Event>&
  SetAsEvent()
  {
    if (mType == eEvent) {
      return mValue.mEvent.Value();
    }
    Uninit();
    mType = eEvent;
    return mValue.mEvent.SetValue();
  }

  inline bool
  IsEvent() const
  {
    return mType == eEvent;
  }

  inline NonNull<mozilla::dom::Event>&
  GetAsEvent()
  {
    do { } while (0);
    return mValue.mEvent.Value();
  }

  inline mozilla::dom::Event&
  GetAsEvent() const
  {
    do { } while (0);
    return mValue.mEvent.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eEvent: {
        DestroyEvent();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyEvent()
  {
    do { } while (0);
    mValue.mEvent.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};


class OwningEventOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningEventOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eEvent,
    eString
  };

  union Value
  {
    UnionMember<OwningNonNull<mozilla::dom::Event> > mEvent;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningEventOrString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningEventOrString(const OwningEventOrString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningEventOrString()
  {
    Uninit();
  }

  OwningNonNull<mozilla::dom::Event>&
  RawSetAsEvent();

  OwningNonNull<mozilla::dom::Event>&
  SetAsEvent();

  bool
  TrySetToEvent(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsEvent() const
  {
    return mType == eEvent;
  }

  inline OwningNonNull<mozilla::dom::Event>&
  GetAsEvent()
  {
    do { } while (0);
    return mValue.mEvent.Value();
  }

  inline OwningNonNull<mozilla::dom::Event> const &
  GetAsEvent() const
  {
    do { } while (0);
    return mValue.mEvent.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningEventOrString&
  operator=(const OwningEventOrString& aOther);

private:
  void
  DestroyEvent();

  void
  DestroyString();
};


class EventHandlerNonNull : public CallbackFunction
{
public:
  explicit inline EventHandlerNonNull(JSContext* aCx, JS::Handle<JSObject*> aCallback, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCx, aCallback, aIncumbentGlobal)
  {
  }

  explicit inline EventHandlerNonNull(JS::Handle<JSObject*> aCallback, const FastCallbackConstructor& )
    : CallbackFunction(aCallback, FastCallbackConstructor())
  {
  }

  explicit inline EventHandlerNonNull(JS::Handle<JSObject*> aCallback, JS::Handle<JSObject*> aAsyncStack, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCallback, aAsyncStack, aIncumbentGlobal)
  {
  }

  explicit inline EventHandlerNonNull(CallbackFunction* aOther)
    : CallbackFunction(aOther)
  {
  }

  template <typename T>
  inline void
  Call(const T& thisVal, Event& event, JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "EventHandlerNonNull";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    JS::Rooted<JS::Value> thisValJS(s.GetContext());
    if (!ToJSValue(s.GetContext(), thisVal, &thisValJS)) {
      aRv.Throw(NS_ERROR_FAILURE);
      return;
    }
    return Call(s.GetContext(), thisValJS, event, aRetVal, aRv);
  }

  inline void
  Call(Event& event, JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "EventHandlerNonNull";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    return Call(s.GetContext(), JS::UndefinedHandleValue, event, aRetVal, aRv);
  }

  template <typename T>
  inline void
  Call(const T& thisVal, Event& event, JS::MutableHandle<JS::Value> aRetVal, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(thisVal, event, aRetVal, rv, aExecutionReason);
  }

  inline void
  Call(Event& event, JS::MutableHandle<JS::Value> aRetVal, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(event, aRetVal, rv, aExecutionReason, eReportExceptions, nullptr);
  }

  inline bool
  operator==(const EventHandlerNonNull& aOther) const
  {
    return CallbackFunction::operator==(aOther);
  }

private:
  void Call(JSContext* cx, JS::Handle<JS::Value> aThisVal, Event& event, JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv);
};


class OnBeforeUnloadEventHandlerNonNull : public CallbackFunction
{
public:
  explicit inline OnBeforeUnloadEventHandlerNonNull(JSContext* aCx, JS::Handle<JSObject*> aCallback, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCx, aCallback, aIncumbentGlobal)
  {
  }

  explicit inline OnBeforeUnloadEventHandlerNonNull(JS::Handle<JSObject*> aCallback, const FastCallbackConstructor& )
    : CallbackFunction(aCallback, FastCallbackConstructor())
  {
  }

  explicit inline OnBeforeUnloadEventHandlerNonNull(JS::Handle<JSObject*> aCallback, JS::Handle<JSObject*> aAsyncStack, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCallback, aAsyncStack, aIncumbentGlobal)
  {
  }

  explicit inline OnBeforeUnloadEventHandlerNonNull(CallbackFunction* aOther)
    : CallbackFunction(aOther)
  {
  }

  template <typename T>
  inline void
  Call(const T& thisVal, Event& event, nsString& aRetVal, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "OnBeforeUnloadEventHandlerNonNull";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    JS::Rooted<JS::Value> thisValJS(s.GetContext());
    if (!ToJSValue(s.GetContext(), thisVal, &thisValJS)) {
      aRv.Throw(NS_ERROR_FAILURE);
      return;
    }
    return Call(s.GetContext(), thisValJS, event, aRetVal, aRv);
  }

  inline void
  Call(Event& event, nsString& aRetVal, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "OnBeforeUnloadEventHandlerNonNull";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    return Call(s.GetContext(), JS::UndefinedHandleValue, event, aRetVal, aRv);
  }

  template <typename T>
  inline void
  Call(const T& thisVal, Event& event, nsString& aRetVal, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(thisVal, event, aRetVal, rv, aExecutionReason);
  }

  inline void
  Call(Event& event, nsString& aRetVal, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(event, aRetVal, rv, aExecutionReason, eReportExceptions, nullptr);
  }

  inline bool
  operator==(const OnBeforeUnloadEventHandlerNonNull& aOther) const
  {
    return CallbackFunction::operator==(aOther);
  }

private:
  void Call(JSContext* cx, JS::Handle<JS::Value> aThisVal, Event& event, nsString& aRetVal, ErrorResult& aRv);
};


class OnErrorEventHandlerNonNull : public CallbackFunction
{
public:
  explicit inline OnErrorEventHandlerNonNull(JSContext* aCx, JS::Handle<JSObject*> aCallback, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCx, aCallback, aIncumbentGlobal)
  {
  }

  explicit inline OnErrorEventHandlerNonNull(JS::Handle<JSObject*> aCallback, const FastCallbackConstructor& )
    : CallbackFunction(aCallback, FastCallbackConstructor())
  {
  }

  explicit inline OnErrorEventHandlerNonNull(JS::Handle<JSObject*> aCallback, JS::Handle<JSObject*> aAsyncStack, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCallback, aAsyncStack, aIncumbentGlobal)
  {
  }

  explicit inline OnErrorEventHandlerNonNull(CallbackFunction* aOther)
    : CallbackFunction(aOther)
  {
  }

  template <typename T>
  inline void
  Call(const T& thisVal, const EventOrString& event, const Optional<nsAString>& source, const Optional<uint32_t>& lineno, const Optional<uint32_t>& column, const Optional<JS::Handle<JS::Value>>& error, JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "OnErrorEventHandlerNonNull";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    JS::Rooted<JS::Value> thisValJS(s.GetContext());
    if (!ToJSValue(s.GetContext(), thisVal, &thisValJS)) {
      aRv.Throw(NS_ERROR_FAILURE);
      return;
    }
    return Call(s.GetContext(), thisValJS, event, source, lineno, column, error, aRetVal, aRv);
  }

  inline void
  Call(const EventOrString& event, const Optional<nsAString>& source, const Optional<uint32_t>& lineno, const Optional<uint32_t>& column, const Optional<JS::Handle<JS::Value>>& error, JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "OnErrorEventHandlerNonNull";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    return Call(s.GetContext(), JS::UndefinedHandleValue, event, source, lineno, column, error, aRetVal, aRv);
  }

  template <typename T>
  inline void
  Call(const T& thisVal, const EventOrString& event, const Optional<nsAString>& source, const Optional<uint32_t>& lineno, const Optional<uint32_t>& column, const Optional<JS::Handle<JS::Value>>& error, JS::MutableHandle<JS::Value> aRetVal, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(thisVal, event, source, lineno, column, error, aRetVal, rv, aExecutionReason);
  }

  inline void
  Call(const EventOrString& event, const Optional<nsAString>& source, const Optional<uint32_t>& lineno, const Optional<uint32_t>& column, const Optional<JS::Handle<JS::Value>>& error, JS::MutableHandle<JS::Value> aRetVal, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(event, source, lineno, column, error, aRetVal, rv, aExecutionReason, eReportExceptions, nullptr);
  }

  inline bool
  operator==(const OnErrorEventHandlerNonNull& aOther) const
  {
    return CallbackFunction::operator==(aOther);
  }

private:
  void Call(JSContext* cx, JS::Handle<JS::Value> aThisVal, const EventOrString& event, const Optional<nsAString>& source, const Optional<uint32_t>& lineno, const Optional<uint32_t>& column, const Optional<JS::Handle<JS::Value>>& error, JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv);
};


namespace binding_detail {
class FastEventHandlerNonNull : public EventHandlerNonNull
{
public:
  explicit inline FastEventHandlerNonNull(JS::Handle<JSObject*> aCallback)
    : EventHandlerNonNull(aCallback, FastCallbackConstructor())
  {
  }

  inline void
  Trace(JSTracer* aTracer)
  {
    EventHandlerNonNull::Trace(aTracer);
  }

  inline void
  FinishSlowJSInitIfMoreThanOneOwner(JSContext* aCx)
  {
    EventHandlerNonNull::FinishSlowJSInitIfMoreThanOneOwner(aCx);
  }
};
}


namespace binding_detail {
class FastOnBeforeUnloadEventHandlerNonNull : public OnBeforeUnloadEventHandlerNonNull
{
public:
  explicit inline FastOnBeforeUnloadEventHandlerNonNull(JS::Handle<JSObject*> aCallback)
    : OnBeforeUnloadEventHandlerNonNull(aCallback, FastCallbackConstructor())
  {
  }

  inline void
  Trace(JSTracer* aTracer)
  {
    OnBeforeUnloadEventHandlerNonNull::Trace(aTracer);
  }

  inline void
  FinishSlowJSInitIfMoreThanOneOwner(JSContext* aCx)
  {
    OnBeforeUnloadEventHandlerNonNull::FinishSlowJSInitIfMoreThanOneOwner(aCx);
  }
};
}


namespace binding_detail {
class FastOnErrorEventHandlerNonNull : public OnErrorEventHandlerNonNull
{
public:
  explicit inline FastOnErrorEventHandlerNonNull(JS::Handle<JSObject*> aCallback)
    : OnErrorEventHandlerNonNull(aCallback, FastCallbackConstructor())
  {
  }

  inline void
  Trace(JSTracer* aTracer)
  {
    OnErrorEventHandlerNonNull::Trace(aTracer);
  }

  inline void
  FinishSlowJSInitIfMoreThanOneOwner(JSContext* aCx)
  {
    OnErrorEventHandlerNonNull::FinishSlowJSInitIfMoreThanOneOwner(aCx);
  }
};
}


}
}
# 8 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionTypes.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ImageData.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ImageData.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCanvasRenderingContext2D.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCanvasRenderingContext2D.h"
class nsIDOMCanvasRenderingContext2D : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    DRAWWINDOW_DRAW_CARET = 1U,
    DRAWWINDOW_DO_NOT_FLUSH = 2U,
    DRAWWINDOW_DRAW_VIEW = 4U,
    DRAWWINDOW_USE_WIDGET_LAYERS = 8U,
    DRAWWINDOW_ASYNC_DECODE_IMAGES = 16U
  };

};

  template<typename T> struct nsIDOMCanvasRenderingContext2D::COMTypeInfo<nsIDOMCanvasRenderingContext2D, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMCanvasRenderingContext2D::COMTypeInfo<nsIDOMCanvasRenderingContext2D, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x4417cab7, 0xc7eb, 0x4e0c, { 0xb0, 0x0a, 0xc4, 0x38, 0x42, 0xf0, 0xcb, 0xa8 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ImageData.h" 2
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ImageData.h"
namespace mozilla {
namespace dom {

class ImageData final : public nsISupports
{
  ~ImageData()
  {
    DropData();
  }

public:
  ImageData(uint32_t aWidth, uint32_t aHeight, JSObject& aData)
    : mWidth(aWidth)
    , mHeight(aHeight)
    , mData(&aData)
  {
    HoldData();
  }

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "ImageData"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<ImageData>(p)->DeleteCycleCollectable(); } static ImageData* Downcast(nsISupports* s) { return static_cast<ImageData*>(static_cast<ImageData*>(s)); } static nsISupports* Upcast(ImageData *p) { return static_cast<nsISupports*>(static_cast<ImageData*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &ImageData::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

  static already_AddRefed<ImageData>
    Constructor(const GlobalObject& aGlobal,
                const uint32_t aWidth,
                const uint32_t aHeight,
                ErrorResult& aRv);

  static already_AddRefed<ImageData>
    Constructor(const GlobalObject& aGlobal,
                const Uint8ClampedArray& aData,
                const uint32_t aWidth,
                const Optional<uint32_t>& aHeight,
                ErrorResult& aRv);

  uint32_t Width() const
  {
    return mWidth;
  }
  uint32_t Height() const
  {
    return mHeight;
  }
  void GetData(JSContext* cx, JS::MutableHandle<JSObject*> aData) const
  {
    aData.set(GetDataObject());
  }
  JSObject* GetDataObject() const
  {
    return mData;
  }

  bool WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

private:
  void HoldData();
  void DropData();

  ImageData() = delete;

  uint32_t mWidth, mHeight;
  JS::Heap<JSObject*> mData;
};

}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionTypes.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Record.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Record.h"
namespace mozilla {
namespace dom {

namespace binding_detail {
template<typename KeyType, typename ValueType>
class RecordEntry
{
public:
  RecordEntry()
  {
  }


  RecordEntry(RecordEntry<KeyType, ValueType>&& aOther)
    : mKey(Move(aOther.mKey)),
      mValue(Move(aOther.mValue))
  {
  }

  KeyType mKey;
  ValueType mValue;
};

}

template<typename KeyType, typename ValueType>
class Record
{
public:
  typedef typename binding_detail::RecordEntry<KeyType, ValueType> EntryType;
  typedef Record<KeyType, ValueType> SelfType;

  Record()
  {
  }


  Record(SelfType&& aOther) :
    mEntries(Move(aOther.mEntries))
  {
  }

  const nsTArray<EntryType>& Entries() const
  {
    return mEntries;
  }

  nsTArray<EntryType>& Entries()
  {
    return mEntries;
  }

private:
  nsTArray<EntryType> mEntries;
};

}
}

template<typename K, typename V>
class nsDefaultComparator<mozilla::dom::binding_detail::RecordEntry<K, V>, K>
{
public:
  bool Equals(const mozilla::dom::binding_detail::RecordEntry<K, V>& aEntry,
              const K& aKey) const
  {
    return aEntry.mKey == aKey;
  }
};
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/UnionTypes.h" 2




class nsGenericHTMLElement;
class nsINode;

namespace mozilla {
namespace dom {

class CanvasGradient;
class CanvasPattern;
class Directory;
class File;
class HTMLOptGroupElement;
class HTMLOptionElement;
class OwningCanvasPatternOrCanvasGradient;
class OwningCanvasPatternOrNullOrCanvasGradient;
class OwningEventHandlerNonNullOrNullOrLong;
class OwningFileOrDirectory;
class OwningHTMLElementOrLong;
class OwningHTMLOptionElementOrHTMLOptGroupElement;
class OwningImageDataOrNullSequenceOrLong;
class OwningImageDataOrNullSequenceSequenceOrLong;
class OwningImageDataSequenceOrLong;
class OwningImageDataSequenceSequenceOrLong;
class OwningNodeOrLongOrBoolean;
class OwningNodeOrString;

}
}

namespace mozilla {
namespace dom {
void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningCanvasPatternOrCanvasGradient& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningCanvasPatternOrNullOrCanvasGradient& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningEventHandlerNonNullOrNullOrLong& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningFileOrDirectory& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningHTMLElementOrLong& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningHTMLOptionElementOrHTMLOptGroupElement& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningImageDataOrNullSequenceOrLong& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningImageDataOrNullSequenceSequenceOrLong& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningImageDataSequenceOrLong& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningImageDataSequenceSequenceOrLong& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningNodeOrLongOrBoolean& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningNodeOrString& aUnion, const char* aName, uint32_t aFlags = 0);

void
ImplCycleCollectionUnlink(OwningCanvasPatternOrCanvasGradient& aUnion);

void
ImplCycleCollectionUnlink(OwningCanvasPatternOrNullOrCanvasGradient& aUnion);

void
ImplCycleCollectionUnlink(OwningEventHandlerNonNullOrNullOrLong& aUnion);

void
ImplCycleCollectionUnlink(OwningFileOrDirectory& aUnion);

void
ImplCycleCollectionUnlink(OwningHTMLElementOrLong& aUnion);

void
ImplCycleCollectionUnlink(OwningHTMLOptionElementOrHTMLOptGroupElement& aUnion);

void
ImplCycleCollectionUnlink(OwningImageDataOrNullSequenceOrLong& aUnion);

void
ImplCycleCollectionUnlink(OwningImageDataOrNullSequenceSequenceOrLong& aUnion);

void
ImplCycleCollectionUnlink(OwningImageDataSequenceOrLong& aUnion);

void
ImplCycleCollectionUnlink(OwningImageDataSequenceSequenceOrLong& aUnion);

void
ImplCycleCollectionUnlink(OwningNodeOrLongOrBoolean& aUnion);

void
ImplCycleCollectionUnlink(OwningNodeOrString& aUnion);

class ArrayBufferOrLong
{
  friend class ArrayBufferOrLongArgument;
  enum Type
  {
    eUninitialized,
    eArrayBuffer,
    eLong
  };

  union Value
  {
    UnionMember<RootedTypedArray<ArrayBuffer> > mArrayBuffer;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ArrayBufferOrLong(const ArrayBufferOrLong&) = delete;
  ArrayBufferOrLong& operator=(const ArrayBufferOrLong&) = delete;
public:
  explicit inline ArrayBufferOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ArrayBufferOrLong()
  {
    Uninit();
  }

  inline RootedTypedArray<ArrayBuffer>&
  RawSetAsArrayBuffer(JSContext* cx)
  {
    if (mType == eArrayBuffer) {
      return mValue.mArrayBuffer.Value();
    }
    do { } while (0);
    mType = eArrayBuffer;
    return mValue.mArrayBuffer.SetValue(cx);
  }

  inline RootedTypedArray<ArrayBuffer>&
  SetAsArrayBuffer(JSContext* cx)
  {
    if (mType == eArrayBuffer) {
      return mValue.mArrayBuffer.Value();
    }
    Uninit();
    mType = eArrayBuffer;
    return mValue.mArrayBuffer.SetValue(cx);
  }

  inline bool
  IsArrayBuffer() const
  {
    return mType == eArrayBuffer;
  }

  inline RootedTypedArray<ArrayBuffer>&
  GetAsArrayBuffer()
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline ArrayBuffer const &
  GetAsArrayBuffer() const
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eArrayBuffer: {
        DestroyArrayBuffer();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyArrayBuffer()
  {
    do { } while (0);
    mValue.mArrayBuffer.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ArrayBufferViewOrArrayBuffer
{
  friend class ArrayBufferViewOrArrayBufferArgument;
  enum Type
  {
    eUninitialized,
    eArrayBufferView,
    eArrayBuffer
  };

  union Value
  {
    UnionMember<RootedTypedArray<ArrayBufferView> > mArrayBufferView;
    UnionMember<RootedTypedArray<ArrayBuffer> > mArrayBuffer;

  };

  Type mType;
  Value mValue;

  ArrayBufferViewOrArrayBuffer(const ArrayBufferViewOrArrayBuffer&) = delete;
  ArrayBufferViewOrArrayBuffer& operator=(const ArrayBufferViewOrArrayBuffer&) = delete;
public:
  explicit inline ArrayBufferViewOrArrayBuffer()
    : mType(eUninitialized)
  {
  }

  inline ~ArrayBufferViewOrArrayBuffer()
  {
    Uninit();
  }

  inline RootedTypedArray<ArrayBufferView>&
  RawSetAsArrayBufferView(JSContext* cx)
  {
    if (mType == eArrayBufferView) {
      return mValue.mArrayBufferView.Value();
    }
    do { } while (0);
    mType = eArrayBufferView;
    return mValue.mArrayBufferView.SetValue(cx);
  }

  inline RootedTypedArray<ArrayBufferView>&
  SetAsArrayBufferView(JSContext* cx)
  {
    if (mType == eArrayBufferView) {
      return mValue.mArrayBufferView.Value();
    }
    Uninit();
    mType = eArrayBufferView;
    return mValue.mArrayBufferView.SetValue(cx);
  }

  inline bool
  IsArrayBufferView() const
  {
    return mType == eArrayBufferView;
  }

  inline RootedTypedArray<ArrayBufferView>&
  GetAsArrayBufferView()
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  inline ArrayBufferView const &
  GetAsArrayBufferView() const
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  inline RootedTypedArray<ArrayBuffer>&
  RawSetAsArrayBuffer(JSContext* cx)
  {
    if (mType == eArrayBuffer) {
      return mValue.mArrayBuffer.Value();
    }
    do { } while (0);
    mType = eArrayBuffer;
    return mValue.mArrayBuffer.SetValue(cx);
  }

  inline RootedTypedArray<ArrayBuffer>&
  SetAsArrayBuffer(JSContext* cx)
  {
    if (mType == eArrayBuffer) {
      return mValue.mArrayBuffer.Value();
    }
    Uninit();
    mType = eArrayBuffer;
    return mValue.mArrayBuffer.SetValue(cx);
  }

  inline bool
  IsArrayBuffer() const
  {
    return mType == eArrayBuffer;
  }

  inline RootedTypedArray<ArrayBuffer>&
  GetAsArrayBuffer()
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline ArrayBuffer const &
  GetAsArrayBuffer() const
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eArrayBufferView: {
        DestroyArrayBufferView();
        break;
      }
      case eArrayBuffer: {
        DestroyArrayBuffer();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyArrayBufferView()
  {
    do { } while (0);
    mValue.mArrayBufferView.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyArrayBuffer()
  {
    do { } while (0);
    mValue.mArrayBuffer.Destroy();
    mType = eUninitialized;
  }
};

class ByteStringOrLong
{
  friend class ByteStringOrLongArgument;
  enum Type
  {
    eUninitialized,
    eByteString,
    eLong
  };

  union Value
  {
    UnionMember<nsCString > mByteString;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ByteStringOrLong(const ByteStringOrLong&) = delete;
  ByteStringOrLong& operator=(const ByteStringOrLong&) = delete;
public:
  explicit inline ByteStringOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ByteStringOrLong()
  {
    Uninit();
  }

  inline nsCString&
  RawSetAsByteString()
  {
    if (mType == eByteString) {
      return mValue.mByteString.Value();
    }
    do { } while (0);
    mType = eByteString;
    return mValue.mByteString.SetValue();
  }

  inline nsCString&
  SetAsByteString()
  {
    if (mType == eByteString) {
      return mValue.mByteString.Value();
    }
    Uninit();
    mType = eByteString;
    return mValue.mByteString.SetValue();
  }

  inline bool
  IsByteString() const
  {
    return mType == eByteString;
  }

  inline nsCString&
  GetAsByteString()
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  inline const nsCString&
  GetAsByteString() const
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eByteString: {
        DestroyByteString();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyByteString()
  {
    do { } while (0);
    mValue.mByteString.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class CanvasPatternOrCanvasGradient
{
  friend class CanvasPatternOrCanvasGradientArgument;
  enum Type
  {
    eUninitialized,
    eCanvasPattern,
    eCanvasGradient
  };

  union Value
  {
    UnionMember<NonNull<mozilla::dom::CanvasPattern> > mCanvasPattern;
    UnionMember<NonNull<mozilla::dom::CanvasGradient> > mCanvasGradient;

  };

  Type mType;
  Value mValue;

  CanvasPatternOrCanvasGradient(const CanvasPatternOrCanvasGradient&) = delete;
  CanvasPatternOrCanvasGradient& operator=(const CanvasPatternOrCanvasGradient&) = delete;
public:
  explicit inline CanvasPatternOrCanvasGradient()
    : mType(eUninitialized)
  {
  }

  inline ~CanvasPatternOrCanvasGradient()
  {
    Uninit();
  }

  inline NonNull<mozilla::dom::CanvasPattern>&
  RawSetAsCanvasPattern()
  {
    if (mType == eCanvasPattern) {
      return mValue.mCanvasPattern.Value();
    }
    do { } while (0);
    mType = eCanvasPattern;
    return mValue.mCanvasPattern.SetValue();
  }

  inline NonNull<mozilla::dom::CanvasPattern>&
  SetAsCanvasPattern()
  {
    if (mType == eCanvasPattern) {
      return mValue.mCanvasPattern.Value();
    }
    Uninit();
    mType = eCanvasPattern;
    return mValue.mCanvasPattern.SetValue();
  }

  inline bool
  IsCanvasPattern() const
  {
    return mType == eCanvasPattern;
  }

  inline NonNull<mozilla::dom::CanvasPattern>&
  GetAsCanvasPattern()
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  inline mozilla::dom::CanvasPattern&
  GetAsCanvasPattern() const
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  inline NonNull<mozilla::dom::CanvasGradient>&
  RawSetAsCanvasGradient()
  {
    if (mType == eCanvasGradient) {
      return mValue.mCanvasGradient.Value();
    }
    do { } while (0);
    mType = eCanvasGradient;
    return mValue.mCanvasGradient.SetValue();
  }

  inline NonNull<mozilla::dom::CanvasGradient>&
  SetAsCanvasGradient()
  {
    if (mType == eCanvasGradient) {
      return mValue.mCanvasGradient.Value();
    }
    Uninit();
    mType = eCanvasGradient;
    return mValue.mCanvasGradient.SetValue();
  }

  inline bool
  IsCanvasGradient() const
  {
    return mType == eCanvasGradient;
  }

  inline NonNull<mozilla::dom::CanvasGradient>&
  GetAsCanvasGradient()
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  inline mozilla::dom::CanvasGradient&
  GetAsCanvasGradient() const
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eCanvasPattern: {
        DestroyCanvasPattern();
        break;
      }
      case eCanvasGradient: {
        DestroyCanvasGradient();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyCanvasPattern()
  {
    do { } while (0);
    mValue.mCanvasPattern.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyCanvasGradient()
  {
    do { } while (0);
    mValue.mCanvasGradient.Destroy();
    mType = eUninitialized;
  }
};

class CanvasPatternOrNullOrCanvasGradient
{
  friend class CanvasPatternOrNullOrCanvasGradientArgument;
  enum Type
  {
    eUninitialized,
    eNull,
    eCanvasPattern,
    eCanvasGradient
  };

  union Value
  {
    UnionMember<NonNull<mozilla::dom::CanvasPattern> > mCanvasPattern;
    UnionMember<NonNull<mozilla::dom::CanvasGradient> > mCanvasGradient;

  };

  Type mType;
  Value mValue;

  CanvasPatternOrNullOrCanvasGradient(const CanvasPatternOrNullOrCanvasGradient&) = delete;
  CanvasPatternOrNullOrCanvasGradient& operator=(const CanvasPatternOrNullOrCanvasGradient&) = delete;
public:
  explicit inline CanvasPatternOrNullOrCanvasGradient()
    : mType(eUninitialized)
  {
  }

  inline ~CanvasPatternOrNullOrCanvasGradient()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  inline NonNull<mozilla::dom::CanvasPattern>&
  RawSetAsCanvasPattern()
  {
    if (mType == eCanvasPattern) {
      return mValue.mCanvasPattern.Value();
    }
    do { } while (0);
    mType = eCanvasPattern;
    return mValue.mCanvasPattern.SetValue();
  }

  inline NonNull<mozilla::dom::CanvasPattern>&
  SetAsCanvasPattern()
  {
    if (mType == eCanvasPattern) {
      return mValue.mCanvasPattern.Value();
    }
    Uninit();
    mType = eCanvasPattern;
    return mValue.mCanvasPattern.SetValue();
  }

  inline bool
  IsCanvasPattern() const
  {
    return mType == eCanvasPattern;
  }

  inline NonNull<mozilla::dom::CanvasPattern>&
  GetAsCanvasPattern()
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  inline mozilla::dom::CanvasPattern&
  GetAsCanvasPattern() const
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  inline NonNull<mozilla::dom::CanvasGradient>&
  RawSetAsCanvasGradient()
  {
    if (mType == eCanvasGradient) {
      return mValue.mCanvasGradient.Value();
    }
    do { } while (0);
    mType = eCanvasGradient;
    return mValue.mCanvasGradient.SetValue();
  }

  inline NonNull<mozilla::dom::CanvasGradient>&
  SetAsCanvasGradient()
  {
    if (mType == eCanvasGradient) {
      return mValue.mCanvasGradient.Value();
    }
    Uninit();
    mType = eCanvasGradient;
    return mValue.mCanvasGradient.SetValue();
  }

  inline bool
  IsCanvasGradient() const
  {
    return mType == eCanvasGradient;
  }

  inline NonNull<mozilla::dom::CanvasGradient>&
  GetAsCanvasGradient()
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  inline mozilla::dom::CanvasGradient&
  GetAsCanvasGradient() const
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eNull: {
        break;
      }
      case eCanvasPattern: {
        DestroyCanvasPattern();
        break;
      }
      case eCanvasGradient: {
        DestroyCanvasGradient();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyCanvasPattern()
  {
    do { } while (0);
    mValue.mCanvasPattern.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyCanvasGradient()
  {
    do { } while (0);
    mValue.mCanvasGradient.Destroy();
    mType = eUninitialized;
  }
};

class CustomEventInitOrLong
{
  friend class CustomEventInitOrLongArgument;
  enum Type
  {
    eUninitialized,
    eCustomEventInit,
    eLong
  };

  union Value
  {
    UnionMember<RootedDictionary<binding_detail::FastCustomEventInit> > mCustomEventInit;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  CustomEventInitOrLong(const CustomEventInitOrLong&) = delete;
  CustomEventInitOrLong& operator=(const CustomEventInitOrLong&) = delete;
public:
  explicit inline CustomEventInitOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~CustomEventInitOrLong()
  {
    Uninit();
  }

  inline RootedDictionary<binding_detail::FastCustomEventInit>&
  RawSetAsCustomEventInit(JSContext* cx)
  {
    if (mType == eCustomEventInit) {
      return mValue.mCustomEventInit.Value();
    }
    do { } while (0);
    mType = eCustomEventInit;
    return mValue.mCustomEventInit.SetValue(cx);
  }

  inline RootedDictionary<binding_detail::FastCustomEventInit>&
  SetAsCustomEventInit(JSContext* cx)
  {
    if (mType == eCustomEventInit) {
      return mValue.mCustomEventInit.Value();
    }
    Uninit();
    mType = eCustomEventInit;
    return mValue.mCustomEventInit.SetValue(cx);
  }

  inline bool
  IsCustomEventInit() const
  {
    return mType == eCustomEventInit;
  }

  inline RootedDictionary<binding_detail::FastCustomEventInit>&
  GetAsCustomEventInit()
  {
    do { } while (0);
    return mValue.mCustomEventInit.Value();
  }

  inline const CustomEventInit&
  GetAsCustomEventInit() const
  {
    do { } while (0);
    return mValue.mCustomEventInit.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eCustomEventInit: {
        DestroyCustomEventInit();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyCustomEventInit()
  {
    do { } while (0);
    mValue.mCustomEventInit.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class DoubleOrByteString
{
  friend class DoubleOrByteStringArgument;
  enum Type
  {
    eUninitialized,
    eDouble,
    eByteString
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<nsCString > mByteString;

  };

  Type mType;
  Value mValue;

  DoubleOrByteString(const DoubleOrByteString&) = delete;
  DoubleOrByteString& operator=(const DoubleOrByteString&) = delete;
public:
  explicit inline DoubleOrByteString()
    : mType(eUninitialized)
  {
  }

  inline ~DoubleOrByteString()
  {
    Uninit();
  }

  inline double&
  RawSetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    do { } while (0);
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline double&
  SetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    Uninit();
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline nsCString&
  RawSetAsByteString()
  {
    if (mType == eByteString) {
      return mValue.mByteString.Value();
    }
    do { } while (0);
    mType = eByteString;
    return mValue.mByteString.SetValue();
  }

  inline nsCString&
  SetAsByteString()
  {
    if (mType == eByteString) {
      return mValue.mByteString.Value();
    }
    Uninit();
    mType = eByteString;
    return mValue.mByteString.SetValue();
  }

  inline bool
  IsByteString() const
  {
    return mType == eByteString;
  }

  inline nsCString&
  GetAsByteString()
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  inline const nsCString&
  GetAsByteString() const
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eDouble: {
        DestroyDouble();
        break;
      }
      case eByteString: {
        DestroyByteString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyDouble()
  {
    do { } while (0);
    mValue.mDouble.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyByteString()
  {
    do { } while (0);
    mValue.mByteString.Destroy();
    mType = eUninitialized;
  }
};

class DoubleOrString
{
  friend class DoubleOrStringArgument;
  enum Type
  {
    eUninitialized,
    eDouble,
    eString
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  DoubleOrString(const DoubleOrString&) = delete;
  DoubleOrString& operator=(const DoubleOrString&) = delete;
public:
  explicit inline DoubleOrString()
    : mType(eUninitialized)
  {
  }

  inline ~DoubleOrString()
  {
    Uninit();
  }

  inline double&
  RawSetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    do { } while (0);
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline double&
  SetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    Uninit();
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eDouble: {
        DestroyDouble();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyDouble()
  {
    do { } while (0);
    mValue.mDouble.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};

class DoubleOrSupportedType
{
  friend class DoubleOrSupportedTypeArgument;
  enum Type
  {
    eUninitialized,
    eDouble,
    eSupportedType
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<SupportedType > mSupportedType;

  };

  Type mType;
  Value mValue;

  DoubleOrSupportedType(const DoubleOrSupportedType&) = delete;
  DoubleOrSupportedType& operator=(const DoubleOrSupportedType&) = delete;
public:
  explicit inline DoubleOrSupportedType()
    : mType(eUninitialized)
  {
  }

  inline ~DoubleOrSupportedType()
  {
    Uninit();
  }

  inline double&
  RawSetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    do { } while (0);
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline double&
  SetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    Uninit();
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline SupportedType&
  RawSetAsSupportedType()
  {
    if (mType == eSupportedType) {
      return mValue.mSupportedType.Value();
    }
    do { } while (0);
    mType = eSupportedType;
    return mValue.mSupportedType.SetValue();
  }

  inline SupportedType&
  SetAsSupportedType()
  {
    if (mType == eSupportedType) {
      return mValue.mSupportedType.Value();
    }
    Uninit();
    mType = eSupportedType;
    return mValue.mSupportedType.SetValue();
  }

  inline bool
  IsSupportedType() const
  {
    return mType == eSupportedType;
  }

  inline SupportedType&
  GetAsSupportedType()
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  inline SupportedType
  GetAsSupportedType() const
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eDouble: {
        DestroyDouble();
        break;
      }
      case eSupportedType: {
        DestroySupportedType();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyDouble()
  {
    do { } while (0);
    mValue.mDouble.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroySupportedType()
  {
    do { } while (0);
    mValue.mSupportedType.Destroy();
    mType = eUninitialized;
  }
};

class DoubleOrUSVString
{
  friend class DoubleOrUSVStringArgument;
  enum Type
  {
    eUninitialized,
    eDouble,
    eUSVString
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<binding_detail::FakeString > mUSVString;

  };

  Type mType;
  Value mValue;

  DoubleOrUSVString(const DoubleOrUSVString&) = delete;
  DoubleOrUSVString& operator=(const DoubleOrUSVString&) = delete;
public:
  explicit inline DoubleOrUSVString()
    : mType(eUninitialized)
  {
  }

  inline ~DoubleOrUSVString()
  {
    Uninit();
  }

  inline double&
  RawSetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    do { } while (0);
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline double&
  SetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    Uninit();
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsUSVString()
  {
    if (mType == eUSVString) {
      return mValue.mUSVString.Value();
    }
    do { } while (0);
    mType = eUSVString;
    return mValue.mUSVString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsUSVString()
  {
    if (mType == eUSVString) {
      return mValue.mUSVString.Value();
    }
    Uninit();
    mType = eUSVString;
    return mValue.mUSVString.SetValue();
  }

  inline bool
  IsUSVString() const
  {
    return mType == eUSVString;
  }

  inline binding_detail::FakeString&
  GetAsUSVString()
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  inline const nsAString&
  GetAsUSVString() const
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eDouble: {
        DestroyDouble();
        break;
      }
      case eUSVString: {
        DestroyUSVString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyDouble()
  {
    do { } while (0);
    mValue.mDouble.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyUSVString()
  {
    do { } while (0);
    mValue.mUSVString.Destroy();
    mType = eUninitialized;
  }
};

class EventHandlerNonNullOrNullOrLong
{
  friend class EventHandlerNonNullOrNullOrLongArgument;
  enum Type
  {
    eUninitialized,
    eNull,
    eEventHandlerNonNull,
    eLong
  };

  union Value
  {
    UnionMember<RootedCallback<OwningNonNull<binding_detail::FastEventHandlerNonNull>> > mEventHandlerNonNull;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  EventHandlerNonNullOrNullOrLong(const EventHandlerNonNullOrNullOrLong&) = delete;
  EventHandlerNonNullOrNullOrLong& operator=(const EventHandlerNonNullOrNullOrLong&) = delete;
public:
  explicit inline EventHandlerNonNullOrNullOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~EventHandlerNonNullOrNullOrLong()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  inline RootedCallback<OwningNonNull<binding_detail::FastEventHandlerNonNull>>&
  RawSetAsEventHandlerNonNull(JSContext* cx)
  {
    if (mType == eEventHandlerNonNull) {
      return mValue.mEventHandlerNonNull.Value();
    }
    do { } while (0);
    mType = eEventHandlerNonNull;
    return mValue.mEventHandlerNonNull.SetValue(cx);
  }

  inline RootedCallback<OwningNonNull<binding_detail::FastEventHandlerNonNull>>&
  SetAsEventHandlerNonNull(JSContext* cx)
  {
    if (mType == eEventHandlerNonNull) {
      return mValue.mEventHandlerNonNull.Value();
    }
    Uninit();
    mType = eEventHandlerNonNull;
    return mValue.mEventHandlerNonNull.SetValue(cx);
  }

  inline bool
  IsEventHandlerNonNull() const
  {
    return mType == eEventHandlerNonNull;
  }

  inline RootedCallback<OwningNonNull<binding_detail::FastEventHandlerNonNull>>&
  GetAsEventHandlerNonNull()
  {
    do { } while (0);
    return mValue.mEventHandlerNonNull.Value();
  }

  inline EventHandlerNonNull&
  GetAsEventHandlerNonNull() const
  {
    do { } while (0);
    return mValue.mEventHandlerNonNull.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eNull: {
        break;
      }
      case eEventHandlerNonNull: {
        DestroyEventHandlerNonNull();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyEventHandlerNonNull()
  {
    do { } while (0);
    mValue.mEventHandlerNonNull.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class EventInitOrLong
{
  friend class EventInitOrLongArgument;
  enum Type
  {
    eUninitialized,
    eEventInit,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::FastEventInit > mEventInit;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  EventInitOrLong(const EventInitOrLong&) = delete;
  EventInitOrLong& operator=(const EventInitOrLong&) = delete;
public:
  explicit inline EventInitOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~EventInitOrLong()
  {
    Uninit();
  }

  inline binding_detail::FastEventInit&
  RawSetAsEventInit()
  {
    if (mType == eEventInit) {
      return mValue.mEventInit.Value();
    }
    do { } while (0);
    mType = eEventInit;
    return mValue.mEventInit.SetValue();
  }

  inline binding_detail::FastEventInit&
  SetAsEventInit()
  {
    if (mType == eEventInit) {
      return mValue.mEventInit.Value();
    }
    Uninit();
    mType = eEventInit;
    return mValue.mEventInit.SetValue();
  }

  inline bool
  IsEventInit() const
  {
    return mType == eEventInit;
  }

  inline binding_detail::FastEventInit&
  GetAsEventInit()
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline const EventInit&
  GetAsEventInit() const
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eEventInit: {
        DestroyEventInit();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyEventInit()
  {
    do { } while (0);
    mValue.mEventInit.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class EventInitOrStringSequence
{
  friend class EventInitOrStringSequenceArgument;
  enum Type
  {
    eUninitialized,
    eEventInit,
    eStringSequence
  };

  union Value
  {
    UnionMember<binding_detail::FastEventInit > mEventInit;
    UnionMember<binding_detail::AutoSequence<nsString> > mStringSequence;

  };

  Type mType;
  Value mValue;

  EventInitOrStringSequence(const EventInitOrStringSequence&) = delete;
  EventInitOrStringSequence& operator=(const EventInitOrStringSequence&) = delete;
public:
  explicit inline EventInitOrStringSequence()
    : mType(eUninitialized)
  {
  }

  inline ~EventInitOrStringSequence()
  {
    Uninit();
  }

  inline binding_detail::FastEventInit&
  RawSetAsEventInit()
  {
    if (mType == eEventInit) {
      return mValue.mEventInit.Value();
    }
    do { } while (0);
    mType = eEventInit;
    return mValue.mEventInit.SetValue();
  }

  inline binding_detail::FastEventInit&
  SetAsEventInit()
  {
    if (mType == eEventInit) {
      return mValue.mEventInit.Value();
    }
    Uninit();
    mType = eEventInit;
    return mValue.mEventInit.SetValue();
  }

  inline bool
  IsEventInit() const
  {
    return mType == eEventInit;
  }

  inline binding_detail::FastEventInit&
  GetAsEventInit()
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline const EventInit&
  GetAsEventInit() const
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline binding_detail::AutoSequence<nsString>&
  RawSetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    do { } while (0);
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline binding_detail::AutoSequence<nsString>&
  SetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    Uninit();
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline binding_detail::AutoSequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline const Sequence<nsString>&
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eEventInit: {
        DestroyEventInit();
        break;
      }
      case eStringSequence: {
        DestroyStringSequence();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyEventInit()
  {
    do { } while (0);
    mValue.mEventInit.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyStringSequence()
  {
    do { } while (0);
    mValue.mStringSequence.Destroy();
    mType = eUninitialized;
  }
};

class FileOrDirectory
{
  friend class FileOrDirectoryArgument;
  enum Type
  {
    eUninitialized,
    eFile,
    eDirectory
  };

  union Value
  {
    UnionMember<NonNull<mozilla::dom::File> > mFile;
    UnionMember<NonNull<mozilla::dom::Directory> > mDirectory;

  };

  Type mType;
  Value mValue;

  FileOrDirectory(const FileOrDirectory&) = delete;
  FileOrDirectory& operator=(const FileOrDirectory&) = delete;
public:
  explicit inline FileOrDirectory()
    : mType(eUninitialized)
  {
  }

  inline ~FileOrDirectory()
  {
    Uninit();
  }

  inline NonNull<mozilla::dom::File>&
  RawSetAsFile()
  {
    if (mType == eFile) {
      return mValue.mFile.Value();
    }
    do { } while (0);
    mType = eFile;
    return mValue.mFile.SetValue();
  }

  inline NonNull<mozilla::dom::File>&
  SetAsFile()
  {
    if (mType == eFile) {
      return mValue.mFile.Value();
    }
    Uninit();
    mType = eFile;
    return mValue.mFile.SetValue();
  }

  inline bool
  IsFile() const
  {
    return mType == eFile;
  }

  inline NonNull<mozilla::dom::File>&
  GetAsFile()
  {
    do { } while (0);
    return mValue.mFile.Value();
  }

  inline mozilla::dom::File&
  GetAsFile() const
  {
    do { } while (0);
    return mValue.mFile.Value();
  }

  inline NonNull<mozilla::dom::Directory>&
  RawSetAsDirectory()
  {
    if (mType == eDirectory) {
      return mValue.mDirectory.Value();
    }
    do { } while (0);
    mType = eDirectory;
    return mValue.mDirectory.SetValue();
  }

  inline NonNull<mozilla::dom::Directory>&
  SetAsDirectory()
  {
    if (mType == eDirectory) {
      return mValue.mDirectory.Value();
    }
    Uninit();
    mType = eDirectory;
    return mValue.mDirectory.SetValue();
  }

  inline bool
  IsDirectory() const
  {
    return mType == eDirectory;
  }

  inline NonNull<mozilla::dom::Directory>&
  GetAsDirectory()
  {
    do { } while (0);
    return mValue.mDirectory.Value();
  }

  inline mozilla::dom::Directory&
  GetAsDirectory() const
  {
    do { } while (0);
    return mValue.mDirectory.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eFile: {
        DestroyFile();
        break;
      }
      case eDirectory: {
        DestroyDirectory();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyFile()
  {
    do { } while (0);
    mValue.mFile.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyDirectory()
  {
    do { } while (0);
    mValue.mDirectory.Destroy();
    mType = eUninitialized;
  }
};

class FloatOrString
{
  friend class FloatOrStringArgument;
  enum Type
  {
    eUninitialized,
    eFloat,
    eString
  };

  union Value
  {
    UnionMember<float > mFloat;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  FloatOrString(const FloatOrString&) = delete;
  FloatOrString& operator=(const FloatOrString&) = delete;
public:
  explicit inline FloatOrString()
    : mType(eUninitialized)
  {
  }

  inline ~FloatOrString()
  {
    Uninit();
  }

  inline float&
  RawSetAsFloat()
  {
    if (mType == eFloat) {
      return mValue.mFloat.Value();
    }
    do { } while (0);
    mType = eFloat;
    return mValue.mFloat.SetValue();
  }

  inline float&
  SetAsFloat()
  {
    if (mType == eFloat) {
      return mValue.mFloat.Value();
    }
    Uninit();
    mType = eFloat;
    return mValue.mFloat.SetValue();
  }

  inline bool
  IsFloat() const
  {
    return mType == eFloat;
  }

  inline float&
  GetAsFloat()
  {
    do { } while (0);
    return mValue.mFloat.Value();
  }

  inline float
  GetAsFloat() const
  {
    do { } while (0);
    return mValue.mFloat.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eFloat: {
        DestroyFloat();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyFloat()
  {
    do { } while (0);
    mValue.mFloat.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};

class HTMLElementOrLong
{
  friend class HTMLElementOrLongArgument;
  enum Type
  {
    eUninitialized,
    eHTMLElement,
    eLong
  };

  union Value
  {
    UnionMember<NonNull<nsGenericHTMLElement> > mHTMLElement;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  HTMLElementOrLong(const HTMLElementOrLong&) = delete;
  HTMLElementOrLong& operator=(const HTMLElementOrLong&) = delete;
public:
  explicit inline HTMLElementOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~HTMLElementOrLong()
  {
    Uninit();
  }

  inline NonNull<nsGenericHTMLElement>&
  RawSetAsHTMLElement()
  {
    if (mType == eHTMLElement) {
      return mValue.mHTMLElement.Value();
    }
    do { } while (0);
    mType = eHTMLElement;
    return mValue.mHTMLElement.SetValue();
  }

  inline NonNull<nsGenericHTMLElement>&
  SetAsHTMLElement()
  {
    if (mType == eHTMLElement) {
      return mValue.mHTMLElement.Value();
    }
    Uninit();
    mType = eHTMLElement;
    return mValue.mHTMLElement.SetValue();
  }

  inline bool
  IsHTMLElement() const
  {
    return mType == eHTMLElement;
  }

  inline NonNull<nsGenericHTMLElement>&
  GetAsHTMLElement()
  {
    do { } while (0);
    return mValue.mHTMLElement.Value();
  }

  inline nsGenericHTMLElement&
  GetAsHTMLElement() const
  {
    do { } while (0);
    return mValue.mHTMLElement.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eHTMLElement: {
        DestroyHTMLElement();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyHTMLElement()
  {
    do { } while (0);
    mValue.mHTMLElement.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class HTMLOptionElementOrHTMLOptGroupElement
{
  friend class HTMLOptionElementOrHTMLOptGroupElementArgument;
  enum Type
  {
    eUninitialized,
    eHTMLOptionElement,
    eHTMLOptGroupElement
  };

  union Value
  {
    UnionMember<NonNull<mozilla::dom::HTMLOptionElement> > mHTMLOptionElement;
    UnionMember<NonNull<mozilla::dom::HTMLOptGroupElement> > mHTMLOptGroupElement;

  };

  Type mType;
  Value mValue;

  HTMLOptionElementOrHTMLOptGroupElement(const HTMLOptionElementOrHTMLOptGroupElement&) = delete;
  HTMLOptionElementOrHTMLOptGroupElement& operator=(const HTMLOptionElementOrHTMLOptGroupElement&) = delete;
public:
  explicit inline HTMLOptionElementOrHTMLOptGroupElement()
    : mType(eUninitialized)
  {
  }

  inline ~HTMLOptionElementOrHTMLOptGroupElement()
  {
    Uninit();
  }

  inline NonNull<mozilla::dom::HTMLOptionElement>&
  RawSetAsHTMLOptionElement()
  {
    if (mType == eHTMLOptionElement) {
      return mValue.mHTMLOptionElement.Value();
    }
    do { } while (0);
    mType = eHTMLOptionElement;
    return mValue.mHTMLOptionElement.SetValue();
  }

  inline NonNull<mozilla::dom::HTMLOptionElement>&
  SetAsHTMLOptionElement()
  {
    if (mType == eHTMLOptionElement) {
      return mValue.mHTMLOptionElement.Value();
    }
    Uninit();
    mType = eHTMLOptionElement;
    return mValue.mHTMLOptionElement.SetValue();
  }

  inline bool
  IsHTMLOptionElement() const
  {
    return mType == eHTMLOptionElement;
  }

  inline NonNull<mozilla::dom::HTMLOptionElement>&
  GetAsHTMLOptionElement()
  {
    do { } while (0);
    return mValue.mHTMLOptionElement.Value();
  }

  inline mozilla::dom::HTMLOptionElement&
  GetAsHTMLOptionElement() const
  {
    do { } while (0);
    return mValue.mHTMLOptionElement.Value();
  }

  inline NonNull<mozilla::dom::HTMLOptGroupElement>&
  RawSetAsHTMLOptGroupElement()
  {
    if (mType == eHTMLOptGroupElement) {
      return mValue.mHTMLOptGroupElement.Value();
    }
    do { } while (0);
    mType = eHTMLOptGroupElement;
    return mValue.mHTMLOptGroupElement.SetValue();
  }

  inline NonNull<mozilla::dom::HTMLOptGroupElement>&
  SetAsHTMLOptGroupElement()
  {
    if (mType == eHTMLOptGroupElement) {
      return mValue.mHTMLOptGroupElement.Value();
    }
    Uninit();
    mType = eHTMLOptGroupElement;
    return mValue.mHTMLOptGroupElement.SetValue();
  }

  inline bool
  IsHTMLOptGroupElement() const
  {
    return mType == eHTMLOptGroupElement;
  }

  inline NonNull<mozilla::dom::HTMLOptGroupElement>&
  GetAsHTMLOptGroupElement()
  {
    do { } while (0);
    return mValue.mHTMLOptGroupElement.Value();
  }

  inline mozilla::dom::HTMLOptGroupElement&
  GetAsHTMLOptGroupElement() const
  {
    do { } while (0);
    return mValue.mHTMLOptGroupElement.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eHTMLOptionElement: {
        DestroyHTMLOptionElement();
        break;
      }
      case eHTMLOptGroupElement: {
        DestroyHTMLOptGroupElement();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyHTMLOptionElement()
  {
    do { } while (0);
    mValue.mHTMLOptionElement.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyHTMLOptGroupElement()
  {
    do { } while (0);
    mValue.mHTMLOptGroupElement.Destroy();
    mType = eUninitialized;
  }
};

class ImageDataOrNullSequenceOrLong
{
  friend class ImageDataOrNullSequenceOrLongArgument;
  enum Type
  {
    eUninitialized,
    eImageDataOrNullSequence,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<RefPtr<mozilla::dom::ImageData>> > mImageDataOrNullSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ImageDataOrNullSequenceOrLong(const ImageDataOrNullSequenceOrLong&) = delete;
  ImageDataOrNullSequenceOrLong& operator=(const ImageDataOrNullSequenceOrLong&) = delete;
public:
  explicit inline ImageDataOrNullSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ImageDataOrNullSequenceOrLong()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<RefPtr<mozilla::dom::ImageData>>&
  RawSetAsImageDataOrNullSequence()
  {
    if (mType == eImageDataOrNullSequence) {
      return mValue.mImageDataOrNullSequence.Value();
    }
    do { } while (0);
    mType = eImageDataOrNullSequence;
    return mValue.mImageDataOrNullSequence.SetValue();
  }

  inline binding_detail::AutoSequence<RefPtr<mozilla::dom::ImageData>>&
  SetAsImageDataOrNullSequence()
  {
    if (mType == eImageDataOrNullSequence) {
      return mValue.mImageDataOrNullSequence.Value();
    }
    Uninit();
    mType = eImageDataOrNullSequence;
    return mValue.mImageDataOrNullSequence.SetValue();
  }

  inline bool
  IsImageDataOrNullSequence() const
  {
    return mType == eImageDataOrNullSequence;
  }

  inline binding_detail::AutoSequence<RefPtr<mozilla::dom::ImageData>>&
  GetAsImageDataOrNullSequence()
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequence.Value();
  }

  inline const Sequence<RefPtr<mozilla::dom::ImageData>>&
  GetAsImageDataOrNullSequence() const
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequence.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eImageDataOrNullSequence: {
        DestroyImageDataOrNullSequence();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyImageDataOrNullSequence()
  {
    do { } while (0);
    mValue.mImageDataOrNullSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ImageDataOrNullSequenceSequenceOrLong
{
  friend class ImageDataOrNullSequenceSequenceOrLongArgument;
  enum Type
  {
    eUninitialized,
    eImageDataOrNullSequenceSequence,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<Sequence<RefPtr<mozilla::dom::ImageData>>> > mImageDataOrNullSequenceSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ImageDataOrNullSequenceSequenceOrLong(const ImageDataOrNullSequenceSequenceOrLong&) = delete;
  ImageDataOrNullSequenceSequenceOrLong& operator=(const ImageDataOrNullSequenceSequenceOrLong&) = delete;
public:
  explicit inline ImageDataOrNullSequenceSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ImageDataOrNullSequenceSequenceOrLong()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<Sequence<RefPtr<mozilla::dom::ImageData>>>&
  RawSetAsImageDataOrNullSequenceSequence()
  {
    if (mType == eImageDataOrNullSequenceSequence) {
      return mValue.mImageDataOrNullSequenceSequence.Value();
    }
    do { } while (0);
    mType = eImageDataOrNullSequenceSequence;
    return mValue.mImageDataOrNullSequenceSequence.SetValue();
  }

  inline binding_detail::AutoSequence<Sequence<RefPtr<mozilla::dom::ImageData>>>&
  SetAsImageDataOrNullSequenceSequence()
  {
    if (mType == eImageDataOrNullSequenceSequence) {
      return mValue.mImageDataOrNullSequenceSequence.Value();
    }
    Uninit();
    mType = eImageDataOrNullSequenceSequence;
    return mValue.mImageDataOrNullSequenceSequence.SetValue();
  }

  inline bool
  IsImageDataOrNullSequenceSequence() const
  {
    return mType == eImageDataOrNullSequenceSequence;
  }

  inline binding_detail::AutoSequence<Sequence<RefPtr<mozilla::dom::ImageData>>>&
  GetAsImageDataOrNullSequenceSequence()
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequenceSequence.Value();
  }

  inline const Sequence<Sequence<RefPtr<mozilla::dom::ImageData>>>&
  GetAsImageDataOrNullSequenceSequence() const
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequenceSequence.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eImageDataOrNullSequenceSequence: {
        DestroyImageDataOrNullSequenceSequence();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyImageDataOrNullSequenceSequence()
  {
    do { } while (0);
    mValue.mImageDataOrNullSequenceSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ImageDataSequenceOrLong
{
  friend class ImageDataSequenceOrLongArgument;
  enum Type
  {
    eUninitialized,
    eImageDataSequence,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<OwningNonNull<mozilla::dom::ImageData>> > mImageDataSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ImageDataSequenceOrLong(const ImageDataSequenceOrLong&) = delete;
  ImageDataSequenceOrLong& operator=(const ImageDataSequenceOrLong&) = delete;
public:
  explicit inline ImageDataSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ImageDataSequenceOrLong()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<OwningNonNull<mozilla::dom::ImageData>>&
  RawSetAsImageDataSequence()
  {
    if (mType == eImageDataSequence) {
      return mValue.mImageDataSequence.Value();
    }
    do { } while (0);
    mType = eImageDataSequence;
    return mValue.mImageDataSequence.SetValue();
  }

  inline binding_detail::AutoSequence<OwningNonNull<mozilla::dom::ImageData>>&
  SetAsImageDataSequence()
  {
    if (mType == eImageDataSequence) {
      return mValue.mImageDataSequence.Value();
    }
    Uninit();
    mType = eImageDataSequence;
    return mValue.mImageDataSequence.SetValue();
  }

  inline bool
  IsImageDataSequence() const
  {
    return mType == eImageDataSequence;
  }

  inline binding_detail::AutoSequence<OwningNonNull<mozilla::dom::ImageData>>&
  GetAsImageDataSequence()
  {
    do { } while (0);
    return mValue.mImageDataSequence.Value();
  }

  inline const Sequence<OwningNonNull<mozilla::dom::ImageData>>&
  GetAsImageDataSequence() const
  {
    do { } while (0);
    return mValue.mImageDataSequence.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eImageDataSequence: {
        DestroyImageDataSequence();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyImageDataSequence()
  {
    do { } while (0);
    mValue.mImageDataSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ImageDataSequenceSequenceOrLong
{
  friend class ImageDataSequenceSequenceOrLongArgument;
  enum Type
  {
    eUninitialized,
    eImageDataSequenceSequence,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>> > mImageDataSequenceSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ImageDataSequenceSequenceOrLong(const ImageDataSequenceSequenceOrLong&) = delete;
  ImageDataSequenceSequenceOrLong& operator=(const ImageDataSequenceSequenceOrLong&) = delete;
public:
  explicit inline ImageDataSequenceSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ImageDataSequenceSequenceOrLong()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>>&
  RawSetAsImageDataSequenceSequence()
  {
    if (mType == eImageDataSequenceSequence) {
      return mValue.mImageDataSequenceSequence.Value();
    }
    do { } while (0);
    mType = eImageDataSequenceSequence;
    return mValue.mImageDataSequenceSequence.SetValue();
  }

  inline binding_detail::AutoSequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>>&
  SetAsImageDataSequenceSequence()
  {
    if (mType == eImageDataSequenceSequence) {
      return mValue.mImageDataSequenceSequence.Value();
    }
    Uninit();
    mType = eImageDataSequenceSequence;
    return mValue.mImageDataSequenceSequence.SetValue();
  }

  inline bool
  IsImageDataSequenceSequence() const
  {
    return mType == eImageDataSequenceSequence;
  }

  inline binding_detail::AutoSequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>>&
  GetAsImageDataSequenceSequence()
  {
    do { } while (0);
    return mValue.mImageDataSequenceSequence.Value();
  }

  inline const Sequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>>&
  GetAsImageDataSequenceSequence() const
  {
    do { } while (0);
    return mValue.mImageDataSequenceSequence.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eImageDataSequenceSequence: {
        DestroyImageDataSequenceSequence();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyImageDataSequenceSequence()
  {
    do { } while (0);
    mValue.mImageDataSequenceSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class LongOrBoolean
{
  friend class LongOrBooleanArgument;
  enum Type
  {
    eUninitialized,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  LongOrBoolean(const LongOrBoolean&) = delete;
  LongOrBoolean& operator=(const LongOrBoolean&) = delete;
public:
  explicit inline LongOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~LongOrBoolean()
  {
    Uninit();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline bool&
  RawSetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool&
  SetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    Uninit();
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
      case eBoolean: {
        DestroyBoolean();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyBoolean()
  {
    do { } while (0);
    mValue.mBoolean.Destroy();
    mType = eUninitialized;
  }
};

class LongOrStringAnyRecord
{
  friend class LongOrStringAnyRecordArgument;
  enum Type
  {
    eUninitialized,
    eLong,
    eStringAnyRecord
  };

  union Value
  {
    UnionMember<int32_t > mLong;
    UnionMember<Record<nsString, JS::Value> > mStringAnyRecord;

  };

  Type mType;
  Value mValue;

  LongOrStringAnyRecord(const LongOrStringAnyRecord&) = delete;
  LongOrStringAnyRecord& operator=(const LongOrStringAnyRecord&) = delete;
public:
  explicit inline LongOrStringAnyRecord()
    : mType(eUninitialized)
  {
  }

  inline ~LongOrStringAnyRecord()
  {
    Uninit();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline Record<nsString, JS::Value>&
  RawSetAsStringAnyRecord()
  {
    if (mType == eStringAnyRecord) {
      return mValue.mStringAnyRecord.Value();
    }
    do { } while (0);
    mType = eStringAnyRecord;
    return mValue.mStringAnyRecord.SetValue();
  }

  inline Record<nsString, JS::Value>&
  SetAsStringAnyRecord()
  {
    if (mType == eStringAnyRecord) {
      return mValue.mStringAnyRecord.Value();
    }
    Uninit();
    mType = eStringAnyRecord;
    return mValue.mStringAnyRecord.SetValue();
  }

  inline bool
  IsStringAnyRecord() const
  {
    return mType == eStringAnyRecord;
  }

  inline Record<nsString, JS::Value>&
  GetAsStringAnyRecord()
  {
    do { } while (0);
    return mValue.mStringAnyRecord.Value();
  }

  inline const Record<nsString, JS::Value>&
  GetAsStringAnyRecord() const
  {
    do { } while (0);
    return mValue.mStringAnyRecord.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
      case eStringAnyRecord: {
        DestroyStringAnyRecord();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyStringAnyRecord()
  {
    do { } while (0);
    mValue.mStringAnyRecord.Destroy();
    mType = eUninitialized;
  }
};

class LongSequenceOrLong
{
  friend class LongSequenceOrLongArgument;
  enum Type
  {
    eUninitialized,
    eLongSequence,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<int32_t> > mLongSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  LongSequenceOrLong(const LongSequenceOrLong&) = delete;
  LongSequenceOrLong& operator=(const LongSequenceOrLong&) = delete;
public:
  explicit inline LongSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~LongSequenceOrLong()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<int32_t>&
  RawSetAsLongSequence()
  {
    if (mType == eLongSequence) {
      return mValue.mLongSequence.Value();
    }
    do { } while (0);
    mType = eLongSequence;
    return mValue.mLongSequence.SetValue();
  }

  inline binding_detail::AutoSequence<int32_t>&
  SetAsLongSequence()
  {
    if (mType == eLongSequence) {
      return mValue.mLongSequence.Value();
    }
    Uninit();
    mType = eLongSequence;
    return mValue.mLongSequence.SetValue();
  }

  inline bool
  IsLongSequence() const
  {
    return mType == eLongSequence;
  }

  inline binding_detail::AutoSequence<int32_t>&
  GetAsLongSequence()
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  inline const Sequence<int32_t>&
  GetAsLongSequence() const
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eLongSequence: {
        DestroyLongSequence();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyLongSequence()
  {
    do { } while (0);
    mValue.mLongSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class LongSequenceOrNullOrLong
{
  friend class LongSequenceOrNullOrLongArgument;
  enum Type
  {
    eUninitialized,
    eNull,
    eLongSequence,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<int32_t> > mLongSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  LongSequenceOrNullOrLong(const LongSequenceOrNullOrLong&) = delete;
  LongSequenceOrNullOrLong& operator=(const LongSequenceOrNullOrLong&) = delete;
public:
  explicit inline LongSequenceOrNullOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~LongSequenceOrNullOrLong()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  inline binding_detail::AutoSequence<int32_t>&
  RawSetAsLongSequence()
  {
    if (mType == eLongSequence) {
      return mValue.mLongSequence.Value();
    }
    do { } while (0);
    mType = eLongSequence;
    return mValue.mLongSequence.SetValue();
  }

  inline binding_detail::AutoSequence<int32_t>&
  SetAsLongSequence()
  {
    if (mType == eLongSequence) {
      return mValue.mLongSequence.Value();
    }
    Uninit();
    mType = eLongSequence;
    return mValue.mLongSequence.SetValue();
  }

  inline bool
  IsLongSequence() const
  {
    return mType == eLongSequence;
  }

  inline binding_detail::AutoSequence<int32_t>&
  GetAsLongSequence()
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  inline const Sequence<int32_t>&
  GetAsLongSequence() const
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eNull: {
        break;
      }
      case eLongSequence: {
        DestroyLongSequence();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyLongSequence()
  {
    do { } while (0);
    mValue.mLongSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class NodeOrLongOrBoolean
{
  friend class NodeOrLongOrBooleanArgument;
  enum Type
  {
    eUninitialized,
    eNode,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<NonNull<nsINode> > mNode;
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  NodeOrLongOrBoolean(const NodeOrLongOrBoolean&) = delete;
  NodeOrLongOrBoolean& operator=(const NodeOrLongOrBoolean&) = delete;
public:
  explicit inline NodeOrLongOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~NodeOrLongOrBoolean()
  {
    Uninit();
  }

  inline NonNull<nsINode>&
  RawSetAsNode()
  {
    if (mType == eNode) {
      return mValue.mNode.Value();
    }
    do { } while (0);
    mType = eNode;
    return mValue.mNode.SetValue();
  }

  inline NonNull<nsINode>&
  SetAsNode()
  {
    if (mType == eNode) {
      return mValue.mNode.Value();
    }
    Uninit();
    mType = eNode;
    return mValue.mNode.SetValue();
  }

  inline bool
  IsNode() const
  {
    return mType == eNode;
  }

  inline NonNull<nsINode>&
  GetAsNode()
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  inline nsINode&
  GetAsNode() const
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline bool&
  RawSetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool&
  SetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    Uninit();
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eNode: {
        DestroyNode();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
      case eBoolean: {
        DestroyBoolean();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyNode()
  {
    do { } while (0);
    mValue.mNode.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyBoolean()
  {
    do { } while (0);
    mValue.mBoolean.Destroy();
    mType = eUninitialized;
  }
};

class NodeOrString
{
  friend class NodeOrStringArgument;
  enum Type
  {
    eUninitialized,
    eNode,
    eString
  };

  union Value
  {
    UnionMember<NonNull<nsINode> > mNode;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  NodeOrString(const NodeOrString&) = delete;
  NodeOrString& operator=(const NodeOrString&) = delete;
public:
  explicit inline NodeOrString()
    : mType(eUninitialized)
  {
  }

  inline ~NodeOrString()
  {
    Uninit();
  }

  inline NonNull<nsINode>&
  RawSetAsNode()
  {
    if (mType == eNode) {
      return mValue.mNode.Value();
    }
    do { } while (0);
    mType = eNode;
    return mValue.mNode.SetValue();
  }

  inline NonNull<nsINode>&
  SetAsNode()
  {
    if (mType == eNode) {
      return mValue.mNode.Value();
    }
    Uninit();
    mType = eNode;
    return mValue.mNode.SetValue();
  }

  inline bool
  IsNode() const
  {
    return mType == eNode;
  }

  inline NonNull<nsINode>&
  GetAsNode()
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  inline nsINode&
  GetAsNode() const
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eNode: {
        DestroyNode();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyNode()
  {
    do { } while (0);
    mValue.mNode.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrBoolean
{
  friend class ObjectOrBooleanArgument;
  enum Type
  {
    eUninitialized,
    eObject,
    eBoolean
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  ObjectOrBoolean(const ObjectOrBoolean&) = delete;
  ObjectOrBoolean& operator=(const ObjectOrBoolean&) = delete;
public:
  explicit inline ObjectOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrBoolean()
  {
    Uninit();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline bool&
  RawSetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool&
  SetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    Uninit();
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eBoolean: {
        DestroyBoolean();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyBoolean()
  {
    do { } while (0);
    mValue.mBoolean.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrLong
{
  friend class ObjectOrLongArgument;
  enum Type
  {
    eUninitialized,
    eObject,
    eLong
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ObjectOrLong(const ObjectOrLong&) = delete;
  ObjectOrLong& operator=(const ObjectOrLong&) = delete;
public:
  explicit inline ObjectOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrLong()
  {
    Uninit();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrLongOrBoolean
{
  friend class ObjectOrLongOrBooleanArgument;
  enum Type
  {
    eUninitialized,
    eObject,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  ObjectOrLongOrBoolean(const ObjectOrLongOrBoolean&) = delete;
  ObjectOrLongOrBoolean& operator=(const ObjectOrLongOrBoolean&) = delete;
public:
  explicit inline ObjectOrLongOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrLongOrBoolean()
  {
    Uninit();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline bool&
  RawSetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool&
  SetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    Uninit();
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
      case eBoolean: {
        DestroyBoolean();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyBoolean()
  {
    do { } while (0);
    mValue.mBoolean.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrLongOrNull
{
  friend class ObjectOrLongOrNullArgument;
  enum Type
  {
    eUninitialized,
    eNull,
    eObject,
    eLong
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ObjectOrLongOrNull(const ObjectOrLongOrNull&) = delete;
  ObjectOrLongOrNull& operator=(const ObjectOrLongOrNull&) = delete;
public:
  explicit inline ObjectOrLongOrNull()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrLongOrNull()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eNull: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrNullOrLong
{
  friend class ObjectOrNullOrLongArgument;
  enum Type
  {
    eUninitialized,
    eNull,
    eObject,
    eLong
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ObjectOrNullOrLong(const ObjectOrNullOrLong&) = delete;
  ObjectOrNullOrLong& operator=(const ObjectOrNullOrLong&) = delete;
public:
  explicit inline ObjectOrNullOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrNullOrLong()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eNull: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrString
{
  friend class ObjectOrStringArgument;
  enum Type
  {
    eUninitialized,
    eObject,
    eString
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  ObjectOrString(const ObjectOrString&) = delete;
  ObjectOrString& operator=(const ObjectOrString&) = delete;
public:
  explicit inline ObjectOrString()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrString()
  {
    Uninit();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrStringOrBoolean
{
  friend class ObjectOrStringOrBooleanArgument;
  enum Type
  {
    eUninitialized,
    eObject,
    eString,
    eBoolean
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<binding_detail::FakeString > mString;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  ObjectOrStringOrBoolean(const ObjectOrStringOrBoolean&) = delete;
  ObjectOrStringOrBoolean& operator=(const ObjectOrStringOrBoolean&) = delete;
public:
  explicit inline ObjectOrStringOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrStringOrBoolean()
  {
    Uninit();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline bool&
  RawSetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool&
  SetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    Uninit();
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
      case eBoolean: {
        DestroyBoolean();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyBoolean()
  {
    do { } while (0);
    mValue.mBoolean.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrStringOrLong
{
  friend class ObjectOrStringOrLongArgument;
  enum Type
  {
    eUninitialized,
    eObject,
    eString,
    eLong
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<binding_detail::FakeString > mString;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ObjectOrStringOrLong(const ObjectOrStringOrLong&) = delete;
  ObjectOrStringOrLong& operator=(const ObjectOrStringOrLong&) = delete;
public:
  explicit inline ObjectOrStringOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrStringOrLong()
  {
    Uninit();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class ObjectOrStringOrLongOrBoolean
{
  friend class ObjectOrStringOrLongOrBooleanArgument;
  enum Type
  {
    eUninitialized,
    eObject,
    eString,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<JS::Rooted<JSObject*> > mObject;
    UnionMember<binding_detail::FakeString > mString;
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  ObjectOrStringOrLongOrBoolean(const ObjectOrStringOrLongOrBoolean&) = delete;
  ObjectOrStringOrLongOrBoolean& operator=(const ObjectOrStringOrLongOrBoolean&) = delete;
public:
  explicit inline ObjectOrStringOrLongOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectOrStringOrLongOrBoolean()
  {
    Uninit();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline bool&
  RawSetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool&
  SetAsBoolean()
  {
    if (mType == eBoolean) {
      return mValue.mBoolean.Value();
    }
    do { } while (0);
    Uninit();
    mType = eBoolean;
    return mValue.mBoolean.SetValue();
  }

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
      case eBoolean: {
        DestroyBoolean();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyBoolean()
  {
    do { } while (0);
    mValue.mBoolean.Destroy();
    mType = eUninitialized;
  }
};

class ObjectSequenceOrLong
{
  friend class ObjectSequenceOrLongArgument;
  enum Type
  {
    eUninitialized,
    eObjectSequence,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<JSObject*> > mObjectSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  ObjectSequenceOrLong(const ObjectSequenceOrLong&) = delete;
  ObjectSequenceOrLong& operator=(const ObjectSequenceOrLong&) = delete;
public:
  explicit inline ObjectSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~ObjectSequenceOrLong()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<JSObject*>&
  RawSetAsObjectSequence()
  {
    if (mType == eObjectSequence) {
      return mValue.mObjectSequence.Value();
    }
    do { } while (0);
    mType = eObjectSequence;
    return mValue.mObjectSequence.SetValue();
  }

  inline binding_detail::AutoSequence<JSObject*>&
  SetAsObjectSequence()
  {
    if (mType == eObjectSequence) {
      return mValue.mObjectSequence.Value();
    }
    Uninit();
    mType = eObjectSequence;
    return mValue.mObjectSequence.SetValue();
  }

  inline bool
  IsObjectSequence() const
  {
    return mType == eObjectSequence;
  }

  inline binding_detail::AutoSequence<JSObject*>&
  GetAsObjectSequence()
  {
    do { } while (0);
    return mValue.mObjectSequence.Value();
  }

  inline const Sequence<JSObject*>&
  GetAsObjectSequence() const
  {
    do { } while (0);
    return mValue.mObjectSequence.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eObjectSequence: {
        DestroyObjectSequence();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyObjectSequence()
  {
    do { } while (0);
    mValue.mObjectSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class StringLongRecordOrLong
{
  friend class StringLongRecordOrLongArgument;
  enum Type
  {
    eUninitialized,
    eStringLongRecord,
    eLong
  };

  union Value
  {
    UnionMember<Record<nsString, int32_t> > mStringLongRecord;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  StringLongRecordOrLong(const StringLongRecordOrLong&) = delete;
  StringLongRecordOrLong& operator=(const StringLongRecordOrLong&) = delete;
public:
  explicit inline StringLongRecordOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~StringLongRecordOrLong()
  {
    Uninit();
  }

  inline Record<nsString, int32_t>&
  RawSetAsStringLongRecord()
  {
    if (mType == eStringLongRecord) {
      return mValue.mStringLongRecord.Value();
    }
    do { } while (0);
    mType = eStringLongRecord;
    return mValue.mStringLongRecord.SetValue();
  }

  inline Record<nsString, int32_t>&
  SetAsStringLongRecord()
  {
    if (mType == eStringLongRecord) {
      return mValue.mStringLongRecord.Value();
    }
    Uninit();
    mType = eStringLongRecord;
    return mValue.mStringLongRecord.SetValue();
  }

  inline bool
  IsStringLongRecord() const
  {
    return mType == eStringLongRecord;
  }

  inline Record<nsString, int32_t>&
  GetAsStringLongRecord()
  {
    do { } while (0);
    return mValue.mStringLongRecord.Value();
  }

  inline const Record<nsString, int32_t>&
  GetAsStringLongRecord() const
  {
    do { } while (0);
    return mValue.mStringLongRecord.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eStringLongRecord: {
        DestroyStringLongRecord();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyStringLongRecord()
  {
    do { } while (0);
    mValue.mStringLongRecord.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class StringObjectRecordOrLong
{
  friend class StringObjectRecordOrLongArgument;
  enum Type
  {
    eUninitialized,
    eStringObjectRecord,
    eLong
  };

  union Value
  {
    UnionMember<Record<nsString, JSObject*> > mStringObjectRecord;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  StringObjectRecordOrLong(const StringObjectRecordOrLong&) = delete;
  StringObjectRecordOrLong& operator=(const StringObjectRecordOrLong&) = delete;
public:
  explicit inline StringObjectRecordOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~StringObjectRecordOrLong()
  {
    Uninit();
  }

  inline Record<nsString, JSObject*>&
  RawSetAsStringObjectRecord()
  {
    if (mType == eStringObjectRecord) {
      return mValue.mStringObjectRecord.Value();
    }
    do { } while (0);
    mType = eStringObjectRecord;
    return mValue.mStringObjectRecord.SetValue();
  }

  inline Record<nsString, JSObject*>&
  SetAsStringObjectRecord()
  {
    if (mType == eStringObjectRecord) {
      return mValue.mStringObjectRecord.Value();
    }
    Uninit();
    mType = eStringObjectRecord;
    return mValue.mStringObjectRecord.SetValue();
  }

  inline bool
  IsStringObjectRecord() const
  {
    return mType == eStringObjectRecord;
  }

  inline Record<nsString, JSObject*>&
  GetAsStringObjectRecord()
  {
    do { } while (0);
    return mValue.mStringObjectRecord.Value();
  }

  inline const Record<nsString, JSObject*>&
  GetAsStringObjectRecord() const
  {
    do { } while (0);
    return mValue.mStringObjectRecord.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eStringObjectRecord: {
        DestroyStringObjectRecord();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyStringObjectRecord()
  {
    do { } while (0);
    mValue.mStringObjectRecord.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class StringOrObject
{
  friend class StringOrObjectArgument;
  enum Type
  {
    eUninitialized,
    eString,
    eObject
  };

  union Value
  {
    UnionMember<binding_detail::FakeString > mString;
    UnionMember<JS::Rooted<JSObject*> > mObject;

  };

  Type mType;
  Value mValue;

  StringOrObject(const StringOrObject&) = delete;
  StringOrObject& operator=(const StringOrObject&) = delete;
public:
  explicit inline StringOrObject()
    : mType(eUninitialized)
  {
  }

  inline ~StringOrObject()
  {
    Uninit();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }
};

class StringOrStringSequence
{
  friend class StringOrStringSequenceArgument;
  enum Type
  {
    eUninitialized,
    eString,
    eStringSequence
  };

  union Value
  {
    UnionMember<binding_detail::FakeString > mString;
    UnionMember<binding_detail::AutoSequence<nsString> > mStringSequence;

  };

  Type mType;
  Value mValue;

  StringOrStringSequence(const StringOrStringSequence&) = delete;
  StringOrStringSequence& operator=(const StringOrStringSequence&) = delete;
public:
  explicit inline StringOrStringSequence()
    : mType(eUninitialized)
  {
  }

  inline ~StringOrStringSequence()
  {
    Uninit();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline binding_detail::AutoSequence<nsString>&
  RawSetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    do { } while (0);
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline binding_detail::AutoSequence<nsString>&
  SetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    Uninit();
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline binding_detail::AutoSequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline const Sequence<nsString>&
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
      case eStringSequence: {
        DestroyStringSequence();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyStringSequence()
  {
    do { } while (0);
    mValue.mStringSequence.Destroy();
    mType = eUninitialized;
  }
};

class StringSequenceOrEventInit
{
  friend class StringSequenceOrEventInitArgument;
  enum Type
  {
    eUninitialized,
    eStringSequence,
    eEventInit
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<nsString> > mStringSequence;
    UnionMember<binding_detail::FastEventInit > mEventInit;

  };

  Type mType;
  Value mValue;

  StringSequenceOrEventInit(const StringSequenceOrEventInit&) = delete;
  StringSequenceOrEventInit& operator=(const StringSequenceOrEventInit&) = delete;
public:
  explicit inline StringSequenceOrEventInit()
    : mType(eUninitialized)
  {
  }

  inline ~StringSequenceOrEventInit()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<nsString>&
  RawSetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    do { } while (0);
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline binding_detail::AutoSequence<nsString>&
  SetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    Uninit();
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline binding_detail::AutoSequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline const Sequence<nsString>&
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline binding_detail::FastEventInit&
  RawSetAsEventInit()
  {
    if (mType == eEventInit) {
      return mValue.mEventInit.Value();
    }
    do { } while (0);
    mType = eEventInit;
    return mValue.mEventInit.SetValue();
  }

  inline binding_detail::FastEventInit&
  SetAsEventInit()
  {
    if (mType == eEventInit) {
      return mValue.mEventInit.Value();
    }
    Uninit();
    mType = eEventInit;
    return mValue.mEventInit.SetValue();
  }

  inline bool
  IsEventInit() const
  {
    return mType == eEventInit;
  }

  inline binding_detail::FastEventInit&
  GetAsEventInit()
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline const EventInit&
  GetAsEventInit() const
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eStringSequence: {
        DestroyStringSequence();
        break;
      }
      case eEventInit: {
        DestroyEventInit();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyStringSequence()
  {
    do { } while (0);
    mValue.mStringSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyEventInit()
  {
    do { } while (0);
    mValue.mEventInit.Destroy();
    mType = eUninitialized;
  }
};

class StringSequenceOrStringStringRecord
{
  friend class StringSequenceOrStringStringRecordArgument;
  enum Type
  {
    eUninitialized,
    eStringSequence,
    eStringStringRecord
  };

  union Value
  {
    UnionMember<binding_detail::AutoSequence<nsString> > mStringSequence;
    UnionMember<Record<nsString, nsString> > mStringStringRecord;

  };

  Type mType;
  Value mValue;

  StringSequenceOrStringStringRecord(const StringSequenceOrStringStringRecord&) = delete;
  StringSequenceOrStringStringRecord& operator=(const StringSequenceOrStringStringRecord&) = delete;
public:
  explicit inline StringSequenceOrStringStringRecord()
    : mType(eUninitialized)
  {
  }

  inline ~StringSequenceOrStringStringRecord()
  {
    Uninit();
  }

  inline binding_detail::AutoSequence<nsString>&
  RawSetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    do { } while (0);
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline binding_detail::AutoSequence<nsString>&
  SetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    Uninit();
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline binding_detail::AutoSequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline const Sequence<nsString>&
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline Record<nsString, nsString>&
  RawSetAsStringStringRecord()
  {
    if (mType == eStringStringRecord) {
      return mValue.mStringStringRecord.Value();
    }
    do { } while (0);
    mType = eStringStringRecord;
    return mValue.mStringStringRecord.SetValue();
  }

  inline Record<nsString, nsString>&
  SetAsStringStringRecord()
  {
    if (mType == eStringStringRecord) {
      return mValue.mStringStringRecord.Value();
    }
    Uninit();
    mType = eStringStringRecord;
    return mValue.mStringStringRecord.SetValue();
  }

  inline bool
  IsStringStringRecord() const
  {
    return mType == eStringStringRecord;
  }

  inline Record<nsString, nsString>&
  GetAsStringStringRecord()
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline const Record<nsString, nsString>&
  GetAsStringStringRecord() const
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eStringSequence: {
        DestroyStringSequence();
        break;
      }
      case eStringStringRecord: {
        DestroyStringStringRecord();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyStringSequence()
  {
    do { } while (0);
    mValue.mStringSequence.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyStringStringRecord()
  {
    do { } while (0);
    mValue.mStringStringRecord.Destroy();
    mType = eUninitialized;
  }
};

class StringStringRecordOrString
{
  friend class StringStringRecordOrStringArgument;
  enum Type
  {
    eUninitialized,
    eStringStringRecord,
    eString
  };

  union Value
  {
    UnionMember<Record<nsString, nsString> > mStringStringRecord;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  StringStringRecordOrString(const StringStringRecordOrString&) = delete;
  StringStringRecordOrString& operator=(const StringStringRecordOrString&) = delete;
public:
  explicit inline StringStringRecordOrString()
    : mType(eUninitialized)
  {
  }

  inline ~StringStringRecordOrString()
  {
    Uninit();
  }

  inline Record<nsString, nsString>&
  RawSetAsStringStringRecord()
  {
    if (mType == eStringStringRecord) {
      return mValue.mStringStringRecord.Value();
    }
    do { } while (0);
    mType = eStringStringRecord;
    return mValue.mStringStringRecord.SetValue();
  }

  inline Record<nsString, nsString>&
  SetAsStringStringRecord()
  {
    if (mType == eStringStringRecord) {
      return mValue.mStringStringRecord.Value();
    }
    Uninit();
    mType = eStringStringRecord;
    return mValue.mStringStringRecord.SetValue();
  }

  inline bool
  IsStringStringRecord() const
  {
    return mType == eStringStringRecord;
  }

  inline Record<nsString, nsString>&
  GetAsStringStringRecord()
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline const Record<nsString, nsString>&
  GetAsStringStringRecord() const
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eStringStringRecord: {
        DestroyStringStringRecord();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyStringStringRecord()
  {
    do { } while (0);
    mValue.mStringStringRecord.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};

class StringStringRecordOrStringSequence
{
  friend class StringStringRecordOrStringSequenceArgument;
  enum Type
  {
    eUninitialized,
    eStringStringRecord,
    eStringSequence
  };

  union Value
  {
    UnionMember<Record<nsString, nsString> > mStringStringRecord;
    UnionMember<binding_detail::AutoSequence<nsString> > mStringSequence;

  };

  Type mType;
  Value mValue;

  StringStringRecordOrStringSequence(const StringStringRecordOrStringSequence&) = delete;
  StringStringRecordOrStringSequence& operator=(const StringStringRecordOrStringSequence&) = delete;
public:
  explicit inline StringStringRecordOrStringSequence()
    : mType(eUninitialized)
  {
  }

  inline ~StringStringRecordOrStringSequence()
  {
    Uninit();
  }

  inline Record<nsString, nsString>&
  RawSetAsStringStringRecord()
  {
    if (mType == eStringStringRecord) {
      return mValue.mStringStringRecord.Value();
    }
    do { } while (0);
    mType = eStringStringRecord;
    return mValue.mStringStringRecord.SetValue();
  }

  inline Record<nsString, nsString>&
  SetAsStringStringRecord()
  {
    if (mType == eStringStringRecord) {
      return mValue.mStringStringRecord.Value();
    }
    Uninit();
    mType = eStringStringRecord;
    return mValue.mStringStringRecord.SetValue();
  }

  inline bool
  IsStringStringRecord() const
  {
    return mType == eStringStringRecord;
  }

  inline Record<nsString, nsString>&
  GetAsStringStringRecord()
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline const Record<nsString, nsString>&
  GetAsStringStringRecord() const
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline binding_detail::AutoSequence<nsString>&
  RawSetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    do { } while (0);
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline binding_detail::AutoSequence<nsString>&
  SetAsStringSequence()
  {
    if (mType == eStringSequence) {
      return mValue.mStringSequence.Value();
    }
    Uninit();
    mType = eStringSequence;
    return mValue.mStringSequence.SetValue();
  }

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline binding_detail::AutoSequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline const Sequence<nsString>&
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eStringStringRecord: {
        DestroyStringStringRecord();
        break;
      }
      case eStringSequence: {
        DestroyStringSequence();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyStringStringRecord()
  {
    do { } while (0);
    mValue.mStringStringRecord.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyStringSequence()
  {
    do { } while (0);
    mValue.mStringSequence.Destroy();
    mType = eUninitialized;
  }
};

class SupportedTypeOrObject
{
  friend class SupportedTypeOrObjectArgument;
  enum Type
  {
    eUninitialized,
    eSupportedType,
    eObject
  };

  union Value
  {
    UnionMember<SupportedType > mSupportedType;
    UnionMember<JS::Rooted<JSObject*> > mObject;

  };

  Type mType;
  Value mValue;

  SupportedTypeOrObject(const SupportedTypeOrObject&) = delete;
  SupportedTypeOrObject& operator=(const SupportedTypeOrObject&) = delete;
public:
  explicit inline SupportedTypeOrObject()
    : mType(eUninitialized)
  {
  }

  inline ~SupportedTypeOrObject()
  {
    Uninit();
  }

  inline SupportedType&
  RawSetAsSupportedType()
  {
    if (mType == eSupportedType) {
      return mValue.mSupportedType.Value();
    }
    do { } while (0);
    mType = eSupportedType;
    return mValue.mSupportedType.SetValue();
  }

  inline SupportedType&
  SetAsSupportedType()
  {
    if (mType == eSupportedType) {
      return mValue.mSupportedType.Value();
    }
    do { } while (0);
    Uninit();
    mType = eSupportedType;
    return mValue.mSupportedType.SetValue();
  }

  inline bool
  IsSupportedType() const
  {
    return mType == eSupportedType;
  }

  inline SupportedType&
  GetAsSupportedType()
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  inline SupportedType
  GetAsSupportedType() const
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JS::Rooted<JSObject*>&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject*
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eSupportedType: {
        DestroySupportedType();
        break;
      }
      case eObject: {
        DestroyObject();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroySupportedType()
  {
    do { } while (0);
    mValue.mSupportedType.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyObject()
  {
    do { } while (0);
    mValue.mObject.Destroy();
    mType = eUninitialized;
  }
};

class USVStringOrLong
{
  friend class USVStringOrLongArgument;
  enum Type
  {
    eUninitialized,
    eUSVString,
    eLong
  };

  union Value
  {
    UnionMember<binding_detail::FakeString > mUSVString;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  USVStringOrLong(const USVStringOrLong&) = delete;
  USVStringOrLong& operator=(const USVStringOrLong&) = delete;
public:
  explicit inline USVStringOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~USVStringOrLong()
  {
    Uninit();
  }

  inline binding_detail::FakeString&
  RawSetAsUSVString()
  {
    if (mType == eUSVString) {
      return mValue.mUSVString.Value();
    }
    do { } while (0);
    mType = eUSVString;
    return mValue.mUSVString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsUSVString()
  {
    if (mType == eUSVString) {
      return mValue.mUSVString.Value();
    }
    Uninit();
    mType = eUSVString;
    return mValue.mUSVString.SetValue();
  }

  inline bool
  IsUSVString() const
  {
    return mType == eUSVString;
  }

  inline binding_detail::FakeString&
  GetAsUSVString()
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  inline const nsAString&
  GetAsUSVString() const
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  inline int32_t&
  RawSetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    do { } while (0);
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline int32_t&
  SetAsLong()
  {
    if (mType == eLong) {
      return mValue.mLong.Value();
    }
    Uninit();
    mType = eLong;
    return mValue.mLong.SetValue();
  }

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eUSVString: {
        DestroyUSVString();
        break;
      }
      case eLong: {
        DestroyLong();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyUSVString()
  {
    do { } while (0);
    mValue.mUSVString.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyLong()
  {
    do { } while (0);
    mValue.mLong.Destroy();
    mType = eUninitialized;
  }
};

class UnrestrictedDoubleOrString
{
  friend class UnrestrictedDoubleOrStringArgument;
  enum Type
  {
    eUninitialized,
    eUnrestrictedDouble,
    eString
  };

  union Value
  {
    UnionMember<double > mUnrestrictedDouble;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  UnrestrictedDoubleOrString(const UnrestrictedDoubleOrString&) = delete;
  UnrestrictedDoubleOrString& operator=(const UnrestrictedDoubleOrString&) = delete;
public:
  explicit inline UnrestrictedDoubleOrString()
    : mType(eUninitialized)
  {
  }

  inline ~UnrestrictedDoubleOrString()
  {
    Uninit();
  }

  inline double&
  RawSetAsUnrestrictedDouble()
  {
    if (mType == eUnrestrictedDouble) {
      return mValue.mUnrestrictedDouble.Value();
    }
    do { } while (0);
    mType = eUnrestrictedDouble;
    return mValue.mUnrestrictedDouble.SetValue();
  }

  inline double&
  SetAsUnrestrictedDouble()
  {
    if (mType == eUnrestrictedDouble) {
      return mValue.mUnrestrictedDouble.Value();
    }
    Uninit();
    mType = eUnrestrictedDouble;
    return mValue.mUnrestrictedDouble.SetValue();
  }

  inline bool
  IsUnrestrictedDouble() const
  {
    return mType == eUnrestrictedDouble;
  }

  inline double&
  GetAsUnrestrictedDouble()
  {
    do { } while (0);
    return mValue.mUnrestrictedDouble.Value();
  }

  inline double
  GetAsUnrestrictedDouble() const
  {
    do { } while (0);
    return mValue.mUnrestrictedDouble.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eUnrestrictedDouble: {
        DestroyUnrestrictedDouble();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyUnrestrictedDouble()
  {
    do { } while (0);
    mValue.mUnrestrictedDouble.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};

class UnrestrictedFloatOrString
{
  friend class UnrestrictedFloatOrStringArgument;
  enum Type
  {
    eUninitialized,
    eUnrestrictedFloat,
    eString
  };

  union Value
  {
    UnionMember<float > mUnrestrictedFloat;
    UnionMember<binding_detail::FakeString > mString;

  };

  Type mType;
  Value mValue;

  UnrestrictedFloatOrString(const UnrestrictedFloatOrString&) = delete;
  UnrestrictedFloatOrString& operator=(const UnrestrictedFloatOrString&) = delete;
public:
  explicit inline UnrestrictedFloatOrString()
    : mType(eUninitialized)
  {
  }

  inline ~UnrestrictedFloatOrString()
  {
    Uninit();
  }

  inline float&
  RawSetAsUnrestrictedFloat()
  {
    if (mType == eUnrestrictedFloat) {
      return mValue.mUnrestrictedFloat.Value();
    }
    do { } while (0);
    mType = eUnrestrictedFloat;
    return mValue.mUnrestrictedFloat.SetValue();
  }

  inline float&
  SetAsUnrestrictedFloat()
  {
    if (mType == eUnrestrictedFloat) {
      return mValue.mUnrestrictedFloat.Value();
    }
    Uninit();
    mType = eUnrestrictedFloat;
    return mValue.mUnrestrictedFloat.SetValue();
  }

  inline bool
  IsUnrestrictedFloat() const
  {
    return mType == eUnrestrictedFloat;
  }

  inline float&
  GetAsUnrestrictedFloat()
  {
    do { } while (0);
    return mValue.mUnrestrictedFloat.Value();
  }

  inline float
  GetAsUnrestrictedFloat() const
  {
    do { } while (0);
    return mValue.mUnrestrictedFloat.Value();
  }

  inline binding_detail::FakeString&
  RawSetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    do { } while (0);
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline binding_detail::FakeString&
  SetAsString()
  {
    if (mType == eString) {
      return mValue.mString.Value();
    }
    Uninit();
    mType = eString;
    return mValue.mString.SetValue();
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline binding_detail::FakeString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline const nsAString&
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eUnrestrictedFloat: {
        DestroyUnrestrictedFloat();
        break;
      }
      case eString: {
        DestroyString();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyUnrestrictedFloat()
  {
    do { } while (0);
    mValue.mUnrestrictedFloat.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyString()
  {
    do { } while (0);
    mValue.mString.Destroy();
    mType = eUninitialized;
  }
};

class OwningArrayBufferOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningArrayBufferOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eArrayBuffer,
    eLong
  };

  union Value
  {
    UnionMember<ArrayBuffer > mArrayBuffer;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningArrayBufferOrLong(const OwningArrayBufferOrLong&) = delete;
  OwningArrayBufferOrLong& operator=(const OwningArrayBufferOrLong&) = delete;
public:
  explicit inline OwningArrayBufferOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningArrayBufferOrLong()
  {
    Uninit();
  }

  ArrayBuffer&
  RawSetAsArrayBuffer();

  ArrayBuffer&
  SetAsArrayBuffer();

  bool
  TrySetToArrayBuffer(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsArrayBuffer() const
  {
    return mType == eArrayBuffer;
  }

  inline ArrayBuffer&
  GetAsArrayBuffer()
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline ArrayBuffer const &
  GetAsArrayBuffer() const
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyArrayBuffer();

  void
  DestroyLong();
};

class OwningArrayBufferViewOrArrayBuffer : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningArrayBufferViewOrArrayBuffer& aUnion);
  enum Type
  {
    eUninitialized,
    eArrayBufferView,
    eArrayBuffer
  };

  union Value
  {
    UnionMember<ArrayBufferView > mArrayBufferView;
    UnionMember<ArrayBuffer > mArrayBuffer;

  };

  Type mType;
  Value mValue;

  OwningArrayBufferViewOrArrayBuffer(const OwningArrayBufferViewOrArrayBuffer&) = delete;
  OwningArrayBufferViewOrArrayBuffer& operator=(const OwningArrayBufferViewOrArrayBuffer&) = delete;
public:
  explicit inline OwningArrayBufferViewOrArrayBuffer()
    : mType(eUninitialized)
  {
  }

  inline ~OwningArrayBufferViewOrArrayBuffer()
  {
    Uninit();
  }

  ArrayBufferView&
  RawSetAsArrayBufferView();

  ArrayBufferView&
  SetAsArrayBufferView();

  bool
  TrySetToArrayBufferView(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsArrayBufferView() const
  {
    return mType == eArrayBufferView;
  }

  inline ArrayBufferView&
  GetAsArrayBufferView()
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  inline ArrayBufferView const &
  GetAsArrayBufferView() const
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  ArrayBuffer&
  RawSetAsArrayBuffer();

  ArrayBuffer&
  SetAsArrayBuffer();

  bool
  TrySetToArrayBuffer(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsArrayBuffer() const
  {
    return mType == eArrayBuffer;
  }

  inline ArrayBuffer&
  GetAsArrayBuffer()
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline ArrayBuffer const &
  GetAsArrayBuffer() const
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyArrayBufferView();

  void
  DestroyArrayBuffer();
};

class OwningByteStringOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningByteStringOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eByteString,
    eLong
  };

  union Value
  {
    UnionMember<nsCString > mByteString;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningByteStringOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningByteStringOrLong(const OwningByteStringOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningByteStringOrLong()
  {
    Uninit();
  }

  nsCString&
  RawSetAsByteString();

  nsCString&
  SetAsByteString();

  bool
  TrySetToByteString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsCString::char_type* aData, nsCString::size_type aLength)
  {
    RawSetAsByteString().Assign(aData, aLength);
  }

  inline bool
  IsByteString() const
  {
    return mType == eByteString;
  }

  inline nsCString&
  GetAsByteString()
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  inline nsCString const &
  GetAsByteString() const
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningByteStringOrLong&
  operator=(const OwningByteStringOrLong& aOther);

private:
  void
  DestroyByteString();

  void
  DestroyLong();
};

class OwningCanvasPatternOrCanvasGradient : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningCanvasPatternOrCanvasGradient& aUnion);
  enum Type
  {
    eUninitialized,
    eCanvasPattern,
    eCanvasGradient
  };

  union Value
  {
    UnionMember<OwningNonNull<mozilla::dom::CanvasPattern> > mCanvasPattern;
    UnionMember<OwningNonNull<mozilla::dom::CanvasGradient> > mCanvasGradient;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningCanvasPatternOrCanvasGradient()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningCanvasPatternOrCanvasGradient(const OwningCanvasPatternOrCanvasGradient& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningCanvasPatternOrCanvasGradient()
  {
    Uninit();
  }

  OwningNonNull<mozilla::dom::CanvasPattern>&
  RawSetAsCanvasPattern();

  OwningNonNull<mozilla::dom::CanvasPattern>&
  SetAsCanvasPattern();

  bool
  TrySetToCanvasPattern(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsCanvasPattern() const
  {
    return mType == eCanvasPattern;
  }

  inline OwningNonNull<mozilla::dom::CanvasPattern>&
  GetAsCanvasPattern()
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  inline OwningNonNull<mozilla::dom::CanvasPattern> const &
  GetAsCanvasPattern() const
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  OwningNonNull<mozilla::dom::CanvasGradient>&
  RawSetAsCanvasGradient();

  OwningNonNull<mozilla::dom::CanvasGradient>&
  SetAsCanvasGradient();

  bool
  TrySetToCanvasGradient(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsCanvasGradient() const
  {
    return mType == eCanvasGradient;
  }

  inline OwningNonNull<mozilla::dom::CanvasGradient>&
  GetAsCanvasGradient()
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  inline OwningNonNull<mozilla::dom::CanvasGradient> const &
  GetAsCanvasGradient() const
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningCanvasPatternOrCanvasGradient&
  operator=(const OwningCanvasPatternOrCanvasGradient& aOther);

private:
  void
  DestroyCanvasPattern();

  void
  DestroyCanvasGradient();
};

class OwningCanvasPatternOrNullOrCanvasGradient : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningCanvasPatternOrNullOrCanvasGradient& aUnion);
  enum Type
  {
    eUninitialized,
    eNull,
    eCanvasPattern,
    eCanvasGradient
  };

  union Value
  {
    UnionMember<OwningNonNull<mozilla::dom::CanvasPattern> > mCanvasPattern;
    UnionMember<OwningNonNull<mozilla::dom::CanvasGradient> > mCanvasGradient;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningCanvasPatternOrNullOrCanvasGradient()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningCanvasPatternOrNullOrCanvasGradient(const OwningCanvasPatternOrNullOrCanvasGradient& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningCanvasPatternOrNullOrCanvasGradient()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  OwningNonNull<mozilla::dom::CanvasPattern>&
  RawSetAsCanvasPattern();

  OwningNonNull<mozilla::dom::CanvasPattern>&
  SetAsCanvasPattern();

  bool
  TrySetToCanvasPattern(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsCanvasPattern() const
  {
    return mType == eCanvasPattern;
  }

  inline OwningNonNull<mozilla::dom::CanvasPattern>&
  GetAsCanvasPattern()
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  inline OwningNonNull<mozilla::dom::CanvasPattern> const &
  GetAsCanvasPattern() const
  {
    do { } while (0);
    return mValue.mCanvasPattern.Value();
  }

  OwningNonNull<mozilla::dom::CanvasGradient>&
  RawSetAsCanvasGradient();

  OwningNonNull<mozilla::dom::CanvasGradient>&
  SetAsCanvasGradient();

  bool
  TrySetToCanvasGradient(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsCanvasGradient() const
  {
    return mType == eCanvasGradient;
  }

  inline OwningNonNull<mozilla::dom::CanvasGradient>&
  GetAsCanvasGradient()
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  inline OwningNonNull<mozilla::dom::CanvasGradient> const &
  GetAsCanvasGradient() const
  {
    do { } while (0);
    return mValue.mCanvasGradient.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningCanvasPatternOrNullOrCanvasGradient&
  operator=(const OwningCanvasPatternOrNullOrCanvasGradient& aOther);

private:
  void
  DestroyCanvasPattern();

  void
  DestroyCanvasGradient();
};

class OwningCustomEventInitOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningCustomEventInitOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eCustomEventInit,
    eLong
  };

  union Value
  {
    UnionMember<CustomEventInit > mCustomEventInit;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningCustomEventInitOrLong(const OwningCustomEventInitOrLong&) = delete;
  OwningCustomEventInitOrLong& operator=(const OwningCustomEventInitOrLong&) = delete;
public:
  explicit inline OwningCustomEventInitOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningCustomEventInitOrLong()
  {
    Uninit();
  }

  CustomEventInit&
  RawSetAsCustomEventInit();

  CustomEventInit&
  SetAsCustomEventInit();

  bool
  TrySetToCustomEventInit(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsCustomEventInit() const
  {
    return mType == eCustomEventInit;
  }

  inline CustomEventInit&
  GetAsCustomEventInit()
  {
    do { } while (0);
    return mValue.mCustomEventInit.Value();
  }

  inline CustomEventInit const &
  GetAsCustomEventInit() const
  {
    do { } while (0);
    return mValue.mCustomEventInit.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyCustomEventInit();

  void
  DestroyLong();
};

class OwningDoubleOrByteString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningDoubleOrByteString& aUnion);
  enum Type
  {
    eUninitialized,
    eDouble,
    eByteString
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<nsCString > mByteString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningDoubleOrByteString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningDoubleOrByteString(const OwningDoubleOrByteString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningDoubleOrByteString()
  {
    Uninit();
  }

  double&
  RawSetAsDouble();

  double&
  SetAsDouble();

  bool
  TrySetToDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double const &
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  nsCString&
  RawSetAsByteString();

  nsCString&
  SetAsByteString();

  bool
  TrySetToByteString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsCString::char_type* aData, nsCString::size_type aLength)
  {
    RawSetAsByteString().Assign(aData, aLength);
  }

  inline bool
  IsByteString() const
  {
    return mType == eByteString;
  }

  inline nsCString&
  GetAsByteString()
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  inline nsCString const &
  GetAsByteString() const
  {
    do { } while (0);
    return mValue.mByteString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningDoubleOrByteString&
  operator=(const OwningDoubleOrByteString& aOther);

private:
  void
  DestroyDouble();

  void
  DestroyByteString();
};

class OwningDoubleOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningDoubleOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eDouble,
    eString
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningDoubleOrString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningDoubleOrString(const OwningDoubleOrString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningDoubleOrString()
  {
    Uninit();
  }

  double&
  RawSetAsDouble();

  double&
  SetAsDouble();

  bool
  TrySetToDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double const &
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningDoubleOrString&
  operator=(const OwningDoubleOrString& aOther);

private:
  void
  DestroyDouble();

  void
  DestroyString();
};

class OwningDoubleOrSupportedType : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningDoubleOrSupportedType& aUnion);
  enum Type
  {
    eUninitialized,
    eDouble,
    eSupportedType
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<SupportedType > mSupportedType;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningDoubleOrSupportedType()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningDoubleOrSupportedType(const OwningDoubleOrSupportedType& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningDoubleOrSupportedType()
  {
    Uninit();
  }

  double&
  RawSetAsDouble();

  double&
  SetAsDouble();

  bool
  TrySetToDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double const &
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  SupportedType&
  RawSetAsSupportedType();

  SupportedType&
  SetAsSupportedType();

  bool
  TrySetToSupportedType(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsSupportedType() const
  {
    return mType == eSupportedType;
  }

  inline SupportedType&
  GetAsSupportedType()
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  inline SupportedType const &
  GetAsSupportedType() const
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningDoubleOrSupportedType&
  operator=(const OwningDoubleOrSupportedType& aOther);

private:
  void
  DestroyDouble();

  void
  DestroySupportedType();
};

class OwningDoubleOrUSVString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningDoubleOrUSVString& aUnion);
  enum Type
  {
    eUninitialized,
    eDouble,
    eUSVString
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<nsString > mUSVString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningDoubleOrUSVString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningDoubleOrUSVString(const OwningDoubleOrUSVString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningDoubleOrUSVString()
  {
    Uninit();
  }

  double&
  RawSetAsDouble();

  double&
  SetAsDouble();

  bool
  TrySetToDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double const &
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  nsString&
  RawSetAsUSVString();

  nsString&
  SetAsUSVString();

  bool
  TrySetToUSVString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsUSVString().Assign(aData, aLength);
  }

  inline bool
  IsUSVString() const
  {
    return mType == eUSVString;
  }

  inline nsString&
  GetAsUSVString()
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  inline nsString const &
  GetAsUSVString() const
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningDoubleOrUSVString&
  operator=(const OwningDoubleOrUSVString& aOther);

private:
  void
  DestroyDouble();

  void
  DestroyUSVString();
};

class OwningEventHandlerNonNullOrNullOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningEventHandlerNonNullOrNullOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eNull,
    eEventHandlerNonNull,
    eLong
  };

  union Value
  {
    UnionMember<OwningNonNull<EventHandlerNonNull> > mEventHandlerNonNull;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningEventHandlerNonNullOrNullOrLong(const OwningEventHandlerNonNullOrNullOrLong&) = delete;
  OwningEventHandlerNonNullOrNullOrLong& operator=(const OwningEventHandlerNonNullOrNullOrLong&) = delete;
public:
  explicit inline OwningEventHandlerNonNullOrNullOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningEventHandlerNonNullOrNullOrLong()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  OwningNonNull<EventHandlerNonNull>&
  RawSetAsEventHandlerNonNull();

  OwningNonNull<EventHandlerNonNull>&
  SetAsEventHandlerNonNull();

  bool
  TrySetToEventHandlerNonNull(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsEventHandlerNonNull() const
  {
    return mType == eEventHandlerNonNull;
  }

  inline OwningNonNull<EventHandlerNonNull>&
  GetAsEventHandlerNonNull()
  {
    do { } while (0);
    return mValue.mEventHandlerNonNull.Value();
  }

  inline OwningNonNull<EventHandlerNonNull> const &
  GetAsEventHandlerNonNull() const
  {
    do { } while (0);
    return mValue.mEventHandlerNonNull.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyEventHandlerNonNull();

  void
  DestroyLong();
};

class OwningEventInitOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningEventInitOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eEventInit,
    eLong
  };

  union Value
  {
    UnionMember<EventInit > mEventInit;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningEventInitOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningEventInitOrLong(const OwningEventInitOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningEventInitOrLong()
  {
    Uninit();
  }

  EventInit&
  RawSetAsEventInit();

  EventInit&
  SetAsEventInit();

  bool
  TrySetToEventInit(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsEventInit() const
  {
    return mType == eEventInit;
  }

  inline EventInit&
  GetAsEventInit()
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline EventInit const &
  GetAsEventInit() const
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningEventInitOrLong&
  operator=(const OwningEventInitOrLong& aOther);

private:
  void
  DestroyEventInit();

  void
  DestroyLong();
};

class OwningEventInitOrStringSequence : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningEventInitOrStringSequence& aUnion);
  enum Type
  {
    eUninitialized,
    eEventInit,
    eStringSequence
  };

  union Value
  {
    UnionMember<EventInit > mEventInit;
    UnionMember<Sequence<nsString> > mStringSequence;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningEventInitOrStringSequence()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningEventInitOrStringSequence(const OwningEventInitOrStringSequence& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningEventInitOrStringSequence()
  {
    Uninit();
  }

  EventInit&
  RawSetAsEventInit();

  EventInit&
  SetAsEventInit();

  bool
  TrySetToEventInit(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsEventInit() const
  {
    return mType == eEventInit;
  }

  inline EventInit&
  GetAsEventInit()
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline EventInit const &
  GetAsEventInit() const
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  Sequence<nsString>&
  RawSetAsStringSequence();

  Sequence<nsString>&
  SetAsStringSequence();

  bool
  TrySetToStringSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline Sequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline Sequence<nsString> const &
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningEventInitOrStringSequence&
  operator=(const OwningEventInitOrStringSequence& aOther);

private:
  void
  DestroyEventInit();

  void
  DestroyStringSequence();
};

class OwningFileOrDirectory : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningFileOrDirectory& aUnion);
  enum Type
  {
    eUninitialized,
    eFile,
    eDirectory
  };

  union Value
  {
    UnionMember<OwningNonNull<mozilla::dom::File> > mFile;
    UnionMember<OwningNonNull<mozilla::dom::Directory> > mDirectory;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningFileOrDirectory()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningFileOrDirectory(const OwningFileOrDirectory& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningFileOrDirectory()
  {
    Uninit();
  }

  OwningNonNull<mozilla::dom::File>&
  RawSetAsFile();

  OwningNonNull<mozilla::dom::File>&
  SetAsFile();

  bool
  TrySetToFile(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsFile() const
  {
    return mType == eFile;
  }

  inline OwningNonNull<mozilla::dom::File>&
  GetAsFile()
  {
    do { } while (0);
    return mValue.mFile.Value();
  }

  inline OwningNonNull<mozilla::dom::File> const &
  GetAsFile() const
  {
    do { } while (0);
    return mValue.mFile.Value();
  }

  OwningNonNull<mozilla::dom::Directory>&
  RawSetAsDirectory();

  OwningNonNull<mozilla::dom::Directory>&
  SetAsDirectory();

  bool
  TrySetToDirectory(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsDirectory() const
  {
    return mType == eDirectory;
  }

  inline OwningNonNull<mozilla::dom::Directory>&
  GetAsDirectory()
  {
    do { } while (0);
    return mValue.mDirectory.Value();
  }

  inline OwningNonNull<mozilla::dom::Directory> const &
  GetAsDirectory() const
  {
    do { } while (0);
    return mValue.mDirectory.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningFileOrDirectory&
  operator=(const OwningFileOrDirectory& aOther);

private:
  void
  DestroyFile();

  void
  DestroyDirectory();
};

class OwningFloatOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningFloatOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eFloat,
    eString
  };

  union Value
  {
    UnionMember<float > mFloat;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningFloatOrString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningFloatOrString(const OwningFloatOrString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningFloatOrString()
  {
    Uninit();
  }

  float&
  RawSetAsFloat();

  float&
  SetAsFloat();

  bool
  TrySetToFloat(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsFloat() const
  {
    return mType == eFloat;
  }

  inline float&
  GetAsFloat()
  {
    do { } while (0);
    return mValue.mFloat.Value();
  }

  inline float const &
  GetAsFloat() const
  {
    do { } while (0);
    return mValue.mFloat.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningFloatOrString&
  operator=(const OwningFloatOrString& aOther);

private:
  void
  DestroyFloat();

  void
  DestroyString();
};

class OwningHTMLElementOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningHTMLElementOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eHTMLElement,
    eLong
  };

  union Value
  {
    UnionMember<OwningNonNull<nsGenericHTMLElement> > mHTMLElement;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningHTMLElementOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningHTMLElementOrLong(const OwningHTMLElementOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningHTMLElementOrLong()
  {
    Uninit();
  }

  OwningNonNull<nsGenericHTMLElement>&
  RawSetAsHTMLElement();

  OwningNonNull<nsGenericHTMLElement>&
  SetAsHTMLElement();

  bool
  TrySetToHTMLElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsHTMLElement() const
  {
    return mType == eHTMLElement;
  }

  inline OwningNonNull<nsGenericHTMLElement>&
  GetAsHTMLElement()
  {
    do { } while (0);
    return mValue.mHTMLElement.Value();
  }

  inline OwningNonNull<nsGenericHTMLElement> const &
  GetAsHTMLElement() const
  {
    do { } while (0);
    return mValue.mHTMLElement.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningHTMLElementOrLong&
  operator=(const OwningHTMLElementOrLong& aOther);

private:
  void
  DestroyHTMLElement();

  void
  DestroyLong();
};

class OwningHTMLOptionElementOrHTMLOptGroupElement : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningHTMLOptionElementOrHTMLOptGroupElement& aUnion);
  enum Type
  {
    eUninitialized,
    eHTMLOptionElement,
    eHTMLOptGroupElement
  };

  union Value
  {
    UnionMember<OwningNonNull<mozilla::dom::HTMLOptionElement> > mHTMLOptionElement;
    UnionMember<OwningNonNull<mozilla::dom::HTMLOptGroupElement> > mHTMLOptGroupElement;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningHTMLOptionElementOrHTMLOptGroupElement()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningHTMLOptionElementOrHTMLOptGroupElement(const OwningHTMLOptionElementOrHTMLOptGroupElement& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningHTMLOptionElementOrHTMLOptGroupElement()
  {
    Uninit();
  }

  OwningNonNull<mozilla::dom::HTMLOptionElement>&
  RawSetAsHTMLOptionElement();

  OwningNonNull<mozilla::dom::HTMLOptionElement>&
  SetAsHTMLOptionElement();

  bool
  TrySetToHTMLOptionElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsHTMLOptionElement() const
  {
    return mType == eHTMLOptionElement;
  }

  inline OwningNonNull<mozilla::dom::HTMLOptionElement>&
  GetAsHTMLOptionElement()
  {
    do { } while (0);
    return mValue.mHTMLOptionElement.Value();
  }

  inline OwningNonNull<mozilla::dom::HTMLOptionElement> const &
  GetAsHTMLOptionElement() const
  {
    do { } while (0);
    return mValue.mHTMLOptionElement.Value();
  }

  OwningNonNull<mozilla::dom::HTMLOptGroupElement>&
  RawSetAsHTMLOptGroupElement();

  OwningNonNull<mozilla::dom::HTMLOptGroupElement>&
  SetAsHTMLOptGroupElement();

  bool
  TrySetToHTMLOptGroupElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsHTMLOptGroupElement() const
  {
    return mType == eHTMLOptGroupElement;
  }

  inline OwningNonNull<mozilla::dom::HTMLOptGroupElement>&
  GetAsHTMLOptGroupElement()
  {
    do { } while (0);
    return mValue.mHTMLOptGroupElement.Value();
  }

  inline OwningNonNull<mozilla::dom::HTMLOptGroupElement> const &
  GetAsHTMLOptGroupElement() const
  {
    do { } while (0);
    return mValue.mHTMLOptGroupElement.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningHTMLOptionElementOrHTMLOptGroupElement&
  operator=(const OwningHTMLOptionElementOrHTMLOptGroupElement& aOther);

private:
  void
  DestroyHTMLOptionElement();

  void
  DestroyHTMLOptGroupElement();
};

class OwningImageDataOrNullSequenceOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningImageDataOrNullSequenceOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eImageDataOrNullSequence,
    eLong
  };

  union Value
  {
    UnionMember<Sequence<RefPtr<mozilla::dom::ImageData>> > mImageDataOrNullSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningImageDataOrNullSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningImageDataOrNullSequenceOrLong(const OwningImageDataOrNullSequenceOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningImageDataOrNullSequenceOrLong()
  {
    Uninit();
  }

  Sequence<RefPtr<mozilla::dom::ImageData>>&
  RawSetAsImageDataOrNullSequence();

  Sequence<RefPtr<mozilla::dom::ImageData>>&
  SetAsImageDataOrNullSequence();

  bool
  TrySetToImageDataOrNullSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsImageDataOrNullSequence() const
  {
    return mType == eImageDataOrNullSequence;
  }

  inline Sequence<RefPtr<mozilla::dom::ImageData>>&
  GetAsImageDataOrNullSequence()
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequence.Value();
  }

  inline Sequence<RefPtr<mozilla::dom::ImageData>> const &
  GetAsImageDataOrNullSequence() const
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequence.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningImageDataOrNullSequenceOrLong&
  operator=(const OwningImageDataOrNullSequenceOrLong& aOther);

private:
  void
  DestroyImageDataOrNullSequence();

  void
  DestroyLong();
};

class OwningImageDataOrNullSequenceSequenceOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningImageDataOrNullSequenceSequenceOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eImageDataOrNullSequenceSequence,
    eLong
  };

  union Value
  {
    UnionMember<Sequence<Sequence<RefPtr<mozilla::dom::ImageData>>> > mImageDataOrNullSequenceSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningImageDataOrNullSequenceSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningImageDataOrNullSequenceSequenceOrLong(const OwningImageDataOrNullSequenceSequenceOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningImageDataOrNullSequenceSequenceOrLong()
  {
    Uninit();
  }

  Sequence<Sequence<RefPtr<mozilla::dom::ImageData>>>&
  RawSetAsImageDataOrNullSequenceSequence();

  Sequence<Sequence<RefPtr<mozilla::dom::ImageData>>>&
  SetAsImageDataOrNullSequenceSequence();

  bool
  TrySetToImageDataOrNullSequenceSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsImageDataOrNullSequenceSequence() const
  {
    return mType == eImageDataOrNullSequenceSequence;
  }

  inline Sequence<Sequence<RefPtr<mozilla::dom::ImageData>>>&
  GetAsImageDataOrNullSequenceSequence()
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequenceSequence.Value();
  }

  inline Sequence<Sequence<RefPtr<mozilla::dom::ImageData>>> const &
  GetAsImageDataOrNullSequenceSequence() const
  {
    do { } while (0);
    return mValue.mImageDataOrNullSequenceSequence.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningImageDataOrNullSequenceSequenceOrLong&
  operator=(const OwningImageDataOrNullSequenceSequenceOrLong& aOther);

private:
  void
  DestroyImageDataOrNullSequenceSequence();

  void
  DestroyLong();
};

class OwningImageDataSequenceOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningImageDataSequenceOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eImageDataSequence,
    eLong
  };

  union Value
  {
    UnionMember<Sequence<OwningNonNull<mozilla::dom::ImageData>> > mImageDataSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningImageDataSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningImageDataSequenceOrLong(const OwningImageDataSequenceOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningImageDataSequenceOrLong()
  {
    Uninit();
  }

  Sequence<OwningNonNull<mozilla::dom::ImageData>>&
  RawSetAsImageDataSequence();

  Sequence<OwningNonNull<mozilla::dom::ImageData>>&
  SetAsImageDataSequence();

  bool
  TrySetToImageDataSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsImageDataSequence() const
  {
    return mType == eImageDataSequence;
  }

  inline Sequence<OwningNonNull<mozilla::dom::ImageData>>&
  GetAsImageDataSequence()
  {
    do { } while (0);
    return mValue.mImageDataSequence.Value();
  }

  inline Sequence<OwningNonNull<mozilla::dom::ImageData>> const &
  GetAsImageDataSequence() const
  {
    do { } while (0);
    return mValue.mImageDataSequence.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningImageDataSequenceOrLong&
  operator=(const OwningImageDataSequenceOrLong& aOther);

private:
  void
  DestroyImageDataSequence();

  void
  DestroyLong();
};

class OwningImageDataSequenceSequenceOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningImageDataSequenceSequenceOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eImageDataSequenceSequence,
    eLong
  };

  union Value
  {
    UnionMember<Sequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>> > mImageDataSequenceSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningImageDataSequenceSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningImageDataSequenceSequenceOrLong(const OwningImageDataSequenceSequenceOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningImageDataSequenceSequenceOrLong()
  {
    Uninit();
  }

  Sequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>>&
  RawSetAsImageDataSequenceSequence();

  Sequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>>&
  SetAsImageDataSequenceSequence();

  bool
  TrySetToImageDataSequenceSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsImageDataSequenceSequence() const
  {
    return mType == eImageDataSequenceSequence;
  }

  inline Sequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>>&
  GetAsImageDataSequenceSequence()
  {
    do { } while (0);
    return mValue.mImageDataSequenceSequence.Value();
  }

  inline Sequence<Sequence<OwningNonNull<mozilla::dom::ImageData>>> const &
  GetAsImageDataSequenceSequence() const
  {
    do { } while (0);
    return mValue.mImageDataSequenceSequence.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningImageDataSequenceSequenceOrLong&
  operator=(const OwningImageDataSequenceSequenceOrLong& aOther);

private:
  void
  DestroyImageDataSequenceSequence();

  void
  DestroyLong();
};

class OwningLongOrBoolean : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningLongOrBoolean& aUnion);
  enum Type
  {
    eUninitialized,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningLongOrBoolean()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningLongOrBoolean(const OwningLongOrBoolean& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningLongOrBoolean()
  {
    Uninit();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  bool&
  RawSetAsBoolean();

  bool&
  SetAsBoolean();

  bool
  TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool const &
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningLongOrBoolean&
  operator=(const OwningLongOrBoolean& aOther);

private:
  void
  DestroyLong();

  void
  DestroyBoolean();
};

class OwningLongOrStringAnyRecord : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningLongOrStringAnyRecord& aUnion);
  enum Type
  {
    eUninitialized,
    eLong,
    eStringAnyRecord
  };

  union Value
  {
    UnionMember<int32_t > mLong;
    UnionMember<Record<nsString, JS::Value> > mStringAnyRecord;

  };

  Type mType;
  Value mValue;

  OwningLongOrStringAnyRecord(const OwningLongOrStringAnyRecord&) = delete;
  OwningLongOrStringAnyRecord& operator=(const OwningLongOrStringAnyRecord&) = delete;
public:
  explicit inline OwningLongOrStringAnyRecord()
    : mType(eUninitialized)
  {
  }

  inline ~OwningLongOrStringAnyRecord()
  {
    Uninit();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  Record<nsString, JS::Value>&
  RawSetAsStringAnyRecord();

  Record<nsString, JS::Value>&
  SetAsStringAnyRecord();

  bool
  TrySetToStringAnyRecord(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringAnyRecord() const
  {
    return mType == eStringAnyRecord;
  }

  inline Record<nsString, JS::Value>&
  GetAsStringAnyRecord()
  {
    do { } while (0);
    return mValue.mStringAnyRecord.Value();
  }

  inline Record<nsString, JS::Value> const &
  GetAsStringAnyRecord() const
  {
    do { } while (0);
    return mValue.mStringAnyRecord.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyLong();

  void
  DestroyStringAnyRecord();
};

class OwningLongSequenceOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningLongSequenceOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eLongSequence,
    eLong
  };

  union Value
  {
    UnionMember<Sequence<int32_t> > mLongSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningLongSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningLongSequenceOrLong(const OwningLongSequenceOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningLongSequenceOrLong()
  {
    Uninit();
  }

  Sequence<int32_t>&
  RawSetAsLongSequence();

  Sequence<int32_t>&
  SetAsLongSequence();

  bool
  TrySetToLongSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLongSequence() const
  {
    return mType == eLongSequence;
  }

  inline Sequence<int32_t>&
  GetAsLongSequence()
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  inline Sequence<int32_t> const &
  GetAsLongSequence() const
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningLongSequenceOrLong&
  operator=(const OwningLongSequenceOrLong& aOther);

private:
  void
  DestroyLongSequence();

  void
  DestroyLong();
};

class OwningLongSequenceOrNullOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningLongSequenceOrNullOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eNull,
    eLongSequence,
    eLong
  };

  union Value
  {
    UnionMember<Sequence<int32_t> > mLongSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningLongSequenceOrNullOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningLongSequenceOrNullOrLong(const OwningLongSequenceOrNullOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningLongSequenceOrNullOrLong()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  Sequence<int32_t>&
  RawSetAsLongSequence();

  Sequence<int32_t>&
  SetAsLongSequence();

  bool
  TrySetToLongSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLongSequence() const
  {
    return mType == eLongSequence;
  }

  inline Sequence<int32_t>&
  GetAsLongSequence()
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  inline Sequence<int32_t> const &
  GetAsLongSequence() const
  {
    do { } while (0);
    return mValue.mLongSequence.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningLongSequenceOrNullOrLong&
  operator=(const OwningLongSequenceOrNullOrLong& aOther);

private:
  void
  DestroyLongSequence();

  void
  DestroyLong();
};

class OwningNodeOrLongOrBoolean : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningNodeOrLongOrBoolean& aUnion);
  enum Type
  {
    eUninitialized,
    eNode,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<OwningNonNull<nsINode> > mNode;
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningNodeOrLongOrBoolean()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningNodeOrLongOrBoolean(const OwningNodeOrLongOrBoolean& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningNodeOrLongOrBoolean()
  {
    Uninit();
  }

  OwningNonNull<nsINode>&
  RawSetAsNode();

  OwningNonNull<nsINode>&
  SetAsNode();

  bool
  TrySetToNode(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsNode() const
  {
    return mType == eNode;
  }

  inline OwningNonNull<nsINode>&
  GetAsNode()
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  inline OwningNonNull<nsINode> const &
  GetAsNode() const
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  bool&
  RawSetAsBoolean();

  bool&
  SetAsBoolean();

  bool
  TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool const &
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningNodeOrLongOrBoolean&
  operator=(const OwningNodeOrLongOrBoolean& aOther);

private:
  void
  DestroyNode();

  void
  DestroyLong();

  void
  DestroyBoolean();
};

class OwningNodeOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningNodeOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eNode,
    eString
  };

  union Value
  {
    UnionMember<OwningNonNull<nsINode> > mNode;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningNodeOrString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningNodeOrString(const OwningNodeOrString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningNodeOrString()
  {
    Uninit();
  }

  OwningNonNull<nsINode>&
  RawSetAsNode();

  OwningNonNull<nsINode>&
  SetAsNode();

  bool
  TrySetToNode(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsNode() const
  {
    return mType == eNode;
  }

  inline OwningNonNull<nsINode>&
  GetAsNode()
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  inline OwningNonNull<nsINode> const &
  GetAsNode() const
  {
    do { } while (0);
    return mValue.mNode.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningNodeOrString&
  operator=(const OwningNodeOrString& aOther);

private:
  void
  DestroyNode();

  void
  DestroyString();
};

class OwningObjectOrBoolean : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrBoolean& aUnion);
  enum Type
  {
    eUninitialized,
    eObject,
    eBoolean
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  OwningObjectOrBoolean(const OwningObjectOrBoolean&) = delete;
  OwningObjectOrBoolean& operator=(const OwningObjectOrBoolean&) = delete;
public:
  explicit inline OwningObjectOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrBoolean()
  {
    Uninit();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  bool&
  RawSetAsBoolean();

  bool&
  SetAsBoolean();

  bool
  TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool const &
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyBoolean();
};

class OwningObjectOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eObject,
    eLong
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningObjectOrLong(const OwningObjectOrLong&) = delete;
  OwningObjectOrLong& operator=(const OwningObjectOrLong&) = delete;
public:
  explicit inline OwningObjectOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrLong()
  {
    Uninit();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyLong();
};

class OwningObjectOrLongOrBoolean : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrLongOrBoolean& aUnion);
  enum Type
  {
    eUninitialized,
    eObject,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  OwningObjectOrLongOrBoolean(const OwningObjectOrLongOrBoolean&) = delete;
  OwningObjectOrLongOrBoolean& operator=(const OwningObjectOrLongOrBoolean&) = delete;
public:
  explicit inline OwningObjectOrLongOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrLongOrBoolean()
  {
    Uninit();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  bool&
  RawSetAsBoolean();

  bool&
  SetAsBoolean();

  bool
  TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool const &
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyLong();

  void
  DestroyBoolean();
};

class OwningObjectOrLongOrNull : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrLongOrNull& aUnion);
  enum Type
  {
    eUninitialized,
    eNull,
    eObject,
    eLong
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningObjectOrLongOrNull(const OwningObjectOrLongOrNull&) = delete;
  OwningObjectOrLongOrNull& operator=(const OwningObjectOrLongOrNull&) = delete;
public:
  explicit inline OwningObjectOrLongOrNull()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrLongOrNull()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyLong();
};

class OwningObjectOrNullOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrNullOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eNull,
    eObject,
    eLong
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningObjectOrNullOrLong(const OwningObjectOrNullOrLong&) = delete;
  OwningObjectOrNullOrLong& operator=(const OwningObjectOrNullOrLong&) = delete;
public:
  explicit inline OwningObjectOrNullOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrNullOrLong()
  {
    Uninit();
  }

  inline bool
  IsNull() const
  {
    return mType == eNull;
  }

  inline void
  SetNull()
  {
    Uninit();
    mType = eNull;
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyLong();
};

class OwningObjectOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eObject,
    eString
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

  OwningObjectOrString(const OwningObjectOrString&) = delete;
  OwningObjectOrString& operator=(const OwningObjectOrString&) = delete;
public:
  explicit inline OwningObjectOrString()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrString()
  {
    Uninit();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyString();
};

class OwningObjectOrStringOrBoolean : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrStringOrBoolean& aUnion);
  enum Type
  {
    eUninitialized,
    eObject,
    eString,
    eBoolean
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<nsString > mString;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  OwningObjectOrStringOrBoolean(const OwningObjectOrStringOrBoolean&) = delete;
  OwningObjectOrStringOrBoolean& operator=(const OwningObjectOrStringOrBoolean&) = delete;
public:
  explicit inline OwningObjectOrStringOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrStringOrBoolean()
  {
    Uninit();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  bool&
  RawSetAsBoolean();

  bool&
  SetAsBoolean();

  bool
  TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool const &
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyString();

  void
  DestroyBoolean();
};

class OwningObjectOrStringOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrStringOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eObject,
    eString,
    eLong
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<nsString > mString;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningObjectOrStringOrLong(const OwningObjectOrStringOrLong&) = delete;
  OwningObjectOrStringOrLong& operator=(const OwningObjectOrStringOrLong&) = delete;
public:
  explicit inline OwningObjectOrStringOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrStringOrLong()
  {
    Uninit();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyString();

  void
  DestroyLong();
};

class OwningObjectOrStringOrLongOrBoolean : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectOrStringOrLongOrBoolean& aUnion);
  enum Type
  {
    eUninitialized,
    eObject,
    eString,
    eLong,
    eBoolean
  };

  union Value
  {
    UnionMember<JSObject* > mObject;
    UnionMember<nsString > mString;
    UnionMember<int32_t > mLong;
    UnionMember<bool > mBoolean;

  };

  Type mType;
  Value mValue;

  OwningObjectOrStringOrLongOrBoolean(const OwningObjectOrStringOrLongOrBoolean&) = delete;
  OwningObjectOrStringOrLongOrBoolean& operator=(const OwningObjectOrStringOrLongOrBoolean&) = delete;
public:
  explicit inline OwningObjectOrStringOrLongOrBoolean()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectOrStringOrLongOrBoolean()
  {
    Uninit();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  bool&
  RawSetAsBoolean();

  bool&
  SetAsBoolean();

  bool
  TrySetToBoolean(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsBoolean() const
  {
    return mType == eBoolean;
  }

  inline bool&
  GetAsBoolean()
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  inline bool const &
  GetAsBoolean() const
  {
    do { } while (0);
    return mValue.mBoolean.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObject();

  void
  DestroyString();

  void
  DestroyLong();

  void
  DestroyBoolean();
};

class OwningObjectSequenceOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningObjectSequenceOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eObjectSequence,
    eLong
  };

  union Value
  {
    UnionMember<Sequence<JSObject*> > mObjectSequence;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningObjectSequenceOrLong(const OwningObjectSequenceOrLong&) = delete;
  OwningObjectSequenceOrLong& operator=(const OwningObjectSequenceOrLong&) = delete;
public:
  explicit inline OwningObjectSequenceOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningObjectSequenceOrLong()
  {
    Uninit();
  }

  Sequence<JSObject*>&
  RawSetAsObjectSequence();

  Sequence<JSObject*>&
  SetAsObjectSequence();

  bool
  TrySetToObjectSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsObjectSequence() const
  {
    return mType == eObjectSequence;
  }

  inline Sequence<JSObject*>&
  GetAsObjectSequence()
  {
    do { } while (0);
    return mValue.mObjectSequence.Value();
  }

  inline Sequence<JSObject*> const &
  GetAsObjectSequence() const
  {
    do { } while (0);
    return mValue.mObjectSequence.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyObjectSequence();

  void
  DestroyLong();
};

class OwningStringLongRecordOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringLongRecordOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eStringLongRecord,
    eLong
  };

  union Value
  {
    UnionMember<Record<nsString, int32_t> > mStringLongRecord;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningStringLongRecordOrLong(const OwningStringLongRecordOrLong&) = delete;
  OwningStringLongRecordOrLong& operator=(const OwningStringLongRecordOrLong&) = delete;
public:
  explicit inline OwningStringLongRecordOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningStringLongRecordOrLong()
  {
    Uninit();
  }

  Record<nsString, int32_t>&
  RawSetAsStringLongRecord();

  Record<nsString, int32_t>&
  SetAsStringLongRecord();

  bool
  TrySetToStringLongRecord(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringLongRecord() const
  {
    return mType == eStringLongRecord;
  }

  inline Record<nsString, int32_t>&
  GetAsStringLongRecord()
  {
    do { } while (0);
    return mValue.mStringLongRecord.Value();
  }

  inline Record<nsString, int32_t> const &
  GetAsStringLongRecord() const
  {
    do { } while (0);
    return mValue.mStringLongRecord.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyStringLongRecord();

  void
  DestroyLong();
};

class OwningStringObjectRecordOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringObjectRecordOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eStringObjectRecord,
    eLong
  };

  union Value
  {
    UnionMember<Record<nsString, JSObject*> > mStringObjectRecord;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

  OwningStringObjectRecordOrLong(const OwningStringObjectRecordOrLong&) = delete;
  OwningStringObjectRecordOrLong& operator=(const OwningStringObjectRecordOrLong&) = delete;
public:
  explicit inline OwningStringObjectRecordOrLong()
    : mType(eUninitialized)
  {
  }

  inline ~OwningStringObjectRecordOrLong()
  {
    Uninit();
  }

  Record<nsString, JSObject*>&
  RawSetAsStringObjectRecord();

  Record<nsString, JSObject*>&
  SetAsStringObjectRecord();

  bool
  TrySetToStringObjectRecord(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringObjectRecord() const
  {
    return mType == eStringObjectRecord;
  }

  inline Record<nsString, JSObject*>&
  GetAsStringObjectRecord()
  {
    do { } while (0);
    return mValue.mStringObjectRecord.Value();
  }

  inline Record<nsString, JSObject*> const &
  GetAsStringObjectRecord() const
  {
    do { } while (0);
    return mValue.mStringObjectRecord.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyStringObjectRecord();

  void
  DestroyLong();
};

class OwningStringOrObject : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringOrObject& aUnion);
  enum Type
  {
    eUninitialized,
    eString,
    eObject
  };

  union Value
  {
    UnionMember<nsString > mString;
    UnionMember<JSObject* > mObject;

  };

  Type mType;
  Value mValue;

  OwningStringOrObject(const OwningStringOrObject&) = delete;
  OwningStringOrObject& operator=(const OwningStringOrObject&) = delete;
public:
  explicit inline OwningStringOrObject()
    : mType(eUninitialized)
  {
  }

  inline ~OwningStringOrObject()
  {
    Uninit();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyString();

  void
  DestroyObject();
};

class OwningStringOrStringSequence : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringOrStringSequence& aUnion);
  enum Type
  {
    eUninitialized,
    eString,
    eStringSequence
  };

  union Value
  {
    UnionMember<nsString > mString;
    UnionMember<Sequence<nsString> > mStringSequence;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningStringOrStringSequence()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningStringOrStringSequence(const OwningStringOrStringSequence& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningStringOrStringSequence()
  {
    Uninit();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  Sequence<nsString>&
  RawSetAsStringSequence();

  Sequence<nsString>&
  SetAsStringSequence();

  bool
  TrySetToStringSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline Sequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline Sequence<nsString> const &
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningStringOrStringSequence&
  operator=(const OwningStringOrStringSequence& aOther);

private:
  void
  DestroyString();

  void
  DestroyStringSequence();
};

class OwningStringSequenceOrEventInit : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringSequenceOrEventInit& aUnion);
  enum Type
  {
    eUninitialized,
    eStringSequence,
    eEventInit
  };

  union Value
  {
    UnionMember<Sequence<nsString> > mStringSequence;
    UnionMember<EventInit > mEventInit;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningStringSequenceOrEventInit()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningStringSequenceOrEventInit(const OwningStringSequenceOrEventInit& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningStringSequenceOrEventInit()
  {
    Uninit();
  }

  Sequence<nsString>&
  RawSetAsStringSequence();

  Sequence<nsString>&
  SetAsStringSequence();

  bool
  TrySetToStringSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline Sequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline Sequence<nsString> const &
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  EventInit&
  RawSetAsEventInit();

  EventInit&
  SetAsEventInit();

  bool
  TrySetToEventInit(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsEventInit() const
  {
    return mType == eEventInit;
  }

  inline EventInit&
  GetAsEventInit()
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  inline EventInit const &
  GetAsEventInit() const
  {
    do { } while (0);
    return mValue.mEventInit.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningStringSequenceOrEventInit&
  operator=(const OwningStringSequenceOrEventInit& aOther);

private:
  void
  DestroyStringSequence();

  void
  DestroyEventInit();
};

class OwningStringSequenceOrStringStringRecord : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringSequenceOrStringStringRecord& aUnion);
  enum Type
  {
    eUninitialized,
    eStringSequence,
    eStringStringRecord
  };

  union Value
  {
    UnionMember<Sequence<nsString> > mStringSequence;
    UnionMember<Record<nsString, nsString> > mStringStringRecord;

  };

  Type mType;
  Value mValue;

  OwningStringSequenceOrStringStringRecord(const OwningStringSequenceOrStringStringRecord&) = delete;
  OwningStringSequenceOrStringStringRecord& operator=(const OwningStringSequenceOrStringStringRecord&) = delete;
public:
  explicit inline OwningStringSequenceOrStringStringRecord()
    : mType(eUninitialized)
  {
  }

  inline ~OwningStringSequenceOrStringStringRecord()
  {
    Uninit();
  }

  Sequence<nsString>&
  RawSetAsStringSequence();

  Sequence<nsString>&
  SetAsStringSequence();

  bool
  TrySetToStringSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline Sequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline Sequence<nsString> const &
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  Record<nsString, nsString>&
  RawSetAsStringStringRecord();

  Record<nsString, nsString>&
  SetAsStringStringRecord();

  bool
  TrySetToStringStringRecord(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringStringRecord() const
  {
    return mType == eStringStringRecord;
  }

  inline Record<nsString, nsString>&
  GetAsStringStringRecord()
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline Record<nsString, nsString> const &
  GetAsStringStringRecord() const
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyStringSequence();

  void
  DestroyStringStringRecord();
};

class OwningStringStringRecordOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringStringRecordOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eStringStringRecord,
    eString
  };

  union Value
  {
    UnionMember<Record<nsString, nsString> > mStringStringRecord;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

  OwningStringStringRecordOrString(const OwningStringStringRecordOrString&) = delete;
  OwningStringStringRecordOrString& operator=(const OwningStringStringRecordOrString&) = delete;
public:
  explicit inline OwningStringStringRecordOrString()
    : mType(eUninitialized)
  {
  }

  inline ~OwningStringStringRecordOrString()
  {
    Uninit();
  }

  Record<nsString, nsString>&
  RawSetAsStringStringRecord();

  Record<nsString, nsString>&
  SetAsStringStringRecord();

  bool
  TrySetToStringStringRecord(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringStringRecord() const
  {
    return mType == eStringStringRecord;
  }

  inline Record<nsString, nsString>&
  GetAsStringStringRecord()
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline Record<nsString, nsString> const &
  GetAsStringStringRecord() const
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyStringStringRecord();

  void
  DestroyString();
};

class OwningStringStringRecordOrStringSequence : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningStringStringRecordOrStringSequence& aUnion);
  enum Type
  {
    eUninitialized,
    eStringStringRecord,
    eStringSequence
  };

  union Value
  {
    UnionMember<Record<nsString, nsString> > mStringStringRecord;
    UnionMember<Sequence<nsString> > mStringSequence;

  };

  Type mType;
  Value mValue;

  OwningStringStringRecordOrStringSequence(const OwningStringStringRecordOrStringSequence&) = delete;
  OwningStringStringRecordOrStringSequence& operator=(const OwningStringStringRecordOrStringSequence&) = delete;
public:
  explicit inline OwningStringStringRecordOrStringSequence()
    : mType(eUninitialized)
  {
  }

  inline ~OwningStringStringRecordOrStringSequence()
  {
    Uninit();
  }

  Record<nsString, nsString>&
  RawSetAsStringStringRecord();

  Record<nsString, nsString>&
  SetAsStringStringRecord();

  bool
  TrySetToStringStringRecord(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringStringRecord() const
  {
    return mType == eStringStringRecord;
  }

  inline Record<nsString, nsString>&
  GetAsStringStringRecord()
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  inline Record<nsString, nsString> const &
  GetAsStringStringRecord() const
  {
    do { } while (0);
    return mValue.mStringStringRecord.Value();
  }

  Sequence<nsString>&
  RawSetAsStringSequence();

  Sequence<nsString>&
  SetAsStringSequence();

  bool
  TrySetToStringSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsStringSequence() const
  {
    return mType == eStringSequence;
  }

  inline Sequence<nsString>&
  GetAsStringSequence()
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  inline Sequence<nsString> const &
  GetAsStringSequence() const
  {
    do { } while (0);
    return mValue.mStringSequence.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyStringStringRecord();

  void
  DestroyStringSequence();
};

class OwningSupportedTypeOrObject : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningSupportedTypeOrObject& aUnion);
  enum Type
  {
    eUninitialized,
    eSupportedType,
    eObject
  };

  union Value
  {
    UnionMember<SupportedType > mSupportedType;
    UnionMember<JSObject* > mObject;

  };

  Type mType;
  Value mValue;

  OwningSupportedTypeOrObject(const OwningSupportedTypeOrObject&) = delete;
  OwningSupportedTypeOrObject& operator=(const OwningSupportedTypeOrObject&) = delete;
public:
  explicit inline OwningSupportedTypeOrObject()
    : mType(eUninitialized)
  {
  }

  inline ~OwningSupportedTypeOrObject()
  {
    Uninit();
  }

  SupportedType&
  RawSetAsSupportedType();

  SupportedType&
  SetAsSupportedType();

  bool
  TrySetToSupportedType(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsSupportedType() const
  {
    return mType == eSupportedType;
  }

  inline SupportedType&
  GetAsSupportedType()
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  inline SupportedType const &
  GetAsSupportedType() const
  {
    do { } while (0);
    return mValue.mSupportedType.Value();
  }

  JSObject*&
  RawSetAsObject();

  JSObject*&
  SetAsObject();

  inline bool
  SetToObject(JSContext* cx, JSObject* obj, bool passedToJSImpl = false)
  {
    do { } while (0);
    mValue.mObject.SetValue(obj);
    mType = eObject;
    if (passedToJSImpl && !CallerSubsumes(obj)) {
      ThrowErrorMessage(cx, MSG_PERMISSION_DENIED_TO_PASS_ARG, "%s");
      return false;
    }
    return true;
  }

  inline bool
  IsObject() const
  {
    return mType == eObject;
  }

  inline JSObject*&
  GetAsObject()
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  inline JSObject* const &
  GetAsObject() const
  {
    do { } while (0);
    return mValue.mObject.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroySupportedType();

  void
  DestroyObject();
};

class OwningUSVStringOrLong : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningUSVStringOrLong& aUnion);
  enum Type
  {
    eUninitialized,
    eUSVString,
    eLong
  };

  union Value
  {
    UnionMember<nsString > mUSVString;
    UnionMember<int32_t > mLong;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningUSVStringOrLong()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningUSVStringOrLong(const OwningUSVStringOrLong& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningUSVStringOrLong()
  {
    Uninit();
  }

  nsString&
  RawSetAsUSVString();

  nsString&
  SetAsUSVString();

  bool
  TrySetToUSVString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsUSVString().Assign(aData, aLength);
  }

  inline bool
  IsUSVString() const
  {
    return mType == eUSVString;
  }

  inline nsString&
  GetAsUSVString()
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  inline nsString const &
  GetAsUSVString() const
  {
    do { } while (0);
    return mValue.mUSVString.Value();
  }

  int32_t&
  RawSetAsLong();

  int32_t&
  SetAsLong();

  bool
  TrySetToLong(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsLong() const
  {
    return mType == eLong;
  }

  inline int32_t&
  GetAsLong()
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  inline int32_t const &
  GetAsLong() const
  {
    do { } while (0);
    return mValue.mLong.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningUSVStringOrLong&
  operator=(const OwningUSVStringOrLong& aOther);

private:
  void
  DestroyUSVString();

  void
  DestroyLong();
};

class OwningUnrestrictedDoubleOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningUnrestrictedDoubleOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eUnrestrictedDouble,
    eString
  };

  union Value
  {
    UnionMember<double > mUnrestrictedDouble;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningUnrestrictedDoubleOrString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningUnrestrictedDoubleOrString(const OwningUnrestrictedDoubleOrString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningUnrestrictedDoubleOrString()
  {
    Uninit();
  }

  double&
  RawSetAsUnrestrictedDouble();

  double&
  SetAsUnrestrictedDouble();

  bool
  TrySetToUnrestrictedDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsUnrestrictedDouble() const
  {
    return mType == eUnrestrictedDouble;
  }

  inline double&
  GetAsUnrestrictedDouble()
  {
    do { } while (0);
    return mValue.mUnrestrictedDouble.Value();
  }

  inline double const &
  GetAsUnrestrictedDouble() const
  {
    do { } while (0);
    return mValue.mUnrestrictedDouble.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningUnrestrictedDoubleOrString&
  operator=(const OwningUnrestrictedDoubleOrString& aOther);

private:
  void
  DestroyUnrestrictedDouble();

  void
  DestroyString();
};

class OwningUnrestrictedFloatOrString : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningUnrestrictedFloatOrString& aUnion);
  enum Type
  {
    eUninitialized,
    eUnrestrictedFloat,
    eString
  };

  union Value
  {
    UnionMember<float > mUnrestrictedFloat;
    UnionMember<nsString > mString;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningUnrestrictedFloatOrString()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningUnrestrictedFloatOrString(const OwningUnrestrictedFloatOrString& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningUnrestrictedFloatOrString()
  {
    Uninit();
  }

  float&
  RawSetAsUnrestrictedFloat();

  float&
  SetAsUnrestrictedFloat();

  bool
  TrySetToUnrestrictedFloat(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsUnrestrictedFloat() const
  {
    return mType == eUnrestrictedFloat;
  }

  inline float&
  GetAsUnrestrictedFloat()
  {
    do { } while (0);
    return mValue.mUnrestrictedFloat.Value();
  }

  inline float const &
  GetAsUnrestrictedFloat() const
  {
    do { } while (0);
    return mValue.mUnrestrictedFloat.Value();
  }

  nsString&
  RawSetAsString();

  nsString&
  SetAsString();

  bool
  TrySetToString(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline void
  SetStringData(const nsString::char_type* aData, nsString::size_type aLength)
  {
    RawSetAsString().Assign(aData, aLength);
  }

  inline bool
  IsString() const
  {
    return mType == eString;
  }

  inline nsString&
  GetAsString()
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  inline nsString const &
  GetAsString() const
  {
    do { } while (0);
    return mValue.mString.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningUnrestrictedFloatOrString&
  operator=(const OwningUnrestrictedFloatOrString& aOther);

private:
  void
  DestroyUnrestrictedFloat();

  void
  DestroyString();
};
}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h" 2

namespace mozilla {
namespace dom {

class AnimationEffectReadOnly;
struct AnimationEffectReadOnlyAtoms;
struct AnimationEffectTimingPropertiesAtoms;
struct ComputedTimingPropertiesAtoms;
struct NativePropertyHooks;
class OwningUnrestrictedDoubleOrString;
class ProtoAndIfaceCache;
class UnrestrictedDoubleOrString;

}
}

namespace mozilla {
namespace dom {

enum class FillMode : uint8_t {
  None,
  Forwards,
  Backwards,
  Both,
  Auto,
  EndGuard_
};

namespace FillModeValues {
extern const EnumEntry strings[6];
}

bool
ToJSValue(JSContext* aCx, FillMode aArgument, JS::MutableHandle<JS::Value> aValue);


enum class PlaybackDirection : uint8_t {
  Normal,
  Reverse,
  Alternate,
  Alternate_reverse,
  EndGuard_
};

namespace PlaybackDirectionValues {
extern const EnumEntry strings[5];
}

bool
ToJSValue(JSContext* aCx, PlaybackDirection aArgument, JS::MutableHandle<JS::Value> aValue);


struct AnimationEffectTimingProperties : public DictionaryBase
{
                        double mDelay;
                        PlaybackDirection mDirection;
                        OwningUnrestrictedDoubleOrString mDuration;
                        nsString mEasing;
                        double mEndDelay;
                        FillMode mFill;
                        double mIterationStart;
                        double mIterations;

  AnimationEffectTimingProperties();

  explicit inline AnimationEffectTimingProperties(const FastDictionaryInitializer& )
  {

  }

  explicit inline AnimationEffectTimingProperties(const AnimationEffectTimingProperties& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);

  AnimationEffectTimingProperties&
  operator=(const AnimationEffectTimingProperties& aOther);

private:
  static bool
  InitIds(JSContext* cx, AnimationEffectTimingPropertiesAtoms* atomsCache);
};

namespace binding_detail {
struct FastAnimationEffectTimingProperties : public AnimationEffectTimingProperties
{
  inline FastAnimationEffectTimingProperties()
    : AnimationEffectTimingProperties(FastDictionaryInitializer())
  {

  }
};
}


struct ComputedTimingProperties : public AnimationEffectTimingProperties
{
                        double mActiveDuration;
                        Nullable<double> mCurrentIteration;
                        double mEndTime;
                        Nullable<double> mLocalTime;
                        Nullable<double> mProgress;

  ComputedTimingProperties();

  explicit inline ComputedTimingProperties(const FastDictionaryInitializer& )
    : AnimationEffectTimingProperties(FastDictionaryInitializer())
  {

  }

  explicit inline ComputedTimingProperties(const ComputedTimingProperties& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);

  ComputedTimingProperties&
  operator=(const ComputedTimingProperties& aOther);

private:
  static bool
  InitIds(JSContext* cx, ComputedTimingPropertiesAtoms* atomsCache);
};

namespace binding_detail {
struct FastComputedTimingProperties : public ComputedTimingProperties
{
  inline FastComputedTimingProperties()
    : ComputedTimingProperties(FastDictionaryInitializer())
  {

  }
};
}


namespace AnimationEffectReadOnlyBinding {

  typedef mozilla::dom::AnimationEffectReadOnly NativeType;

  bool
  ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj);

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);
# 184 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/AnimationEffectReadOnlyBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JSObject*
  GetProtoObject(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 7 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AnimationPropertySegment.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AnimationPropertySegment.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ComputedTimingFunction.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ComputedTimingFunction.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSMILKeySpline.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsSMILKeySpline.h"
class nsSMILKeySpline
{
public:
  nsSMILKeySpline() { }







  nsSMILKeySpline(double aX1, double aY1,
                  double aX2, double aY2)
  {
    Init(aX1, aY1, aX2, aY2);
  }

  double X1() const { return mX1; }
  double Y1() const { return mY1; }
  double X2() const { return mX2; }
  double Y2() const { return mY2; }

  void Init(double aX1, double aY1,
            double aX2, double aY2);







  double GetSplineValue(double aX) const;

  void GetSplineDerivativeValues(double aX, double& aDX, double& aDY) const;

  bool operator==(const nsSMILKeySpline& aOther) const {
    return mX1 == aOther.mX1 &&
           mY1 == aOther.mY1 &&
           mX2 == aOther.mX2 &&
           mY2 == aOther.mY2;
  }
  bool operator!=(const nsSMILKeySpline& aOther) const {
    return !(*this == aOther);
  }
  int32_t Compare(const nsSMILKeySpline& aRhs) const {
    if (mX1 != aRhs.mX1) return mX1 < aRhs.mX1 ? -1 : 1;
    if (mY1 != aRhs.mY1) return mY1 < aRhs.mY1 ? -1 : 1;
    if (mX2 != aRhs.mX2) return mX2 < aRhs.mX2 ? -1 : 1;
    if (mY2 != aRhs.mY2) return mY2 < aRhs.mY2 ? -1 : 1;
    return 0;
  }

private:
  void
  CalcSampleValues();




  static double
  CalcBezier(double aT, double aA1, double aA2);




  static double
  GetSlope(double aT, double aA1, double aA2);

  double
  GetTForX(double aX) const;

  double
  NewtonRaphsonIterate(double aX, double aGuessT) const;

  double
  BinarySubdivide(double aX, double aA, double aB) const;

  static double
  A(double aA1, double aA2)
  {
    return 1.0 - 3.0 * aA2 + 3.0 * aA1;
  }

  static double
  B(double aA1, double aA2)
  {
    return 3.0 * aA2 - 6.0 * aA1;
  }

  static double
  C(double aA1)
  {
    return 3.0 * aA1;
  }

  double mX1;
  double mY1;
  double mX2;
  double mY2;

  enum { kSplineTableSize = 11 };
  double mSampleValues[kSplineTableSize];

  static const double kSampleStepSize;
};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ComputedTimingFunction.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaObjectID.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaObjectID.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQueryFrame.h" 1
# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQueryFrame.h"
class nsQueryFrame
{
public:
  enum FrameIID {


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameIdList.h" 1




BRFrame_id,
DetailsFrame_id,
nsAutoRepeatBoxFrame_id,
nsBCTableCellFrame_id,
nsBackdropFrame_id,
nsBlockFrame_id,
nsBox_id,
nsBoxFrame_id,
nsBulletFrame_id,
nsButtonBoxFrame_id,
nsCanvasFrame_id,
nsColorControlFrame_id,
nsColumnSetFrame_id,
nsComboboxControlFrame_id,
nsComboboxDisplayFrame_id,
nsContainerFrame_id,
nsContinuingTextFrame_id,
nsDateTimeControlFrame_id,
nsDeckFrame_id,
nsDocElementBoxFrame_id,
nsFieldSetFrame_id,
nsFileControlFrame_id,
nsFirstLetterFrame_id,
nsFirstLineFrame_id,
nsFlexContainerFrame_id,
nsFormControlFrame_id,
nsFrame_id,
nsGfxButtonControlFrame_id,
nsGfxCheckboxControlFrame_id,
nsGfxRadioControlFrame_id,
nsGridContainerFrame_id,
nsGridRowGroupFrame_id,
nsGridRowLeafFrame_id,
nsGroupBoxFrame_id,
nsHTMLButtonControlFrame_id,
nsHTMLCanvasFrame_id,
nsHTMLFramesetBlankFrame_id,
nsHTMLFramesetBorderFrame_id,
nsHTMLFramesetFrame_id,
nsHTMLScrollFrame_id,
nsIAnonymousContentCreator_id,
nsIComboboxControlFrame_id,
nsIFormControlFrame_id,
nsIFrame_id,
nsIFrameFrame_id,
nsIListControlFrame_id,
nsIMathMLFrame_id,
nsIMenuFrame_id,
nsIObjectFrame_id,
nsIPageSequenceFrame_id,
nsIPercentBSizeObserver_id,
nsIRootBox_id,
nsSVGDisplayableFrame_id,
nsISVGSVGFrame_id,
nsIScrollableFrame_id,
nsIScrollbarMediator_id,
nsISelectControlFrame_id,
nsIStatefulFrame_id,
nsITableCellLayout_id,
nsITableLayout_id,
nsITextControlFrame_id,
nsITreeBoxObject_id,
nsImageBoxFrame_id,
nsImageControlFrame_id,
nsImageFrame_id,
nsInlineFrame_id,
nsLeafBoxFrame_id,
nsLeafFrame_id,
nsLegendFrame_id,
nsListBoxBodyFrame_id,
nsListControlFrame_id,
nsListItemFrame_id,
nsMathMLContainerFrame_id,
nsMathMLFrame_id,
nsMathMLmactionFrame_id,
nsMathMLmathBlockFrame_id,
nsMathMLmathInlineFrame_id,
nsMathMLmencloseFrame_id,
nsMathMLmfencedFrame_id,
nsMathMLmfracFrame_id,
nsMathMLmmultiscriptsFrame_id,
nsMathMLmoFrame_id,
nsMathMLmoverFrame_id,
nsMathMLmpaddedFrame_id,
nsMathMLmrootFrame_id,
nsMathMLmrowFrame_id,
nsMathMLmspaceFrame_id,
nsMathMLmsqrtFrame_id,
nsMathMLmstyleFrame_id,
nsMathMLmtableFrame_id,
nsMathMLmtableWrapperFrame_id,
nsMathMLmtdFrame_id,
nsMathMLmtdInnerFrame_id,
nsMathMLmtrFrame_id,
nsMathMLmunderFrame_id,
nsMathMLmunderoverFrame_id,
nsMathMLsemanticsFrame_id,
nsMathMLTokenFrame_id,
nsMenuBarFrame_id,
nsMenuFrame_id,
nsMenuPopupFrame_id,
nsMeterFrame_id,
nsNumberControlFrame_id,
nsPluginFrame_id,
nsPageBreakFrame_id,
nsPageContentFrame_id,
nsPageFrame_id,
nsPlaceholderFrame_id,
nsPopupSetFrame_id,
nsProgressFrame_id,
nsProgressMeterFrame_id,
nsRangeFrame_id,
nsResizerFrame_id,
nsRootBoxFrame_id,
nsRubyBaseContainerFrame_id,
nsRubyBaseFrame_id,
nsRubyContentFrame_id,
nsRubyFrame_id,
nsRubyTextContainerFrame_id,
nsRubyTextFrame_id,
nsScrollbarButtonFrame_id,
nsScrollbarFrame_id,
nsSelectsAreaFrame_id,
nsSimplePageSequenceFrame_id,
nsSliderFrame_id,
nsSplittableFrame_id,
nsSplitterFrame_id,
nsStackFrame_id,
nsSubDocumentFrame_id,
nsSVGAFrame_id,
nsSVGClipPathFrame_id,
nsSVGContainerFrame_id,
nsSVGDisplayContainerFrame_id,
SVGFEContainerFrame_id,
SVGFEImageFrame_id,
SVGFELeafFrame_id,
SVGFEUnstyledLeafFrame_id,
nsSVGFilterFrame_id,
nsSVGForeignObjectFrame_id,
nsSVGGenericContainerFrame_id,
nsSVGGFrame_id,
nsSVGGradientFrame_id,
nsSVGImageFrame_id,
nsSVGInnerSVGFrame_id,
nsSVGLinearGradientFrame_id,
nsSVGMarkerFrame_id,
nsSVGMarkerAnonChildFrame_id,
nsSVGMaskFrame_id,
nsSVGOuterSVGFrame_id,
nsSVGOuterSVGAnonChildFrame_id,
nsSVGPaintServerFrame_id,
SVGGeometryFrame_id,
nsSVGPatternFrame_id,
nsSVGRadialGradientFrame_id,
nsSVGStopFrame_id,
nsSVGSwitchFrame_id,
SVGTextFrame_id,
nsSVGUseFrame_id,
SVGViewFrame_id,
nsTableCellFrame_id,
nsTableColFrame_id,
nsTableColGroupFrame_id,
nsTableFrame_id,
nsTableWrapperFrame_id,
nsTableRowFrame_id,
nsTableRowGroupFrame_id,
nsTextBoxFrame_id,
nsTextControlFrame_id,
nsTextFrame_id,
nsTitleBarFrame_id,
nsTreeBodyFrame_id,
nsTreeColFrame_id,
nsVideoFrame_id,
nsXULLabelFrame_id,
nsXULScrollFrame_id,
ViewportFrame_id,
# 63 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsQueryFrame.h" 2








    NON_FRAME_MARKER = 0x20000000
  };

  virtual void* QueryFrame(FrameIID id) = 0;
};

class do_QueryFrame
{
public:
  explicit do_QueryFrame(nsQueryFrame *s) : mRawPtr(s) { }



  typedef void (do_QueryFrame::* MatchNullptr)(double, float);

               do_QueryFrame(MatchNullptr aRawPtr) : mRawPtr(nullptr) {}

  template<class Dest>
  operator Dest*() {
    static_assert(mozilla::IsSame<Dest, typename Dest::Has_NS_DECL_QUERYFRAME_TARGET>::value,
                  "Dest must declare itself as a queryframe target");
    if (!mRawPtr)
      return nullptr;

    return reinterpret_cast<Dest*>(mRawPtr->QueryFrame(Dest::kFrameIID));
  }

private:
  nsQueryFrame *mRawPtr;
};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaObjectID.h" 2

namespace mozilla {

enum ArenaObjectID {
  eArenaObjectID_DummyBeforeFirstObjectID = nsQueryFrame::NON_FRAME_MARKER - 1,




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArenaObjectList.h" 1
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArenaObjectList.h"
eArenaObjectID_nsLineBox,
eArenaObjectID_nsRuleNode,
eArenaObjectID_nsStyleContext,
eArenaObjectID_nsInheritedStyleData,
eArenaObjectID_nsResetStyleData,
eArenaObjectID_nsConditionalResetStyleData,
eArenaObjectID_nsConditionalResetStyleDataEntry,
eArenaObjectID_nsFrameList,
eArenaObjectID_CustomCounterStyle,
eArenaObjectID_DependentBuiltinCounterStyle,




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h" 1
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h"
eArenaObjectID_nsStyleFont,



eArenaObjectID_nsStyleColor,


eArenaObjectID_nsStyleList,




eArenaObjectID_nsStyleText,





eArenaObjectID_nsStyleVisibility,


eArenaObjectID_nsStyleUserInterface,


eArenaObjectID_nsStyleTableBorder,




eArenaObjectID_nsStyleSVG,





eArenaObjectID_nsStyleVariables,

eArenaObjectID_nsStyleBackground,





eArenaObjectID_nsStylePosition,




eArenaObjectID_nsStyleTextReset,





eArenaObjectID_nsStyleDisplay,




eArenaObjectID_nsStyleContent,




eArenaObjectID_nsStyleUIReset,


eArenaObjectID_nsStyleTable,


eArenaObjectID_nsStyleMargin,




eArenaObjectID_nsStylePadding,




eArenaObjectID_nsStyleBorder,





eArenaObjectID_nsStyleOutline,





eArenaObjectID_nsStyleXUL,


eArenaObjectID_nsStyleSVGReset,





eArenaObjectID_nsStyleColumn,





eArenaObjectID_nsStyleEffects,
# 62 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArenaObjectList.h" 2
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaObjectID.h" 2
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaObjectID.h"
  eArenaObjectID_NON_OBJECT_MARKER = 0x40000000
};

};
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSVariableValues.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSVariableValues.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSScanner.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSScanner.h"
namespace mozilla {
namespace css {
class ErrorReporter;
}
}







enum nsCSSTokenType {



  eCSSToken_Whitespace,

  eCSSToken_Comment,






  eCSSToken_Ident,
  eCSSToken_Function,
  eCSSToken_AtKeyword,
  eCSSToken_ID,
  eCSSToken_Hash,
# 54 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSScanner.h"
  eCSSToken_Number,
  eCSSToken_Dimension,
  eCSSToken_Percentage,






  eCSSToken_String,
  eCSSToken_Bad_String,
  eCSSToken_URL,
  eCSSToken_Bad_URL,


  eCSSToken_Symbol,





  eCSSToken_Includes,
  eCSSToken_Dashmatch,
  eCSSToken_Beginsmatch,
  eCSSToken_Endsmatch,
  eCSSToken_Containsmatch,
# 89 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSScanner.h"
  eCSSToken_URange,







  eCSSToken_HTMLComment,
};
# 108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSScanner.h"
enum nsCSSTokenSerializationType {
  eCSSTokenSerialization_Nothing,
  eCSSTokenSerialization_Whitespace,
  eCSSTokenSerialization_AtKeyword_or_Hash,
  eCSSTokenSerialization_Number,
  eCSSTokenSerialization_Dimension,
  eCSSTokenSerialization_Percentage,
  eCSSTokenSerialization_URange,
  eCSSTokenSerialization_URL_or_BadURL,
  eCSSTokenSerialization_Function,
  eCSSTokenSerialization_Ident,
  eCSSTokenSerialization_CDC,
  eCSSTokenSerialization_DashMatch,
  eCSSTokenSerialization_ContainsMatch,
  eCSSTokenSerialization_Symbol_Hash,
  eCSSTokenSerialization_Symbol_At,
  eCSSTokenSerialization_Symbol_Dot_or_Plus,
  eCSSTokenSerialization_Symbol_Minus,
  eCSSTokenSerialization_Symbol_OpenParen,
  eCSSTokenSerialization_Symbol_Question,
  eCSSTokenSerialization_Symbol_Assorted,
  eCSSTokenSerialization_Symbol_Equals,
  eCSSTokenSerialization_Symbol_Bar,
  eCSSTokenSerialization_Symbol_Slash,
  eCSSTokenSerialization_Symbol_Asterisk,
  eCSSTokenSerialization_Other
};




struct nsCSSToken {
  nsAutoString mIdent;
  float mNumber;
  int32_t mInteger;
  int32_t mInteger2;
  nsCSSTokenType mType;
  char16_t mSymbol;
  bool mIntegerValid;
  bool mHasSign;

  nsCSSToken()
    : mNumber(0), mInteger(0), mInteger2(0), mType(eCSSToken_Whitespace),
      mSymbol('\0'), mIntegerValid(false), mHasSign(false)
  {}

  bool IsSymbol(char16_t aSymbol) const {
    return mType == eCSSToken_Symbol && mSymbol == aSymbol;
  }

  void AppendToString(nsString& aBuffer) const;
};


class nsCSSScannerPosition {
  friend class nsCSSScanner;
public:
  nsCSSScannerPosition() : mInitialized(false) { }

  uint32_t LineNumber() {
    do { } while (0);
    return mLineNumber;
  }

  uint32_t LineOffset() {
    do { } while (0);
    return mLineOffset;
  }

private:
  uint32_t mOffset;
  uint32_t mLineNumber;
  uint32_t mLineOffset;
  uint32_t mTokenLineNumber;
  uint32_t mTokenLineOffset;
  uint32_t mTokenOffset;
  bool mInitialized;
};

enum nsCSSScannerExclude {

  eCSSScannerExclude_None,

  eCSSScannerExclude_Comments,

  eCSSScannerExclude_WhitespaceAndComments
};




class nsCSSScanner {
  public:




  nsCSSScanner(const nsAString& aBuffer, uint32_t aLineNumber);
  ~nsCSSScanner();

  void SetErrorReporter(mozilla::css::ErrorReporter* aReporter) {
    mReporter = aReporter;
  }


  void ClearSeenBadToken() { mSeenBadToken = false; }
  bool SeenBadToken() const { return mSeenBadToken; }


  void ClearSeenVariableReference() { mSeenVariableReference = false; }
  bool SeenVariableReference() const { return mSeenVariableReference; }



  uint32_t GetLineNumber() const { return mTokenLineNumber; }



  uint32_t GetColumnNumber() const
  { return mTokenOffset - mTokenLineOffset; }

  uint32_t GetTokenOffset() const
  { return mTokenOffset; }

  uint32_t GetTokenEndOffset() const
  { return mOffset; }



  nsDependentSubstring GetCurrentLine() const;




  bool Next(nsCSSToken& aTokenResult, nsCSSScannerExclude aSkip);






  void NextURL(nsCSSToken& aTokenResult);
# 258 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSScanner.h"
  void Backup(uint32_t n);


  void StartRecording();


  void StopRecording();



  void StopRecording(nsString& aBuffer);


  uint32_t RecordingLength() const;






  void SavePosition(nsCSSScannerPosition& aState);


  void RestoreSavedPosition(const nsCSSScannerPosition& aState);

  enum EOFCharacters {
    eEOFCharacters_None = 0x0000,


    eEOFCharacters_DropBackslash = 0x0001,


    eEOFCharacters_ReplacementChar = 0x0002,


    eEOFCharacters_Asterisk = 0x0004,
    eEOFCharacters_Slash = 0x0008,


    eEOFCharacters_DoubleQuote = 0x0010,


    eEOFCharacters_SingleQuote = 0x0020,


    eEOFCharacters_CloseParen = 0x0040,
  };





  static void AppendImpliedEOFCharacters(EOFCharacters aEOFCharacters,
                                         nsAString& aString);

  EOFCharacters GetEOFCharacters() const {



    return mEOFCharacters;
  }





protected:
  int32_t Peek(uint32_t n = 0);
  void Advance(uint32_t n = 1);
  void AdvanceLine();

  void SkipWhitespace();
  void SkipComment();

  bool GatherEscape(nsString& aOutput, bool aInString);
  bool GatherText(uint8_t aClass, nsString& aIdent);

  bool ScanIdent(nsCSSToken& aResult);
  bool ScanAtKeyword(nsCSSToken& aResult);
  bool ScanHash(nsCSSToken& aResult);
  bool ScanNumber(nsCSSToken& aResult);
  bool ScanString(nsCSSToken& aResult);
  bool ScanURange(nsCSSToken& aResult);

  void SetEOFCharacters(uint32_t aEOFCharacters);
  void AddEOFCharacters(uint32_t aEOFCharacters);

  const char16_t *mBuffer;
  uint32_t mOffset;
  uint32_t mCount;

  uint32_t mLineNumber;
  uint32_t mLineOffset;

  uint32_t mTokenLineNumber;
  uint32_t mTokenLineOffset;
  uint32_t mTokenOffset;

  uint32_t mRecordStartOffset;
  EOFCharacters mEOFCharacters;

  mozilla::css::ErrorReporter *mReporter;

  bool mRecording;
  bool mSeenBadToken;
  bool mSeenVariableReference;
};



struct nsCSSGridTemplateAreaToken {
  nsAutoString mName;
  bool isTrash;
};


class nsCSSGridTemplateAreaScanner {
public:
  explicit nsCSSGridTemplateAreaScanner(const nsAString& aBuffer);



  bool Next(nsCSSGridTemplateAreaToken& aTokenResult);

private:
  const char16_t *mBuffer;
  uint32_t mOffset;
  uint32_t mCount;
};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSVariableValues.h" 2



namespace mozilla {

class CSSVariableResolver;

class CSSVariableValues
{
public:
  CSSVariableValues();
  CSSVariableValues(const CSSVariableValues& aOther);



  CSSVariableValues& operator=(const CSSVariableValues& aOther);

  bool operator==(const CSSVariableValues& aOther) const;
  bool operator!=(const CSSVariableValues& aOther) const
    { return !(*this == aOther); }
# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSVariableValues.h"
  bool Get(const nsAString& aName, nsString& aValue) const;
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSVariableValues.h"
  bool Get(const nsAString& aName,
           nsString& aValue,
           nsCSSTokenSerializationType& aFirstToken,
           nsCSSTokenSerializationType& aLastToken) const;
# 77 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSVariableValues.h"
  void GetVariableAt(size_t aIndex, nsAString& aName) const;




  size_t Count() const;
# 93 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/CSSVariableValues.h"
  void Put(const nsAString& aName,
           nsString aValue,
           nsCSSTokenSerializationType aFirstToken,
           nsCSSTokenSerializationType aLastToken);





  void AddVariablesToResolver(CSSVariableResolver* aResolver) const;

private:
  struct Variable
  {
    Variable()
      : mFirstToken(eCSSTokenSerialization_Nothing)
      , mLastToken(eCSSTokenSerialization_Nothing)
    {}

    Variable(const nsAString& aVariableName,
             nsString aValue,
             nsCSSTokenSerializationType aFirstToken,
             nsCSSTokenSerializationType aLastToken)
      : mVariableName(aVariableName)
      , mValue(aValue)
      , mFirstToken(aFirstToken)
      , mLastToken(aLastToken)
    {}

    nsString mVariableName;
    nsString mValue;
    nsCSSTokenSerializationType mFirstToken;
    nsCSSTokenSerializationType mLastToken;
  };




  void CopyVariablesFrom(const CSSVariableValues& aOther);





  nsDataHashtable<nsStringHashKey, size_t> mVariableIDs;




  nsTArray<Variable> mVariables;
};

}
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SheetType.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SheetType.h"
namespace mozilla {






enum class SheetType : uint8_t {
  Agent,
  User,
  PresHint,
  Doc,
  ScopedDoc,
  StyleAttr,
  Override,
  Animation,
  Transition,

  Count,
  Unknown = 0xff
};

}
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPtr.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPtr.h"
namespace mozilla {
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPtr.h"
template<class T>
class StaticAutoPtr
{
public:
# 52 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPtr.h"
  StaticAutoPtr<T>& operator=(T* aRhs)
  {
    Assign(aRhs);
    return *this;
  }

  T* get() const { return mRawPtr; }

  operator T*() const { return get(); }

  T* operator->() const
  {
    do { } while (0);
    return get();
  }

  T& operator*() const { return *get(); }

private:
# 79 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPtr.h"
  void Assign(T* aNewPtr)
  {
    do { } while (0);
    T* oldPtr = mRawPtr;
    mRawPtr = aNewPtr;
    delete oldPtr;
  }

  T* mRawPtr;
};

template<class T>
class StaticRefPtr
{
public:
# 104 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPtr.h"
  StaticRefPtr<T>& operator=(T* aRhs)
  {
    AssignWithAddref(aRhs);
    return *this;
  }

  StaticRefPtr<T>& operator=(const StaticRefPtr<T>& aRhs)
  {
    return (this = aRhs.mRawPtr);
  }

  StaticRefPtr<T>& operator=(already_AddRefed<T>& aRhs)
  {
    AssignAssumingAddRef(aRhs.take());
    return *this;
  }

  StaticRefPtr<T>& operator=(already_AddRefed<T>&& aRhs)
  {
    AssignAssumingAddRef(aRhs.take());
    return *this;
  }

  already_AddRefed<T>
  forget()
  {
    T* temp = mRawPtr;
    mRawPtr = nullptr;
    return already_AddRefed<T>(temp);
  }

  T* get() const { return mRawPtr; }

  operator T*() const { return get(); }

  T* operator->() const
  {
    do { } while (0);
    return get();
  }

  T& operator*() const { return *get(); }

private:
  void AssignWithAddref(T* aNewPtr)
  {
    if (aNewPtr) {
      aNewPtr->AddRef();
    }
    AssignAssumingAddRef(aNewPtr);
  }

  void AssignAssumingAddRef(T* aNewPtr)
  {
    T* oldPtr = mRawPtr;
    mRawPtr = aNewPtr;
    if (oldPtr) {
      oldPtr->Release();
    }
  }

  T* mRawPtr;
};

namespace StaticPtr_internal {
class Zero;
}
# 203 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPtr.h"
template<class T, class U>
inline bool
operator==(const StaticAutoPtr<T>& aLhs, const StaticAutoPtr<U>& aRhs)
{
  return aLhs.get() == aRhs.get();
}

template<class T, class U>
inline bool
operator!=(const StaticAutoPtr<T>& aLhs, const StaticAutoPtr<U>& aRhs)
{
  return !(aLhs == aRhs);
}

template<class T, class U> inline bool operator==(const StaticAutoPtr<T>& lhs, const U* rhs) { return lhs.get() == rhs; } template<class T, class U> inline bool operator==(const U* lhs, const StaticAutoPtr<T>& rhs) { return rhs == lhs; } template<class T, class U> inline bool operator!=(const StaticAutoPtr<T>& lhs, const U* rhs) { return !(lhs == rhs); } template<class T, class U> inline bool operator!=(const U* lhs, const StaticAutoPtr<T>& rhs) { return !(lhs == rhs); }


template<class T, class U> inline bool operator==(const StaticAutoPtr<T>& lhs, U* rhs) { return lhs.get() == rhs; } template<class T, class U> inline bool operator==(U* lhs, const StaticAutoPtr<T>& rhs) { return rhs == lhs; } template<class T, class U> inline bool operator!=(const StaticAutoPtr<T>& lhs, U* rhs) { return !(lhs == rhs); } template<class T, class U> inline bool operator!=(U* lhs, const StaticAutoPtr<T>& rhs) { return !(lhs == rhs); }



template<class T> inline bool operator==(const StaticAutoPtr<T>& lhs, StaticPtr_internal::Zero* rhs) { return lhs.get() == nullptr; } template<class T> inline bool operator==(StaticPtr_internal::Zero* lhs, const StaticAutoPtr<T>& rhs) { return rhs == lhs; } template<class T> inline bool operator!=(const StaticAutoPtr<T>& lhs, StaticPtr_internal::Zero* rhs) { return !(lhs == rhs); } template<class T> inline bool operator!=(StaticPtr_internal::Zero* lhs, const StaticAutoPtr<T>& rhs) { return !(lhs == rhs); }




template<class T, class U>
inline bool
operator==(const StaticRefPtr<T>& aLhs, const StaticRefPtr<U>& aRhs)
{
  return aLhs.get() == aRhs.get();
}

template<class T, class U>
inline bool
operator!=(const StaticRefPtr<T>& aLhs, const StaticRefPtr<U>& aRhs)
{
  return !(aLhs == aRhs);
}

template<class T, class U> inline bool operator==(const StaticRefPtr<T>& lhs, const U* rhs) { return lhs.get() == rhs; } template<class T, class U> inline bool operator==(const U* lhs, const StaticRefPtr<T>& rhs) { return rhs == lhs; } template<class T, class U> inline bool operator!=(const StaticRefPtr<T>& lhs, const U* rhs) { return !(lhs == rhs); } template<class T, class U> inline bool operator!=(const U* lhs, const StaticRefPtr<T>& rhs) { return !(lhs == rhs); }


template<class T, class U> inline bool operator==(const StaticRefPtr<T>& lhs, U* rhs) { return lhs.get() == rhs; } template<class T, class U> inline bool operator==(U* lhs, const StaticRefPtr<T>& rhs) { return rhs == lhs; } template<class T, class U> inline bool operator!=(const StaticRefPtr<T>& lhs, U* rhs) { return !(lhs == rhs); } template<class T, class U> inline bool operator!=(U* lhs, const StaticRefPtr<T>& rhs) { return !(lhs == rhs); }



template<class T> inline bool operator==(const StaticRefPtr<T>& lhs, StaticPtr_internal::Zero* rhs) { return lhs.get() == nullptr; } template<class T> inline bool operator==(StaticPtr_internal::Zero* lhs, const StaticRefPtr<T>& rhs) { return rhs == lhs; } template<class T> inline bool operator!=(const StaticRefPtr<T>& lhs, StaticPtr_internal::Zero* rhs) { return !(lhs == rhs); } template<class T> inline bool operator!=(StaticPtr_internal::Zero* lhs, const StaticRefPtr<T>& rhs) { return !(lhs == rhs); }




}


template<class T> template<class U>
RefPtr<T>::RefPtr(const mozilla::StaticRefPtr<U>& aOther)
  : RefPtr(aOther.get())
{}

template<class T> template<class U>
RefPtr<T>&
RefPtr<T>::operator=(const mozilla::StaticRefPtr<U>& aOther)
{
  return operator=(aOther.get());
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleComplexColor.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleComplexColor.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h" 1








# 1 "/usr/local/bin/../lib/clang/3.9.1/include/stddef.h" 1 3
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h" 2




class nsAString;
class nsString;



typedef uint32_t nscolor;
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h"
namespace mozilla {

template<typename T>
inline uint8_t ClampColor(T aColor)
{
  if (aColor >= 255) {
    return 255;
  }
  if (aColor <= 0) {
    return 0;
  }
  return NSToIntRound(aColor);
}

}
# 65 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsColor.h"
enum class nsHexColorType : uint8_t {
  NoAlpha,
  AllowAlpha,
};




bool
NS_HexToRGBA(const nsAString& aBuf, nsHexColorType aType, nscolor* aResult);



nscolor NS_ComposeColors(nscolor aBG, nscolor aFG);

namespace mozilla {

inline uint32_t RoundingDivideBy255(uint32_t n)
{



  return (n + 127) / 255;
}



nscolor LinearBlendColors(nscolor aBg, nscolor aFg, uint_fast8_t aFgRatio);

}




bool NS_LooseHexToRGB(const nsString& aBuf, nscolor* aResult);






bool NS_ColorNameToRGB(const nsAString& aBuf, nscolor* aResult);



const char * const * NS_AllColorNames(size_t *aSizeArray);



nscolor NS_HSL2RGB(float h, float s, float l);






const char* NS_RGBToColorName(nscolor aColor);
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleComplexColor.h" 2

namespace mozilla {
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleComplexColor.h"
struct StyleComplexColor
{
  nscolor mColor;
  uint8_t mForegroundRatio;




  bool mIsAuto;

  static StyleComplexColor FromColor(nscolor aColor) {
    return {aColor, 0, false};
  }
  static StyleComplexColor CurrentColor() {
    return {((nscolor) (((0) << 24) | ((0)<<16) | ((0)<<8) | (0))), 255, false};
  }
  static StyleComplexColor Auto() {
    return {((nscolor) (((0) << 24) | ((0)<<16) | ((0)<<8) | (0))), 255, true};
  }

  bool IsNumericColor() const { return mForegroundRatio == 0; }
  bool IsCurrentColor() const { return mForegroundRatio == 255; }

  bool operator==(const StyleComplexColor& aOther) const {
    return mForegroundRatio == aOther.mForegroundRatio &&
           (IsCurrentColor() || mColor == aOther.mColor) &&
           mIsAuto == aOther.mIsAuto;
  }
  bool operator!=(const StyleComplexColor& aOther) const {
    return !(*this == aOther);
  }
};

}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFont.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFont.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontFamilyList.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontFamilyList.h"
namespace mozilla {







enum FontFamilyType : uint32_t {
  eFamily_none = 0,


  eFamily_named,
  eFamily_named_quoted,


  eFamily_serif,
  eFamily_sans_serif,
  eFamily_monospace,
  eFamily_cursive,
  eFamily_fantasy,


  eFamily_moz_variable,
  eFamily_moz_fixed,

  eFamily_generic_first = eFamily_serif,
  eFamily_generic_last = eFamily_fantasy,
  eFamily_generic_count = (eFamily_fantasy - eFamily_serif + 1)
};

enum QuotedName { eQuotedName, eUnquotedName };






struct FontFamilyName final {
    FontFamilyName()
        : mType(eFamily_named)
    {}


    explicit FontFamilyName(const nsAString& aFamilyName,
                            QuotedName aQuoted = eUnquotedName) {
        mType = (aQuoted == eQuotedName) ? eFamily_named_quoted : eFamily_named;
        mName = aFamilyName;
    }


    explicit FontFamilyName(FontFamilyType aType) {
        do { } while(0);



        mName.Truncate();
        mType = aType;
    }

    FontFamilyName(const FontFamilyName& aCopy) {
        mType = aCopy.mType;
        mName = aCopy.mName;
    }

    bool IsNamed() const {
        return mType == eFamily_named || mType == eFamily_named_quoted;
    }

    bool IsGeneric() const {
        return !IsNamed();
    }

    void AppendToString(nsAString& aFamilyList, bool aQuotes = true) const {
        switch (mType) {
            case eFamily_named:
                aFamilyList.Append(mName);
                break;
            case eFamily_named_quoted:
                if (aQuotes) {
                    aFamilyList.Append('"');
                }
                aFamilyList.Append(mName);
                if (aQuotes) {
                    aFamilyList.Append('"');
                }
                break;
            case eFamily_serif:
                aFamilyList.AppendLiteral("serif");
                break;
            case eFamily_sans_serif:
                aFamilyList.AppendLiteral("sans-serif");
                break;
            case eFamily_monospace:
                aFamilyList.AppendLiteral("monospace");
                break;
            case eFamily_cursive:
                aFamilyList.AppendLiteral("cursive");
                break;
            case eFamily_fantasy:
                aFamilyList.AppendLiteral("fantasy");
                break;
            case eFamily_moz_fixed:
                aFamilyList.AppendLiteral("-moz-fixed");
                break;
            default:
                break;
        }
    }


    static FontFamilyName
    Convert(const nsAString& aFamilyOrGenericName) {



        do { } while(0);


        FontFamilyType genericType = eFamily_none;
        if (aFamilyOrGenericName.LowerCaseEqualsLiteral("serif")) {
            genericType = eFamily_serif;
        } else if (aFamilyOrGenericName.LowerCaseEqualsLiteral("sans-serif")) {
            genericType = eFamily_sans_serif;
        } else if (aFamilyOrGenericName.LowerCaseEqualsLiteral("monospace")) {
            genericType = eFamily_monospace;
        } else if (aFamilyOrGenericName.LowerCaseEqualsLiteral("cursive")) {
            genericType = eFamily_cursive;
        } else if (aFamilyOrGenericName.LowerCaseEqualsLiteral("fantasy")) {
            genericType = eFamily_fantasy;
        } else if (aFamilyOrGenericName.LowerCaseEqualsLiteral("-moz-fixed")) {
            genericType = eFamily_moz_fixed;
        } else {
            return FontFamilyName(aFamilyOrGenericName, eUnquotedName);
        }

        return FontFamilyName(genericType);
    }


    size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
        return mName.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
    }

    FontFamilyType mType;
    nsString mName;
};

inline bool
operator==(const FontFamilyName& a, const FontFamilyName& b) {
    return a.mType == b.mType && a.mName == b.mName;
}







class FontFamilyList {
public:
    FontFamilyList()
        : mDefaultFontType(eFamily_none)
    {
    }

    explicit FontFamilyList(FontFamilyType aGenericType)
        : mDefaultFontType(eFamily_none)
    {
        Append(FontFamilyName(aGenericType));
    }

    FontFamilyList(const nsAString& aFamilyName,
                   QuotedName aQuoted)
        : mDefaultFontType(eFamily_none)
    {
        Append(FontFamilyName(aFamilyName, aQuoted));
    }

    FontFamilyList(const FontFamilyList& aOther)
        : mFontlist(aOther.mFontlist)
        , mDefaultFontType(aOther.mDefaultFontType)
    {
    }

    void Append(const FontFamilyName& aFamilyName) {
        mFontlist.AppendElement(aFamilyName);
    }

    void Append(const nsTArray<nsString>& aFamilyNameList) {
        uint32_t len = aFamilyNameList.Length();
        for (uint32_t i = 0; i < len; i++) {
            mFontlist.AppendElement(FontFamilyName(aFamilyNameList[i],
                                                   eUnquotedName));
        }
    }

    void Clear() {
        mFontlist.Clear();
    }

    uint32_t Length() const {
        return mFontlist.Length();
    }

    bool IsEmpty() const {
      return mFontlist.IsEmpty();
    }

    const nsTArray<FontFamilyName>& GetFontlist() const {
        return mFontlist;
    }

    bool Equals(const FontFamilyList& aFontlist) const {
        return mFontlist == aFontlist.mFontlist &&
               mDefaultFontType == aFontlist.mDefaultFontType;
    }

    FontFamilyType FirstGeneric() const {
        uint32_t len = mFontlist.Length();
        for (uint32_t i = 0; i < len; i++) {
            const FontFamilyName& name = mFontlist[i];
            if (name.IsGeneric()) {
                return name.mType;
            }
        }
        return eFamily_none;
    }

    bool HasGeneric() const {
        return FirstGeneric() != eFamily_none;
    }

    bool HasDefaultGeneric() const {
        uint32_t len = mFontlist.Length();
        for (uint32_t i = 0; i < len; i++) {
            const FontFamilyName& name = mFontlist[i];
            if (name.mType == mDefaultFontType) {
                return true;
            }
        }
        return false;
    }




    bool PrioritizeFirstGeneric() {
        uint32_t len = mFontlist.Length();
        for (uint32_t i = 0; i < len; i++) {
            const FontFamilyName name = mFontlist[i];
            if (name.IsGeneric()) {
                if (name.mType == eFamily_cursive ||
                    name.mType == eFamily_fantasy) {
                    continue;
                }
                if (i > 0) {
                    mFontlist.RemoveElementAt(i);
                    mFontlist.InsertElementAt(0, name);
                }
                return true;
            }
        }
        return false;
    }

    void PrependGeneric(FontFamilyType aType) {
        mFontlist.InsertElementAt(0, FontFamilyName(aType));
    }

    void ToString(nsAString& aFamilyList,
                  bool aQuotes = true,
                  bool aIncludeDefault = false) const {
        aFamilyList.Truncate();
        uint32_t len = mFontlist.Length();
        for (uint32_t i = 0; i < len; i++) {
            if (i != 0) {
                aFamilyList.Append(',');
            }
            const FontFamilyName& name = mFontlist[i];
            name.AppendToString(aFamilyList, aQuotes);
        }
        if (aIncludeDefault && mDefaultFontType != eFamily_none) {
            if (!aFamilyList.IsEmpty()) {
                aFamilyList.Append(',');
            }
            if (mDefaultFontType == eFamily_serif) {
                aFamilyList.AppendLiteral("serif");
            } else {
                aFamilyList.AppendLiteral("sans-serif");
            }
        }
    }


    bool Contains(const nsAString& aFamilyName) const {
        uint32_t len = mFontlist.Length();
        nsAutoString fam(aFamilyName);
        ToLowerCase(fam);
        for (uint32_t i = 0; i < len; i++) {
            const FontFamilyName& name = mFontlist[i];
            if (name.mType != eFamily_named &&
                name.mType != eFamily_named_quoted) {
                continue;
            }
            nsAutoString listname(name.mName);
            ToLowerCase(listname);
            if (listname.Equals(fam)) {
                return true;
            }
        }
        return false;
    }

    FontFamilyType GetDefaultFontType() const { return mDefaultFontType; }
    void SetDefaultFontType(FontFamilyType aType) {
        do { } while(0);


        mDefaultFontType = aType;
    }


    size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
        size_t n = 0;
        n += mFontlist.ShallowSizeOfExcludingThis(aMallocSizeOf);
        for (size_t i = 0; i < mFontlist.Length(); i++) {
            n += mFontlist[i].SizeOfExcludingThis(aMallocSizeOf);
        }
        return n;
    }

    size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
        return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
    }

private:
    nsTArray<FontFamilyName> mFontlist;
    FontFamilyType mDefaultFontType;
};

inline bool
operator==(const FontFamilyList& a, const FontFamilyList& b) {
    return a.Equals(b);
}

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFont.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontFeatures.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontFeatures.h"
struct gfxFontFeature {
    uint32_t mTag;
    uint32_t mValue;

};

inline bool
operator<(const gfxFontFeature& a, const gfxFontFeature& b)
{
    return (a.mTag < b.mTag) || ((a.mTag == b.mTag) && (a.mValue < b.mValue));
}

inline bool
operator==(const gfxFontFeature& a, const gfxFontFeature& b)
{
    return (a.mTag == b.mTag) && (a.mValue == b.mValue);
}

struct gfxAlternateValue {
    uint32_t alternate;
    nsString value;
};

inline bool
operator<(const gfxAlternateValue& a, const gfxAlternateValue& b)
{
    return (a.alternate < b.alternate) ||
        ((a.alternate == b.alternate) && (a.value < b.value));
}

inline bool
operator==(const gfxAlternateValue& a, const gfxAlternateValue& b)
{
    return (a.alternate == b.alternate) && (a.value == b.value);
}

class gfxFontFeatureValueSet final {
public:
    public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<gfxFontFeatureValueSet>::value, "Reference-counted class " "gfxFontFeatureValueSet" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

    gfxFontFeatureValueSet();

    struct ValueList {
        ValueList(const nsAString& aName, const nsTArray<uint32_t>& aSelectors)
          : name(aName), featureSelectors(aSelectors)
        {}
        nsString name;
        nsTArray<uint32_t> featureSelectors;
    };

    struct FeatureValues {
        uint32_t alternate;
        nsTArray<ValueList> valuelist;
    };


    bool
    GetFontFeatureValuesFor(const nsAString& aFamily,
                            uint32_t aVariantProperty,
                            const nsAString& aName,
                            nsTArray<uint32_t>& aValues);
    void
    AddFontFeatureValues(const nsAString& aFamily,
                const nsTArray<gfxFontFeatureValueSet::FeatureValues>& aValues);

private:

    ~gfxFontFeatureValueSet() {}

    struct FeatureValueHashKey {
        nsString mFamily;
        uint32_t mPropVal;
        nsString mName;

        FeatureValueHashKey()
            : mPropVal(0)
        { }
        FeatureValueHashKey(const nsAString& aFamily,
                            uint32_t aPropVal,
                            const nsAString& aName)
            : mFamily(aFamily), mPropVal(aPropVal), mName(aName)
        { }
        FeatureValueHashKey(const FeatureValueHashKey& aKey)
            : mFamily(aKey.mFamily), mPropVal(aKey.mPropVal), mName(aKey.mName)
        { }
    };

    class FeatureValueHashEntry : public PLDHashEntryHdr {
    public:
        typedef const FeatureValueHashKey &KeyType;
        typedef const FeatureValueHashKey *KeyTypePointer;

        explicit FeatureValueHashEntry(KeyTypePointer aKey) { }
        FeatureValueHashEntry(const FeatureValueHashEntry& toCopy)
        {
            do { } while(0);
        }
        ~FeatureValueHashEntry() { }

        bool KeyEquals(const KeyTypePointer aKey) const;
        static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
        static PLDHashNumber HashKey(const KeyTypePointer aKey);
        enum { ALLOW_MEMMOVE = true };

        FeatureValueHashKey mKey;
        nsTArray<uint32_t> mValues;
    };

    nsTHashtable<FeatureValueHashEntry> mFontFeatureValues;
  };
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFont.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontVariations.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxFontVariations.h"
struct gfxFontVariation {
    uint32_t mTag;
    float mValue;
};

inline bool
operator==(const gfxFontVariation& a, const gfxFontVariation& b)
{
    return (a.mTag == b.mTag) && (a.mValue == b.mValue);
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFont.h" 2






struct gfxFontStyle;





typedef bool (*nsFontFamilyEnumFunc)(const nsString& aFamily, bool aGeneric, void *aData);




const uint8_t kGenericFont_NONE = 0x00;

const uint8_t kGenericFont_moz_variable = 0x00;
const uint8_t kGenericFont_moz_fixed = 0x01;

const uint8_t kGenericFont_serif = 0x02;
const uint8_t kGenericFont_sans_serif = 0x04;
const uint8_t kGenericFont_monospace = 0x08;
const uint8_t kGenericFont_cursive = 0x10;
const uint8_t kGenericFont_fantasy = 0x20;


struct nsFont {


  mozilla::FontFamilyList fontlist;


  uint8_t style = 0;



  bool systemFont = false;


  uint8_t variantCaps = 0;
  uint8_t variantNumeric = 0;
  uint8_t variantPosition = 0;
  uint8_t variantWidth = 0;

  uint16_t variantLigatures = 0;
  uint16_t variantEastAsian = 0;






  uint16_t variantAlternates = 0;


  uint8_t smoothing = 0;


  uint16_t weight = 400;



  int16_t stretch = 0;


  uint8_t kerning = 0;


  uint8_t synthesis = 0x1 | 0x2;


  nscoord size = 0;





  float sizeAdjust = -1.0f;


  nsTArray<gfxAlternateValue> alternateValues;


  RefPtr<gfxFontFeatureValueSet> featureValueLookup;


  nsTArray<gfxFontFeature> fontFeatureSettings;


  nsTArray<gfxFontVariation> fontVariationSettings;




  uint32_t languageOverride = 0;


  nsFont(const mozilla::FontFamilyList& aFontlist, nscoord aSize);


  nsFont(mozilla::FontFamilyType aGenericType, nscoord aSize);


  nsFont(const nsFont& aFont);


  nsFont();

  ~nsFont();

  bool operator==(const nsFont& aOther) const {
    return Equals(aOther);
  }

  bool operator!=(const nsFont& aOther) const {
    return !Equals(aOther);
  }

  bool Equals(const nsFont& aOther) const;

  nsFont& operator=(const nsFont& aOther);

  void CopyAlternates(const nsFont& aOther);


  void AddFontFeaturesToStyle(gfxFontStyle *aStyle) const;

  void AddFontVariationsToStyle(gfxFontStyle *aStyle) const;
};
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleAutoArray.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleAutoArray.h"
template<typename T>
class nsStyleAutoArray
{
public:

  enum WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT };
  explicit nsStyleAutoArray(WithSingleInitialElement) {}
  nsStyleAutoArray(const nsStyleAutoArray& aOther) { *this = aOther; }
  nsStyleAutoArray& operator=(const nsStyleAutoArray& aOther) {
    mFirstElement = aOther.mFirstElement;
    mOtherElements = aOther.mOtherElements;
    return *this;
  }

  bool operator==(const nsStyleAutoArray& aOther) const {
    return Length() == aOther.Length() &&
           mFirstElement == aOther.mFirstElement &&
           mOtherElements == aOther.mOtherElements;
  }
  bool operator!=(const nsStyleAutoArray& aOther) const {
    return !(*this == aOther);
  }

  nsStyleAutoArray& operator=(nsStyleAutoArray&& aOther) {
    mFirstElement = aOther.mFirstElement;
    mOtherElements.SwapElements(aOther.mOtherElements);

    return *this;
  }

  size_t Length() const {
    return mOtherElements.Length() + 1;
  }
  const T& operator[](size_t aIndex) const {
    return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
  }
  T& operator[](size_t aIndex) {
    return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
  }

  void EnsureLengthAtLeast(size_t aMinLen) {
    if (aMinLen > 0) {
      mOtherElements.EnsureLengthAtLeast(aMinLen - 1);
    }
  }

  void SetLengthNonZero(size_t aNewLen) {
    do { } while (0);
    mOtherElements.SetLength(aNewLen - 1);
  }

  void TruncateLengthNonZero(size_t aNewLen) {
    do { } while (0);
    do { } while (0);
    mOtherElements.TruncateLength(aNewLen - 1);
  }

private:
  T mFirstElement;
  nsTArray<T> mOtherElements;
};
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleCoord.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleCoord.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumTypeTraits.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumTypeTraits.h"
namespace mozilla {

namespace detail {

template<size_t EnumSize, bool EnumSigned, size_t StorageSize, bool StorageSigned>
struct EnumFitsWithinHelper;


template<size_t EnumSize, size_t StorageSize>
struct EnumFitsWithinHelper<EnumSize, true, StorageSize, true>
  : public std::integral_constant<bool, (EnumSize <= StorageSize)>
{};


template<size_t EnumSize, size_t StorageSize>
struct EnumFitsWithinHelper<EnumSize, true, StorageSize, false>
  : public std::integral_constant<bool, false>
{};


template<size_t EnumSize, size_t StorageSize>
struct EnumFitsWithinHelper<EnumSize, false, StorageSize, true>
  : public std::integral_constant<bool, (EnumSize * 2 <= StorageSize)>
{};


template<size_t EnumSize, size_t StorageSize>
struct EnumFitsWithinHelper<EnumSize, false, StorageSize, false>
  : public std::integral_constant<bool, (EnumSize <= StorageSize)>
{};

}
# 55 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EnumTypeTraits.h"
template<typename T, typename Storage>
struct EnumTypeFitsWithin
  : public detail::EnumFitsWithinHelper<
      sizeof(T),
      std::is_signed<typename std::underlying_type<T>::type>::value,
      sizeof(Storage),
      std::is_signed<Storage>::value
    >
{
  static_assert(std::is_enum<T>::value, "must provide an enum type");
  static_assert(std::is_integral<Storage>::value, "must provide an integral type");
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleCoord.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxRect.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/gfxRect.h"
struct gfxQuad;

struct gfxMargin : public mozilla::gfx::BaseMargin<gfxFloat, gfxMargin> {
  typedef mozilla::gfx::BaseMargin<gfxFloat, gfxMargin> Super;


  gfxMargin() : Super() {}
  gfxMargin(const gfxMargin& aMargin) : Super(aMargin) {}
  gfxMargin(gfxFloat aTop, gfxFloat aRight, gfxFloat aBottom, gfxFloat aLeft)
    : Super(aTop, aRight, aBottom, aLeft) {}
};

struct gfxRect :
    public mozilla::gfx::BaseRect<gfxFloat, gfxRect, gfxPoint, gfxSize, gfxMargin> {
    typedef mozilla::gfx::BaseRect<gfxFloat, gfxRect, gfxPoint, gfxSize, gfxMargin> Super;

    gfxRect() : Super() {}
    gfxRect(const gfxPoint& aPos, const gfxSize& aSize) :
        Super(aPos, aSize) {}
    gfxRect(gfxFloat aX, gfxFloat aY, gfxFloat aWidth, gfxFloat aHeight) :
        Super(aX, aY, aWidth, aHeight) {}







    bool WithinEpsilonOfIntegerPixels(gfxFloat aEpsilon) const;

    gfxPoint AtCorner(mozilla::Corner corner) const {
        switch (corner) {
            case mozilla::eCornerTopLeft: return TopLeft();
            case mozilla::eCornerTopRight: return TopRight();
            case mozilla::eCornerBottomRight: return BottomRight();
            case mozilla::eCornerBottomLeft: return BottomLeft();
        }
        return gfxPoint(0.0, 0.0);
    }

    gfxPoint CCWCorner(mozilla::Side side) const {
        switch (side) {
            case mozilla::eSideTop: return TopLeft();
            case mozilla::eSideRight: return TopRight();
            case mozilla::eSideBottom: return BottomRight();
            case mozilla::eSideLeft: return BottomLeft();
        }
        do { AnnotateMozCrashReason("MOZ_CRASH(" "Incomplete switch" ")"); do { *((volatile int*) __null) = 65; ::abort(); } while (0); } while (0);
    }

    gfxPoint CWCorner(mozilla::Side side) const {
        switch (side) {
            case mozilla::eSideTop: return TopRight();
            case mozilla::eSideRight: return BottomRight();
            case mozilla::eSideBottom: return BottomLeft();
            case mozilla::eSideLeft: return TopLeft();
        }
        do { AnnotateMozCrashReason("MOZ_CRASH(" "Incomplete switch" ")"); do { *((volatile int*) __null) = 75; ::abort(); } while (0); } while (0);
    }





    void Condition();

    void Scale(gfxFloat k) {
        do { } while(0);
        x *= k;
        y *= k;
        width *= k;
        height *= k;
    }

    void Scale(gfxFloat sx, gfxFloat sy) {
        do { } while(0);
        do { } while(0);
        x *= sx;
        y *= sy;
        width *= sx;
        height *= sy;
    }

    void ScaleInverse(gfxFloat k) {
        do { } while(0);
        x /= k;
        y /= k;
        width /= k;
        height /= k;
    }




    gfxQuad TransformToQuad(const mozilla::gfx::Matrix4x4 &aMatrix) const;
};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/X11UndefineNone.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h" 2



namespace mozilla {


enum class StyleBasicShapeType : uint8_t {
  Polygon,
  Circle,
  Ellipse,
  Inset,
};


enum class StyleBoxAlign : uint8_t {
  Stretch,
  Start,
  Center,
  Baseline,
  End,
};


enum class StyleBoxDecorationBreak : uint8_t {
  Slice,
  Clone,
};


enum class StyleBoxDirection : uint8_t {
  Normal,
  Reverse,
};


enum class StyleBoxOrient : uint8_t {
  Horizontal,
  Vertical,
};


enum class StyleBoxPack : uint8_t {
  Start,
  Center,
  End,
  Justify,
};


enum class StyleBoxSizing : uint8_t {
  Content,
  Border
};


enum class StyleBoxShadowType : uint8_t {
  Inset,
};


enum class StyleClear : uint8_t {
  None = 0,
  Left,
  Right,
  InlineStart,
  InlineEnd,
  Both,


  Line = 8,
  Max = 13
};



enum class StyleGeometryBox : uint8_t {
  ContentBox,
  PaddingBox,
  BorderBox,
  MarginBox,



  FillBox,
  StrokeBox,
  ViewBox,
  NoClip,
  Text,
  NoBox,






  MozAlmostPadding = 127






};


enum class StyleFillRule : uint8_t {
  Nonzero,
  Evenodd,
};



enum class StyleFloat : uint8_t {
  None,
  Left,
  Right,
  InlineStart,
  InlineEnd
};


enum class StyleFloatEdge : uint8_t {
  ContentBox,
  MarginBox,
};


enum class StyleHyphens : uint8_t {
  None,
  Manual,
  Auto,
};


enum class StyleShapeRadius : uint8_t {
  ClosestSide,
  FarthestSide,
};


enum class StyleShapeSourceType : uint8_t {
  None,
  URL,
  Shape,
  Box,
};


enum class StyleTextJustify : uint8_t {
  None,
  Auto,
  InterWord,
  InterCharacter,
};


enum class StyleUserFocus : uint8_t {
  None,
  Ignore,
  Normal,
  SelectAll,
  SelectBefore,
  SelectAfter,
  SelectSame,
  SelectMenu,
};


enum class StyleUserSelect : uint8_t {
  None,
  Text,
  Element,
  Elements,
  All,
  Toggle,
  TriState,
  Auto,
  MozAll,
  MozText,
};


enum class StyleUserInput : uint8_t {
  None,
  Enabled,
  Disabled,
  Auto,
};


enum class StyleUserModify : uint8_t {
  ReadOnly,
  ReadWrite,
  WriteOnly,
};


enum class StyleWindowDragging : uint8_t {
  Default,
  Drag,
  NoDrag,
};


enum class StyleOrient : uint8_t {
  Inline,
  Block,
  Horizontal,
  Vertical,
};
# 315 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h"
namespace dom {
enum class PlaybackDirection : uint8_t;
enum class FillMode : uint8_t;
}
# 475 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h"
enum class StyleDisplay : uint8_t {
  None = 0,
  Block,
  FlowRoot,
  Inline,
  InlineBlock,
  ListItem,
  Table,
  InlineTable,
  TableRowGroup,
  TableColumn,
  TableColumnGroup,
  TableHeaderGroup,
  TableFooterGroup,
  TableRow,
  TableCell,
  TableCaption,
  Flex,
  InlineFlex,
  Grid,
  InlineGrid,
  Ruby,
  RubyBase,
  RubyBaseContainer,
  RubyText,
  RubyTextContainer,
  Contents,
  WebkitBox,
  WebkitInlineBox,
  MozBox,
  MozInlineBox,

  MozGrid,
  MozInlineGrid,
  MozGridGroup,
  MozGridLine,
  MozStack,
  MozInlineStack,
  MozDeck,
  MozGroupbox,
  MozPopup,

};
# 684 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h"
enum class StyleGridTrackBreadth : uint8_t {
  MaxContent = 1,
  MinContent = 2,
};
# 1246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleConsts.h"
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleCoord.h" 2

namespace mozilla {

class WritingMode;


enum LogicalAxis {
  eLogicalAxisBlock = 0x0,
  eLogicalAxisInline = 0x1
};
enum LogicalEdge {
  eLogicalEdgeStart = 0x0,
  eLogicalEdgeEnd = 0x1
};
enum LogicalSide {
  eLogicalSideBStart = (eLogicalAxisBlock << 1) | eLogicalEdgeStart,
  eLogicalSideBEnd = (eLogicalAxisBlock << 1) | eLogicalEdgeEnd,
  eLogicalSideIStart = (eLogicalAxisInline << 1) | eLogicalEdgeStart,
  eLogicalSideIEnd = (eLogicalAxisInline << 1) | eLogicalEdgeEnd
};

enum LogicalCorner
{
  eLogicalCornerBStartIStart = 0,
  eLogicalCornerBStartIEnd = 1,
  eLogicalCornerBEndIEnd = 2,
  eLogicalCornerBEndIStart = 3
};

}

enum nsStyleUnit : uint8_t {
  eStyleUnit_Null = 0,
  eStyleUnit_Normal = 1,
  eStyleUnit_Auto = 2,
  eStyleUnit_None = 3,
  eStyleUnit_Percent = 10,
  eStyleUnit_Factor = 11,
  eStyleUnit_Degree = 12,
  eStyleUnit_Grad = 13,
  eStyleUnit_Radian = 14,
  eStyleUnit_Turn = 15,
  eStyleUnit_FlexFraction = 16,
  eStyleUnit_Coord = 20,
  eStyleUnit_Integer = 30,
  eStyleUnit_Enumerated = 32,


  eStyleUnit_Calc = 40,


  eStyleUnit_MAX = 40
};

typedef union {
  int32_t mInt;
  float mFloat;


  void* mPointer;
} nsStyleUnion;
# 87 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleCoord.h"
class nsStyleCoord {
public:


  struct CalcValue {

    nscoord mLength;
    float mPercent;
    bool mHasPercent;

    bool operator==(const CalcValue& aOther) const {
      return mLength == aOther.mLength &&
             mPercent == aOther.mPercent &&
             mHasPercent == aOther.mHasPercent;
    }
    bool operator!=(const CalcValue& aOther) const {
      return !(*this == aOther);
    }

    nscoord ToLength() const {
      do { } while (0);
      return mLength;
    }



    bool IsDefinitelyZero() const { return mLength == 0 && mPercent == 0; }
  };



  struct Calc final : public CalcValue {
    public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<Calc>::value, "Reference-counted class " "Calc" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:
    Calc() {}

  private:
    Calc(const Calc&) = delete;
    ~Calc() {}
    Calc& operator=(const Calc&) = delete;
  };

  explicit nsStyleCoord(nsStyleUnit aUnit = eStyleUnit_Null);
  enum CoordConstructorType { CoordConstructor };
  inline nsStyleCoord(nscoord aValue, CoordConstructorType);
  nsStyleCoord(int32_t aValue, nsStyleUnit aUnit);
  nsStyleCoord(float aValue, nsStyleUnit aUnit);
  inline nsStyleCoord(const nsStyleCoord& aCopy);
  inline nsStyleCoord(const nsStyleUnion& aValue, nsStyleUnit aUnit);
  ~nsStyleCoord() { Reset(); }

  nsStyleCoord& operator=(const nsStyleCoord& aOther)
  {
    if (this != &aOther) {
      SetValue(mUnit, mValue, aOther);
    }
    return *this;
  }
  bool operator==(const nsStyleCoord& aOther) const;
  bool operator!=(const nsStyleCoord& aOther) const;

  nsStyleUnit GetUnit() const {
    do { } while(0);
    return mUnit;
  }

  bool IsAngleValue() const {
    return eStyleUnit_Degree <= mUnit && mUnit <= eStyleUnit_Turn;
  }

  static bool IsCalcUnit(nsStyleUnit aUnit) {
    return aUnit == eStyleUnit_Calc;
  }

  static bool IsPointerUnit(nsStyleUnit aUnit) {
    return IsCalcUnit(aUnit);
  }

  bool IsCalcUnit() const {
    return IsCalcUnit(mUnit);
  }

  bool IsPointerValue() const {
    return IsPointerUnit(mUnit);
  }

  bool IsCoordPercentCalcUnit() const {
    return mUnit == eStyleUnit_Coord ||
           mUnit == eStyleUnit_Percent ||
           IsCalcUnit();
  }



  bool CalcHasPercent() const {
    return GetCalcValue()->mHasPercent;
  }

  bool HasPercent() const {
    return mUnit == eStyleUnit_Percent ||
           (IsCalcUnit() && CalcHasPercent());
  }

  static bool ConvertsToLength(const nsStyleUnit aUnit,
                               const nsStyleUnion aValue) {
    return aUnit == eStyleUnit_Coord ||
           (IsCalcUnit(aUnit) && !AsCalcValue(aValue)->mHasPercent);
  }

  bool ConvertsToLength() const {
    return ConvertsToLength(mUnit, mValue);
  }

  static nscoord ToLength(nsStyleUnit aUnit, nsStyleUnion aValue) {
    do { } while (0);
    if (IsCalcUnit(aUnit)) {
      return AsCalcValue(aValue)->ToLength();
    }
    do { } while (0);
    return aValue.mInt;
  }

  nscoord ToLength() const {
    return ToLength(GetUnit(), mValue);
  }


  static Calc* AsCalcValue(nsStyleUnion aValue) {
    return static_cast<Calc*>(aValue.mPointer);
  }

  nscoord GetCoordValue() const;
  int32_t GetIntValue() const;
  float GetPercentValue() const;
  float GetFactorValue() const;
  float GetFactorOrPercentValue() const;
  float GetAngleValue() const;
  double GetAngleValueInDegrees() const;
  double GetAngleValueInRadians() const;
  float GetFlexFractionValue() const;
  Calc* GetCalcValue() const;
  uint32_t HashValue(uint32_t aHash) const;
  template<typename T,
           typename = typename std::enable_if<std::is_enum<T>::value>::type>
  T GetEnumValue() const
  {
    do { } while (0);

    return static_cast<T>(GetIntValue());
  }



  void Reset();

  void SetCoordValue(nscoord aValue);
  void SetIntValue(int32_t aValue, nsStyleUnit aUnit);
  void SetPercentValue(float aValue);
  void SetFactorValue(float aValue);
  void SetAngleValue(float aValue, nsStyleUnit aUnit);
  void SetFlexFractionValue(float aValue);
  void SetNormalValue();
  void SetAutoValue();
  void SetNoneValue();
  void SetCalcValue(Calc* aValue);
  template<typename T,
           typename = typename std::enable_if<std::is_enum<T>::value>::type>
  void SetEnumValue(T aValue)
  {
    static_assert(mozilla::EnumTypeFitsWithin<T, int32_t>::value,
                  "aValue must be an enum that fits within mValue.mInt!");
    SetIntValue(static_cast<int32_t>(aValue), eStyleUnit_Enumerated);
  }


  static inline void Reset(nsStyleUnit& aUnit, nsStyleUnion& aValue);



  static inline void SetValue(nsStyleUnit& aUnit,
                              nsStyleUnion& aValue,
                              nsStyleUnit aOtherUnit,
                              const nsStyleUnion& aOtherValue);


  static inline void SetValue(nsStyleUnit& aUnit, nsStyleUnion& aValue,
                              const nsStyleCoord& aOther);


  static inline void InitWithValue(nsStyleUnit& aUnit,
                                   nsStyleUnion& aValue,
                                   nsStyleUnit aOtherUnit,
                                   const nsStyleUnion& aOtherValue);

  static inline void InitWithValue(nsStyleUnit& aUnit, nsStyleUnion& aValue,
                                   const nsStyleCoord& aOther);

private:
  nsStyleUnit mUnit;
  nsStyleUnion mValue;
};







class nsStyleSides {
public:
  nsStyleSides();
  nsStyleSides(const nsStyleSides&);
  ~nsStyleSides();

  nsStyleSides& operator=(const nsStyleSides& aCopy);
  bool operator==(const nsStyleSides& aOther) const;
  bool operator!=(const nsStyleSides& aOther) const;

  inline nsStyleUnit GetUnit(mozilla::Side aSide) const;
  inline nsStyleUnit GetLeftUnit() const;
  inline nsStyleUnit GetTopUnit() const;
  inline nsStyleUnit GetRightUnit() const;
  inline nsStyleUnit GetBottomUnit() const;

  inline nsStyleCoord Get(mozilla::Side aSide) const;
  inline nsStyleCoord GetLeft() const;
  inline nsStyleCoord GetTop() const;
  inline nsStyleCoord GetRight() const;
  inline nsStyleCoord GetBottom() const;





  inline nsStyleUnit GetUnit(mozilla::WritingMode aWritingMode,
                             mozilla::LogicalSide aSide) const;
  inline nsStyleUnit GetIStartUnit(mozilla::WritingMode aWritingMode) const;
  inline nsStyleUnit GetBStartUnit(mozilla::WritingMode aWritingMode) const;
  inline nsStyleUnit GetIEndUnit(mozilla::WritingMode aWritingMode) const;
  inline nsStyleUnit GetBEndUnit(mozilla::WritingMode aWritingMode) const;


  inline bool HasBlockAxisAuto(mozilla::WritingMode aWritingMode) const;
  inline bool HasInlineAxisAuto(mozilla::WritingMode aWritingMode) const;

  inline nsStyleCoord Get(mozilla::WritingMode aWritingMode,
                          mozilla::LogicalSide aSide) const;
  inline nsStyleCoord GetIStart(mozilla::WritingMode aWritingMode) const;
  inline nsStyleCoord GetBStart(mozilla::WritingMode aWritingMode) const;
  inline nsStyleCoord GetIEnd(mozilla::WritingMode aWritingMode) const;
  inline nsStyleCoord GetBEnd(mozilla::WritingMode aWritingMode) const;




  void Reset();

  inline void Set(mozilla::Side aSide, const nsStyleCoord& aCoord);
  inline void SetLeft(const nsStyleCoord& aCoord);
  inline void SetTop(const nsStyleCoord& aCoord);
  inline void SetRight(const nsStyleCoord& aCoord);
  inline void SetBottom(const nsStyleCoord& aCoord);

  nscoord ToLength(mozilla::Side aSide) const {
    return nsStyleCoord::ToLength(mUnits[aSide], mValues[aSide]);
  }

  bool ConvertsToLength() const {
    int32_t side354 = mozilla::eSideTop; for (mozilla::Side side; side354 <= mozilla::eSideLeft && ((side = mozilla::Side(side354)), true); ++side354) {
      if (!nsStyleCoord::ConvertsToLength(mUnits[side], mValues[side])) {
        return false;
      }
    }
    return true;
  }

protected:
  nsStyleUnit mUnits[4];
  nsStyleUnion mValues[4];
};







class nsStyleCorners {
public:
  nsStyleCorners();
  nsStyleCorners(const nsStyleCorners&);
  ~nsStyleCorners();


  nsStyleCorners& operator=(const nsStyleCorners& aCopy);
  bool operator==(const nsStyleCorners& aOther) const;
  bool operator!=(const nsStyleCorners& aOther) const;


  inline nsStyleUnit GetUnit(uint8_t aHalfCorner) const;

  inline nsStyleCoord Get(uint8_t aHalfCorner) const;




  void Reset();

  inline void Set(uint8_t aHalfCorner, const nsStyleCoord& aCoord);

protected:





  nsStyleUnit mUnits[8];
  nsStyleUnion mValues[8];
};





inline nsStyleCoord::nsStyleCoord(nscoord aValue, CoordConstructorType)
  : mUnit(eStyleUnit_Coord)
{
  mValue.mInt = aValue;
}

inline nsStyleCoord::nsStyleCoord(const nsStyleCoord& aCopy)
  : mUnit(eStyleUnit_Null)
{
  InitWithValue(mUnit, mValue, aCopy);
}

inline nsStyleCoord::nsStyleCoord(const nsStyleUnion& aValue, nsStyleUnit aUnit)
  : mUnit(eStyleUnit_Null)
{
  InitWithValue(mUnit, mValue, aUnit, aValue);
}

inline bool nsStyleCoord::operator!=(const nsStyleCoord& aOther) const
{
  return !((*this) == aOther);
}

inline nscoord nsStyleCoord::GetCoordValue() const
{
  do { } while(0);
  if (mUnit == eStyleUnit_Coord) {
    return mValue.mInt;
  }
  return 0;
}

inline int32_t nsStyleCoord::GetIntValue() const
{
  do { } while(0);

  if ((mUnit == eStyleUnit_Enumerated) ||
      (mUnit == eStyleUnit_Integer)) {
    return mValue.mInt;
  }
  return 0;
}

inline float nsStyleCoord::GetPercentValue() const
{
  do { } while(0);
  if (mUnit == eStyleUnit_Percent) {
    return mValue.mFloat;
  }
  return 0.0f;
}

inline float nsStyleCoord::GetFactorValue() const
{
  do { } while(0);
  if (mUnit == eStyleUnit_Factor) {
    return mValue.mFloat;
  }
  return 0.0f;
}

inline float nsStyleCoord::GetFactorOrPercentValue() const
{
  do { } while(0);

  if (mUnit == eStyleUnit_Factor || mUnit == eStyleUnit_Percent) {
    return mValue.mFloat;
  }
  return 0.0f;
}

inline float nsStyleCoord::GetAngleValue() const
{
  do { } while(0);

  if (mUnit >= eStyleUnit_Degree && mUnit <= eStyleUnit_Turn) {
    return mValue.mFloat;
  }
  return 0.0f;
}

inline float nsStyleCoord::GetFlexFractionValue() const
{
  do { } while(0);
  if (mUnit == eStyleUnit_FlexFraction) {
    return mValue.mFloat;
  }
  return 0.0f;
}

inline nsStyleCoord::Calc* nsStyleCoord::GetCalcValue() const
{
  do { } while(0);
  if (IsCalcUnit()) {
    return AsCalcValue(mValue);
  }
  return nullptr;
}

             inline void
nsStyleCoord::Reset(nsStyleUnit& aUnit, nsStyleUnion& aValue)
{
  do { } while (0);


  switch (aUnit) {
    case eStyleUnit_Calc:
      static_cast<Calc*>(aValue.mPointer)->Release();
      break;
    default:
      do { } while (0);
  }

  aUnit = eStyleUnit_Null;
  aValue.mInt = 0;
}

             inline void
nsStyleCoord::SetValue(nsStyleUnit& aUnit,
                       nsStyleUnion& aValue,
                       nsStyleUnit aOtherUnit,
                       const nsStyleUnion& aOtherValue)
{
  Reset(aUnit, aValue);
  InitWithValue(aUnit, aValue, aOtherUnit, aOtherValue);
}

             inline void
nsStyleCoord::InitWithValue(nsStyleUnit& aUnit,
                            nsStyleUnion& aValue,
                            nsStyleUnit aOtherUnit,
                            const nsStyleUnion& aOtherValue)
{
  aUnit = aOtherUnit;
  aValue = aOtherValue;

  switch (aUnit) {
    case eStyleUnit_Calc:
      static_cast<Calc*>(aValue.mPointer)->AddRef();
      break;
    default:
      do { } while (0);
  }
}

             inline void
nsStyleCoord::SetValue(nsStyleUnit& aUnit, nsStyleUnion& aValue,
                       const nsStyleCoord& aOther)
{
  SetValue(aUnit, aValue, aOther.mUnit, aOther.mValue);
}

             inline void
nsStyleCoord::InitWithValue(nsStyleUnit& aUnit, nsStyleUnion& aValue,
                            const nsStyleCoord& aOther)
{
  InitWithValue(aUnit, aValue, aOther.mUnit, aOther.mValue);
}





inline bool nsStyleSides::operator!=(const nsStyleSides& aOther) const
{
  return !((*this) == aOther);
}

inline nsStyleUnit nsStyleSides::GetUnit(mozilla::Side aSide) const
{
  return (nsStyleUnit)mUnits[aSide];
}

inline nsStyleUnit nsStyleSides::GetLeftUnit() const
{
  return GetUnit(mozilla::eSideLeft);
}

inline nsStyleUnit nsStyleSides::GetTopUnit() const
{
  return GetUnit(mozilla::eSideTop);
}

inline nsStyleUnit nsStyleSides::GetRightUnit() const
{
  return GetUnit(mozilla::eSideRight);
}

inline nsStyleUnit nsStyleSides::GetBottomUnit() const
{
  return GetUnit(mozilla::eSideBottom);
}

inline nsStyleCoord nsStyleSides::Get(mozilla::Side aSide) const
{
  return nsStyleCoord(mValues[aSide], nsStyleUnit(mUnits[aSide]));
}

inline nsStyleCoord nsStyleSides::GetLeft() const
{
  return Get(mozilla::eSideLeft);
}

inline nsStyleCoord nsStyleSides::GetTop() const
{
  return Get(mozilla::eSideTop);
}

inline nsStyleCoord nsStyleSides::GetRight() const
{
  return Get(mozilla::eSideRight);
}

inline nsStyleCoord nsStyleSides::GetBottom() const
{
  return Get(mozilla::eSideBottom);
}

inline void nsStyleSides::Set(mozilla::Side aSide, const nsStyleCoord& aCoord)
{
  nsStyleCoord::SetValue(mUnits[aSide], mValues[aSide], aCoord);
}

inline void nsStyleSides::SetLeft(const nsStyleCoord& aCoord)
{
  Set(mozilla::eSideLeft, aCoord);
}

inline void nsStyleSides::SetTop(const nsStyleCoord& aCoord)
{
  Set(mozilla::eSideTop, aCoord);
}

inline void nsStyleSides::SetRight(const nsStyleCoord& aCoord)
{
  Set(mozilla::eSideRight, aCoord);
}

inline void nsStyleSides::SetBottom(const nsStyleCoord& aCoord)
{
  Set(mozilla::eSideBottom, aCoord);
}




inline bool nsStyleCorners::operator!=(const nsStyleCorners& aOther) const
{
  return !((*this) == aOther);
}

inline nsStyleUnit nsStyleCorners::GetUnit(uint8_t aCorner) const
{
  return (nsStyleUnit)mUnits[aCorner];
}

inline nsStyleCoord nsStyleCorners::Get(uint8_t aCorner) const
{
  return nsStyleCoord(mValues[aCorner], nsStyleUnit(mUnits[aCorner]));
}

inline void nsStyleCorners::Set(uint8_t aCorner, const nsStyleCoord& aCoord)
{
  nsStyleCoord::SetValue(mUnits[aCorner], mValues[aCorner], aCoord);
}
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsThemeConstants.h" 1
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
struct nsCSSSelector;



enum nsChangeHint {
  nsChangeHint_Empty = 0,




  nsChangeHint_RepaintFrame = 1 << 0,



  nsChangeHint_NeedReflow = 1 << 1,



  nsChangeHint_ClearAncestorIntrinsics = 1 << 2,




  nsChangeHint_ClearDescendantIntrinsics = 1 << 3,




  nsChangeHint_NeedDirtyReflow = 1 << 4,



  nsChangeHint_SyncFrameView = 1 << 5,


  nsChangeHint_UpdateCursor = 1 << 6,
# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_UpdateEffects = 1 << 7,






  nsChangeHint_UpdateOpacityLayer = 1 << 8,




  nsChangeHint_UpdateTransformLayer = 1 << 9,
# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_ReconstructFrame = 1 << 10,





  nsChangeHint_UpdateOverflow = 1 << 11,





  nsChangeHint_UpdateSubtreeOverflow = 1 << 12,
# 104 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_UpdatePostTransformOverflow = 1 << 13,







  nsChangeHint_UpdateParentOverflow = 1 << 14,





  nsChangeHint_ChildrenOnlyTransform = 1 << 15,
# 130 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_RecomputePosition = 1 << 16,
# 143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_UpdateContainingBlock = 1 << 17,







  nsChangeHint_BorderStyleNoneChange = 1 << 18,





  nsChangeHint_UpdateTextPath = 1 << 19,





  nsChangeHint_SchedulePaint = 1 << 20,
# 179 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_NeutralChange = 1 << 21,




  nsChangeHint_InvalidateRenderingObservers = 1 << 22,







  nsChangeHint_ReflowChangesSizeOrPosition = 1 << 23,





  nsChangeHint_UpdateComputedBSize = 1 << 24,
# 208 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_UpdateUsesOpacity = 1 << 25,
# 217 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_UpdateBackgroundPosition = 1 << 26,





  nsChangeHint_AddOrRemoveTransform = 1 << 27,
# 240 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  nsChangeHint_AllHints = (1 << 28) - 1,
};




inline void operator<(nsChangeHint s1, nsChangeHint s2) {}
inline void operator>(nsChangeHint s1, nsChangeHint s2) {}
inline void operator!=(nsChangeHint s1, nsChangeHint s2) {}
inline void operator==(nsChangeHint s1, nsChangeHint s2) {}
inline void operator<=(nsChangeHint s1, nsChangeHint s2) {}
inline void operator>=(nsChangeHint s1, nsChangeHint s2) {}




inline bool NS_IsHintSubset(nsChangeHint aSubset, nsChangeHint aSuperSet) {
  return (aSubset & aSuperSet) == aSubset;
}



typedef decltype(nsChangeHint(0) + nsChangeHint(0)) nsChangeHint_size_t;

inline nsChangeHint constexpr
operator|(nsChangeHint aLeft, nsChangeHint aRight)
{
  return nsChangeHint(nsChangeHint_size_t(aLeft) | nsChangeHint_size_t(aRight));
}

inline nsChangeHint constexpr
operator&(nsChangeHint aLeft, nsChangeHint aRight)
{
  return nsChangeHint(nsChangeHint_size_t(aLeft) & nsChangeHint_size_t(aRight));
}

inline nsChangeHint& operator|=(nsChangeHint& aLeft, nsChangeHint aRight)
{
  return aLeft = aLeft | aRight;
}

inline nsChangeHint& operator&=(nsChangeHint& aLeft, nsChangeHint aRight)
{
  return aLeft = aLeft & aRight;
}

inline nsChangeHint constexpr
operator~(nsChangeHint aArg)
{
  return nsChangeHint(~nsChangeHint_size_t(aArg));
}

inline nsChangeHint constexpr
operator^(nsChangeHint aLeft, nsChangeHint aRight)
{
  return nsChangeHint(nsChangeHint_size_t(aLeft) ^ nsChangeHint_size_t(aRight));
}

inline nsChangeHint operator^=(nsChangeHint& aLeft, nsChangeHint aRight)
{
  return aLeft = aLeft ^ aRight;
}
# 351 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
static_assert(!(( nsChangeHint_ClearDescendantIntrinsics | nsChangeHint_NeedDirtyReflow | nsChangeHint_NeutralChange | nsChangeHint_ReconstructFrame | nsChangeHint_RepaintFrame | nsChangeHint_SchedulePaint | nsChangeHint_SyncFrameView | nsChangeHint_UpdateCursor | nsChangeHint_UpdateSubtreeOverflow | nsChangeHint_UpdateTextPath ) &
                ( nsChangeHint_BorderStyleNoneChange | nsChangeHint_ChildrenOnlyTransform | nsChangeHint_InvalidateRenderingObservers | nsChangeHint_RecomputePosition | nsChangeHint_UpdateBackgroundPosition | nsChangeHint_UpdateComputedBSize | nsChangeHint_UpdateContainingBlock | nsChangeHint_UpdateEffects | nsChangeHint_UpdateOpacityLayer | nsChangeHint_UpdateOverflow | nsChangeHint_UpdateParentOverflow | nsChangeHint_UpdatePostTransformOverflow | nsChangeHint_UpdateTransformLayer | nsChangeHint_UpdateUsesOpacity | nsChangeHint_AddOrRemoveTransform )) &&
              !(( nsChangeHint_ClearDescendantIntrinsics | nsChangeHint_NeedDirtyReflow | nsChangeHint_NeutralChange | nsChangeHint_ReconstructFrame | nsChangeHint_RepaintFrame | nsChangeHint_SchedulePaint | nsChangeHint_SyncFrameView | nsChangeHint_UpdateCursor | nsChangeHint_UpdateSubtreeOverflow | nsChangeHint_UpdateTextPath ) &
                ( nsChangeHint_ClearAncestorIntrinsics | nsChangeHint_NeedReflow | nsChangeHint_ReflowChangesSizeOrPosition )) &&
              !(( nsChangeHint_BorderStyleNoneChange | nsChangeHint_ChildrenOnlyTransform | nsChangeHint_InvalidateRenderingObservers | nsChangeHint_RecomputePosition | nsChangeHint_UpdateBackgroundPosition | nsChangeHint_UpdateComputedBSize | nsChangeHint_UpdateContainingBlock | nsChangeHint_UpdateEffects | nsChangeHint_UpdateOpacityLayer | nsChangeHint_UpdateOverflow | nsChangeHint_UpdateParentOverflow | nsChangeHint_UpdatePostTransformOverflow | nsChangeHint_UpdateTransformLayer | nsChangeHint_UpdateUsesOpacity | nsChangeHint_AddOrRemoveTransform ) &
                ( nsChangeHint_ClearAncestorIntrinsics | nsChangeHint_NeedReflow | nsChangeHint_ReflowChangesSizeOrPosition )) &&
              !(nsChangeHint_AllHints ^
                ( nsChangeHint_ClearDescendantIntrinsics | nsChangeHint_NeedDirtyReflow | nsChangeHint_NeutralChange | nsChangeHint_ReconstructFrame | nsChangeHint_RepaintFrame | nsChangeHint_SchedulePaint | nsChangeHint_SyncFrameView | nsChangeHint_UpdateCursor | nsChangeHint_UpdateSubtreeOverflow | nsChangeHint_UpdateTextPath ) ^
                ( nsChangeHint_BorderStyleNoneChange | nsChangeHint_ChildrenOnlyTransform | nsChangeHint_InvalidateRenderingObservers | nsChangeHint_RecomputePosition | nsChangeHint_UpdateBackgroundPosition | nsChangeHint_UpdateComputedBSize | nsChangeHint_UpdateContainingBlock | nsChangeHint_UpdateEffects | nsChangeHint_UpdateOpacityLayer | nsChangeHint_UpdateOverflow | nsChangeHint_UpdateParentOverflow | nsChangeHint_UpdatePostTransformOverflow | nsChangeHint_UpdateTransformLayer | nsChangeHint_UpdateUsesOpacity | nsChangeHint_AddOrRemoveTransform ) ^
                ( nsChangeHint_ClearAncestorIntrinsics | nsChangeHint_NeedReflow | nsChangeHint_ReflowChangesSizeOrPosition )),
              "change hints must be present in exactly one of "
              "nsChangeHint_Hints_{Always,Never,Sometimes}"
              "HandledForDescendants");
# 393 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
inline nsChangeHint NS_HintsNotHandledForDescendantsIn(nsChangeHint aChangeHint) {
  nsChangeHint result =
    aChangeHint & ( nsChangeHint_BorderStyleNoneChange | nsChangeHint_ChildrenOnlyTransform | nsChangeHint_InvalidateRenderingObservers | nsChangeHint_RecomputePosition | nsChangeHint_UpdateBackgroundPosition | nsChangeHint_UpdateComputedBSize | nsChangeHint_UpdateContainingBlock | nsChangeHint_UpdateEffects | nsChangeHint_UpdateOpacityLayer | nsChangeHint_UpdateOverflow | nsChangeHint_UpdateParentOverflow | nsChangeHint_UpdatePostTransformOverflow | nsChangeHint_UpdateTransformLayer | nsChangeHint_UpdateUsesOpacity | nsChangeHint_AddOrRemoveTransform );

  if (!NS_IsHintSubset(nsChangeHint_NeedDirtyReflow, aChangeHint)) {
    if (NS_IsHintSubset(nsChangeHint_NeedReflow, aChangeHint)) {


      result |= nsChangeHint_NeedReflow;
    }

    if (NS_IsHintSubset(nsChangeHint_ReflowChangesSizeOrPosition,
                        aChangeHint)) {


      result |= nsChangeHint_ReflowChangesSizeOrPosition;
    }
  }

  if (!NS_IsHintSubset(nsChangeHint_ClearDescendantIntrinsics, aChangeHint) &&
      NS_IsHintSubset(nsChangeHint_ClearAncestorIntrinsics, aChangeHint)) {


    result |= nsChangeHint_ClearAncestorIntrinsics;
  }

  do { } while (0);



  return result;
}

inline nsChangeHint
NS_HintsHandledForDescendantsIn(nsChangeHint aChangeHint)
{
  return aChangeHint & ~NS_HintsNotHandledForDescendantsIn(aChangeHint);
}



inline nsChangeHint
NS_RemoveSubsumedHints(nsChangeHint aOurChange, nsChangeHint aHintsHandled)
{
  nsChangeHint result =
    aOurChange & ~NS_HintsHandledForDescendantsIn(aHintsHandled);

  if (result & (nsChangeHint_ClearAncestorIntrinsics |
                nsChangeHint_ClearDescendantIntrinsics |
                nsChangeHint_NeedDirtyReflow |
                nsChangeHint_ReflowChangesSizeOrPosition |
                nsChangeHint_UpdateComputedBSize)) {
    result |= nsChangeHint_NeedReflow;
  }

  if (result & (nsChangeHint_ClearDescendantIntrinsics)) {
    do { } while (0);
    result |=
              nsChangeHint_NeedDirtyReflow;
  }

  return result;
}
# 475 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
enum nsRestyleHint {




  eRestyle_Self = 1 << 0,



  eRestyle_SomeDescendants = 1 << 1,





  eRestyle_Subtree = 1 << 2,



  eRestyle_LaterSiblings = 1 << 3,






  eRestyle_CSSTransitions = 1 << 4,






  eRestyle_CSSAnimations = 1 << 5,
# 519 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsChangeHint.h"
  eRestyle_StyleAttribute = 1 << 6,



  eRestyle_StyleAttribute_Animations = 1 << 7,



  eRestyle_Force = 1 << 8,






  eRestyle_ForceDescendants = 1 << 9,


  eRestyle_AllHintsWithAnimations = eRestyle_CSSTransitions |
                                    eRestyle_CSSAnimations |
                                    eRestyle_StyleAttribute_Animations,
};



typedef decltype(nsRestyleHint(0) + nsRestyleHint(0)) nsRestyleHint_size_t;

inline constexpr nsRestyleHint operator|(nsRestyleHint aLeft,
                                             nsRestyleHint aRight)
{
  return nsRestyleHint(nsRestyleHint_size_t(aLeft) |
                       nsRestyleHint_size_t(aRight));
}

inline constexpr nsRestyleHint operator&(nsRestyleHint aLeft,
                                             nsRestyleHint aRight)
{
  return nsRestyleHint(nsRestyleHint_size_t(aLeft) &
                       nsRestyleHint_size_t(aRight));
}

inline nsRestyleHint& operator|=(nsRestyleHint& aLeft, nsRestyleHint aRight)
{
  return aLeft = aLeft | aRight;
}

inline nsRestyleHint& operator&=(nsRestyleHint& aLeft, nsRestyleHint aRight)
{
  return aLeft = aLeft & aRight;
}

inline constexpr nsRestyleHint operator~(nsRestyleHint aArg)
{
  return nsRestyleHint(~nsRestyleHint_size_t(aArg));
}

inline constexpr nsRestyleHint operator^(nsRestyleHint aLeft,
                                             nsRestyleHint aRight)
{
  return nsRestyleHint(nsRestyleHint_size_t(aLeft) ^
                       nsRestyleHint_size_t(aRight));
}

inline nsRestyleHint operator^=(nsRestyleHint& aLeft, nsRestyleHint aRight)
{
  return aLeft = aLeft ^ aRight;
}

namespace mozilla {





struct RestyleHintData
{


  nsTArray<nsCSSSelector*> mSelectorsForDescendants;
};

}
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 1
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSetHandle.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSetHandle.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoTypes.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoTypes.h"
struct ServoNodeData;
namespace mozilla {





template<typename T>
struct ServoUnsafeCell {
  T value;


  ServoUnsafeCell() : value() {};
};

template<typename T>
struct ServoCell {
  ServoUnsafeCell<T> value;
  T Get() const { return value.value; }
  void Set(T arg) { value.value = arg; }
  ServoCell() : value() {};
};




enum class LazyComputeBehavior {
  Allow,
  Assert,
};




enum class TraversalRootBehavior {
  Normal,
  UnstyledChildrenOnly,
};






enum class TraversalRestyleBehavior {
  Normal,
  ForReconstruct,
};


enum class UpdateAnimationsTasks : uint8_t {
  CSSAnimations = 1 << 0,
  CSSTransitions = 1 << 1,
  EffectProperties = 1 << 2,
  CascadeResults = 1 << 3,
};

inline constexpr mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> operator |(UpdateAnimationsTasks a, UpdateAnimationsTasks b) { typedef mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<UpdateAnimationsTasks>::Type U; return Result(UpdateAnimationsTasks(U(a) | U(b))); } inline UpdateAnimationsTasks& operator |=(UpdateAnimationsTasks& a, UpdateAnimationsTasks b) { return a = a | b; } inline constexpr mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> operator &(UpdateAnimationsTasks a, UpdateAnimationsTasks b) { typedef mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<UpdateAnimationsTasks>::Type U; return Result(UpdateAnimationsTasks(U(a) & U(b))); } inline UpdateAnimationsTasks& operator &=(UpdateAnimationsTasks& a, UpdateAnimationsTasks b) { return a = a & b; } inline constexpr mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> operator ^(UpdateAnimationsTasks a, UpdateAnimationsTasks b) { typedef mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<UpdateAnimationsTasks>::Type U; return Result(UpdateAnimationsTasks(U(a) ^ U(b))); } inline UpdateAnimationsTasks& operator ^=(UpdateAnimationsTasks& a, UpdateAnimationsTasks b) { return a = a ^ b; } inline constexpr mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> operator~(UpdateAnimationsTasks a) { typedef mozilla::CastableTypedEnumResult<UpdateAnimationsTasks> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<UpdateAnimationsTasks>::Type U; return Result(UpdateAnimationsTasks(~(U(a)))); }

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSetHandle.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElements.h" 1
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElements.h"
namespace mozilla {



typedef uint8_t CSSPseudoElementTypeBase;
enum class CSSPseudoElementType : CSSPseudoElementTypeBase {





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElementList.h" 1
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElementList.h"
after,
before,

backdrop,

cue,


firstLetter,


firstLine,



mozSelection,




mozFocusInner,
mozFocusOuter,



mozListBullet,
mozListNumber,

mozMathAnonymous,


mozNumberWrapper,


mozNumberText,


mozNumberSpinBox,


mozNumberSpinUp,


mozNumberSpinDown,


mozProgressBar,

mozRangeTrack,

mozRangeProgress,

mozRangeThumb,

mozMeterBar,

mozPlaceholder,

placeholder,

mozColorSwatch,
# 55 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElements.h" 2

  Count,
  InheritingAnonBox = Count,

  NonInheritingAnonBox,

  XULTree,

  NotPseudo,
  MAX
};

}



class nsICSSPseudoElement : public nsIAtom {};

class nsCSSPseudoElements
{
  typedef mozilla::CSSPseudoElementType Type;
  typedef mozilla::CSSEnabledState EnabledState;

public:
  static void AddRefAtoms();

  static bool IsPseudoElement(nsIAtom *aAtom);

  static bool IsCSS2PseudoElement(nsIAtom *aAtom);




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElementList.h" 1
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElementList.h"
static nsICSSPseudoElement* after;
static nsICSSPseudoElement* before;

static nsICSSPseudoElement* backdrop;

static nsICSSPseudoElement* cue;


static nsICSSPseudoElement* firstLetter;


static nsICSSPseudoElement* firstLine;



static nsICSSPseudoElement* mozSelection;




static nsICSSPseudoElement* mozFocusInner;
static nsICSSPseudoElement* mozFocusOuter;



static nsICSSPseudoElement* mozListBullet;
static nsICSSPseudoElement* mozListNumber;

static nsICSSPseudoElement* mozMathAnonymous;


static nsICSSPseudoElement* mozNumberWrapper;


static nsICSSPseudoElement* mozNumberText;


static nsICSSPseudoElement* mozNumberSpinBox;


static nsICSSPseudoElement* mozNumberSpinUp;


static nsICSSPseudoElement* mozNumberSpinDown;


static nsICSSPseudoElement* mozProgressBar;

static nsICSSPseudoElement* mozRangeTrack;

static nsICSSPseudoElement* mozRangeProgress;

static nsICSSPseudoElement* mozRangeThumb;

static nsICSSPseudoElement* mozMeterBar;

static nsICSSPseudoElement* mozPlaceholder;

static nsICSSPseudoElement* placeholder;

static nsICSSPseudoElement* mozColorSwatch;
# 88 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElements.h" 2


  static Type GetPseudoType(nsIAtom* aAtom, EnabledState aEnabledState);


  static nsIAtom* GetPseudoAtom(Type aType);

  static bool PseudoElementContainsElements(const Type aType) {
    return PseudoElementHasFlags(aType, (1<<1));
  }

  static bool PseudoElementSupportsStyleAttribute(const Type aType) {
    do { } while (0);
    return PseudoElementHasFlags(aType,
                                 (1<<2));
  }

  static bool PseudoElementSupportsUserActionState(const Type aType);

  static bool PseudoElementIsJSCreatedNAC(Type aType)
  {
    return PseudoElementHasFlags(aType, (1<<5));
  }

  static bool IsEnabled(Type aType, EnabledState aEnabledState)
  {
    return !PseudoElementHasFlags(aType, (1<<4)) ||
           (aEnabledState & EnabledState::eInUASheets);
  }

private:
# 130 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPseudoElements.h"
  static bool PseudoElementHasFlags(const Type aType, uint32_t aFlags)
  {
    do { } while (0);
    return (kPseudoElementFlags[size_t(aType)] & aFlags) == aFlags;
  }

  static const uint32_t kPseudoElementFlags[size_t(Type::Count)];
};
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleSetHandle.h" 2


namespace mozilla {
class CSSStyleSheet;
class ServoStyleSet;
namespace dom {
class Element;
}
}
struct nsFontFaceRuleContainer;
class nsIAtom;
class nsIContent;
class nsIDocument;
class nsStyleContext;
class nsStyleSet;
class nsPresContext;
struct TreeMatchContext;

namespace mozilla {







class StyleSetHandle
{
public:




  class Ptr
  {
  public:
    friend class ::mozilla::StyleSetHandle;

    bool IsGecko() const { return !IsServo(); }
    bool IsServo() const
    {
      do { } while (0);

      return mValue & 0x1;



    }

    StyleBackendType BackendType() const
    {
      return IsGecko() ? StyleBackendType::Gecko :
                         StyleBackendType::Servo;
    }

    nsStyleSet* AsGecko()
    {
      do { } while (0);
      return reinterpret_cast<nsStyleSet*>(mValue);
    }

    ServoStyleSet* AsServo()
    {
      do { } while (0);
      return reinterpret_cast<ServoStyleSet*>(mValue & ~0x1);
    }

    nsStyleSet* GetAsGecko() { return IsGecko() ? AsGecko() : nullptr; }
    ServoStyleSet* GetAsServo() { return IsServo() ? AsServo() : nullptr; }

    const nsStyleSet* AsGecko() const
    {
      return const_cast<Ptr*>(this)->AsGecko();
    }

    const ServoStyleSet* AsServo() const
    {
      do { } while (0);
      return const_cast<Ptr*>(this)->AsServo();
    }

    const nsStyleSet* GetAsGecko() const { return IsGecko() ? AsGecko() : nullptr; }
    const ServoStyleSet* GetAsServo() const { return IsServo() ? AsServo() : nullptr; }


    inline void Delete();






    inline void Init(nsPresContext* aPresContext);
    inline void BeginShutdown();
    inline void Shutdown();
    inline bool GetAuthorStyleDisabled() const;
    inline nsresult SetAuthorStyleDisabled(bool aStyleDisabled);
    inline void BeginUpdate();
    inline nsresult EndUpdate();
    inline already_AddRefed<nsStyleContext>
    ResolveStyleFor(dom::Element* aElement,
                    nsStyleContext* aParentContext,
                    LazyComputeBehavior aMayCompute);
    inline already_AddRefed<nsStyleContext>
    ResolveStyleFor(dom::Element* aElement,
                    nsStyleContext* aParentContext,
                    LazyComputeBehavior aMayCompute,
                    TreeMatchContext& aTreeMatchContext);
    inline already_AddRefed<nsStyleContext>
    ResolveStyleForText(nsIContent* aTextNode,
                        nsStyleContext* aParentContext);
    inline already_AddRefed<nsStyleContext>
    ResolveStyleForFirstLetterContinuation(nsStyleContext* aParentContext);
    inline already_AddRefed<nsStyleContext>
    ResolveStyleForPlaceholder();
    inline already_AddRefed<nsStyleContext>
    ResolvePseudoElementStyle(dom::Element* aParentElement,
                              mozilla::CSSPseudoElementType aType,
                              nsStyleContext* aParentContext,
                              dom::Element* aPseudoElement);
    inline already_AddRefed<nsStyleContext>
    ResolveInheritingAnonymousBoxStyle(nsIAtom* aPseudoTag,
                                       nsStyleContext* aParentContext,
                                       uint32_t aFlags = 0);
    inline already_AddRefed<nsStyleContext>
    ResolveNonInheritingAnonymousBoxStyle(nsIAtom* aPseudoTag);
    inline nsresult AppendStyleSheet(SheetType aType, StyleSheet* aSheet);
    inline nsresult PrependStyleSheet(SheetType aType, StyleSheet* aSheet);
    inline nsresult RemoveStyleSheet(SheetType aType, StyleSheet* aSheet);
    inline nsresult ReplaceSheets(SheetType aType,
                           const nsTArray<RefPtr<StyleSheet>>& aNewSheets);
    inline nsresult InsertStyleSheetBefore(SheetType aType,
                                    StyleSheet* aNewSheet,
                                    StyleSheet* aReferenceSheet);
    inline int32_t SheetCount(SheetType aType) const;
    inline StyleSheet* StyleSheetAt(SheetType aType, int32_t aIndex) const;
    inline nsresult RemoveDocStyleSheet(StyleSheet* aSheet);
    inline nsresult AddDocStyleSheet(StyleSheet* aSheet, nsIDocument* aDocument);
    inline already_AddRefed<nsStyleContext>
    ProbePseudoElementStyle(dom::Element* aParentElement,
                            mozilla::CSSPseudoElementType aType,
                            nsStyleContext* aParentContext);
    inline already_AddRefed<nsStyleContext>
    ProbePseudoElementStyle(dom::Element* aParentElement,
                            mozilla::CSSPseudoElementType aType,
                            nsStyleContext* aParentContext,
                            TreeMatchContext& aTreeMatchContext,
                            dom::Element* aPseudoElement = nullptr);
    inline nsRestyleHint HasStateDependentStyle(dom::Element* aElement,
                                                EventStates aStateMask);
    inline nsRestyleHint HasStateDependentStyle(
        dom::Element* aElement,
        mozilla::CSSPseudoElementType aPseudoType,
        dom::Element* aPseudoElement,
        EventStates aStateMask);

    inline void RootStyleContextAdded();
    inline void RootStyleContextRemoved();

    inline bool AppendFontFaceRules(nsTArray<nsFontFaceRuleContainer>& aArray);

  private:




    uintptr_t mValue;
  };

  StyleSetHandle() { mPtr.mValue = 0; }
  StyleSetHandle(const StyleSetHandle& aOth) { mPtr.mValue = aOth.mPtr.mValue; }
               StyleSetHandle(nsStyleSet* aSet) { *this = aSet; }
               StyleSetHandle(ServoStyleSet* aSet) { *this = aSet; }

  StyleSetHandle& operator=(nsStyleSet* aStyleSet)
  {
    do { } while (0);

    mPtr.mValue = reinterpret_cast<uintptr_t>(aStyleSet);
    return *this;
  }

  StyleSetHandle& operator=(ServoStyleSet* aStyleSet)
  {

    do { } while (0);

    mPtr.mValue =
      aStyleSet ? (reinterpret_cast<uintptr_t>(aStyleSet) | 0x1) : 0;
    return *this;




  }


  explicit operator bool() const { return !!mPtr.mValue; }
  bool operator!() const { return !mPtr.mValue; }


  Ptr* operator->() { return &mPtr; }
  const Ptr* operator->() const { return &mPtr; }

private:
  Ptr mPtr;
};



}
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BorrowedAttrInfo.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BorrowedAttrInfo.h"
class nsAttrName;
class nsAttrValue;

namespace mozilla {
namespace dom {
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BorrowedAttrInfo.h"
struct BorrowedAttrInfo
{
  BorrowedAttrInfo()
    : mName(nullptr)
    , mValue(nullptr)
  {
  }

  BorrowedAttrInfo(const nsAttrName* aName, const nsAttrValue* aValue);

  BorrowedAttrInfo(const BorrowedAttrInfo& aOther);

  const nsAttrName* mName;
  const nsAttrValue* mValue;

  explicit operator bool() const { return mName != nullptr; }
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCaseTreatment.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCaseTreatment.h"
enum nsCaseTreatment {
  eCaseMatters,
  eIgnoreCase
};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h" 2



class nsAString;
class nsIAtom;
class nsIURI;
class nsRuleWalker;
class nsAttrValue;
class nsAttrName;
class nsTextFragment;
class nsIFrame;
class nsXBLBinding;

namespace mozilla {
class EventChainPreVisitor;
struct URLExtraData;
namespace dom {
class ShadowRoot;
}
namespace widget {
struct IMEState;
}
}

enum nsLinkState {
  eLinkState_Unvisited = 1,
  eLinkState_Visited = 2,
  eLinkState_NotLink = 3
};
# 51 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
class nsIContent : public nsINode {
public:
  typedef mozilla::widget::IMEState IMEState;





  explicit nsIContent(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
    : nsINode(aNodeInfo)
  {
    do { } while (0);
    SetNodeIsContent();
  }


  template<typename T, typename U> struct COMTypeInfo;
# 97 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                              nsIContent* aBindingParent,
                              bool aCompileEventHandlers) = 0;
# 115 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual void UnbindFromTree(bool aDeep = true,
                              bool aNullParent = true) = 0;

  enum {
# 129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
    eAllChildren = 0,
# 142 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
    eAllButXBL = 1,





    eSkipPlaceholderContent = 2,






    eSkipDocumentLevelNativeAnonymousContent = 4,
  };
# 168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual already_AddRefed<nsINodeList> GetChildren(uint32_t aFilter) = 0;






  bool IsRootOfNativeAnonymousSubtree() const
  {
    do { } while(0);



    return HasFlag(NODE_IS_NATIVE_ANONYMOUS_ROOT);
  }

  bool IsRootOfChromeAccessOnlySubtree() const
  {
    return HasFlag(NODE_IS_NATIVE_ANONYMOUS_ROOT |
                   NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS);
  }





  void SetIsNativeAnonymousRoot()
  {
    SetFlags(NODE_IS_ANONYMOUS_ROOT | NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE |
             NODE_IS_NATIVE_ANONYMOUS_ROOT | NODE_IS_NATIVE_ANONYMOUS);
  }





  virtual nsIContent* FindFirstNonChromeOnlyAccessContent() const;





  bool IsRootOfAnonymousSubtree() const
  {
    do { } while(0);



    do { } while(0);
# 229 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
    return HasFlag(NODE_IS_ANONYMOUS_ROOT);
  }






  bool IsInAnonymousSubtree() const
  {
    do { } while(0);




    return IsInNativeAnonymousSubtree() || (!IsInShadowTree() && GetBindingParent() != nullptr);
  }





  inline bool IsInHTMLDocument() const;





  virtual bool IsInChromeDocument() const;





  inline int32_t GetNameSpaceID() const
  {
    return mNodeInfo->NamespaceID();
  }

  inline bool IsHTMLElement() const
  {
    return IsInNamespace(3);
  }

  inline bool IsHTMLElement(nsIAtom* aTag) const
  {
    return mNodeInfo->Equals(aTag, 3);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfHTMLElements(First aFirst, Args... aArgs) const
  {
    return IsHTMLElement() && IsNodeInternal(aFirst, aArgs...);
  }

  inline bool IsSVGElement() const
  {
    return IsInNamespace(10);
  }

  inline bool IsSVGElement(nsIAtom* aTag) const
  {
    return mNodeInfo->Equals(aTag, 10);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfSVGElements(First aFirst, Args... aArgs) const
  {
    return IsSVGElement() && IsNodeInternal(aFirst, aArgs...);
  }

  inline bool IsXULElement() const
  {
    return IsInNamespace(9);
  }

  inline bool IsXULElement(nsIAtom* aTag) const
  {
    return mNodeInfo->Equals(aTag, 9);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfXULElements(First aFirst, Args... aArgs) const
  {
    return IsXULElement() && IsNodeInternal(aFirst, aArgs...);
  }

  inline bool IsMathMLElement() const
  {
    return IsInNamespace(7);
  }

  inline bool IsMathMLElement(nsIAtom* aTag) const
  {
    return mNodeInfo->Equals(aTag, 7);
  }

  template<typename First, typename... Args>
  inline bool IsAnyOfMathMLElements(First aFirst, Args... aArgs) const
  {
    return IsMathMLElement() && IsNodeInternal(aFirst, aArgs...);
  }
  inline bool IsActiveChildrenElement() const
  {
    return mNodeInfo->Equals(nsGkAtoms::children, 6) &&
           GetBindingParent();
  }

  bool IsGeneratedContentContainerForBefore() const
  {
    return IsRootOfNativeAnonymousSubtree() &&
           mNodeInfo->NameAtom() == nsGkAtoms::mozgeneratedcontentbefore;
  }

  bool IsGeneratedContentContainerForAfter() const
  {
    return IsRootOfNativeAnonymousSubtree() &&
           mNodeInfo->NameAtom() == nsGkAtoms::mozgeneratedcontentafter;
  }
# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                   const nsAString& aValue, bool aNotify)
  {
    return SetAttr(aNameSpaceID, aName, nullptr, aValue, aNotify);
  }
# 382 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                           nsIAtom* aPrefix, const nsAString& aValue,
                           bool aNotify) = 0;
# 396 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  bool GetAttr(int32_t aNameSpaceID, nsIAtom* aName,
               nsAString& aResult) const;
# 406 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  bool HasAttr(int32_t aNameSpaceID, nsIAtom* aName) const;
# 418 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  bool AttrValueIs(int32_t aNameSpaceID,
                   nsIAtom* aName,
                   const nsAString& aValue,
                   nsCaseTreatment aCaseSensitive) const;
# 433 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  bool AttrValueIs(int32_t aNameSpaceID,
                   nsIAtom* aName,
                   nsIAtom* aValue,
                   nsCaseTreatment aCaseSensitive) const;

  enum {
    ATTR_MISSING = -1,
    ATTR_VALUE_NO_MATCH = -2
  };
# 459 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  typedef nsIAtom* const* const AttrValuesArray;
  virtual int32_t FindAttrValueIn(int32_t aNameSpaceID,
                                  nsIAtom* aName,
                                  AttrValuesArray* aValues,
                                  nsCaseTreatment aCaseSensitive) const
  {
    return ATTR_MISSING;
  }
# 476 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttr,
                             bool aNotify) = 0;
# 491 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const = 0;




  virtual mozilla::dom::BorrowedAttrInfo GetAttrInfoAt(uint32_t aIndex) const = 0;






  virtual uint32_t GetAttrCount() const = 0;






  virtual const nsTextFragment *GetText() = 0;





  virtual uint32_t TextLength() const = 0;
# 525 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual bool IsEventAttributeName(nsIAtom* aName)
  {
    return false;
  }






  virtual nsresult SetText(const char16_t* aBuffer, uint32_t aLength,
                           bool aNotify) = 0;






  virtual nsresult AppendText(const char16_t* aBuffer, uint32_t aLength,
                              bool aNotify) = 0;






  nsresult SetText(const nsAString& aStr, bool aNotify)
  {
    return SetText(aStr.BeginReading(), aStr.Length(), aNotify);
  }





  virtual bool TextIsOnlyWhitespace() = 0;




  virtual bool ThreadSafeTextIsOnlyWhitespace() const = 0;







  virtual bool HasTextForTranslation() = 0;





  virtual void AppendTextTo(nsAString& aResult) = 0;





  __attribute__ ((warn_unused_result))
  virtual bool AppendTextTo(nsAString& aResult, const mozilla::fallible_t&) = 0;
# 610 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  bool IsFocusable(int32_t* aTabIndex = nullptr, bool aWithMouse = false);
  virtual bool IsFocusableInternal(int32_t* aTabIndex, bool aWithMouse);
# 622 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual bool PerformAccesskey(bool aKeyCausesActivation,
                                bool aIsTrustedEvent)
  {
    return false;
  }
# 643 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual IMEState GetDesiredIMEState();
# 655 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual nsIContent *GetBindingParent() const = 0;






  virtual nsXBLBinding *GetXBLBinding() const = 0;
# 677 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual void SetXBLBinding(nsXBLBinding* aBinding,
                             nsBindingManager* aOldBindingManager = nullptr) = 0;







  virtual void SetShadowRoot(mozilla::dom::ShadowRoot* aShadowRoot) = 0;






  inline mozilla::dom::ShadowRoot *GetShadowRoot() const;
# 702 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual mozilla::dom::ShadowRoot *GetContainingShadow() const = 0;






  virtual nsTArray<nsIContent*> &DestInsertionPoints() = 0;






  virtual nsTArray<nsIContent*> *GetExistingDestInsertionPoints() const = 0;







  virtual nsIContent *GetXBLInsertionParent() const = 0;






  virtual void SetXBLInsertionParent(nsIContent* aContent) = 0;





  inline nsIContent *GetFlattenedTreeParent() const;


  enum FlattenedParentType { eNotForStyle, eForStyle };
  nsINode* GetFlattenedTreeParentNodeInternal(FlattenedParentType aType) const;
# 756 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual bool IsLink(nsIURI** aURI) const = 0;
# 765 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual already_AddRefed<nsIURI> GetHrefURI() const
  {
    return nullptr;
  }
# 797 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual void DoneCreatingElement()
  {
  }







  virtual void BeginAddingChildren()
  {
  }
# 830 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual void DoneAddingChildren(bool aHaveNotified)
  {
  }
# 843 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual bool IsDoneAddingChildren()
  {
    return true;
  }





  nsIAtom* GetID() const {
    if (HasID()) {
      return DoGetID();
    }
    return nullptr;
  }





  virtual nsresult WalkContentStyleRules(nsRuleWalker* aRuleWalker) = 0;







  virtual void UpdateEditableState(bool aNotify);





  virtual void DestroyContent()
  {
  }




  virtual void SaveSubtreeState() = 0;
# 897 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  nsIFrame* GetPrimaryFrame() const
  {
    return (IsInUncomposedDoc() || IsInShadowTree()) ? mPrimaryFrame : nullptr;
  }
  void SetPrimaryFrame(nsIFrame* aFrame) {
    do { } while (0);
    do { } while(0);

    mPrimaryFrame = aFrame;
  }

  nsresult LookupNamespaceURIInternal(const nsAString& aNamespacePrefix,
                                      nsAString& aNamespaceURI) const;





  bool HasIndependentSelection();






  mozilla::dom::Element* GetEditingHost();






  bool GetLang(nsAString& aResult) const {
    for (const nsIContent* content = this; content; content = content->GetParent()) {
      if (content->GetAttrCount() > 0) {


        bool hasAttr = content->GetAttr(2, nsGkAtoms::lang,
                                          aResult);
        if (!hasAttr && (content->IsHTMLElement() || content->IsSVGElement() ||
            content->IsXULElement())) {
          hasAttr = content->GetAttr(kNameSpaceID_None, nsGkAtoms::lang,
                                     aResult);
        }
        do { } while(0);

        if (hasAttr) {
          return true;
        }
      }
    }
    return false;
  }


  bool IsNativeScrollbarContent() const {
    return IsNativeAnonymous() &&
           IsAnyOfXULElements(nsGkAtoms::scrollbar,
                              nsGkAtoms::resizer,
                              nsGkAtoms::scrollcorner);
  }


  virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const override;


  already_AddRefed<nsIURI> GetBaseURIForStyleAttr() const;


  mozilla::URLExtraData* GetURLDataForStyleAttr() const;

  virtual nsresult GetEventTargetParent(
                     mozilla::EventChainPreVisitor& aVisitor) override;

  virtual bool IsPurple() = 0;
  virtual void RemovePurple() = 0;

  virtual bool OwnedOnlyByTheDOMTree() { return false; }
protected:




  nsIAtom* DoGetID() const;


  inline nsIURI* GetBaseURIWithoutXMLBase() const;

public:
# 1006 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIContent.h"
  virtual void Describe(nsAString& aOutDescription) const {
    aOutDescription = static_cast<const nsLiteralString&>(nsLiteralString(u"" "(not an element)"));
  }

  enum ETabFocusType {
    eTabFocus_textControlsMask = (1<<0),
    eTabFocus_formElementsMask = (1<<1),
    eTabFocus_linksMask = (1<<2),
    eTabFocus_any = 1 + (1<<1) + (1<<2)
  };


  static int32_t sTabFocusModel;



  static bool sTabFocusModelAppliesToXUL;
};

template<typename T> struct nsIContent::COMTypeInfo<nsIContent, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIContent::COMTypeInfo<nsIContent, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x8e1bab9d, 0x8815, 0x4d2c, { 0xa2, 0x4d, 0x7a, 0xba, 0x52, 0x39, 0xdc, 0x22 } };

inline nsIContent* nsINode::AsContent()
{
  do { } while (0);
  return static_cast<nsIContent*>(this);
}
# 36 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISelectionController.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISelectionController.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISelectionDisplay.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISelectionDisplay.h"
class nsISelectionDisplay : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    DISPLAY_TEXT = 1,
    DISPLAY_IMAGES = 2,
    DISPLAY_FRAMES = 4,
    DISPLAY_ALL = 7
  };


  virtual nsresult SetSelectionFlags(int16_t toggle) = 0;


  virtual nsresult GetSelectionFlags(int16_t *_retval) = 0;

};

  template<typename T> struct nsISelectionDisplay::COMTypeInfo<nsISelectionDisplay, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISelectionDisplay::COMTypeInfo<nsISelectionDisplay, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x0ddf9e1c, 0x1dd2, 0x11b2, { 0xa1, 0x83, 0x90, 0x8a, 0x08, 0xaa, 0x75, 0xae }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISelectionController.h" 2






typedef short SelectionRegion;
class nsIContent;

class nsIDOMNode;

class nsISelection;

class nsISelectionDisplay;
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISelectionController.h"
class nsISelectionController : public nsISelectionDisplay {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    SELECTION_NONE = 0,
    SELECTION_NORMAL = 1,
    SELECTION_SPELLCHECK = 2,
    SELECTION_IME_RAWINPUT = 4,
    SELECTION_IME_SELECTEDRAWTEXT = 8,
    SELECTION_IME_CONVERTEDTEXT = 16,
    SELECTION_IME_SELECTEDCONVERTEDTEXT = 32,
    SELECTION_ACCESSIBILITY = 64,
    SELECTION_FIND = 128,
    SELECTION_URLSECONDARY = 256,
    SELECTION_URLSTRIKEOUT = 512,
    NUM_SELECTIONTYPES = 11,
    SELECTION_ANCHOR_REGION = 0,
    SELECTION_FOCUS_REGION = 1,
    SELECTION_WHOLE_SELECTION = 2,
    NUM_SELECTION_REGIONS = 3,
    SELECTION_OFF = 0,
    SELECTION_HIDDEN = 1,
    SELECTION_ON = 2,
    SELECTION_DISABLED = 3,
    SELECTION_ATTENTION = 4
  };


  virtual nsresult SetDisplaySelection(int16_t toggle) = 0;


  virtual nsresult GetDisplaySelection(int16_t *_retval) = 0;


  virtual nsresult GetSelection(int16_t type, nsISelection * *_retval) = 0;

  enum {
    SCROLL_SYNCHRONOUS = 2,
    SCROLL_FIRST_ANCESTOR_ONLY = 4,
    SCROLL_CENTER_VERTICALLY = 16,
    SCROLL_OVERFLOW_HIDDEN = 32,
    SCROLL_FOR_CARET_MOVE = 64
  };


  virtual nsresult ScrollSelectionIntoView(int16_t type, int16_t region, int16_t flags) = 0;


  virtual nsresult RepaintSelection(int16_t type) = 0;


  virtual nsresult SetCaretEnabled(bool enabled) = 0;


  virtual nsresult SetCaretReadOnly(bool readOnly) = 0;


  virtual nsresult GetCaretEnabled(bool *_retval) = 0;


  virtual nsresult GetCaretVisible(bool *aCaretVisible) = 0;


  virtual nsresult SetCaretVisibilityDuringSelection(bool visibility) = 0;


  virtual nsresult CharacterMove(bool forward, bool extend) = 0;


  virtual nsresult PhysicalMove(int16_t direction, int16_t amount, bool extend) = 0;

  enum {
    MOVE_LEFT = 0,
    MOVE_RIGHT = 1,
    MOVE_UP = 2,
    MOVE_DOWN = 3
  };


  virtual nsresult CharacterExtendForDelete(void) = 0;


  virtual nsresult CharacterExtendForBackspace(void) = 0;


  virtual nsresult WordMove(bool forward, bool extend) = 0;


  virtual nsresult WordExtendForDelete(bool forward) = 0;


  virtual nsresult LineMove(bool forward, bool extend) = 0;


  virtual nsresult IntraLineMove(bool forward, bool extend) = 0;


  virtual nsresult PageMove(bool forward, bool extend) = 0;


  virtual nsresult CompleteScroll(bool forward) = 0;


  virtual nsresult CompleteMove(bool forward, bool extend) = 0;


  virtual nsresult ScrollPage(bool forward) = 0;


  virtual nsresult ScrollLine(bool forward) = 0;


  virtual nsresult ScrollCharacter(bool right) = 0;


  virtual nsresult SelectAll(void) = 0;


  virtual nsresult CheckVisibility(nsIDOMNode *node, int16_t startOffset, int16_t endOffset, bool *_retval) = 0;


  virtual nsresult CheckVisibilityContent(nsIContent *node, int16_t startOffset, int16_t endOffset, bool *_retval) = 0;

};

  template<typename T> struct nsISelectionController::COMTypeInfo<nsISelectionController, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISelectionController::COMTypeInfo<nsISelectionController, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x3801c9d4, 0x8e69, 0x4bfc, { 0x9e, 0xdb, 0xb5, 0x82, 0x78, 0x62, 0x1f, 0x8f }};
# 484 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISelectionController.h"
namespace mozilla {
typedef short RawSelectionType;
enum class SelectionType : RawSelectionType
{
  eInvalid = -1,
  eNone = nsISelectionController::SELECTION_NONE,
  eNormal = nsISelectionController::SELECTION_NORMAL,
  eSpellCheck = nsISelectionController::SELECTION_SPELLCHECK,
  eIMERawClause = nsISelectionController::SELECTION_IME_RAWINPUT,
  eIMESelectedRawClause = nsISelectionController::SELECTION_IME_SELECTEDRAWTEXT,
  eIMEConvertedClause = nsISelectionController::SELECTION_IME_CONVERTEDTEXT,
  eIMESelectedClause =
    nsISelectionController::SELECTION_IME_SELECTEDCONVERTEDTEXT,
  eAccessibility = nsISelectionController::SELECTION_ACCESSIBILITY,
  eFind = nsISelectionController::SELECTION_FIND,
  eURLSecondary = nsISelectionController::SELECTION_URLSECONDARY,
  eURLStrikeout = nsISelectionController::SELECTION_URLSTRIKEOUT,
};





enum : size_t
{

  kSelectionTypeCount = nsISelectionController::NUM_SELECTIONTYPES,

  kPresentSelectionTypeCount = kSelectionTypeCount - 1
};
const char* ToChar(SelectionType aSelectionType);
SelectionType ToSelectionType(RawSelectionType aRawSelectionType);
RawSelectionType ToRawSelectionType(SelectionType aSelectionType);
bool operator &(SelectionType aSelectionType,
                RawSelectionType aRawSelectionTypes);
}
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameManagerBase.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameManagerBase.h"
class nsIFrame;
class nsIPresShell;

class nsFrameManagerBase
{
public:
  nsFrameManagerBase();

  bool IsDestroyingFrames() { return mIsDestroyingFrames; }






  nsIFrame* GetRootFrame() const { return mRootFrame; }
  void SetRootFrame(nsIFrame* aRootFrame)
  {
    do { } while(0);
    mRootFrame = aRootFrame;
  }

protected:
  class UndisplayedMap;


  nsIPresShell* mPresShell;
  nsIFrame* mRootFrame;
  PLDHashTable mPlaceholderMap;
  UndisplayedMap* mUndisplayedMap;
  UndisplayedMap* mDisplayContentsMap;
  bool mIsDestroyingFrames;
};
# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 2







# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArena.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArena.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaAllocator.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaAllocator.h"
namespace mozilla {
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaAllocator.h"
template<size_t ArenaSize, size_t Alignment=1>
class ArenaAllocator
{
public:
  constexpr ArenaAllocator()
    : mHead()
    , mCurrent(nullptr)
  {
     static_assert(mozilla::tl::FloorLog2<Alignment>::value ==
                   mozilla::tl::CeilingLog2<Alignment>::value,
                  "ArenaAllocator alignment must be a power of two");
  }

  ArenaAllocator(const ArenaAllocator&) = delete;
  ArenaAllocator& operator=(const ArenaAllocator&) = delete;





  ~ArenaAllocator()
  {
    Clear();
  }






  __attribute__((always_inline)) inline void* Allocate(size_t aSize, const fallible_t&)
  {
    do { static_assert(mozilla::detail::AssertionConditionType<decltype(aSize)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(aSize))), 0))) { do { } while (0); AnnotateMozCrashReason("MOZ_RELEASE_ASSERT(" "aSize" ") (" "Allocation size must be non-zero" ")"); do { *((volatile int*) __null) = 71; ::abort(); } while (0); } } while (0);
    return InternalAllocate(AlignedSize(aSize));
  }

  void* Allocate(size_t aSize)
  {
    void* p = Allocate(aSize, fallible);
    if ((__builtin_expect(!!(!p), 0))) {
      NS_ABORT_OOM(std::max(aSize, ArenaSize));
    }

    return p;
  }







  void Clear()
  {

    auto a = mHead.next;
    while (a) {
      auto tmp = a;
      a = a->next;
      free(tmp);
    }


    mHead.next = nullptr;
    mCurrent = nullptr;
  }




  static constexpr size_t AlignedSize(size_t aSize)
  {
    return (aSize + (Alignment - 1)) & ~(Alignment - 1);
  }

  size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
  {
    size_t s = 0;
    for (auto arena = mHead.next; arena; arena = arena->next) {
      s += aMallocSizeOf(arena);
    }

    return s;
  }

private:
  struct ArenaHeader
  {



    uintptr_t offset;



    uintptr_t tail;
  };

  struct ArenaChunk
  {
    constexpr ArenaChunk() : header{0, 0}, next(nullptr) {}

    explicit ArenaChunk(size_t aSize)
      : header{AlignedSize(uintptr_t(this + 1)), uintptr_t(this) + aSize}
      , next(nullptr)
    {
    }

    ArenaHeader header;
    ArenaChunk* next;




    void* Allocate(size_t aSize)
    {
      do { } while (0);
      char* p = reinterpret_cast<char*>(header.offset);
      header.offset += aSize;
      do {} while (0);
      return p;
    }




    size_t Available() const {
      return header.tail - header.offset;
    }
  };




  ArenaChunk* AllocateChunk(size_t aSize)
  {
    static const size_t kOffset = AlignedSize(sizeof(ArenaChunk));
    do { } while (0);

    const size_t chunkSize = aSize + kOffset;
    void* p = malloc(chunkSize);
    if (!p) {
      return nullptr;
    }

    ArenaChunk* arena = new (KnownNotNull, p) ArenaChunk(chunkSize);
    do {} while (0);



    arena->next = mHead.next;
    mHead.next = arena;




    if (aSize == ArenaSize - kOffset) {
      mCurrent = arena;
    }

    return arena;
  }

  __attribute__((always_inline)) inline void* InternalAllocate(size_t aSize)
  {
    static_assert(ArenaSize > AlignedSize(sizeof(ArenaChunk)),
                  "Arena size must be greater than the header size");

    static const size_t kMaxArenaCapacity =
        ArenaSize - AlignedSize(sizeof(ArenaChunk));

    if (mCurrent && aSize <= mCurrent->Available()) {
      return mCurrent->Allocate(aSize);
    }

    ArenaChunk* arena = AllocateChunk(std::max(kMaxArenaCapacity, aSize));
    return arena ? arena->Allocate(aSize) : nullptr;
  }

  ArenaChunk mHead;
  ArenaChunk* mCurrent;
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArena.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaRefPtr.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaRefPtr.h"
class nsPresArena;

namespace mozilla {
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ArenaRefPtr.h"
template<typename T>
class ArenaRefPtr
{
  friend class ::nsPresArena;

public:
  ArenaRefPtr()
  {
    AssertValidType();
  }

  template<typename I>
               ArenaRefPtr(already_AddRefed<I>& aRhs)
  {
    AssertValidType();
    assign(aRhs);
  }

  template<typename I>
               ArenaRefPtr(already_AddRefed<I>&& aRhs)
  {
    AssertValidType();
    assign(aRhs);
  }

               ArenaRefPtr(T* aRhs)
  {
    AssertValidType();
    assign(aRhs);
  }

  template<typename I>
  ArenaRefPtr<T>& operator=(already_AddRefed<I>& aRhs)
  {
    assign(aRhs);
    return *this;
  }

  template<typename I>
  ArenaRefPtr<T>& operator=(already_AddRefed<I>&& aRhs)
  {
    assign(aRhs);
    return *this;
  }

  ArenaRefPtr<T>& operator=(T* aRhs)
  {
    assign(aRhs);
    return *this;
  }

  ~ArenaRefPtr() { assign(nullptr); }

  operator T*() const & { return get(); }
  operator T*() const && = delete;
  explicit operator bool() const { return !!mPtr; }
  bool operator!() const { return !mPtr; }
  T* operator->() const { return mPtr.operator->(); }
  T& operator*() const { return *get(); }

  T* get() const { return mPtr; }

private:
  void AssertValidType();







  void ClearWithoutDeregistering()
  {
    mPtr = nullptr;
  }

  template<typename I>
  void assign(already_AddRefed<I>& aSmartPtr)
  {
    RefPtr<T> newPtr(aSmartPtr);
    assignFrom(newPtr);
  }

  template<typename I>
  void assign(already_AddRefed<I>&& aSmartPtr)
  {
    RefPtr<T> newPtr(aSmartPtr);
    assignFrom(newPtr);
  }

  void assign(T* aPtr) { assignFrom(aPtr); }

  template<typename I>
  void assignFrom(I& aPtr)
  {
    if (aPtr == mPtr) {
      return;
    }
    bool sameArena = mPtr && aPtr && mPtr->Arena() == aPtr->Arena();
    if (mPtr && !sameArena) {
      do { } while (0);
      mPtr->Arena()->DeregisterArenaRefPtr(this);
    }
    mPtr = Move(aPtr);
    if (mPtr && !sameArena) {
      do { } while (0);
      mPtr->Arena()->RegisterArenaRefPtr(this);
    }
  }

  RefPtr<T> mPtr;
};

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArena.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArena.h"
struct nsArenaMemoryStats;

class nsPresArena {
public:
  nsPresArena();
  ~nsPresArena();




  void* AllocateBySize(size_t aSize)
  {
    return Allocate(uint32_t(aSize) |
                    uint32_t(mozilla::eArenaObjectID_NON_OBJECT_MARKER), aSize);
  }
  void FreeBySize(size_t aSize, void* aPtr)
  {
    Free(uint32_t(aSize) |
         uint32_t(mozilla::eArenaObjectID_NON_OBJECT_MARKER), aPtr);
  }





  void* AllocateByFrameID(nsQueryFrame::FrameIID aID, size_t aSize)
  {
    return Allocate(aID, aSize);
  }
  void FreeByFrameID(nsQueryFrame::FrameIID aID, void* aPtr)
  {
    Free(aID, aPtr);
  }





  void* AllocateByObjectID(mozilla::ArenaObjectID aID, size_t aSize)
  {
    return Allocate(aID, aSize);
  }
  void FreeByObjectID(mozilla::ArenaObjectID aID, void* aPtr)
  {
    Free(aID, aPtr);
  }
# 82 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresArena.h"
  template<typename T>
  void RegisterArenaRefPtr(mozilla::ArenaRefPtr<T>* aPtr);





  template<typename T>
  void DeregisterArenaRefPtr(mozilla::ArenaRefPtr<T>* aPtr)
  {
    do { } while (0);
    mArenaRefPtrs.Remove(aPtr);
  }






  void ClearArenaRefPtrs();







  void ClearArenaRefPtrs(mozilla::ArenaObjectID aObjectID);





  void AddSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf,
                              nsArenaMemoryStats* aArenaStats);

private:
  void* Allocate(uint32_t aCode, size_t aSize);
  void Free(uint32_t aCode, void* aPtr);

  inline void ClearArenaRefPtrWithoutDeregistering(
      void* aPtr,
      mozilla::ArenaObjectID aObjectID);



  class FreeList : public PLDHashEntryHdr
  {
  public:
    typedef uint32_t KeyType;
    nsTArray<void *> mEntries;
    size_t mEntrySize;
    size_t mEntriesEverAllocated;

    typedef const void* KeyTypePointer;
    KeyTypePointer mKey;

    explicit FreeList(KeyTypePointer aKey)
    : mEntrySize(0), mEntriesEverAllocated(0), mKey(aKey) {}


    bool KeyEquals(KeyTypePointer const aKey) const
    { return mKey == aKey; }

    static KeyTypePointer KeyToPointer(KeyType aKey)
    { return ((void*)(intptr_t)(aKey)); }

    static PLDHashNumber HashKey(KeyTypePointer aKey)
    { return ((int32_t)(intptr_t)(aKey)); }

    size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
    { return mEntries.ShallowSizeOfExcludingThis(aMallocSizeOf); }

    enum { ALLOW_MEMMOVE = false };
  };

  nsTHashtable<FreeList> mFreeLists;
  mozilla::ArenaAllocator<8192, 8> mPool;
  nsDataHashtable<nsPtrHashKey<void>, mozilla::ArenaObjectID> mArenaRefPtrs;
};
# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIImageLoadingContent.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIImageLoadingContent.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgINotificationObserver.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgINotificationObserver.h"
class imgIRequest;
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgINotificationObserver.h"
class imgINotificationObserver : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    SIZE_AVAILABLE = 1,
    FRAME_UPDATE = 2,
    FRAME_COMPLETE = 3,
    LOAD_COMPLETE = 4,
    DECODE_COMPLETE = 5,
    DISCARD = 6,
    UNLOCKED_DRAW = 7,
    IS_ANIMATED = 8,
    HAS_TRANSPARENCY = 9
  };


  virtual nsresult Notify(imgIRequest *aProxy, int32_t aType, const nsIntRect *aRect) = 0;

};

  template<typename T> struct imgINotificationObserver::COMTypeInfo<imgINotificationObserver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID imgINotificationObserver::COMTypeInfo<imgINotificationObserver, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x03da5641, 0xa333, 0x454a, { 0xa8, 0x59, 0x03, 0x6d, 0x0b, 0xb6, 0x83, 0xb7 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIImageLoadingContent.h" 2







# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Visibility.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Visibility.h"
namespace mozilla {


enum class Visibility : uint8_t
{

  UNTRACKED,






  APPROXIMATELY_NONVISIBLE,





  APPROXIMATELY_VISIBLE
};


enum class OnNonvisible : uint8_t
{
  DISCARD_IMAGES
};

}
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIImageLoadingContent.h" 2
class imgIRequest;

class nsIChannel;

class nsIStreamListener;

class nsIURI;

class nsIDocument;

class nsIFrame;
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIImageLoadingContent.h"
class nsIImageLoadingContent : public imgINotificationObserver {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    UNKNOWN_REQUEST = -1,
    CURRENT_REQUEST = 0,
    PENDING_REQUEST = 1
  };


  virtual nsresult GetLoadingEnabled(bool *aLoadingEnabled) = 0;
  virtual nsresult SetLoadingEnabled(bool aLoadingEnabled) = 0;


  virtual nsresult GetImageBlockingStatus(int16_t *aImageBlockingStatus) = 0;


  virtual nsresult AddObserver(imgINotificationObserver *aObserver) = 0;


  virtual nsresult RemoveObserver(imgINotificationObserver *aObserver) = 0;


  virtual nsresult GetRequest(int32_t aRequestType, imgIRequest * *_retval) = 0;


  virtual bool CurrentRequestHasSize(void) = 0;


  virtual void FrameCreated(nsIFrame *aFrame) = 0;


  virtual void FrameDestroyed(nsIFrame *aFrame) = 0;


  virtual nsresult GetRequestType(imgIRequest *aRequest, int32_t *_retval) = 0;


  virtual nsresult GetCurrentURI(nsIURI * *aCurrentURI) = 0;


  virtual nsresult LoadImageWithChannel(nsIChannel *aChannel, nsIStreamListener * *_retval) = 0;


  virtual nsresult ForceReload(bool aNotify, uint8_t _argc) = 0;


  virtual nsresult ForceImageState(bool aForce, uint64_t aState) = 0;


  virtual nsresult GetNaturalWidth(uint32_t *aNaturalWidth) = 0;


  virtual nsresult GetNaturalHeight(uint32_t *aNaturalHeight) = 0;


  virtual void OnVisibilityChange(mozilla::Visibility aNewVisibility, const mozilla::Maybe<mozilla::OnNonvisible> & aNonvisibleAction) = 0;

};

  template<typename T> struct nsIImageLoadingContent::COMTypeInfo<nsIImageLoadingContent, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIImageLoadingContent::COMTypeInfo<nsIImageLoadingContent, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x0357123d, 0x9224, 0x4d12, { 0xa4, 0x7e, 0x86, 0x8c, 0x32, 0x68, 0x97, 0x77 }};
# 50 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameState.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameState.h"
typedef uint64_t nsFrameState_size_t;



enum nsFrameState : nsFrameState_size_t {



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h" 1
# 56 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_FRAME_IN_REFLOW = (nsFrameState(nsFrameState_size_t(1) << (0))),




NS_FRAME_FIRST_REFLOW = (nsFrameState(nsFrameState_size_t(1) << (1))),




NS_FRAME_IS_FLUID_CONTINUATION = (nsFrameState(nsFrameState_size_t(1) << (2))),


NS_FRAME_ANONYMOUSCONTENTCREATOR_CONTENT = (nsFrameState(nsFrameState_size_t(1) << (3))),




NS_FRAME_EXTERNAL_REFERENCE = (nsFrameState(nsFrameState_size_t(1) << (4))),





NS_FRAME_CONTAINS_RELATIVE_BSIZE = (nsFrameState(nsFrameState_size_t(1) << (5))),


NS_FRAME_GENERATED_CONTENT = (nsFrameState(nsFrameState_size_t(1) << (6))),






NS_FRAME_IS_OVERFLOW_CONTAINER = (nsFrameState(nsFrameState_size_t(1) << (7))),



NS_FRAME_OUT_OF_FLOW = (nsFrameState(nsFrameState_size_t(1) << (8))),




NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN = (nsFrameState(nsFrameState_size_t(1) << (9))),
# 108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_FRAME_IS_DIRTY = (nsFrameState(nsFrameState_size_t(1) << (10))),




NS_FRAME_TOO_DEEP_IN_FRAME_TREE = (nsFrameState(nsFrameState_size_t(1) << (11))),
# 132 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_FRAME_HAS_DIRTY_CHILDREN = (nsFrameState(nsFrameState_size_t(1) << (12))),


NS_FRAME_HAS_VIEW = (nsFrameState(nsFrameState_size_t(1) << (13))),


NS_FRAME_INDEPENDENT_SELECTION = (nsFrameState(nsFrameState_size_t(1) << (14))),





NS_FRAME_PART_OF_IBSPLIT = (nsFrameState(nsFrameState_size_t(1) << (15))),






NS_FRAME_MAY_BE_TRANSFORMED = (nsFrameState(nsFrameState_size_t(1) << (16))),



NS_FRAME_IS_BIDI = (nsFrameState(nsFrameState_size_t(1) << (17))),


NS_FRAME_HAS_CHILD_WITH_VIEW = (nsFrameState(nsFrameState_size_t(1) << (18))),



NS_FRAME_REFLOW_ROOT = (nsFrameState(nsFrameState_size_t(1) << (19))),
# 175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_FRAME_IS_PUSHED_FLOAT = (nsFrameState(nsFrameState_size_t(1) << (32))),


NS_FRAME_DRAWING_AS_PAINTSERVER = (nsFrameState(nsFrameState_size_t(1) << (33))),




NS_FRAME_DESCENDANT_INTRINSIC_ISIZE_DEPENDS_ON_BSIZE = (nsFrameState(nsFrameState_size_t(1) << (34))),





NS_FRAME_SIMPLE_EVENT_REGIONS = (nsFrameState(nsFrameState_size_t(1) << (35))),





NS_FRAME_UPDATE_LAYER_TREE = (nsFrameState(nsFrameState_size_t(1) << (36))),


NS_FRAME_HAS_ABSPOS_CHILDREN = (nsFrameState(nsFrameState_size_t(1) << (37))),


NS_FRAME_PAINTED_THEBES = (nsFrameState(nsFrameState_size_t(1) << (38))),




NS_FRAME_IN_CONSTRAINED_BSIZE = (nsFrameState(nsFrameState_size_t(1) << (39))),


NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO = (nsFrameState(nsFrameState_size_t(1) << (40))),




NS_FRAME_FONT_INFLATION_CONTAINER = (nsFrameState(nsFrameState_size_t(1) << (41))),




NS_FRAME_FONT_INFLATION_FLOW_ROOT = (nsFrameState(nsFrameState_size_t(1) << (42))),




NS_FRAME_SVG_LAYOUT = (nsFrameState(nsFrameState_size_t(1) << (43))),


NS_FRAME_MAY_HAVE_GENERATED_CONTENT = (nsFrameState(nsFrameState_size_t(1) << (44))),




NS_FRAME_NO_COMPONENT_ALPHA = (nsFrameState(nsFrameState_size_t(1) << (45))),



NS_FRAME_VISIBILITY_IS_TRACKED = (nsFrameState(nsFrameState_size_t(1) << (46))),



NS_FRAME_IS_SVG_TEXT = (nsFrameState(nsFrameState_size_t(1) << (47))),


NS_FRAME_NEEDS_PAINT = (nsFrameState(nsFrameState_size_t(1) << (48))),



NS_FRAME_DESCENDANT_NEEDS_PAINT = (nsFrameState(nsFrameState_size_t(1) << (49))),


NS_FRAME_IN_POPUP = (nsFrameState(nsFrameState_size_t(1) << (50))),





NS_FRAME_ALL_DESCENDANTS_NEED_PAINT = (nsFrameState(nsFrameState_size_t(1) << (51))),



NS_FRAME_HAS_INVALID_RECT = (nsFrameState(nsFrameState_size_t(1) << (52))),



NS_FRAME_IS_NONDISPLAY = (nsFrameState(nsFrameState_size_t(1) << (53))),


NS_FRAME_HAS_LAYER_ACTIVITY_PROPERTY = (nsFrameState(nsFrameState_size_t(1) << (54))),



NS_FRAME_OWNS_ANON_BOXES = (nsFrameState(nsFrameState_size_t(1) << (55))),


NS_FRAME_HAS_PROPERTIES = (nsFrameState(nsFrameState_size_t(1) << (56))),



NS_FRAME_MATHML_SCRIPT_DESCENDANT = (nsFrameState(nsFrameState_size_t(1) << (58))),




NS_FRAME_IS_IN_SINGLE_CHAR_MI = (nsFrameState(nsFrameState_size_t(1) << (59))),
# 293 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_STATE_BOX_CHILD_RESERVED = (nsFrameState(nsFrameState_size_t(1) << (20))),
NS_STATE_STACK_NOT_POSITIONED = (nsFrameState(nsFrameState_size_t(1) << (21))),
NS_STATE_IS_HORIZONTAL = (nsFrameState(nsFrameState_size_t(1) << (22))),
NS_STATE_AUTO_STRETCH = (nsFrameState(nsFrameState_size_t(1) << (23))),
NS_STATE_IS_ROOT = (nsFrameState(nsFrameState_size_t(1) << (24))),
NS_STATE_CURRENTLY_IN_DEBUG = (nsFrameState(nsFrameState_size_t(1) << (25))),
NS_STATE_SET_TO_DEBUG = (nsFrameState(nsFrameState_size_t(1) << (26))),
NS_STATE_DEBUG_WAS_SET = (nsFrameState(nsFrameState_size_t(1) << (27))),
NS_STATE_MENU_HAS_POPUP_LIST = (nsFrameState(nsFrameState_size_t(1) << (28))),
NS_STATE_BOX_WRAPS_KIDS_IN_BLOCK = (nsFrameState(nsFrameState_size_t(1) << (29))),
NS_STATE_EQUAL_SIZE = (nsFrameState(nsFrameState_size_t(1) << (30))),
NS_STATE_IS_DIRECTION_NORMAL = (nsFrameState(nsFrameState_size_t(1) << (31))),
NS_FRAME_MOUSE_THROUGH_ALWAYS = (nsFrameState(nsFrameState_size_t(1) << (60))),
NS_FRAME_MOUSE_THROUGH_NEVER = (nsFrameState(nsFrameState_size_t(1) << (61))),
# 315 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_STATE_FLEX_NORMAL_FLOW_CHILDREN_IN_CSS_ORDER = (nsFrameState(nsFrameState_size_t(1) << (20))),



NS_STATE_FLEX_IS_LEGACY_WEBKIT_BOX = (nsFrameState(nsFrameState_size_t(1) << (21))),


NS_STATE_FLEX_SYNTHESIZE_BASELINE = (nsFrameState(nsFrameState_size_t(1) << (22))),







NS_STATE_GRID_NORMAL_FLOW_CHILDREN_IN_CSS_ORDER = (nsFrameState(nsFrameState_size_t(1) << (20))),





NS_STATE_GRID_DID_PUSH_ITEMS = (nsFrameState(nsFrameState_size_t(1) << (21))),


NS_STATE_GRID_GENERATE_COMPUTED_VALUES = (nsFrameState(nsFrameState_size_t(1) << (22))),


NS_STATE_GRID_SYNTHESIZE_BASELINE = (nsFrameState(nsFrameState_size_t(1) << (23))),






NS_STATE_IS_OUTER_SVG = (nsFrameState(nsFrameState_size_t(1) << (20))),


NS_STATE_SVG_CLIPPATH_CHILD = (nsFrameState(nsFrameState_size_t(1) << (21))),
# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_STATE_SVG_POSITIONING_DIRTY = (nsFrameState(nsFrameState_size_t(1) << (22))),
# 385 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_STATE_SVG_POSITIONING_MAY_USE_PERCENTAGES = (nsFrameState(nsFrameState_size_t(1) << (23))),

NS_STATE_SVG_TEXT_IN_REFLOW = (nsFrameState(nsFrameState_size_t(1) << (24))),
# 400 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
TEXT_FIRST_LETTER = (nsFrameState(nsFrameState_size_t(1) << (20))),



TEXT_START_OF_LINE = (nsFrameState(nsFrameState_size_t(1) << (21))),



TEXT_END_OF_LINE = (nsFrameState(nsFrameState_size_t(1) << (22))),


TEXT_HYPHEN_BREAK = (nsFrameState(nsFrameState_size_t(1) << (23))),



TEXT_TRIMMED_TRAILING_WHITESPACE = (nsFrameState(nsFrameState_size_t(1) << (24))),




TEXT_JUSTIFICATION_ENABLED = (nsFrameState(nsFrameState_size_t(1) << (25))),


TEXT_SELECTION_UNDERLINE_OVERFLOWED = (nsFrameState(nsFrameState_size_t(1) << (26))),






TEXT_IS_ONLY_WHITESPACE = (nsFrameState(nsFrameState_size_t(1) << (27))),


TEXT_ISNOT_ONLY_WHITESPACE = (nsFrameState(nsFrameState_size_t(1) << (28))),




TEXT_IN_TEXTRUN_USER_DATA = (nsFrameState(nsFrameState_size_t(1) << (29))),



TEXT_OFFSETS_NEED_FIXING = (nsFrameState(nsFrameState_size_t(1) << (30))),



TEXT_HAS_NONCOLLAPSED_CHARACTERS = (nsFrameState(nsFrameState_size_t(1) << (31))),




TEXT_IS_IN_TOKEN_MATHML = (nsFrameState(nsFrameState_size_t(1) << (32))),



TEXT_IN_UNINFLATED_TEXTRUN_USER_DATA = (nsFrameState(nsFrameState_size_t(1) << (60))),

TEXT_HAS_FONT_INFLATION = (nsFrameState(nsFrameState_size_t(1) << (61))),


TEXT_NO_RENDERED_GLYPHS = (nsFrameState(nsFrameState_size_t(1) << (62))),



TEXT_IN_OFFSET_CACHE = (nsFrameState(nsFrameState_size_t(1) << (63))),
# 474 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_BLOCK_NEEDS_BIDI_RESOLUTION = (nsFrameState(nsFrameState_size_t(1) << (20))),

NS_BLOCK_HAS_PUSHED_FLOATS = (nsFrameState(nsFrameState_size_t(1) << (21))),
# 486 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_BLOCK_MARGIN_ROOT = (nsFrameState(nsFrameState_size_t(1) << (22))),




NS_BLOCK_FLOAT_MGR = (nsFrameState(nsFrameState_size_t(1) << (23))),




NS_BLOCK_HAS_LINE_CURSOR = (nsFrameState(nsFrameState_size_t(1) << (24))),

NS_BLOCK_HAS_OVERFLOW_LINES = (nsFrameState(nsFrameState_size_t(1) << (25))),

NS_BLOCK_HAS_OVERFLOW_OUT_OF_FLOWS = (nsFrameState(nsFrameState_size_t(1) << (26))),




NS_BLOCK_HAS_CLEAR_CHILDREN = (nsFrameState(nsFrameState_size_t(1) << (27))),




NS_BLOCK_CLIP_PAGINATED_OVERFLOW = (nsFrameState(nsFrameState_size_t(1) << (28))),



NS_BLOCK_HAS_FIRST_LETTER_STYLE = (nsFrameState(nsFrameState_size_t(1) << (29))),



NS_BLOCK_FRAME_HAS_OUTSIDE_BULLET = (nsFrameState(nsFrameState_size_t(1) << (30))),
NS_BLOCK_FRAME_HAS_INSIDE_BULLET = (nsFrameState(nsFrameState_size_t(1) << (31))),




NS_BLOCK_LOOK_FOR_DIRTY_FRAMES = (nsFrameState(nsFrameState_size_t(1) << (61))),
# 534 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_BLOCK_FRAME_INTRINSICS_INFLATED = (nsFrameState(nsFrameState_size_t(1) << (62))),





NS_BLOCK_HAS_FIRST_LETTER_CHILD = (nsFrameState(nsFrameState_size_t(1) << (63))),






BULLET_FRAME_HAS_FONT_INFLATION = (nsFrameState(nsFrameState_size_t(1) << (62))),
BULLET_FRAME_IMAGE_LOADING = (nsFrameState(nsFrameState_size_t(1) << (63))),
# 559 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_SCROLLFRAME_INVALIDATE_CONTENTS_ON_SCROLL = (nsFrameState(nsFrameState_size_t(1) << (20))),






IMAGE_SIZECONSTRAINED = (nsFrameState(nsFrameState_size_t(1) << (20))),
IMAGE_GOTINITIALREFLOW = (nsFrameState(nsFrameState_size_t(1) << (21))),
# 580 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_INLINE_FRAME_BIDI_VISUAL_STATE_IS_SET = (nsFrameState(nsFrameState_size_t(1) << (21))),
NS_INLINE_FRAME_BIDI_VISUAL_IS_FIRST = (nsFrameState(nsFrameState_size_t(1) << (22))),
NS_INLINE_FRAME_BIDI_VISUAL_IS_LAST = (nsFrameState(nsFrameState_size_t(1) << (23))),
# 591 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_RUBY_TEXT_FRAME_AUTOHIDE = (nsFrameState(nsFrameState_size_t(1) << (24))),






NS_RUBY_TEXT_CONTAINER_IS_SPAN = (nsFrameState(nsFrameState_size_t(1) << (20))),
# 608 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
PLACEHOLDER_FOR_FLOAT = (nsFrameState(nsFrameState_size_t(1) << (20))),
PLACEHOLDER_FOR_ABSPOS = (nsFrameState(nsFrameState_size_t(1) << (21))),
PLACEHOLDER_FOR_FIXEDPOS = (nsFrameState(nsFrameState_size_t(1) << (22))),
PLACEHOLDER_FOR_POPUP = (nsFrameState(nsFrameState_size_t(1) << (23))),
PLACEHOLDER_FOR_TOPLAYER = (nsFrameState(nsFrameState_size_t(1) << (24))),
# 621 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
PLACEHOLDER_STATICPOS_NEEDS_CSSALIGN = (nsFrameState(nsFrameState_size_t(1) << (25))),






NS_TABLE_CELL_HAS_PCT_OVER_BSIZE = (nsFrameState(nsFrameState_size_t(1) << (28))),
NS_TABLE_CELL_HAD_SPECIAL_REFLOW = (nsFrameState(nsFrameState_size_t(1) << (29))),
NS_TABLE_CELL_CONTENT_EMPTY = (nsFrameState(nsFrameState_size_t(1) << (31))),
# 649 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_REPEATED_ROW_OR_ROWGROUP = (nsFrameState(nsFrameState_size_t(1) << (28))),
# 658 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameStateBits.h"
NS_ROW_HAS_CELL_WITH_STYLE_BSIZE = (nsFrameState(nsFrameState_size_t(1) << (29))),

NS_TABLE_ROW_HAS_UNPAGINATED_BSIZE = (nsFrameState(nsFrameState_size_t(1) << (30))),






NS_ROWGROUP_HAS_ROW_CURSOR = (nsFrameState(nsFrameState_size_t(1) << (27))),
NS_ROWGROUP_HAS_STYLE_BSIZE = (nsFrameState(nsFrameState_size_t(1) << (30))),


NS_ROWGROUP_REPEATABLE = (nsFrameState(nsFrameState_size_t(1) << (31))),



NS_TABLE_PART_HAS_FIXED_BACKGROUND = (nsFrameState(nsFrameState_size_t(1) << (28))),
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsFrameState.h" 2

};

inline nsFrameState operator|(nsFrameState aLeft, nsFrameState aRight)
{
  return nsFrameState(nsFrameState_size_t(aLeft) | nsFrameState_size_t(aRight));
}

inline nsFrameState operator&(nsFrameState aLeft, nsFrameState aRight)
{
  return nsFrameState(nsFrameState_size_t(aLeft) & nsFrameState_size_t(aRight));
}

inline nsFrameState& operator|=(nsFrameState& aLeft, nsFrameState aRight)
{
  aLeft = aLeft | aRight;
  return aLeft;
}

inline nsFrameState& operator&=(nsFrameState& aLeft, nsFrameState aRight)
{
  aLeft = aLeft & aRight;
  return aLeft;
}

inline nsFrameState operator~(nsFrameState aRight)
{
  return nsFrameState(~nsFrameState_size_t(aRight));
}

inline nsFrameState operator^(nsFrameState aLeft, nsFrameState aRight)
{
  return nsFrameState(nsFrameState_size_t(aLeft) ^ nsFrameState_size_t(aRight));
}

inline nsFrameState& operator^=(nsFrameState& aLeft, nsFrameState aRight)
{
  aLeft = aLeft ^ aRight;
  return aLeft;
}





namespace mozilla {




}
# 52 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h" 2






class nsDocShell;
class nsIDocument;
class nsIFrame;
class nsPresContext;
class nsViewManager;
class nsView;
class nsRenderingContext;
class nsIPageSequenceFrame;
class nsCanvasFrame;
class nsAString;
class nsCaret;
namespace mozilla {
class AccessibleCaretEventHub;
class CSSStyleSheet;
}
class nsFrameSelection;
class nsFrameManager;
class nsILayoutHistoryState;
class nsIReflowCallback;
class nsIDOMNode;
class nsCSSFrameConstructor;
class nsISelection;
template<class E> class nsCOMArray;
class AutoWeakFrame;
class WeakFrame;
class nsIScrollableFrame;
class gfxContext;
class nsIDOMEvent;
class nsDisplayList;
class nsDisplayListBuilder;
class nsPIDOMWindowOuter;
struct nsPoint;
class nsINode;
struct nsRect;
class nsRegion;
class nsRefreshDriver;
class nsARefreshObserver;
class nsAPostRefreshObserver;

class nsAccessibilityService;
namespace mozilla {
namespace a11y {
class DocAccessible;
}
}

struct nsArenaMemoryStats;
class nsITimer;

namespace mozilla {
class EventStates;

namespace dom {
class Element;
class Touch;
class Selection;
class ShadowRoot;
}

namespace layers {
class LayerManager;
}

namespace gfx {
class SourceSurface;
}
}
# 137 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
typedef struct CapturingContentInfo {

  bool mAllowed;
  bool mPointerLock;
  bool mRetargetToElement;
  bool mPreventDrag;
  mozilla::StaticRefPtr<nsIContent> mContent;
} CapturingContentInfo;
# 162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
enum nsRectVisibility {
  nsRectVisibility_kVisible,
  nsRectVisibility_kAboveViewport,
  nsRectVisibility_kBelowViewport,
  nsRectVisibility_kLeftOfViewport,
  nsRectVisibility_kRightOfViewport
};
# 182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
class nsIPresShell : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;

protected:
  typedef mozilla::layers::LayerManager LayerManager;
  typedef mozilla::gfx::SourceSurface SourceSurface;

  enum eRenderFlag {
    STATE_IGNORING_VIEWPORT_SCROLLING = 0x1,
    STATE_DRAWWINDOW_NOT_FLUSHING = 0x2
  };
  typedef uint8_t RenderFlags;

public:
  nsIPresShell();
# 207 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual void Destroy() = 0;

  bool IsDestroying() { return mIsDestroying; }
# 218 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  void* AllocateFrame(nsQueryFrame::FrameIID aID, size_t aSize)
  {
    void* result = mFrameArena.AllocateByFrameID(aID, aSize);
    RecordAlloc(result);
    return result;
  }

  void FreeFrame(nsQueryFrame::FrameIID aID, void* aPtr)
  {
    RecordFree(aPtr);
    if (!mIsDestroying)
      mFrameArena.FreeByFrameID(aID, aPtr);
  }







  void* AllocateByObjectID(mozilla::ArenaObjectID aID, size_t aSize)
  {
    void* result = mFrameArena.AllocateByObjectID(aID, aSize);
    RecordAlloc(result);
    return result;
  }

  void FreeByObjectID(mozilla::ArenaObjectID aID, void* aPtr)
  {
    RecordFree(aPtr);
    if (!mIsDestroying)
      mFrameArena.FreeByObjectID(aID, aPtr);
  }
# 261 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  void* AllocateMisc(size_t aSize)
  {
    void* result = mFrameArena.AllocateBySize(aSize);
    RecordAlloc(result);
    return result;
  }

  void FreeMisc(size_t aSize, void* aPtr)
  {
    RecordFree(aPtr);
    if (!mIsDestroying)
      mFrameArena.FreeBySize(aSize, aPtr);
  }

  template<typename T>
  void RegisterArenaRefPtr(mozilla::ArenaRefPtr<T>* aPtr)
  {
    mFrameArena.RegisterArenaRefPtr(aPtr);
  }

  template<typename T>
  void DeregisterArenaRefPtr(mozilla::ArenaRefPtr<T>* aPtr)
  {
    mFrameArena.DeregisterArenaRefPtr(aPtr);
  }

  void ClearArenaRefPtrs(mozilla::ArenaObjectID aObjectID)
  {
    mFrameArena.ClearArenaRefPtrs(aObjectID);
  }

  nsIDocument* GetDocument() const { return mDocument; }

  nsPresContext* GetPresContext() const { return mPresContext; }

  nsViewManager* GetViewManager() const { return mViewManager; }

  nsRefreshDriver* GetRefreshDriver() const;





  mozilla::a11y::DocAccessible* GetDocAccessible() const
  {
    return mDocAccessible;
  }




  void SetDocAccessible(mozilla::a11y::DocAccessible* aDocAccessible)
  {
    mDocAccessible = aDocAccessible;
  }



  mozilla::StyleSetHandle StyleSet() const { return mStyleSet; }

  nsCSSFrameConstructor* FrameConstructor() const { return mFrameConstructor; }

  nsFrameManager* FrameManager() const {


    return reinterpret_cast<nsFrameManager*>
                           (const_cast<nsIPresShell*>(this)->mFrameManager);
  }
# 337 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  void SetAuthorStyleDisabled(bool aDisabled);
  bool GetAuthorStyleDisabled() const;
# 359 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  void RestyleForCSSRuleChanges();





  virtual void UpdatePreferenceStyles() = 0;






  already_AddRefed<nsFrameSelection> FrameSelection();





  const nsFrameSelection* ConstFrameSelection() const { return mSelection; }



  virtual void BeginObservingDocument() = 0;


  virtual void EndObservingDocument() = 0;




  bool DidInitialize() const { return mDidInitialize; }
# 403 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual nsresult Initialize(nscoord aWidth, nscoord aHeight) = 0;





  virtual nsresult ResizeReflow(nscoord aWidth, nscoord aHeight, nscoord aOldWidth = 0, nscoord aOldHeight = 0) = 0;




  virtual nsresult ResizeReflowIgnoreOverride(nscoord aWidth, nscoord aHeight, nscoord aOldWidth, nscoord aOldHeight) = 0;




  virtual bool GetIsViewportOverridden() = 0;




  virtual bool IsLayoutFlushObserver() = 0;




  virtual void LoadComplete() = 0;




  virtual nsIFrame* GetRootFrameExternal() const;
  nsIFrame* GetRootFrame() const {

    return mFrameManager->GetRootFrame();



  }




  nsIFrame* GetRootScrollFrame() const;




  nsIScrollableFrame* GetRootScrollFrameAsScrollable() const;





  virtual nsIScrollableFrame* GetRootScrollFrameAsScrollableExternal() const;
# 466 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  enum ScrollDirection { eHorizontal, eVertical, eEither };
  nsIScrollableFrame* GetFrameToScrollAsScrollable(ScrollDirection aDirection);





  virtual nsIPageSequenceFrame* GetPageSequenceFrame() const = 0;





  virtual nsCanvasFrame* GetCanvasFrame() const = 0;





  virtual nsIFrame* GetPlaceholderFrameFor(nsIFrame* aFrame) const = 0;
# 498 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  enum IntrinsicDirty {

    eResize,
    eTreeChange,
    eStyleChange
  };
  enum ReflowRootHandling {
    ePositionOrSizeChange,
    eNoPositionOrSizeChange,
    eInferFromBitToAdd



  };
  virtual void FrameNeedsReflow(nsIFrame *aFrame,
                                IntrinsicDirty aIntrinsicDirty,
                                nsFrameState aBitToAdd,
                                ReflowRootHandling aRootHandling =
                                  eInferFromBitToAdd) = 0;




  virtual void MarkFixedFramesForReflow(IntrinsicDirty aIntrinsicDirty);
# 534 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual void FrameNeedsToContinueReflow(nsIFrame *aFrame) = 0;

  virtual void CancelAllPendingReflows() = 0;

  virtual void NotifyCounterStylesAreDirty() = 0;
# 547 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual void DestroyFramesFor(nsIContent* aContent,
                                nsIContent** aDestroyedFramesFor) = 0;





  virtual void CreateFramesFor(nsIContent* aContent) = 0;




  virtual nsresult RecreateFramesFor(nsIContent* aContent) = 0;

  void PostRecreateFramesFor(mozilla::dom::Element* aElement);
  void RestyleForAnimation(mozilla::dom::Element* aElement,
                           nsRestyleHint aHint);




  virtual void RecordShadowStyleChange(mozilla::dom::ShadowRoot* aShadowRoot) = 0;






  virtual bool IsSafeToFlush() const = 0;
# 592 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
public:
  void FlushPendingNotifications(mozilla::FlushType aType)
  {
    if (!NeedFlush(aType)) {
      return;
    }

    DoFlushPendingNotifications(aType);
  }

  void FlushPendingNotifications(mozilla::ChangesToFlush aType)
  {
    if (!NeedFlush(aType.mFlushType)) {
      return;
    }

    DoFlushPendingNotifications(aType);
  }

protected:



  virtual void DoFlushPendingNotifications(mozilla::FlushType aType) = 0;
  virtual void DoFlushPendingNotifications(mozilla::ChangesToFlush aType) = 0;

public:
# 627 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  bool NeedFlush(mozilla::FlushType aType) const
  {




    do { } while (0);
    return mNeedStyleFlush ||
           (mNeedLayoutFlush &&
            aType >= mozilla::FlushType::InterruptibleLayout) ||
           aType >= mozilla::FlushType::Display ||
           mNeedThrottledAnimationFlush ||
           mInFlush;
  }

  inline void SetNeedStyleFlush();
  inline void SetNeedLayoutFlush();
  inline void SetNeedThrottledAnimationFlush();

  bool ObservingStyleFlushes() const { return mObservingStyleFlushes; }
  bool ObservingLayoutFlushes() const { return mObservingLayoutFlushes; }

  void ObserveStyleFlushes()
  {
    if (!ObservingStyleFlushes())
      DoObserveStyleFlushes();
  }

  bool NeedStyleFlush() const { return mNeedStyleFlush; }





  virtual nsresult PostReflowCallback(nsIReflowCallback* aCallback) = 0;
  virtual void CancelReflowCallback(nsIReflowCallback* aCallback) = 0;

  virtual void ClearFrameRefs(nsIFrame* aFrame) = 0;






  virtual already_AddRefed<gfxContext> CreateReferenceRenderingContext() = 0;
# 682 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual nsresult GoToAnchor(const nsAString& aAnchorName, bool aScroll,
                              uint32_t aAdditionalScrollFlags = 0) = 0;
# 693 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual nsresult ScrollToAnchor() = 0;

  enum {
    SCROLL_TOP = 0,
    SCROLL_BOTTOM = 100,
    SCROLL_LEFT = 0,
    SCROLL_RIGHT = 100,
    SCROLL_CENTER = 50,
    SCROLL_MINIMUM = -1
  };

  enum WhenToScroll {
    SCROLL_ALWAYS,
    SCROLL_IF_NOT_VISIBLE,
    SCROLL_IF_NOT_FULLY_VISIBLE
  };
  typedef struct ScrollAxis {
    int16_t mWhereToScroll;
    WhenToScroll mWhenToScroll : 8;
    bool mOnlyIfPerceivedScrollableDirection : 1;
# 748 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
    explicit ScrollAxis(int16_t aWhere = SCROLL_MINIMUM,
                        WhenToScroll aWhen = SCROLL_IF_NOT_FULLY_VISIBLE,
                        bool aOnlyIfPerceivedScrollableDirection = false) :
      mWhereToScroll(aWhere), mWhenToScroll(aWhen),
      mOnlyIfPerceivedScrollableDirection(aOnlyIfPerceivedScrollableDirection)
    {}
  } ScrollAxis;
# 786 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual nsresult ScrollContentIntoView(nsIContent* aContent,
                                                     ScrollAxis aVertical,
                                                     ScrollAxis aHorizontal,
                                                     uint32_t aFlags) = 0;

  enum {
    SCROLL_FIRST_ANCESTOR_ONLY = 0x01,
    SCROLL_OVERFLOW_HIDDEN = 0x02,
    SCROLL_NO_PARENT_FRAMES = 0x04,
    SCROLL_SMOOTH = 0x08,
    SCROLL_SMOOTH_AUTO = 0x10
  };
# 817 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual bool ScrollFrameRectIntoView(nsIFrame* aFrame,
                                       const nsRect& aRect,
                                       ScrollAxis aVertical,
                                       ScrollAxis aHorizontal,
                                       uint32_t aFlags) = 0;
# 837 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual nsRectVisibility GetRectVisibility(nsIFrame *aFrame,
                                             const nsRect &aRect,
                                             nscoord aMinTwips) const = 0;





  virtual void SetIgnoreFrameDestruction(bool aIgnore) = 0;






  virtual void NotifyDestroyingFrame(nsIFrame* aFrame) = 0;




  virtual already_AddRefed<mozilla::AccessibleCaretEventHub> GetAccessibleCaretEventHub() const = 0;




  virtual already_AddRefed<nsCaret> GetCaret() const = 0;




  virtual void SetCaret(nsCaret *aNewCaret) = 0;





  virtual void RestoreCaret() = 0;
# 883 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual nsresult SetSelectionFlags(int16_t aInEnable) = 0;






  int16_t GetSelectionFlags() const { return mSelectionFlags; }

  virtual mozilla::dom::Selection*
    GetCurrentSelection(mozilla::SelectionType aSelectionType) = 0;
# 909 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual already_AddRefed<nsISelectionController>
            GetSelectionControllerForFocusedContent(
              nsIContent** aFocusedContent = nullptr) = 0;





  virtual nsresult HandleEventWithTarget(
                                 mozilla::WidgetEvent* aEvent,
                                 nsIFrame* aFrame,
                                 nsIContent* aContent,
                                 nsEventStatus* aStatus) = 0;





  virtual nsresult HandleDOMEventWithTarget(
                                 nsIContent* aTargetContent,
                                 mozilla::WidgetEvent* aEvent,
                                 nsEventStatus* aStatus) = 0;





  virtual nsresult HandleDOMEventWithTarget(nsIContent* aTargetContent,
                                                        nsIDOMEvent* aEvent,
                                                        nsEventStatus* aStatus) = 0;




  virtual bool CanDispatchEvent(
      const mozilla::WidgetGUIEvent* aEvent = nullptr) const = 0;




  virtual nsIFrame* GetEventTargetFrame() = 0;




  virtual already_AddRefed<nsIContent> GetEventTargetContent(
                                                     mozilla::WidgetEvent* aEvent) = 0;





  virtual nsresult CaptureHistoryState(nsILayoutHistoryState** aLayoutHistoryState) = 0;





  bool IsReflowLocked() const { return mIsReflowing; }






  bool IsPaintingSuppressed() const { return mPaintingSuppressed; }






  virtual void PausePainting() = 0;






  virtual void ResumePainting() = 0;




  virtual void UnsuppressPainting() = 0;




  void DisableThemeSupport()
  {

    mIsThemeSupportDisabled = true;
  }




  bool IsThemeSupportEnabled() const { return !mIsThemeSupportDisabled; }




  virtual nsresult GetAgentStyleSheets(
      nsTArray<RefPtr<mozilla::StyleSheet>>& aSheets) = 0;




  virtual nsresult SetAgentStyleSheets(
      const nsTArray<RefPtr<mozilla::StyleSheet>>& aSheets) = 0;




  virtual nsresult AddOverrideStyleSheet(mozilla::StyleSheet* aSheet) = 0;




  virtual nsresult RemoveOverrideStyleSheet(mozilla::StyleSheet* aSheet) = 0;




  virtual void ReconstructFrames() = 0;




  virtual void ContentStateChanged(nsIDocument* aDocument,
                                   nsIContent* aContent,
                                   mozilla::EventStates aStateMask) = 0;






  static bool GetVerifyReflowEnable();




  static void SetVerifyReflowEnable(bool aEnabled);

  virtual nsIFrame* GetAbsoluteContainingBlock(nsIFrame* aFrame);


  virtual void DumpReflows() = 0;
  virtual void CountReflows(const char * aName, nsIFrame * aFrame) = 0;
  virtual void PaintCount(const char * aName,
                                      nsRenderingContext* aRenderingContext,
                                      nsPresContext * aPresContext,
                                      nsIFrame * aFrame,
                                      const nsPoint& aOffset,
                                      uint32_t aColor) = 0;
  virtual void SetPaintFrameCount(bool aOn) = 0;
  virtual bool IsPaintingFrameCounts() = 0;
# 1082 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  static bool IsAccessibilityActive();




  static nsAccessibilityService* AccService();







  virtual void Freeze() = 0;
  bool IsFrozen() { return mFrozen; }





  virtual void Thaw() = 0;

  virtual void FireOrClearDelayedEvents(bool aFireEvents) = 0;







  void SetForwardingContainer(const mozilla::WeakPtr<nsDocShell> &aContainer);
# 1152 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  enum {
    RENDER_IS_UNTRUSTED = 0x01,
    RENDER_IGNORE_VIEWPORT_SCROLLING = 0x02,
    RENDER_CARET = 0x04,
    RENDER_USE_WIDGET_LAYERS = 0x08,
    RENDER_ASYNC_DECODE_IMAGES = 0x10,
    RENDER_DOCUMENT_RELATIVE = 0x20,
    RENDER_DRAWWINDOW_NOT_FLUSHING = 0x40
  };
  virtual nsresult RenderDocument(const nsRect& aRect, uint32_t aFlags,
                                  nscolor aBackgroundColor,
                                  gfxContext* aRenderedContext) = 0;

  enum {
    RENDER_IS_IMAGE = 0x100,
    RENDER_AUTO_SCALE = 0x80
  };







  virtual already_AddRefed<mozilla::gfx::SourceSurface>
  RenderNode(nsIDOMNode* aNode,
             nsIntRegion* aRegion,
             const mozilla::LayoutDeviceIntPoint aPoint,
             mozilla::LayoutDeviceIntRect* aScreenRect,
             uint32_t aFlags) = 0;
# 1199 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual already_AddRefed<mozilla::gfx::SourceSurface>
  RenderSelection(nsISelection* aSelection,
                  const mozilla::LayoutDeviceIntPoint aPoint,
                  mozilla::LayoutDeviceIntRect* aScreenRect,
                  uint32_t aFlags) = 0;

  void AddAutoWeakFrameInternal(AutoWeakFrame* aWeakFrame);
  virtual void AddAutoWeakFrameExternal(AutoWeakFrame* aWeakFrame);
  void AddWeakFrameInternal(WeakFrame* aWeakFrame);
  virtual void AddWeakFrameExternal(WeakFrame* aWeakFrame);

  void AddAutoWeakFrame(AutoWeakFrame* aWeakFrame)
  {

    AddAutoWeakFrameInternal(aWeakFrame);



  }
  void AddWeakFrame(WeakFrame* aWeakFrame)
  {

    AddWeakFrameInternal(aWeakFrame);



  }

  void RemoveAutoWeakFrameInternal(AutoWeakFrame* aWeakFrame);
  virtual void RemoveAutoWeakFrameExternal(AutoWeakFrame* aWeakFrame);
  void RemoveWeakFrameInternal(WeakFrame* aWeakFrame);
  virtual void RemoveWeakFrameExternal(WeakFrame* aWeakFrame);

  void RemoveAutoWeakFrame(AutoWeakFrame* aWeakFrame)
  {

    RemoveAutoWeakFrameInternal(aWeakFrame);



  }
  void RemoveWeakFrame(WeakFrame* aWeakFrame)
  {

    RemoveWeakFrameInternal(aWeakFrame);



  }
# 1260 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual void DisableNonTestMouseEvents(bool aDisable) = 0;
# 1269 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  void SetCanvasBackground(nscolor aColor) { mCanvasBackgroundColor = aColor; }
  nscolor GetCanvasBackground() { return mCanvasBackgroundColor; }





  virtual void UpdateCanvasBackground() = 0;
# 1285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  enum {
    FORCE_DRAW = 0x01
  };
  virtual void AddCanvasBackgroundColorItem(nsDisplayListBuilder& aBuilder,
                                            nsDisplayList& aList,
                                            nsIFrame* aFrame,
                                            const nsRect& aBounds,
                                            nscolor aBackstopColor = ((nscolor) (((0) << 24) | ((0)<<16) | ((0)<<8) | (0))),
                                            uint32_t aFlags = 0) = 0;







  virtual void AddPrintPreviewBackgroundItem(nsDisplayListBuilder& aBuilder,
                                             nsDisplayList& aList,
                                             nsIFrame* aFrame,
                                             const nsRect& aBounds) = 0;






  virtual nscolor ComputeBackstopColor(nsView* aDisplayRoot) = 0;

  void ObserveNativeAnonMutationsForPrint(bool aObserve)
  {
    mObservesMutationsForPrint = aObserve;
  }
  bool ObservesNativeAnonMutationsForPrint()
  {
    return mObservesMutationsForPrint;
  }

  virtual nsresult SetIsActive(bool aIsActive) = 0;

  bool IsActive()
  {
    return mIsActive;
  }


  static CapturingContentInfo gCaptureInfo;

  class PointerCaptureInfo final
  {
  public:
    nsCOMPtr<nsIContent> mPendingContent;
    nsCOMPtr<nsIContent> mOverrideContent;

    explicit PointerCaptureInfo(nsIContent* aPendingContent)
      : mPendingContent(aPendingContent)
    {
                                        ;
    }

    ~PointerCaptureInfo()
    {
                                        ;
    }

    bool Empty()
    {
      return !(mPendingContent || mOverrideContent);
    }
  };

  class PointerInfo final
  {
  public:
    uint16_t mPointerType;
    bool mActiveState;
    bool mPrimaryState;
    bool mPreventMouseEventByContent;
    explicit PointerInfo(bool aActiveState, uint16_t aPointerType,
                         bool aPrimaryState)
      : mPointerType(aPointerType)
      , mActiveState(aActiveState)
      , mPrimaryState(aPrimaryState)
      , mPreventMouseEventByContent(false)
    {
    }
  };

  static void DispatchGotOrLostPointerCaptureEvent(
                bool aIsGotCapture,
                const mozilla::WidgetPointerEvent* aPointerEvent,
                nsIContent* aCaptureTarget);

  static PointerCaptureInfo* GetPointerCaptureInfo(uint32_t aPointerId);
  static void SetPointerCapturingContent(uint32_t aPointerId,
                                         nsIContent* aContent);
  static void ReleasePointerCapturingContent(uint32_t aPointerId);
  static nsIContent* GetPointerCapturingContent(uint32_t aPointerId);



  static void CheckPointerCaptureState(
                const mozilla::WidgetPointerEvent* aPointerEvent);





  static bool GetPointerInfo(uint32_t aPointerId, bool& aActiveState);



  static uint16_t GetPointerType(uint32_t aPointerId);



  static bool GetPointerPrimaryState(uint32_t aPointerId);
# 1424 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  static void SetCapturingContent(nsIContent* aContent, uint8_t aFlags);




  static nsIContent* GetCapturingContent()
  {
    return gCaptureInfo.mContent;
  }




  static void AllowMouseCapture(bool aAllowed)
  {
    gCaptureInfo.mAllowed = aAllowed;
  }





  static bool IsMouseCapturePreventingDrag()
  {
    return gCaptureInfo.mPreventDrag && gCaptureInfo.mContent;
  }





  uint64_t GetPaintCount() { return mPaintCount; }
  void IncrementPaintCount() { ++mPaintCount; }




  virtual already_AddRefed<nsPIDOMWindowOuter> GetRootWindow() = 0;





  virtual LayerManager* GetLayerManager() = 0;





  virtual bool AsyncPanZoomEnabled() = 0;






  virtual void SetIgnoreViewportScrolling(bool aIgnore) = 0;
  bool IgnoringViewportScrolling() const
  { return mRenderFlags & STATE_IGNORING_VIEWPORT_SCROLLING; }
# 1493 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual nsresult SetResolution(float aResolution) = 0;
  float GetResolution() const { return mResolution.valueOr(1.0); }
  virtual float GetCumulativeResolution() = 0;





  virtual float GetCumulativeNonRootScaleResolution() = 0;




  bool IsResolutionSet() { return mResolution.isSome(); }





  virtual nsresult SetResolutionAndScaleTo(float aResolution) = 0;






  virtual bool ScaleToResolution() const = 0;





  virtual void SetRestoreResolution(float aResolution,
                                    mozilla::LayoutDeviceIntSize aDisplaySize) = 0;





  bool InDrawWindowNotFlushing() const
  { return mRenderFlags & STATE_DRAWWINDOW_NOT_FLUSHING; }




  void SetIsFirstPaint(bool aIsFirstPaint) { mIsFirstPaint = aIsFirstPaint; }




  bool GetIsFirstPaint() const { return mIsFirstPaint; }

  uint32_t GetPresShellId() { return mPresShellId; }






  virtual void SynthesizeMouseMove(bool aFromScroll) = 0;

  enum PaintFlags {



    PAINT_LAYERS = 0x01,

    PAINT_COMPOSITE = 0x02,

    PAINT_SYNC_DECODE_IMAGES = 0x04
  };
  virtual void Paint(nsView* aViewToPaint, const nsRegion& aDirtyRegion,
                     uint32_t aFlags) = 0;
  virtual nsresult HandleEvent(nsIFrame* aFrame,
                               mozilla::WidgetGUIEvent* aEvent,
                               bool aDontRetargetEvents,
                               nsEventStatus* aEventStatus,
                               nsIContent** aTargetContent = nullptr) = 0;
  virtual bool ShouldIgnoreInvalidation() = 0;







  virtual void WillPaint() = 0;





  virtual void WillPaintWindow() = 0;





  virtual void DidPaintWindow() = 0;
# 1600 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  enum PaintType {
    PAINT_DEFAULT,
    PAINT_DELAYED_COMPRESS
  };
  virtual void ScheduleViewManagerFlush(PaintType aType = PAINT_DEFAULT) = 0;
  virtual void ClearMouseCaptureOnView(nsView* aView) = 0;
  virtual bool IsVisible() = 0;
  virtual void DispatchSynthMouseMove(mozilla::WidgetGUIEvent* aEvent,
                                      bool aFlushOnHoverChange) = 0;

  virtual void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf,
                                      nsArenaMemoryStats *aArenaObjectsSize,
                                      size_t *aPresShellSize,
                                      size_t *aStyleSetsSize,
                                      size_t *aTextRunsSize,
                                      size_t *aPresContextSize) = 0;




  uint32_t FontSizeInflationEmPerLine() const {
    return mFontSizeInflationEmPerLine;
  }

  uint32_t FontSizeInflationMinTwips() const {
    return mFontSizeInflationMinTwips;
  }

  uint32_t FontSizeInflationLineThreshold() const {
    return mFontSizeInflationLineThreshold;
  }

  bool FontSizeInflationForceEnabled() const {
    return mFontSizeInflationForceEnabled;
  }

  bool FontSizeInflationDisabledInMasterProcess() const {
    return mFontSizeInflationDisabledInMasterProcess;
  }







  bool FontSizeInflationEnabled();







  void NotifyFontSizeInflationEnabledIsDirty()
  {
    mFontSizeInflationEnabledIsDirty = true;
  }
# 1667 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  virtual void ScheduleApproximateFrameVisibilityUpdateSoon() = 0;





  virtual void ScheduleApproximateFrameVisibilityUpdateNow() = 0;



  virtual void RebuildApproximateFrameVisibilityDisplayList(const nsDisplayList& aList) = 0;
  virtual void RebuildApproximateFrameVisibility(nsRect* aRect = nullptr,
                                                 bool aRemoveOnly = false) = 0;


  virtual void EnsureFrameInApproximatelyVisibleList(nsIFrame* aFrame) = 0;


  virtual void RemoveFrameFromApproximatelyVisibleList(nsIFrame* aFrame) = 0;


  virtual bool AssumeAllFramesVisible() = 0;
# 1697 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  nsresult HasRuleProcessorUsedByMultipleStyleSets(uint32_t aSheetType,
                                                   bool* aRetVal);




protected:
  virtual bool AddRefreshObserverExternal(nsARefreshObserver* aObserver,
                                          mozilla::FlushType aFlushType);
  bool AddRefreshObserverInternal(nsARefreshObserver* aObserver,
                                  mozilla::FlushType aFlushType);
  virtual bool RemoveRefreshObserverExternal(nsARefreshObserver* aObserver,
                                             mozilla::FlushType aFlushType);
  bool RemoveRefreshObserverInternal(nsARefreshObserver* aObserver,
                                     mozilla::FlushType aFlushType);

  void DoObserveStyleFlushes();
  void DoObserveLayoutFlushes();






  void RecomputeFontSizeInflationEnabled();




  bool DetermineFontSizeInflationState();





  void HandleSystemFontScale();

  void RecordAlloc(void* aPtr) {




  }

  void RecordFree(void* aPtr) {




  }

public:
  bool AddRefreshObserver(nsARefreshObserver* aObserver,
                          mozilla::FlushType aFlushType) {

    return AddRefreshObserverInternal(aObserver, aFlushType);



  }

  bool RemoveRefreshObserver(nsARefreshObserver* aObserver,
                             mozilla::FlushType aFlushType) {

    return RemoveRefreshObserverInternal(aObserver, aFlushType);



  }

  virtual bool AddPostRefreshObserver(nsAPostRefreshObserver* aObserver);
  virtual bool RemovePostRefreshObserver(nsAPostRefreshObserver* aObserver);




  static void InitializeStatics();
  static void ReleaseStatics();



  static void ClearMouseCapture(nsIFrame* aFrame);

  void SetScrollPositionClampingScrollPortSize(nscoord aWidth, nscoord aHeight);
  bool IsScrollPositionClampingScrollPortSizeSet() {
    return mScrollPositionClampingScrollPortSizeSet;
  }
  nsSize GetScrollPositionClampingScrollPortSize() {
    do { } while(0);
    return mScrollPositionClampingScrollPortSize;
  }

  virtual void WindowSizeMoveDone() = 0;
  virtual void SysColorChanged() = 0;
  virtual void ThemeChanged() = 0;
  virtual void BackingScaleFactorChanged() = 0;




  bool IsNeverPainting() {
    return mIsNeverPainting;
  }

  void SetNeverPainting(bool aNeverPainting) {
    mIsNeverPainting = aNeverPainting;
  }

  bool HasPendingReflow() const
    { return mObservingLayoutFlushes || mReflowContinueTimer; }

  void SyncWindowProperties(nsView* aView);

  virtual nsIDocument* GetPrimaryContentDocument() = 0;


  virtual void NotifyStyleSheetServiceSheetAdded(mozilla::StyleSheet* aSheet,
                                                 uint32_t aSheetType) = 0;
  virtual void NotifyStyleSheetServiceSheetRemoved(mozilla::StyleSheet* aSheet,
                                                   uint32_t aSheetType) = 0;

protected:
  friend class nsRefreshDriver;







  nsCOMPtr<nsIDocument> mDocument;
  RefPtr<nsPresContext> mPresContext;
  mozilla::StyleSetHandle mStyleSet;
  nsCSSFrameConstructor* mFrameConstructor;
  nsViewManager* mViewManager;
  nsPresArena mFrameArena;
  RefPtr<nsFrameSelection> mSelection;


  nsFrameManagerBase* mFrameManager;
  mozilla::WeakPtr<nsDocShell> mForwardingContainer;

  mozilla::a11y::DocAccessible* mDocAccessible;






  nsCOMPtr<nsITimer> mReflowContinueTimer;
# 1858 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  uint64_t mPaintCount;

  nsSize mScrollPositionClampingScrollPortSize;


  AutoWeakFrame* mAutoWeakFrames;


  nsTHashtable<nsPtrHashKey<WeakFrame>> mWeakFrames;


  nscolor mCanvasBackgroundColor;



  mozilla::Maybe<float> mResolution;

  int16_t mSelectionFlags;






  RenderFlags mRenderFlags;




  bool mStylesHaveChanged : 1;
  bool mDidInitialize : 1;
  bool mIsDestroying : 1;
  bool mIsReflowing : 1;


  bool mPaintingSuppressed : 1;


  bool mIsThemeSupportDisabled : 1;

  bool mIsActive : 1;
  bool mFrozen : 1;
  bool mIsFirstPaint : 1;
  bool mObservesMutationsForPrint : 1;

  bool mSuppressInterruptibleReflows : 1;
  bool mScrollPositionClampingScrollPortSizeSet : 1;


  bool mNeedLayoutFlush : 1;


  bool mNeedStyleFlush : 1;


  bool mObservingStyleFlushes: 1;





  bool mObservingLayoutFlushes: 1;



  bool mNeedThrottledAnimationFlush : 1;

  uint32_t mPresShellId;
# 1934 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIPresShell.h"
  AutoTArray<RefPtr<mozilla::dom::Element>,1> mChangedScopeStyleRoots;

  static nsIContent* gKeyDownTarget;



  uint32_t mFontSizeInflationEmPerLine;
  uint32_t mFontSizeInflationMinTwips;
  uint32_t mFontSizeInflationLineThreshold;
  bool mFontSizeInflationForceEnabled;
  bool mFontSizeInflationDisabledInMasterProcess;
  bool mFontSizeInflationEnabled;


  bool mFontSizeInflationEnabledIsDirty;

  bool mPaintingIsFrozen;




  bool mIsNeverPainting;



  bool mInFlush;
};

template<typename T> struct nsIPresShell::COMTypeInfo<nsIPresShell, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIPresShell::COMTypeInfo<nsIPresShell, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xa75573d6, 0x34c8, 0x4485, { 0x8f, 0xb7, 0xed, 0xcb, 0x6f, 0xc7, 0x0e, 0x12 } };
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRT.h" 1








# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/stdlib.h" 1 3
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRT.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h" 1
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern "C" {






extern __attribute__((visibility("default"))) PRUint32
PL_strlen(const char *str);
# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) PRUint32
PL_strnlen(const char *str, PRUint32 max);
# 60 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strcpy(char *dest, const char *src);
# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strncpy(char *dest, const char *src, PRUint32 max);
# 96 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strncpyz(char *dest, const char *src, PRUint32 max);
# 110 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strdup(const char *s);







extern __attribute__((visibility("default"))) void
PL_strfree(char *s);
# 134 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strndup(const char *s, PRUint32 max);
# 146 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strcat(char *dst, const char *src);
# 161 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strncat(char *dst, const char *src, PRUint32 max);
# 175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strcatn(char *dst, PRUint32 max, const char *src);
# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) PRIntn
PL_strcmp(const char *a, const char *b);
# 201 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) PRIntn
PL_strncmp(const char *a, const char *b, PRUint32 max);
# 213 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) PRIntn
PL_strcasecmp(const char *a, const char *b);
# 225 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) PRIntn
PL_strncasecmp(const char *a, const char *b, PRUint32 max);
# 236 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strchr(const char *s, char c);
# 247 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strrchr(const char *s, char c);
# 259 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strnchr(const char *s, char c, PRUint32 n);
# 271 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strnrchr(const char *s, char c, PRUint32 n);
# 287 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strpbrk(const char *s, const char *list);
# 298 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strprbrk(const char *s, const char *list);
# 309 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strnpbrk(const char *s, const char *list, PRUint32 n);
# 320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strnprbrk(const char *s, const char *list, PRUint32 n);
# 330 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strstr(const char *big, const char *little);
# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strrstr(const char *big, const char *little);
# 351 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strnstr(const char *big, const char *little, PRUint32 n);
# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strnrstr(const char *big, const char *little, PRUint32 max);
# 372 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strcasestr(const char *big, const char *little);
# 382 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strcaserstr(const char *big, const char *little);
# 393 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strncasestr(const char *big, const char *little, PRUint32 max);
# 404 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strncaserstr(const char *big, const char *little, PRUint32 max);
# 426 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/plstr.h"
extern __attribute__((visibility("default"))) char *
PL_strtok_r(char *s1, const char *s2, char **lasts);







}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRT.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRT.h"
extern const char16_t kIsoLatin1ToUCS2[256];



class nsCRT
{
public:
  enum
  {
    LF = '\n' ,
    VTAB = '\v' ,
    CR = '\r'
  };


  static int32_t strcmp(const char* aStr1, const char* aStr2)
  {
    return int32_t(PL_strcmp(aStr1, aStr2));
  }

  static int32_t strncmp(const char* aStr1, const char* aStr2,
                         uint32_t aMaxLen)
  {
    return int32_t(PL_strncmp(aStr1, aStr2, aMaxLen));
  }


  static int32_t strcasecmp(const char* aStr1, const char* aStr2)
  {
    return int32_t(PL_strcasecmp(aStr1, aStr2));
  }


  static int32_t strncasecmp(const char* aStr1, const char* aStr2,
                             uint32_t aMaxLen)
  {
    int32_t result = int32_t(PL_strncasecmp(aStr1, aStr2, aMaxLen));


    if (result < 0) {
      result = -1;
    }
    return result;
  }

  static int32_t strncmp(const char* aStr1, const char* aStr2, int32_t aMaxLen)
  {

    int32_t diff =
      ((const unsigned char*)aStr1)[0] - ((const unsigned char*)aStr2)[0];
    if (diff != 0) {
      return diff;
    }
    return int32_t(PL_strncmp(aStr1, aStr2, unsigned(aMaxLen)));
  }
# 100 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCRT.h"
  static char* strtok(char* aStr, const char* aDelims, char** aNewStr);


  static int32_t strcmp(const char16_t* aStr1, const char16_t* aStr2);

  static int32_t strncmp(const char16_t* aStr1, const char16_t* aStr2,
                         uint32_t aMaxLen);




  static const char* memmem(const char* aHaystack, uint32_t aHaystackLen,
                            const char* aNeedle, uint32_t aNeedleLen);


  static int64_t atoll(const char* aStr);

  static char ToUpper(char aChar) { return NS_ToUpper(aChar); }
  static char ToLower(char aChar) { return NS_ToLower(aChar); }

  static bool IsUpper(char aChar) { return NS_IsUpper(aChar); }
  static bool IsLower(char aChar) { return NS_IsLower(aChar); }

  static bool IsAscii(char16_t aChar) { return NS_IsAscii(aChar); }
  static bool IsAscii(const char16_t* aString) { return NS_IsAscii(aString); }
  static bool IsAsciiAlpha(char16_t aChar) { return NS_IsAsciiAlpha(aChar); }
  static bool IsAsciiDigit(char16_t aChar) { return NS_IsAsciiDigit(aChar); }
  static bool IsAsciiSpace(char16_t aChar) { return NS_IsAsciiWhitespace(aChar); }
  static bool IsAscii(const char* aString) { return NS_IsAscii(aString); }
  static bool IsAscii(const char* aString, uint32_t aLength)
  {
    return NS_IsAscii(aString, aLength);
  }
};


inline bool
NS_IS_SPACE(char16_t aChar)
{
  return ((int(aChar) & 0x7f) == int(aChar)) && isspace(int(aChar));
}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWidgetListener.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWidgetListener.h"
class nsView;
class nsIPresShell;
class nsIWidget;
class nsIXULWindow;




enum nsSizeMode
{
  nsSizeMode_Normal = 0,
  nsSizeMode_Minimized,
  nsSizeMode_Maximized,
  nsSizeMode_Fullscreen,
  nsSizeMode_Invalid
};




enum nsWindowZ
{
  nsWindowZTop = 0,
  nsWindowZBottom,
  nsWindowZRelative
};

class nsIWidgetListener
{
public:






  virtual nsIXULWindow* GetXULWindow();




  virtual nsView* GetView();




  virtual nsIPresShell* GetPresShell();





  virtual bool WindowMoved(nsIWidget* aWidget, int32_t aX, int32_t aY);





  virtual bool WindowResized(nsIWidget* aWidget,
                             int32_t aWidth, int32_t aHeight);




  virtual void SizeModeChanged(nsSizeMode aSizeMode);





  virtual void UIResolutionChanged();
# 95 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIWidgetListener.h"
  virtual bool ZLevelChanged(bool aImmediate, nsWindowZ* aPlacement,
                             nsIWidget* aRequestBelow,
                             nsIWidget** aActualBelow);




  virtual void FullscreenChanged(bool aInFullscreen);




  virtual void WindowActivated();




  virtual void WindowDeactivated();




  virtual void OSToolbarButtonPressed();





  virtual bool RequestWindowClose(nsIWidget* aWidget);






  virtual void WillPaintWindow(nsIWidget* aWidget);







  virtual bool PaintWindow(nsIWidget* aWidget,
                           mozilla::LayoutDeviceIntRegion aRegion);







  virtual void DidPaintWindow();

  virtual void DidCompositeWindow(uint64_t aTransactionId,
                                  const mozilla::TimeStamp& aCompositeStart,
                                  const mozilla::TimeStamp& aCompositeEnd);




  virtual void RequestRepaint();




  virtual nsEventStatus HandleEvent(mozilla::WidgetGUIEvent* aEvent,
                                    bool aUseAttachedEvents);
};
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
class nsIFrame;

namespace mozilla {

struct FramePropertyDescriptorUntyped
{



  typedef void UntypedDestructor(void* aPropertyValue);
  UntypedDestructor* mDestructor;
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
  typedef void UntypedDestructorWithFrame(const nsIFrame* aFrame,
                                          void* aPropertyValue);
  UntypedDestructorWithFrame* mDestructorWithFrame;





protected:





  constexpr FramePropertyDescriptorUntyped(
    UntypedDestructor* aDtor, UntypedDestructorWithFrame* aDtorWithFrame)
    : mDestructor(aDtor)
    , mDestructorWithFrame(aDtorWithFrame)
  {}
};
# 67 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
template<typename T>
struct FramePropertyDescriptor : public FramePropertyDescriptorUntyped
{
  typedef void Destructor(T* aPropertyValue);
  typedef void DestructorWithFrame(const nsIFrame* aaFrame,
                                   T* aPropertyValue);

  template<Destructor Dtor>
  static constexpr const FramePropertyDescriptor<T> NewWithDestructor()
  {
    return { Destruct<Dtor>, nullptr };
  }

  template<DestructorWithFrame Dtor>
  static constexpr
  const FramePropertyDescriptor<T> NewWithDestructorWithFrame()
  {
    return { nullptr, DestructWithFrame<Dtor> };
  }

  static constexpr const FramePropertyDescriptor<T> NewWithoutDestructor()
  {
    return { nullptr, nullptr };
  }

private:
  constexpr FramePropertyDescriptor(
    UntypedDestructor* aDtor, UntypedDestructorWithFrame* aDtorWithFrame)
    : FramePropertyDescriptorUntyped(aDtor, aDtorWithFrame)
  {}

  template<Destructor Dtor>
  static void Destruct(void* aPropertyValue)
  {
    Dtor(static_cast<T*>(aPropertyValue));
  }

  template<DestructorWithFrame Dtor>
  static void DestructWithFrame(const nsIFrame* aFrame, void* aPropertyValue)
  {
    Dtor(aFrame, static_cast<T*>(aPropertyValue));
  }
};





template<typename T>
class SmallValueHolder;

namespace detail {

template<typename T>
struct FramePropertyTypeHelper
{
  typedef T* Type;
};
template<typename T>
struct FramePropertyTypeHelper<SmallValueHolder<T>>
{
  typedef T Type;
};

}
# 144 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
class FramePropertyTable {
public:
  template<typename T>
  using Descriptor = const FramePropertyDescriptor<T>*;
  using UntypedDescriptor = const FramePropertyDescriptorUntyped*;

  template<typename T>
  using PropertyType = typename detail::FramePropertyTypeHelper<T>::Type;

  FramePropertyTable() : mLastFrame(nullptr), mLastEntry(nullptr)
  {
  }
  ~FramePropertyTable()
  {
    DeleteAll();
  }







  template<typename T>
  void Set(nsIFrame* aFrame, Descriptor<T> aProperty,
           PropertyType<T> aValue)
  {
    void* ptr = ReinterpretHelper<T>::ToPointer(aValue);
    SetInternal(aFrame, aProperty, ptr);
  }
# 197 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
  template<typename T>
  bool Has(const nsIFrame* aFrame, Descriptor<T> aProperty)
  {
    bool foundResult = false;
    mozilla::Unused << GetInternal(aFrame, aProperty, false, &foundResult);
    return foundResult;
  }

  template<typename T>
  bool HasSkippingBitCheck(const nsIFrame* aFrame, Descriptor<T> aProperty)
  {
    bool foundResult = false;
    mozilla::Unused << GetInternal(aFrame, aProperty, true, &foundResult);
    return foundResult;
  }
# 224 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
  template<typename T>
  PropertyType<T> Get(const nsIFrame* aFrame, Descriptor<T> aProperty,
                      bool* aFoundResult = nullptr)
  {
    void* ptr = GetInternal(aFrame, aProperty, false, aFoundResult);
    return ReinterpretHelper<T>::FromPointer(ptr);
  }
# 243 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
  template<typename T>
  PropertyType<T> Remove(nsIFrame* aFrame, Descriptor<T> aProperty,
                         bool* aFoundResult = nullptr)
  {
    void* ptr = RemoveInternal(aFrame, aProperty, false, aFoundResult);
    return ReinterpretHelper<T>::FromPointer(ptr);
  }
# 262 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
  template<typename T>
  void Delete(nsIFrame* aFrame, Descriptor<T> aProperty)
  {
    DeleteInternal(aFrame, aProperty, false);
  }

  template<typename T>
  void DeleteSkippingBitCheck(nsIFrame* aFrame, Descriptor<T> aProperty)
  {
    DeleteInternal(aFrame, aProperty, true);
  }




  void DeleteAllFor(nsIFrame* aFrame);



  void DeleteAll();

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

protected:
  void SetInternal(nsIFrame* aFrame, UntypedDescriptor aProperty,
                   void* aValue);

  void* GetInternal(const nsIFrame* aFrame, UntypedDescriptor aProperty,
                    bool aSkipBitCheck, bool* aFoundResult);

  void* RemoveInternal(nsIFrame* aFrame, UntypedDescriptor aProperty,
                       bool aSkipBitCheck, bool* aFoundResult);

  void DeleteInternal(nsIFrame* aFrame, UntypedDescriptor aProperty,
                      bool aSkipBitCheck);

  template<typename T>
  struct ReinterpretHelper
  {
    static_assert(sizeof(PropertyType<T>) <= sizeof(void*),
                  "size of the value must never be larger than a pointer");

    static void* ToPointer(PropertyType<T> aValue)
    {
      void* ptr = nullptr;
      memcpy(&ptr, &aValue, sizeof(aValue));
      return ptr;
    }

    static PropertyType<T> FromPointer(void* aPtr)
    {
      PropertyType<T> value;
      memcpy(&value, &aPtr, sizeof(value));
      return value;
    }
  };

  template<typename T>
  struct ReinterpretHelper<T*>
  {
    static void* ToPointer(T* aValue)
    {
      return static_cast<void*>(aValue);
    }

    static T* FromPointer(void* aPtr)
    {
      return static_cast<T*>(aPtr);
    }
  };





  struct PropertyValue {
    PropertyValue() : mProperty(nullptr), mValue(nullptr) {}
    PropertyValue(UntypedDescriptor aProperty, void* aValue)
      : mProperty(aProperty), mValue(aValue) {}

    bool IsArray() { return !mProperty && mValue; }
    nsTArray<PropertyValue>* ToArray()
    {
      do { } while(0);
      return reinterpret_cast<nsTArray<PropertyValue>*>(&mValue);
    }

    void DestroyValueFor(const nsIFrame* aFrame) {
      if (mProperty->mDestructor) {
        mProperty->mDestructor(mValue);
      } else if (mProperty->mDestructorWithFrame) {
        mProperty->mDestructorWithFrame(aFrame, mValue);
      }
    }

    size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) {
      size_t n = 0;





      if (IsArray()) {
        nsTArray<PropertyValue>* array = ToArray();
        n += array->ShallowSizeOfExcludingThis(aMallocSizeOf);
      }
      return n;
    }

    UntypedDescriptor mProperty;
    void* mValue;
  };





  class PropertyComparator {
  public:
    bool Equals(const PropertyValue& a, const PropertyValue& b) const {
      return a.mProperty == b.mProperty;
    }
    bool Equals(UntypedDescriptor a, const PropertyValue& b) const {
      return a == b.mProperty;
    }
    bool Equals(const PropertyValue& a, UntypedDescriptor b) const {
      return a.mProperty == b;
    }
  };





  class Entry : public nsPtrHashKey<const nsIFrame>
  {
  public:
    explicit Entry(KeyTypePointer aKey) : nsPtrHashKey<const nsIFrame>(aKey) {}
    Entry(const Entry &toCopy) :
      nsPtrHashKey<const nsIFrame>(toCopy), mProp(toCopy.mProp) {}

    size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) {
      return mProp.SizeOfExcludingThis(aMallocSizeOf);
    }

    PropertyValue mProp;
  };

  static void DeleteAllForEntry(Entry* aEntry);




  nsTHashtable<Entry> mEntries;
  const nsIFrame* mLastFrame;
  Entry* mLastEntry;
};
# 430 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FramePropertyTable.h"
template<class CVnsIFrame>
class FramePropertiesBase {
public:
  template<typename T> using Descriptor = FramePropertyTable::Descriptor<T>;
  template<typename T> using PropertyType = FramePropertyTable::PropertyType<T>;

  template<typename T>
  bool Has(Descriptor<T> aProperty) const
  {
    return mTable->Has(mFrame, aProperty);
  }

  template<typename T>
  PropertyType<T> Get(Descriptor<T> aProperty,
                      bool* aFoundResult = nullptr) const
  {
    return mTable->Get(mFrame, aProperty, aFoundResult);
  }

protected:
  FramePropertiesBase(FramePropertyTable* aTable, CVnsIFrame* aFrame)
    : mTable(aTable), mFrame(aFrame) {}

  FramePropertyTable* const mTable;
  CVnsIFrame* const mFrame;
};

class ConstFrameProperties : public FramePropertiesBase<const nsIFrame> {
public:
  ConstFrameProperties(FramePropertyTable* aTable, const nsIFrame* aFrame)
    : FramePropertiesBase(aTable, aFrame)
  {
  }
};

class FrameProperties : public FramePropertiesBase<nsIFrame> {
public:
  FrameProperties(FramePropertyTable* aTable, nsIFrame* aFrame)
    : FramePropertiesBase(aTable, aFrame)
  {
  }

  template<typename T>
  void Set(Descriptor<T> aProperty, PropertyType<T> aValue) const
  {
    mTable->Set(mFrame, aProperty, aValue);
  }

  template<typename T>
  PropertyType<T> Remove(Descriptor<T> aProperty,
                         bool* aFoundResult = nullptr) const
  {
    return mTable->Remove(mFrame, aProperty, aFoundResult);
  }

  template<typename T>
  void Delete(Descriptor<T> aProperty) const
  {
    mTable->Delete(mFrame, aProperty);
  }

};

}
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ScrollbarStyles.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ScrollbarStyles.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/WindowBinding.h" 1





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ImageBitmapBinding.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ImageBitmapBinding.h"
namespace mozilla {
namespace dom {

class Blob;
class CanvasRenderingContext2D;
struct ChannelPixelLayoutAtoms;
class HTMLCanvasElement;
class HTMLImageElement;
class HTMLVideoElement;
class ImageBitmap;
struct ImageBitmapAtoms;
class ImageData;
struct NativePropertyHooks;
class OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

enum class ImageBitmapFormat : uint8_t {
  RGBA32,
  BGRA32,
  RGB24,
  BGR24,
  GRAY8,
  YUV444P,
  YUV422P,
  YUV420P,
  YUV420SP_NV12,
  YUV420SP_NV21,
  HSV,
  Lab,
  DEPTH,
  EndGuard_
};

namespace ImageBitmapFormatValues {
extern const EnumEntry strings[14];
}

bool
ToJSValue(JSContext* aCx, ImageBitmapFormat aArgument, JS::MutableHandle<JS::Value> aValue);


enum class ChannelPixelLayoutDataType : uint8_t {
  Uint8,
  Int8,
  Uint16,
  Int16,
  Uint32,
  Int32,
  Float32,
  Float64,
  EndGuard_
};

namespace ChannelPixelLayoutDataTypeValues {
extern const EnumEntry strings[9];
}

bool
ToJSValue(JSContext* aCx, ChannelPixelLayoutDataType aArgument, JS::MutableHandle<JS::Value> aValue);


void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer& aUnion, const char* aName, uint32_t aFlags = 0);


void
ImplCycleCollectionUnlink(OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer& aUnion);


struct ChannelPixelLayout : public DictionaryBase
{
                        ChannelPixelLayoutDataType mDataType;
                        uint32_t mHeight;
                        uint32_t mOffset;
                        uint32_t mSkip;
                        uint32_t mStride;
                        uint32_t mWidth;

  ChannelPixelLayout();

  explicit inline ChannelPixelLayout(const FastDictionaryInitializer& )
  {

  }

  explicit inline ChannelPixelLayout(const ChannelPixelLayout& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  ChannelPixelLayout&
  operator=(const ChannelPixelLayout& aOther);

private:
  static bool
  InitIds(JSContext* cx, ChannelPixelLayoutAtoms* atomsCache);
};

namespace binding_detail {
struct FastChannelPixelLayout : public ChannelPixelLayout
{
  inline FastChannelPixelLayout()
    : ChannelPixelLayout(FastDictionaryInitializer())
  {

  }
};
}


class HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer
{
  friend class HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBufferArgument;
  enum Type
  {
    eUninitialized,
    eHTMLImageElement,
    eHTMLVideoElement,
    eHTMLCanvasElement,
    eBlob,
    eImageData,
    eCanvasRenderingContext2D,
    eImageBitmap,
    eArrayBufferView,
    eArrayBuffer
  };

  union Value
  {
    UnionMember<NonNull<mozilla::dom::HTMLImageElement> > mHTMLImageElement;
    UnionMember<NonNull<mozilla::dom::HTMLVideoElement> > mHTMLVideoElement;
    UnionMember<NonNull<mozilla::dom::HTMLCanvasElement> > mHTMLCanvasElement;
    UnionMember<NonNull<mozilla::dom::Blob> > mBlob;
    UnionMember<NonNull<mozilla::dom::ImageData> > mImageData;
    UnionMember<NonNull<mozilla::dom::CanvasRenderingContext2D> > mCanvasRenderingContext2D;
    UnionMember<NonNull<mozilla::dom::ImageBitmap> > mImageBitmap;
    UnionMember<RootedTypedArray<ArrayBufferView> > mArrayBufferView;
    UnionMember<RootedTypedArray<ArrayBuffer> > mArrayBuffer;

  };

  Type mType;
  Value mValue;

  HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer(const HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer&) = delete;
  HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer& operator=(const HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer&) = delete;
public:
  explicit inline HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer()
    : mType(eUninitialized)
  {
  }

  inline ~HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer()
  {
    Uninit();
  }

  inline NonNull<mozilla::dom::HTMLImageElement>&
  RawSetAsHTMLImageElement()
  {
    if (mType == eHTMLImageElement) {
      return mValue.mHTMLImageElement.Value();
    }
    do { } while (0);
    mType = eHTMLImageElement;
    return mValue.mHTMLImageElement.SetValue();
  }

  inline NonNull<mozilla::dom::HTMLImageElement>&
  SetAsHTMLImageElement()
  {
    if (mType == eHTMLImageElement) {
      return mValue.mHTMLImageElement.Value();
    }
    Uninit();
    mType = eHTMLImageElement;
    return mValue.mHTMLImageElement.SetValue();
  }

  inline bool
  IsHTMLImageElement() const
  {
    return mType == eHTMLImageElement;
  }

  inline NonNull<mozilla::dom::HTMLImageElement>&
  GetAsHTMLImageElement()
  {
    do { } while (0);
    return mValue.mHTMLImageElement.Value();
  }

  inline mozilla::dom::HTMLImageElement&
  GetAsHTMLImageElement() const
  {
    do { } while (0);
    return mValue.mHTMLImageElement.Value();
  }

  inline NonNull<mozilla::dom::HTMLVideoElement>&
  RawSetAsHTMLVideoElement()
  {
    if (mType == eHTMLVideoElement) {
      return mValue.mHTMLVideoElement.Value();
    }
    do { } while (0);
    mType = eHTMLVideoElement;
    return mValue.mHTMLVideoElement.SetValue();
  }

  inline NonNull<mozilla::dom::HTMLVideoElement>&
  SetAsHTMLVideoElement()
  {
    if (mType == eHTMLVideoElement) {
      return mValue.mHTMLVideoElement.Value();
    }
    Uninit();
    mType = eHTMLVideoElement;
    return mValue.mHTMLVideoElement.SetValue();
  }

  inline bool
  IsHTMLVideoElement() const
  {
    return mType == eHTMLVideoElement;
  }

  inline NonNull<mozilla::dom::HTMLVideoElement>&
  GetAsHTMLVideoElement()
  {
    do { } while (0);
    return mValue.mHTMLVideoElement.Value();
  }

  inline mozilla::dom::HTMLVideoElement&
  GetAsHTMLVideoElement() const
  {
    do { } while (0);
    return mValue.mHTMLVideoElement.Value();
  }

  inline NonNull<mozilla::dom::HTMLCanvasElement>&
  RawSetAsHTMLCanvasElement()
  {
    if (mType == eHTMLCanvasElement) {
      return mValue.mHTMLCanvasElement.Value();
    }
    do { } while (0);
    mType = eHTMLCanvasElement;
    return mValue.mHTMLCanvasElement.SetValue();
  }

  inline NonNull<mozilla::dom::HTMLCanvasElement>&
  SetAsHTMLCanvasElement()
  {
    if (mType == eHTMLCanvasElement) {
      return mValue.mHTMLCanvasElement.Value();
    }
    Uninit();
    mType = eHTMLCanvasElement;
    return mValue.mHTMLCanvasElement.SetValue();
  }

  inline bool
  IsHTMLCanvasElement() const
  {
    return mType == eHTMLCanvasElement;
  }

  inline NonNull<mozilla::dom::HTMLCanvasElement>&
  GetAsHTMLCanvasElement()
  {
    do { } while (0);
    return mValue.mHTMLCanvasElement.Value();
  }

  inline mozilla::dom::HTMLCanvasElement&
  GetAsHTMLCanvasElement() const
  {
    do { } while (0);
    return mValue.mHTMLCanvasElement.Value();
  }

  inline NonNull<mozilla::dom::Blob>&
  RawSetAsBlob()
  {
    if (mType == eBlob) {
      return mValue.mBlob.Value();
    }
    do { } while (0);
    mType = eBlob;
    return mValue.mBlob.SetValue();
  }

  inline NonNull<mozilla::dom::Blob>&
  SetAsBlob()
  {
    if (mType == eBlob) {
      return mValue.mBlob.Value();
    }
    Uninit();
    mType = eBlob;
    return mValue.mBlob.SetValue();
  }

  inline bool
  IsBlob() const
  {
    return mType == eBlob;
  }

  inline NonNull<mozilla::dom::Blob>&
  GetAsBlob()
  {
    do { } while (0);
    return mValue.mBlob.Value();
  }

  inline mozilla::dom::Blob&
  GetAsBlob() const
  {
    do { } while (0);
    return mValue.mBlob.Value();
  }

  inline NonNull<mozilla::dom::ImageData>&
  RawSetAsImageData()
  {
    if (mType == eImageData) {
      return mValue.mImageData.Value();
    }
    do { } while (0);
    mType = eImageData;
    return mValue.mImageData.SetValue();
  }

  inline NonNull<mozilla::dom::ImageData>&
  SetAsImageData()
  {
    if (mType == eImageData) {
      return mValue.mImageData.Value();
    }
    Uninit();
    mType = eImageData;
    return mValue.mImageData.SetValue();
  }

  inline bool
  IsImageData() const
  {
    return mType == eImageData;
  }

  inline NonNull<mozilla::dom::ImageData>&
  GetAsImageData()
  {
    do { } while (0);
    return mValue.mImageData.Value();
  }

  inline mozilla::dom::ImageData&
  GetAsImageData() const
  {
    do { } while (0);
    return mValue.mImageData.Value();
  }

  inline NonNull<mozilla::dom::CanvasRenderingContext2D>&
  RawSetAsCanvasRenderingContext2D()
  {
    if (mType == eCanvasRenderingContext2D) {
      return mValue.mCanvasRenderingContext2D.Value();
    }
    do { } while (0);
    mType = eCanvasRenderingContext2D;
    return mValue.mCanvasRenderingContext2D.SetValue();
  }

  inline NonNull<mozilla::dom::CanvasRenderingContext2D>&
  SetAsCanvasRenderingContext2D()
  {
    if (mType == eCanvasRenderingContext2D) {
      return mValue.mCanvasRenderingContext2D.Value();
    }
    Uninit();
    mType = eCanvasRenderingContext2D;
    return mValue.mCanvasRenderingContext2D.SetValue();
  }

  inline bool
  IsCanvasRenderingContext2D() const
  {
    return mType == eCanvasRenderingContext2D;
  }

  inline NonNull<mozilla::dom::CanvasRenderingContext2D>&
  GetAsCanvasRenderingContext2D()
  {
    do { } while (0);
    return mValue.mCanvasRenderingContext2D.Value();
  }

  inline mozilla::dom::CanvasRenderingContext2D&
  GetAsCanvasRenderingContext2D() const
  {
    do { } while (0);
    return mValue.mCanvasRenderingContext2D.Value();
  }

  inline NonNull<mozilla::dom::ImageBitmap>&
  RawSetAsImageBitmap()
  {
    if (mType == eImageBitmap) {
      return mValue.mImageBitmap.Value();
    }
    do { } while (0);
    mType = eImageBitmap;
    return mValue.mImageBitmap.SetValue();
  }

  inline NonNull<mozilla::dom::ImageBitmap>&
  SetAsImageBitmap()
  {
    if (mType == eImageBitmap) {
      return mValue.mImageBitmap.Value();
    }
    Uninit();
    mType = eImageBitmap;
    return mValue.mImageBitmap.SetValue();
  }

  inline bool
  IsImageBitmap() const
  {
    return mType == eImageBitmap;
  }

  inline NonNull<mozilla::dom::ImageBitmap>&
  GetAsImageBitmap()
  {
    do { } while (0);
    return mValue.mImageBitmap.Value();
  }

  inline mozilla::dom::ImageBitmap&
  GetAsImageBitmap() const
  {
    do { } while (0);
    return mValue.mImageBitmap.Value();
  }

  inline RootedTypedArray<ArrayBufferView>&
  RawSetAsArrayBufferView(JSContext* cx)
  {
    if (mType == eArrayBufferView) {
      return mValue.mArrayBufferView.Value();
    }
    do { } while (0);
    mType = eArrayBufferView;
    return mValue.mArrayBufferView.SetValue(cx);
  }

  inline RootedTypedArray<ArrayBufferView>&
  SetAsArrayBufferView(JSContext* cx)
  {
    if (mType == eArrayBufferView) {
      return mValue.mArrayBufferView.Value();
    }
    Uninit();
    mType = eArrayBufferView;
    return mValue.mArrayBufferView.SetValue(cx);
  }

  inline bool
  IsArrayBufferView() const
  {
    return mType == eArrayBufferView;
  }

  inline RootedTypedArray<ArrayBufferView>&
  GetAsArrayBufferView()
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  inline ArrayBufferView const &
  GetAsArrayBufferView() const
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  inline RootedTypedArray<ArrayBuffer>&
  RawSetAsArrayBuffer(JSContext* cx)
  {
    if (mType == eArrayBuffer) {
      return mValue.mArrayBuffer.Value();
    }
    do { } while (0);
    mType = eArrayBuffer;
    return mValue.mArrayBuffer.SetValue(cx);
  }

  inline RootedTypedArray<ArrayBuffer>&
  SetAsArrayBuffer(JSContext* cx)
  {
    if (mType == eArrayBuffer) {
      return mValue.mArrayBuffer.Value();
    }
    Uninit();
    mType = eArrayBuffer;
    return mValue.mArrayBuffer.SetValue(cx);
  }

  inline bool
  IsArrayBuffer() const
  {
    return mType == eArrayBuffer;
  }

  inline RootedTypedArray<ArrayBuffer>&
  GetAsArrayBuffer()
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline ArrayBuffer const &
  GetAsArrayBuffer() const
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eHTMLImageElement: {
        DestroyHTMLImageElement();
        break;
      }
      case eHTMLVideoElement: {
        DestroyHTMLVideoElement();
        break;
      }
      case eHTMLCanvasElement: {
        DestroyHTMLCanvasElement();
        break;
      }
      case eBlob: {
        DestroyBlob();
        break;
      }
      case eImageData: {
        DestroyImageData();
        break;
      }
      case eCanvasRenderingContext2D: {
        DestroyCanvasRenderingContext2D();
        break;
      }
      case eImageBitmap: {
        DestroyImageBitmap();
        break;
      }
      case eArrayBufferView: {
        DestroyArrayBufferView();
        break;
      }
      case eArrayBuffer: {
        DestroyArrayBuffer();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyHTMLImageElement()
  {
    do { } while (0);
    mValue.mHTMLImageElement.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyHTMLVideoElement()
  {
    do { } while (0);
    mValue.mHTMLVideoElement.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyHTMLCanvasElement()
  {
    do { } while (0);
    mValue.mHTMLCanvasElement.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyBlob()
  {
    do { } while (0);
    mValue.mBlob.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyImageData()
  {
    do { } while (0);
    mValue.mImageData.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyCanvasRenderingContext2D()
  {
    do { } while (0);
    mValue.mCanvasRenderingContext2D.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyImageBitmap()
  {
    do { } while (0);
    mValue.mImageBitmap.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyArrayBufferView()
  {
    do { } while (0);
    mValue.mArrayBufferView.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyArrayBuffer()
  {
    do { } while (0);
    mValue.mArrayBuffer.Destroy();
    mType = eUninitialized;
  }
};


class OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer& aUnion);
  enum Type
  {
    eUninitialized,
    eHTMLImageElement,
    eHTMLVideoElement,
    eHTMLCanvasElement,
    eBlob,
    eImageData,
    eCanvasRenderingContext2D,
    eImageBitmap,
    eArrayBufferView,
    eArrayBuffer
  };

  union Value
  {
    UnionMember<OwningNonNull<mozilla::dom::HTMLImageElement> > mHTMLImageElement;
    UnionMember<OwningNonNull<mozilla::dom::HTMLVideoElement> > mHTMLVideoElement;
    UnionMember<OwningNonNull<mozilla::dom::HTMLCanvasElement> > mHTMLCanvasElement;
    UnionMember<OwningNonNull<mozilla::dom::Blob> > mBlob;
    UnionMember<OwningNonNull<mozilla::dom::ImageData> > mImageData;
    UnionMember<OwningNonNull<mozilla::dom::CanvasRenderingContext2D> > mCanvasRenderingContext2D;
    UnionMember<OwningNonNull<mozilla::dom::ImageBitmap> > mImageBitmap;
    UnionMember<ArrayBufferView > mArrayBufferView;
    UnionMember<ArrayBuffer > mArrayBuffer;

  };

  Type mType;
  Value mValue;

  OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer(const OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer&) = delete;
  OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer& operator=(const OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer&) = delete;
public:
  explicit inline OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer()
    : mType(eUninitialized)
  {
  }

  inline ~OwningHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrCanvasRenderingContext2DOrImageBitmapOrArrayBufferViewOrArrayBuffer()
  {
    Uninit();
  }

  OwningNonNull<mozilla::dom::HTMLImageElement>&
  RawSetAsHTMLImageElement();

  OwningNonNull<mozilla::dom::HTMLImageElement>&
  SetAsHTMLImageElement();

  bool
  TrySetToHTMLImageElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsHTMLImageElement() const
  {
    return mType == eHTMLImageElement;
  }

  inline OwningNonNull<mozilla::dom::HTMLImageElement>&
  GetAsHTMLImageElement()
  {
    do { } while (0);
    return mValue.mHTMLImageElement.Value();
  }

  inline OwningNonNull<mozilla::dom::HTMLImageElement> const &
  GetAsHTMLImageElement() const
  {
    do { } while (0);
    return mValue.mHTMLImageElement.Value();
  }

  OwningNonNull<mozilla::dom::HTMLVideoElement>&
  RawSetAsHTMLVideoElement();

  OwningNonNull<mozilla::dom::HTMLVideoElement>&
  SetAsHTMLVideoElement();

  bool
  TrySetToHTMLVideoElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsHTMLVideoElement() const
  {
    return mType == eHTMLVideoElement;
  }

  inline OwningNonNull<mozilla::dom::HTMLVideoElement>&
  GetAsHTMLVideoElement()
  {
    do { } while (0);
    return mValue.mHTMLVideoElement.Value();
  }

  inline OwningNonNull<mozilla::dom::HTMLVideoElement> const &
  GetAsHTMLVideoElement() const
  {
    do { } while (0);
    return mValue.mHTMLVideoElement.Value();
  }

  OwningNonNull<mozilla::dom::HTMLCanvasElement>&
  RawSetAsHTMLCanvasElement();

  OwningNonNull<mozilla::dom::HTMLCanvasElement>&
  SetAsHTMLCanvasElement();

  bool
  TrySetToHTMLCanvasElement(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsHTMLCanvasElement() const
  {
    return mType == eHTMLCanvasElement;
  }

  inline OwningNonNull<mozilla::dom::HTMLCanvasElement>&
  GetAsHTMLCanvasElement()
  {
    do { } while (0);
    return mValue.mHTMLCanvasElement.Value();
  }

  inline OwningNonNull<mozilla::dom::HTMLCanvasElement> const &
  GetAsHTMLCanvasElement() const
  {
    do { } while (0);
    return mValue.mHTMLCanvasElement.Value();
  }

  OwningNonNull<mozilla::dom::Blob>&
  RawSetAsBlob();

  OwningNonNull<mozilla::dom::Blob>&
  SetAsBlob();

  bool
  TrySetToBlob(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsBlob() const
  {
    return mType == eBlob;
  }

  inline OwningNonNull<mozilla::dom::Blob>&
  GetAsBlob()
  {
    do { } while (0);
    return mValue.mBlob.Value();
  }

  inline OwningNonNull<mozilla::dom::Blob> const &
  GetAsBlob() const
  {
    do { } while (0);
    return mValue.mBlob.Value();
  }

  OwningNonNull<mozilla::dom::ImageData>&
  RawSetAsImageData();

  OwningNonNull<mozilla::dom::ImageData>&
  SetAsImageData();

  bool
  TrySetToImageData(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsImageData() const
  {
    return mType == eImageData;
  }

  inline OwningNonNull<mozilla::dom::ImageData>&
  GetAsImageData()
  {
    do { } while (0);
    return mValue.mImageData.Value();
  }

  inline OwningNonNull<mozilla::dom::ImageData> const &
  GetAsImageData() const
  {
    do { } while (0);
    return mValue.mImageData.Value();
  }

  OwningNonNull<mozilla::dom::CanvasRenderingContext2D>&
  RawSetAsCanvasRenderingContext2D();

  OwningNonNull<mozilla::dom::CanvasRenderingContext2D>&
  SetAsCanvasRenderingContext2D();

  bool
  TrySetToCanvasRenderingContext2D(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsCanvasRenderingContext2D() const
  {
    return mType == eCanvasRenderingContext2D;
  }

  inline OwningNonNull<mozilla::dom::CanvasRenderingContext2D>&
  GetAsCanvasRenderingContext2D()
  {
    do { } while (0);
    return mValue.mCanvasRenderingContext2D.Value();
  }

  inline OwningNonNull<mozilla::dom::CanvasRenderingContext2D> const &
  GetAsCanvasRenderingContext2D() const
  {
    do { } while (0);
    return mValue.mCanvasRenderingContext2D.Value();
  }

  OwningNonNull<mozilla::dom::ImageBitmap>&
  RawSetAsImageBitmap();

  OwningNonNull<mozilla::dom::ImageBitmap>&
  SetAsImageBitmap();

  bool
  TrySetToImageBitmap(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsImageBitmap() const
  {
    return mType == eImageBitmap;
  }

  inline OwningNonNull<mozilla::dom::ImageBitmap>&
  GetAsImageBitmap()
  {
    do { } while (0);
    return mValue.mImageBitmap.Value();
  }

  inline OwningNonNull<mozilla::dom::ImageBitmap> const &
  GetAsImageBitmap() const
  {
    do { } while (0);
    return mValue.mImageBitmap.Value();
  }

  ArrayBufferView&
  RawSetAsArrayBufferView();

  ArrayBufferView&
  SetAsArrayBufferView();

  bool
  TrySetToArrayBufferView(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsArrayBufferView() const
  {
    return mType == eArrayBufferView;
  }

  inline ArrayBufferView&
  GetAsArrayBufferView()
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  inline ArrayBufferView const &
  GetAsArrayBufferView() const
  {
    do { } while (0);
    return mValue.mArrayBufferView.Value();
  }

  ArrayBuffer&
  RawSetAsArrayBuffer();

  ArrayBuffer&
  SetAsArrayBuffer();

  bool
  TrySetToArrayBuffer(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsArrayBuffer() const
  {
    return mType == eArrayBuffer;
  }

  inline ArrayBuffer&
  GetAsArrayBuffer()
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  inline ArrayBuffer const &
  GetAsArrayBuffer() const
  {
    do { } while (0);
    return mValue.mArrayBuffer.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

private:
  void
  DestroyHTMLImageElement();

  void
  DestroyHTMLVideoElement();

  void
  DestroyHTMLCanvasElement();

  void
  DestroyBlob();

  void
  DestroyImageData();

  void
  DestroyCanvasRenderingContext2D();

  void
  DestroyImageBitmap();

  void
  DestroyArrayBufferView();

  void
  DestroyArrayBuffer();
};


namespace ImageBitmapBinding {

  typedef mozilla::dom::ImageBitmap NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::ImageBitmap* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 1070 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ImageBitmapBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 7 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/WindowBinding.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/WindowBinding.h" 1
# 8 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/WindowBinding.h" 2
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/WindowBinding.h"
class nsGlobalWindow;
struct nsGlobalWindowAtoms;
class nsPIDOMWindowOuter;

namespace mozilla {
namespace dom {

class ChromeWindow;
struct ChromeWindowAtoms;
class External;
class FrameRequestCallback;
class IdleDeadline;
class IdleRequestCallback;
struct IdleRequestOptionsAtoms;
struct NativePropertyHooks;
class OwningExternalOrWindowProxy;
class ProtoAndIfaceCache;
struct ScrollOptionsAtoms;
struct ScrollToOptionsAtoms;

}
}

namespace mozilla {
namespace dom {

enum class ScrollBehavior : uint8_t {
  Auto,
  Instant,
  Smooth,
  EndGuard_
};

namespace ScrollBehaviorValues {
extern const EnumEntry strings[4];
}

bool
ToJSValue(JSContext* aCx, ScrollBehavior aArgument, JS::MutableHandle<JS::Value> aValue);


void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback, OwningExternalOrWindowProxy& aUnion, const char* aName, uint32_t aFlags = 0);


void
ImplCycleCollectionUnlink(OwningExternalOrWindowProxy& aUnion);


class ExternalOrWindowProxy
{
  friend class ExternalOrWindowProxyArgument;
  enum Type
  {
    eUninitialized,
    eExternal,
    eWindowProxy
  };

  union Value
  {
    UnionMember<NonNull<mozilla::dom::External> > mExternal;
    UnionMember<nsPIDOMWindowOuter* > mWindowProxy;

  };

  Type mType;
  Value mValue;

  ExternalOrWindowProxy(const ExternalOrWindowProxy&) = delete;
  ExternalOrWindowProxy& operator=(const ExternalOrWindowProxy&) = delete;
public:
  explicit inline ExternalOrWindowProxy()
    : mType(eUninitialized)
  {
  }

  inline ~ExternalOrWindowProxy()
  {
    Uninit();
  }

  inline NonNull<mozilla::dom::External>&
  RawSetAsExternal()
  {
    if (mType == eExternal) {
      return mValue.mExternal.Value();
    }
    do { } while (0);
    mType = eExternal;
    return mValue.mExternal.SetValue();
  }

  inline NonNull<mozilla::dom::External>&
  SetAsExternal()
  {
    if (mType == eExternal) {
      return mValue.mExternal.Value();
    }
    Uninit();
    mType = eExternal;
    return mValue.mExternal.SetValue();
  }

  inline bool
  IsExternal() const
  {
    return mType == eExternal;
  }

  inline NonNull<mozilla::dom::External>&
  GetAsExternal()
  {
    do { } while (0);
    return mValue.mExternal.Value();
  }

  inline mozilla::dom::External&
  GetAsExternal() const
  {
    do { } while (0);
    return mValue.mExternal.Value();
  }

  inline nsPIDOMWindowOuter*&
  RawSetAsWindowProxy()
  {
    if (mType == eWindowProxy) {
      return mValue.mWindowProxy.Value();
    }
    do { } while (0);
    mType = eWindowProxy;
    return mValue.mWindowProxy.SetValue();
  }

  inline nsPIDOMWindowOuter*&
  SetAsWindowProxy()
  {
    if (mType == eWindowProxy) {
      return mValue.mWindowProxy.Value();
    }
    Uninit();
    mType = eWindowProxy;
    return mValue.mWindowProxy.SetValue();
  }

  inline bool
  IsWindowProxy() const
  {
    return mType == eWindowProxy;
  }

  inline nsPIDOMWindowOuter*&
  GetAsWindowProxy()
  {
    do { } while (0);
    return mValue.mWindowProxy.Value();
  }

  inline nsPIDOMWindowOuter*
  GetAsWindowProxy() const
  {
    do { } while (0);
    return mValue.mWindowProxy.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eExternal: {
        DestroyExternal();
        break;
      }
      case eWindowProxy: {
        DestroyWindowProxy();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyExternal()
  {
    do { } while (0);
    mValue.mExternal.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyWindowProxy()
  {
    do { } while (0);
    mValue.mWindowProxy.Destroy();
    mType = eUninitialized;
  }
};


class OwningExternalOrWindowProxy : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningExternalOrWindowProxy& aUnion);
  enum Type
  {
    eUninitialized,
    eExternal,
    eWindowProxy
  };

  union Value
  {
    UnionMember<OwningNonNull<mozilla::dom::External> > mExternal;
    UnionMember<RefPtr<nsPIDOMWindowOuter> > mWindowProxy;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningExternalOrWindowProxy()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningExternalOrWindowProxy(const OwningExternalOrWindowProxy& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningExternalOrWindowProxy()
  {
    Uninit();
  }

  OwningNonNull<mozilla::dom::External>&
  RawSetAsExternal();

  OwningNonNull<mozilla::dom::External>&
  SetAsExternal();

  bool
  TrySetToExternal(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsExternal() const
  {
    return mType == eExternal;
  }

  inline OwningNonNull<mozilla::dom::External>&
  GetAsExternal()
  {
    do { } while (0);
    return mValue.mExternal.Value();
  }

  inline OwningNonNull<mozilla::dom::External> const &
  GetAsExternal() const
  {
    do { } while (0);
    return mValue.mExternal.Value();
  }

  RefPtr<nsPIDOMWindowOuter>&
  RawSetAsWindowProxy();

  RefPtr<nsPIDOMWindowOuter>&
  SetAsWindowProxy();

  bool
  TrySetToWindowProxy(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsWindowProxy() const
  {
    return mType == eWindowProxy;
  }

  inline RefPtr<nsPIDOMWindowOuter>&
  GetAsWindowProxy()
  {
    do { } while (0);
    return mValue.mWindowProxy.Value();
  }

  inline RefPtr<nsPIDOMWindowOuter> const &
  GetAsWindowProxy() const
  {
    do { } while (0);
    return mValue.mWindowProxy.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningExternalOrWindowProxy&
  operator=(const OwningExternalOrWindowProxy& aOther);

private:
  void
  DestroyExternal();

  void
  DestroyWindowProxy();
};


struct IdleRequestOptions : public DictionaryBase
{
                        Optional<uint32_t> mTimeout;

  IdleRequestOptions();

  explicit inline IdleRequestOptions(const FastDictionaryInitializer& )
  {

  }

  explicit inline IdleRequestOptions(const IdleRequestOptions& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  IdleRequestOptions&
  operator=(const IdleRequestOptions& aOther);

private:
  static bool
  InitIds(JSContext* cx, IdleRequestOptionsAtoms* atomsCache);
};

namespace binding_detail {
struct FastIdleRequestOptions : public IdleRequestOptions
{
  inline FastIdleRequestOptions()
    : IdleRequestOptions(FastDictionaryInitializer())
  {

  }
};
}


struct ScrollOptions : public DictionaryBase
{
                        ScrollBehavior mBehavior;

  ScrollOptions();

  explicit inline ScrollOptions(const FastDictionaryInitializer& )
  {

  }

  explicit inline ScrollOptions(const ScrollOptions& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  ScrollOptions&
  operator=(const ScrollOptions& aOther);

private:
  static bool
  InitIds(JSContext* cx, ScrollOptionsAtoms* atomsCache);
};

namespace binding_detail {
struct FastScrollOptions : public ScrollOptions
{
  inline FastScrollOptions()
    : ScrollOptions(FastDictionaryInitializer())
  {

  }
};
}


struct ScrollToOptions : public ScrollOptions
{
                        Optional<double> mLeft;
                        Optional<double> mTop;

  ScrollToOptions();

  explicit inline ScrollToOptions(const FastDictionaryInitializer& )
    : ScrollOptions(FastDictionaryInitializer())
  {

  }

  explicit inline ScrollToOptions(const ScrollToOptions& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);

  ScrollToOptions&
  operator=(const ScrollToOptions& aOther);

private:
  static bool
  InitIds(JSContext* cx, ScrollToOptionsAtoms* atomsCache);
};

namespace binding_detail {
struct FastScrollToOptions : public ScrollToOptions
{
  inline FastScrollToOptions()
    : ScrollToOptions(FastDictionaryInitializer())
  {

  }
};
}


class FrameRequestCallback : public CallbackFunction
{
public:
  explicit inline FrameRequestCallback(JSContext* aCx, JS::Handle<JSObject*> aCallback, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCx, aCallback, aIncumbentGlobal)
  {
    do { } while (0);
  }

  explicit inline FrameRequestCallback(JS::Handle<JSObject*> aCallback, const FastCallbackConstructor& )
    : CallbackFunction(aCallback, FastCallbackConstructor())
  {
    do { } while (0);
  }

  explicit inline FrameRequestCallback(JS::Handle<JSObject*> aCallback, JS::Handle<JSObject*> aAsyncStack, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCallback, aAsyncStack, aIncumbentGlobal)
  {
    do { } while (0);
  }

  explicit inline FrameRequestCallback(CallbackFunction* aOther)
    : CallbackFunction(aOther)
  {
  }

  template <typename T>
  inline void
  Call(const T& thisVal, double time, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "FrameRequestCallback";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    JS::Rooted<JS::Value> thisValJS(s.GetContext());
    if (!ToJSValue(s.GetContext(), thisVal, &thisValJS)) {
      aRv.Throw(NS_ERROR_FAILURE);
      return;
    }
    return Call(s.GetContext(), thisValJS, time, aRv);
  }

  inline void
  Call(double time, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "FrameRequestCallback";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    return Call(s.GetContext(), JS::UndefinedHandleValue, time, aRv);
  }

  template <typename T>
  inline void
  Call(const T& thisVal, double time, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(thisVal, time, rv, aExecutionReason);
  }

  inline void
  Call(double time, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(time, rv, aExecutionReason, eReportExceptions, nullptr);
  }

  inline bool
  operator==(const FrameRequestCallback& aOther) const
  {
    return CallbackFunction::operator==(aOther);
  }

private:
  void Call(JSContext* cx, JS::Handle<JS::Value> aThisVal, double time, ErrorResult& aRv);
};


class IdleRequestCallback : public CallbackFunction
{
public:
  explicit inline IdleRequestCallback(JSContext* aCx, JS::Handle<JSObject*> aCallback, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCx, aCallback, aIncumbentGlobal)
  {
    do { } while (0);
  }

  explicit inline IdleRequestCallback(JS::Handle<JSObject*> aCallback, const FastCallbackConstructor& )
    : CallbackFunction(aCallback, FastCallbackConstructor())
  {
    do { } while (0);
  }

  explicit inline IdleRequestCallback(JS::Handle<JSObject*> aCallback, JS::Handle<JSObject*> aAsyncStack, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCallback, aAsyncStack, aIncumbentGlobal)
  {
    do { } while (0);
  }

  explicit inline IdleRequestCallback(CallbackFunction* aOther)
    : CallbackFunction(aOther)
  {
  }

  template <typename T>
  inline void
  Call(const T& thisVal, IdleDeadline& deadline, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "IdleRequestCallback";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    JS::Rooted<JS::Value> thisValJS(s.GetContext());
    if (!ToJSValue(s.GetContext(), thisVal, &thisValJS)) {
      aRv.Throw(NS_ERROR_FAILURE);
      return;
    }
    return Call(s.GetContext(), thisValJS, deadline, aRv);
  }

  inline void
  Call(IdleDeadline& deadline, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "IdleRequestCallback";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    return Call(s.GetContext(), JS::UndefinedHandleValue, deadline, aRv);
  }

  template <typename T>
  inline void
  Call(const T& thisVal, IdleDeadline& deadline, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(thisVal, deadline, rv, aExecutionReason);
  }

  inline void
  Call(IdleDeadline& deadline, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(deadline, rv, aExecutionReason, eReportExceptions, nullptr);
  }

  inline bool
  operator==(const IdleRequestCallback& aOther) const
  {
    return CallbackFunction::operator==(aOther);
  }

private:
  void Call(JSContext* cx, JS::Handle<JS::Value> aThisVal, IdleDeadline& deadline, ErrorResult& aRv);
};


namespace binding_detail {
class FastFrameRequestCallback : public FrameRequestCallback
{
public:
  explicit inline FastFrameRequestCallback(JS::Handle<JSObject*> aCallback)
    : FrameRequestCallback(aCallback, FastCallbackConstructor())
  {
  }

  inline void
  Trace(JSTracer* aTracer)
  {
    FrameRequestCallback::Trace(aTracer);
  }

  inline void
  FinishSlowJSInitIfMoreThanOneOwner(JSContext* aCx)
  {
    FrameRequestCallback::FinishSlowJSInitIfMoreThanOneOwner(aCx);
  }
};
}


namespace binding_detail {
class FastIdleRequestCallback : public IdleRequestCallback
{
public:
  explicit inline FastIdleRequestCallback(JS::Handle<JSObject*> aCallback)
    : IdleRequestCallback(aCallback, FastCallbackConstructor())
  {
  }

  inline void
  Trace(JSTracer* aTracer)
  {
    IdleRequestCallback::Trace(aTracer);
  }

  inline void
  FinishSlowJSInitIfMoreThanOneOwner(JSContext* aCx)
  {
    IdleRequestCallback::FinishSlowJSInitIfMoreThanOneOwner(aCx);
  }
};
}


namespace ChromeWindowBinding {

  typedef mozilla::dom::ChromeWindow NativeType;

  bool
  ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj);

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);
# 729 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/WindowBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



namespace WindowBinding {

  typedef nsGlobalWindow NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, nsGlobalWindow* aObject, nsWrapperCache* aCache, JS::CompartmentOptions& aOptions, JSPrincipals* aPrincipal, bool aInitStandardClasses, JS::MutableHandle<JSObject*> aReflector);
# 764 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/WindowBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  bool
  ClearCachedDocumentValue(JSContext* aCx, nsGlobalWindow* aObject);

  bool
  ClearCachedPerformanceValue(JSContext* aCx, nsGlobalWindow* aObject);

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

  inline bool IsPermitted(JSFlatString* prop, char16_t propFirstChar, bool set)
  {
    switch (propFirstChar) {
      case 'b': {
        if (!set && JS_FlatStringEqualsAscii(prop, "blur")) {
          return true;
        }
        break;
      }
      case 'c': {
        if (!set && JS_FlatStringEqualsAscii(prop, "close")) {
          return true;
        }
        if (!set && JS_FlatStringEqualsAscii(prop, "closed")) {
          return true;
        }
        break;
      }
      case 'f': {
        if (!set && JS_FlatStringEqualsAscii(prop, "focus")) {
          return true;
        }
        if (!set && JS_FlatStringEqualsAscii(prop, "frames")) {
          return true;
        }
        break;
      }
      case 'l': {
        if (!set && JS_FlatStringEqualsAscii(prop, "length")) {
          return true;
        }
        if (JS_FlatStringEqualsAscii(prop, "location")) {
          return true;
        }
        break;
      }
      case 'o': {
        if (!set && JS_FlatStringEqualsAscii(prop, "opener")) {
          return true;
        }
        break;
      }
      case 'p': {
        if (!set && JS_FlatStringEqualsAscii(prop, "parent")) {
          return true;
        }
        if (!set && JS_FlatStringEqualsAscii(prop, "postMessage")) {
          return true;
        }
        break;
      }
      case 's': {
        if (!set && JS_FlatStringEqualsAscii(prop, "self")) {
          return true;
        }
        break;
      }
      case 't': {
        if (!set && JS_FlatStringEqualsAscii(prop, "top")) {
          return true;
        }
        break;
      }
      case 'w': {
        if (!set && JS_FlatStringEqualsAscii(prop, "window")) {
          return true;
        }
        break;
      }
    }

    return false;
  }

}



}
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ScrollbarStyles.h" 2


struct nsStyleDisplay;

namespace mozilla {

struct ScrollbarStyles
{


  uint8_t mHorizontal;
  uint8_t mVertical;


  uint8_t mScrollBehavior;


  uint8_t mScrollSnapTypeX;
  uint8_t mScrollSnapTypeY;
  nsStyleCoord mScrollSnapPointsX;
  nsStyleCoord mScrollSnapPointsY;
  nsStyleCoord::CalcValue mScrollSnapDestinationX;
  nsStyleCoord::CalcValue mScrollSnapDestinationY;

  ScrollbarStyles(uint8_t aH, uint8_t aV)
    : mHorizontal(aH), mVertical(aV),
      mScrollBehavior(0),
      mScrollSnapTypeX(0),
      mScrollSnapTypeY(0),
      mScrollSnapPointsX(nsStyleCoord(eStyleUnit_None)),
      mScrollSnapPointsY(nsStyleCoord(eStyleUnit_None)) {

    mScrollSnapDestinationX.mPercent = 0;
    mScrollSnapDestinationX.mLength = nscoord(0.0f);
    mScrollSnapDestinationX.mHasPercent = false;
    mScrollSnapDestinationY.mPercent = 0;
    mScrollSnapDestinationY.mLength = nscoord(0.0f);
    mScrollSnapDestinationY.mHasPercent = false;
  }

  explicit ScrollbarStyles(const nsStyleDisplay* aDisplay);
  ScrollbarStyles(uint8_t aH, uint8_t aV, const nsStyleDisplay* aDisplay);
  ScrollbarStyles() {}
  bool operator==(const ScrollbarStyles& aStyles) const {
    return aStyles.mHorizontal == mHorizontal && aStyles.mVertical == mVertical &&
           aStyles.mScrollBehavior == mScrollBehavior &&
           aStyles.mScrollSnapTypeX == mScrollSnapTypeX &&
           aStyles.mScrollSnapTypeY == mScrollSnapTypeY &&
           aStyles.mScrollSnapPointsX == mScrollSnapPointsX &&
           aStyles.mScrollSnapPointsY == mScrollSnapPointsY &&
           aStyles.mScrollSnapDestinationX == mScrollSnapDestinationX &&
           aStyles.mScrollSnapDestinationY == mScrollSnapDestinationY;
  }
  bool operator!=(const ScrollbarStyles& aStyles) const {
    return !(*this == aStyles);
  }
  bool IsHiddenInBothDirections() const {
    return mHorizontal == 1 &&
           mVertical == 1;
  }
  bool IsSmoothScroll(dom::ScrollBehavior aBehavior) const {
    return aBehavior == dom::ScrollBehavior::Smooth ||
             (aBehavior == dom::ScrollBehavior::Auto &&
               mScrollBehavior == 1);
  }
};

}
# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class mozIDOMWindowProxy;

class nsIDocShell;

class nsIContent;

class nsIFrameLoader;

class nsIPrincipal;
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIMessageListener : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult ReceiveMessage(void) = 0;

};

  template<typename T> struct nsIMessageListener::COMTypeInfo<nsIMessageListener, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMessageListener::COMTypeInfo<nsIMessageListener, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x2b44eb57, 0xa9c6, 0x4773, { 0x9a, 0x1e, 0xfe, 0x08, 0x18, 0x73, 0x9a, 0x4c }};
# 115 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIMessageListenerManager : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult AddMessageListener(const nsAString & messageName, nsIMessageListener *listener, bool listenWhenClosed) = 0;


  virtual nsresult RemoveMessageListener(const nsAString & messageName, nsIMessageListener *listener) = 0;


  virtual nsresult AddWeakMessageListener(const nsAString & messageName, nsIMessageListener *listener) = 0;


  virtual nsresult RemoveWeakMessageListener(const nsAString & messageName, nsIMessageListener *listener) = 0;


  virtual bool MarkForCC(void) = 0;

};

  template<typename T> struct nsIMessageListenerManager::COMTypeInfo<nsIMessageListenerManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMessageListenerManager::COMTypeInfo<nsIMessageListenerManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xb949bfec, 0xbb7d, 0x47bc, { 0xb3, 0x87, 0xac, 0x6a, 0x9b, 0x65, 0x50, 0x72 }};
# 245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIMessageSender : public nsIMessageListenerManager {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult SendAsyncMessage(const nsAString & messageName, JS::HandleValue obj, JS::HandleValue objects, nsIPrincipal *principal, JS::HandleValue transfers, JSContext* cx, uint8_t _argc) = 0;


  virtual nsresult GetProcessMessageManager(nsIMessageSender * *aProcessMessageManager) = 0;

};

  template<typename T> struct nsIMessageSender::COMTypeInfo<nsIMessageSender, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMessageSender::COMTypeInfo<nsIMessageSender, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xbb5d79e4, 0xe73c, 0x45e7, { 0x96, 0x51, 0x4d, 0x71, 0x8f, 0x4b, 0x99, 0x4c }};
# 336 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIMessageBroadcaster : public nsIMessageListenerManager {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult BroadcastAsyncMessage(const nsAString & messageName, JS::HandleValue obj, JS::HandleValue objects, JSContext* cx, uint8_t _argc) = 0;


  virtual nsresult GetChildCount(uint32_t *aChildCount) = 0;


  virtual nsresult GetChildAt(uint32_t aIndex, nsIMessageListenerManager * *_retval) = 0;


  virtual nsresult ReleaseCachedProcesses(void) = 0;

};

  template<typename T> struct nsIMessageBroadcaster::COMTypeInfo<nsIMessageBroadcaster, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMessageBroadcaster::COMTypeInfo<nsIMessageBroadcaster, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x4d7d62ad, 0x4725, 0x4f39, { 0x86, 0xcf, 0x8f, 0xb2, 0x2b, 0xf9, 0xc1, 0xd8 }};
# 453 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsISyncMessageSender : public nsIMessageSender {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult SendSyncMessage(const nsAString & messageName, JS::HandleValue obj, JS::HandleValue objects, nsIPrincipal *principal, JSContext* cx, uint8_t _argc, JS::MutableHandleValue _retval) = 0;


  virtual nsresult SendRpcMessage(const nsAString & messageName, JS::HandleValue obj, JS::HandleValue objects, nsIPrincipal *principal, JSContext* cx, uint8_t _argc, JS::MutableHandleValue _retval) = 0;

};

  template<typename T> struct nsISyncMessageSender::COMTypeInfo<nsISyncMessageSender, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISyncMessageSender::COMTypeInfo<nsISyncMessageSender, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x0e602c9e, 0x1977, 0x422a, { 0xa8, 0xe4, 0xfe, 0x0d, 0x4a, 0x4f, 0x78, 0xd0 }};
# 544 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIMessageManagerGlobal : public nsISyncMessageSender {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Dump(const nsAString & aStr) = 0;


  virtual nsresult PrivateNoteIntentionalCrash(void) = 0;


  virtual nsresult Atob(const nsAString & aAsciiString, nsAString & _retval) = 0;


  virtual nsresult Btoa(const nsAString & aBase64Data, nsAString & _retval) = 0;

};

  template<typename T> struct nsIMessageManagerGlobal::COMTypeInfo<nsIMessageManagerGlobal, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIMessageManagerGlobal::COMTypeInfo<nsIMessageManagerGlobal, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x13f3555f, 0x769e, 0x44ea, { 0xb6, 0x07, 0x52, 0x39, 0x23, 0x0c, 0x31, 0x62 }};
# 661 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIContentFrameMessageManager : public nsIMessageManagerGlobal {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetContent(mozIDOMWindowProxy * *aContent) = 0;


  virtual nsresult GetDocShell(nsIDocShell * *aDocShell) = 0;

};

  template<typename T> struct nsIContentFrameMessageManager::COMTypeInfo<nsIContentFrameMessageManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIContentFrameMessageManager::COMTypeInfo<nsIContentFrameMessageManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x694e367c, 0xaa25, 0x4446, { 0x84, 0x99, 0x2c, 0x52, 0x7c, 0x4b, 0xd8, 0x38 }};
# 752 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIInProcessContentFrameMessageManager : public nsIContentFrameMessageManager {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsIContent * GetOwnerContent(void) = 0;


  virtual void CacheFrameLoader(nsIFrameLoader *aFrameLoader) = 0;

};

  template<typename T> struct nsIInProcessContentFrameMessageManager::COMTypeInfo<nsIInProcessContentFrameMessageManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIInProcessContentFrameMessageManager::COMTypeInfo<nsIInProcessContentFrameMessageManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xb39a3324, 0xb574, 0x4f85, { 0x8c, 0xdb, 0x27, 0x4d, 0x04, 0xf8, 0x07, 0xef }};
# 843 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIContentProcessMessageManager : public nsIMessageManagerGlobal {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetInitialProcessData(JSContext* cx, JS::MutableHandleValue aInitialProcessData) = 0;

};

  template<typename T> struct nsIContentProcessMessageManager::COMTypeInfo<nsIContentProcessMessageManager, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIContentProcessMessageManager::COMTypeInfo<nsIContentProcessMessageManager, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x6d12e467, 0x2446, 0x46db, { 0x99, 0x65, 0xe4, 0xe9, 0x3c, 0xb8, 0x7c, 0xa5 }};
# 921 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIFrameScriptLoader : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult LoadFrameScript(const nsAString & aURL, bool aAllowDelayedLoad, bool aRunInGlobalScope) = 0;


  virtual nsresult RemoveDelayedFrameScript(const nsAString & aURL) = 0;


  virtual nsresult GetDelayedFrameScripts(JSContext* cx, JS::MutableHandleValue _retval) = 0;

};

  template<typename T> struct nsIFrameScriptLoader::COMTypeInfo<nsIFrameScriptLoader, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIFrameScriptLoader::COMTypeInfo<nsIFrameScriptLoader, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xbf61446b, 0xba24, 0x4b1d, { 0x88, 0xc7, 0x4f, 0x94, 0x72, 0x4b, 0x9c, 0xe1 }};
# 1025 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIProcessScriptLoader : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult LoadProcessScript(const nsAString & aURL, bool aAllowDelayedLoad) = 0;


  virtual nsresult RemoveDelayedProcessScript(const nsAString & aURL) = 0;


  virtual nsresult GetDelayedProcessScripts(JSContext* cx, JS::MutableHandleValue _retval) = 0;

};

  template<typename T> struct nsIProcessScriptLoader::COMTypeInfo<nsIProcessScriptLoader, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIProcessScriptLoader::COMTypeInfo<nsIProcessScriptLoader, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x7e1e1a20, 0xb24f, 0x11e4, { 0xab, 0x27, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66 }};
# 1129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIMessageManager.h"
class nsIGlobalProcessScriptLoader : public nsIProcessScriptLoader {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetInitialProcessData(JSContext* cx, JS::MutableHandleValue aInitialProcessData) = 0;

};

  template<typename T> struct nsIGlobalProcessScriptLoader::COMTypeInfo<nsIGlobalProcessScriptLoader, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIGlobalProcessScriptLoader::COMTypeInfo<nsIGlobalProcessScriptLoader, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x5b390753, 0xabb3, 0x49b0, { 0xae, 0x3b, 0xb8, 0x03, 0xda, 0xb5, 0x81, 0x44 }};
# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RestyleLogging.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RestyleLogging.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AutoRestore.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AutoRestore.h"
namespace mozilla {
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AutoRestore.h"
template<class T>
class AutoRestore
{
private:
  T& mLocation;
  T mValue;

public:
  explicit AutoRestore(T& aValue )
    : mLocation(aValue)
    , mValue(aValue)
  {
    do { } while (0);
  }
  ~AutoRestore()
  {
    mLocation = mValue;
  }
  T SavedValue() const
  {
    return mValue;
  }
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/RestyleLogging.h" 2
# 42 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prenv.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prenv.h"
extern "C" {
# 91 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prenv.h"
extern __attribute__((visibility("default"))) char* PR_GetEnv(const char *var);
# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prenv.h"
extern __attribute__((visibility("default"))) char* PR_GetEnvSecure(const char *var);
# 128 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prenv.h"
extern __attribute__((visibility("default"))) PRStatus PR_SetEnv(const char *string);
# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nspr/prenv.h"
extern __attribute__((visibility("default"))) char ** PR_DuplicateEnvironment(void);

}
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPresData.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPresData.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILanguageAtomService.h" 1
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILanguageAtomService.h"
class nsILanguageAtomService : public nsISupports
{
 public:
  template<typename T, typename U> struct COMTypeInfo;

  virtual nsIAtom* LookupLanguage(const nsACString &aLanguage,
                                  nsresult *aError = nullptr) = 0;
  virtual already_AddRefed<nsIAtom>
  LookupCharSet(const nsACString& aCharSet) = 0;

  virtual nsIAtom* GetLocaleLanguage() = 0;

  virtual nsIAtom* GetLanguageGroup(nsIAtom* aLanguage,
                                    nsresult* aError = nullptr) = 0;



  virtual already_AddRefed<nsIAtom> GetUncachedLanguageGroup(nsIAtom* aLanguage,
                                                             nsresult* aError = nullptr) const = 0;
};

template<typename T> struct nsILanguageAtomService::COMTypeInfo<nsILanguageAtomService, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsILanguageAtomService::COMTypeInfo<nsILanguageAtomService, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xcb3892a0, 0x6a76, 0x461c, { 0xb0, 0x24, 0x23, 0x0e, 0xe3, 0xe0, 0x81, 0x1a }};
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPresData.h" 2

namespace mozilla {

struct LangGroupFontPrefs {

  LangGroupFontPrefs()
    : mLangGroup(nullptr)
    , mMinimumFontSize(0)
    , mDefaultVariableFont(mozilla::eFamily_serif, 0)
    , mDefaultFixedFont(mozilla::eFamily_monospace, 0)
    , mDefaultSerifFont(mozilla::eFamily_serif, 0)
    , mDefaultSansSerifFont(mozilla::eFamily_sans_serif, 0)
    , mDefaultMonospaceFont(mozilla::eFamily_monospace, 0)
    , mDefaultCursiveFont(mozilla::eFamily_cursive, 0)
    , mDefaultFantasyFont(mozilla::eFamily_fantasy, 0)
  {}

  void Reset()
  {

    mNext = nullptr;


    mLangGroup = nullptr;
  }

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
    size_t n = 0;
    LangGroupFontPrefs* curr = mNext;
    while (curr) {
      n += aMallocSizeOf(curr);






      curr = curr->mNext;
    }
    return n;
  }


  void Initialize(nsIAtom* aLangGroupAtom);

  nsCOMPtr<nsIAtom> mLangGroup;
  nscoord mMinimumFontSize;
  nsFont mDefaultVariableFont;
  nsFont mDefaultFixedFont;
  nsFont mDefaultSerifFont;
  nsFont mDefaultSansSerifFont;
  nsFont mDefaultMonospaceFont;
  nsFont mDefaultCursiveFont;
  nsFont mDefaultFantasyFont;
  nsAutoPtr<LangGroupFontPrefs> mNext;
};







class StaticPresData
{
public:

  static void Init();
  static void Shutdown();



  static StaticPresData* Get();





  const nscoord* GetBorderWidthTable() { return mBorderWidthTable; }






  nsIAtom* GetLangGroup(nsIAtom* aLanguage) const;





  already_AddRefed<nsIAtom> GetUncachedLangGroup(nsIAtom* aLanguage) const;
# 123 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPresData.h"
  const LangGroupFontPrefs* GetFontPrefsForLangHelper(nsIAtom* aLanguage,
                                                      const LangGroupFontPrefs* aPrefs) const;
# 144 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StaticPresData.h"
  const nsFont* GetDefaultFontHelper(uint8_t aFontID,
                                     nsIAtom* aLanguage,
                                     const LangGroupFontPrefs* aPrefs) const;





  const nsFont* GetDefaultFont(uint8_t aFontID, nsIAtom* aLanguage) const
  {
    do { } while (0);
    return GetDefaultFontHelper(aFontID, aLanguage, GetFontPrefsForLang(aLanguage));
  }
  const LangGroupFontPrefs* GetFontPrefsForLang(nsIAtom* aLanguage) const
  {
    do { } while (0);
    return GetFontPrefsForLangHelper(aLanguage, &mStaticLangGroupFontPrefs);
  }

  void ResetCachedFontPrefs() { mStaticLangGroupFontPrefs.Reset(); }

private:
  StaticPresData();
  ~StaticPresData() {}

  nsCOMPtr<nsILanguageAtomService> mLangService;
  nscoord mBorderWidthTable[3];
  LangGroupFontPrefs mStaticLangGroupFontPrefs;
};

}
# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h" 2


class nsAString;
class nsIPrintSettings;
class nsDocShell;
class nsIDocShell;
class nsIDocument;
class nsILanguageAtomService;
class nsITheme;
class nsIContent;
class nsIFrame;
class nsFrameManager;
class nsILinkHandler;
class nsIAtom;
class nsIRunnable;
class gfxUserFontEntry;
class gfxUserFontSet;
class gfxTextPerfMetrics;
class nsPluginFrame;
class nsTransitionManager;
class nsAnimationManager;
class nsRefreshDriver;
class nsIWidget;
class nsDeviceContext;
class gfxMissingFontRecorder;

namespace mozilla {
class EffectCompositor;
class EventStateManager;
class CounterStyleManager;
class RestyleManager;
namespace layers {
class ContainerLayer;
class LayerManager;
}
namespace dom {
class Element;
}
}


enum nsPresContext_CachedBoolPrefType {
  kPresContext_UseDocumentFonts = 1,
  kPresContext_UnderlineLinks
};


enum nsPresContext_CachedIntPrefType {
  kPresContext_ScrollbarSide = 1,
  kPresContext_BidiDirection
};



const uint8_t kPresContext_DefaultVariableFont_ID = 0x00;
const uint8_t kPresContext_DefaultFixedFont_ID = 0x01;
# 119 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
class nsRootPresContext;




class nsPresContext : public nsIObserver,
                      public mozilla::SupportsWeakPtr<nsPresContext> {
public:
  typedef mozilla::FramePropertyTable FramePropertyTable;
  typedef mozilla::LangGroupFontPrefs LangGroupFontPrefs;
  typedef mozilla::ScrollbarStyles ScrollbarStyles;
  typedef mozilla::StaticPresData StaticPresData;

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  virtual nsresult Observe(nsISupports *aSubject, const char * aTopic, const char16_t * aData) override;
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "nsPresContext"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<nsPresContext>(p)->DeleteCycleCollectable(); } static nsPresContext* Downcast(nsISupports* s) { return static_cast<nsPresContext*>(static_cast<nsPresContext*>(s)); } static nsISupports* Upcast(nsPresContext *p) { return static_cast<nsISupports*>(static_cast<nsPresContext*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &nsPresContext::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;


  enum nsPresContextType {
    eContext_Galley,
    eContext_PrintPreview,
    eContext_Print,
    eContext_PageLayout
  };

  nsPresContext(nsIDocument* aDocument, nsPresContextType aType);




  nsresult Init(nsDeviceContext* aDeviceContext);





  void AttachShell(nsIPresShell* aShell, mozilla::StyleBackendType aBackendType);
  void DetachShell();


  nsPresContextType Type() const { return mType; }




  nsIPresShell* PresShell() const
  {
    do { } while(0);
    return mShell;
  }

  nsIPresShell* GetPresShell() const { return mShell; }





  nsPresContext* GetParentPresContext();





  nsPresContext* GetToplevelContentDocumentPresContext();
# 192 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  nsIWidget* GetNearestWidget(nsPoint* aOffset = nullptr);





  nsIWidget* GetRootWidget();






  nsRootPresContext* GetRootPresContext();

  virtual bool IsRoot() { return false; }

  nsIDocument* Document() const
  {
      do { } while(0);


      return mDocument;
  }


  mozilla::StyleSetHandle StyleSet() const { return GetPresShell()->StyleSet(); }

  nsFrameManager* FrameManager()
    { return PresShell()->FrameManager(); }

  nsCSSFrameConstructor* FrameConstructor()
    { return PresShell()->FrameConstructor(); }

  mozilla::EffectCompositor* EffectCompositor() { return mEffectCompositor; }
  nsTransitionManager* TransitionManager() { return mTransitionManager; }
  nsAnimationManager* AnimationManager() { return mAnimationManager; }

  nsRefreshDriver* RefreshDriver() { return mRefreshDriver; }

  mozilla::RestyleManager* RestyleManager() {
    do { } while (0);
    return mRestyleManager;
  }

  mozilla::CounterStyleManager* CounterStyleManager() const {
    return mCounterStyleManager;
  }
# 249 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  void RebuildAllStyleData(nsChangeHint aExtraHint, nsRestyleHint aRestyleHint);




  void PostRebuildAllStyleDataEvent(nsChangeHint aExtraHint,
                                    nsRestyleHint aRestyleHint);
# 277 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  void MediaFeatureValuesChanged(nsRestyleHint aRestyleHint,
                                 nsChangeHint aChangeHint = nsChangeHint(0));





  void MediaFeatureValuesChangedAllDocuments(nsRestyleHint aRestyleHint,
                                             nsChangeHint aChangeHint = nsChangeHint(0));

  void PostMediaFeatureValuesChangedEvent();
  void HandleMediaFeatureValuesChangedEvent();
  void FlushPendingMediaFeatureValuesChanged() {
    if (mPendingMediaFeatureValuesChanged)
      MediaFeatureValuesChanged(nsRestyleHint(0));
  }






  void SizeModeChanged(nsSizeMode aSizeMode);





  nsCompatibility CompatibilityMode() const;




  void CompatibilityModeChanged();




  uint16_t ImageAnimationMode() const { return mImageAnimationMode; }
  virtual void SetImageAnimationModeExternal(uint16_t aMode);
  void SetImageAnimationModeInternal(uint16_t aMode);

  void SetImageAnimationMode(uint16_t aMode)
  { SetImageAnimationModeInternal(aMode); }
# 329 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  nsIAtom* Medium() {
    if (!mIsEmulatingMedia)
      return mMedium;
    return mMediaEmulated;
  }





  void EmulateMedium(const nsAString& aMediaType);




  void StopEmulatingMedium();

  void* AllocateFromShell(size_t aSize)
  {
    if (mShell)
      return mShell->AllocateMisc(aSize);
    return nullptr;
  }

  void FreeToShell(size_t aSize, void* aFreeChunk)
  {
    do { } while(0);
    if (mShell)
      mShell->FreeMisc(aSize, aFreeChunk);
  }







  const nsFont* GetDefaultFont(uint8_t aFontID,
                               nsIAtom *aLanguage) const
  {
    nsIAtom* lang = aLanguage ? aLanguage : mLanguage.get();
    return StaticPresData::Get()->GetDefaultFontHelper(aFontID, lang,
                                                       GetFontPrefsForLang(lang));
  }



  bool GetCachedBoolPref(nsPresContext_CachedBoolPrefType aPrefType) const
  {


    switch (aPrefType) {
    case kPresContext_UseDocumentFonts:
      return mUseDocumentFonts;
    case kPresContext_UnderlineLinks:
      return mUnderlineLinks;
    default:
      do { } while(0);
    }

    return false;
  }



  int32_t GetCachedIntPref(nsPresContext_CachedIntPrefType aPrefType) const
  {


    switch (aPrefType) {
    case kPresContext_ScrollbarSide:
      return mPrefScrollbarSide;
    case kPresContext_BidiDirection:
      return mPrefBidiDirection;
    default:
      do { } while(0);
    }

    return false;
  }




  nscolor DefaultColor() const { return mDefaultColor; }
  nscolor DefaultBackgroundColor() const { return mBackgroundColor; }
  nscolor DefaultLinkColor() const { return mLinkColor; }
  nscolor DefaultActiveLinkColor() const { return mActiveLinkColor; }
  nscolor DefaultVisitedLinkColor() const { return mVisitedLinkColor; }
  nscolor FocusBackgroundColor() const { return mFocusBackgroundColor; }
  nscolor FocusTextColor() const { return mFocusTextColor; }




  nscolor BodyTextColor() const { return mBodyTextColor; }
  void SetBodyTextColor(nscolor aColor) { mBodyTextColor = aColor; }

  bool GetUseFocusColors() const { return mUseFocusColors; }
  uint8_t FocusRingWidth() const { return mFocusRingWidth; }
  bool GetFocusRingOnAnything() const { return mFocusRingOnAnything; }
  uint8_t GetFocusRingStyle() const { return mFocusRingStyle; }

  void SetContainer(nsIDocShell* aContainer);

  virtual nsISupports* GetContainerWeakExternal() const;
  nsISupports* GetContainerWeakInternal() const;

  nsISupports* GetContainerWeak() const
  { return GetContainerWeakInternal(); }





  nsIDocShell* GetDocShell() const;


  void SetLinkHandler(nsILinkHandler* aHandler) { mLinkHandler = aHandler; }
  nsILinkHandler* GetLinkHandler() { return mLinkHandler; }






  virtual void Detach();







  nsRect GetVisibleArea() const { return mVisibleArea; }





  void SetVisibleArea(const nsRect& r) {
    if (!r.IsEqualEdges(mVisibleArea)) {
      mVisibleArea = r;

      if (!IsPaginated() && HasCachedStyleData()) {
        mPendingViewportChange = true;
        PostMediaFeatureValuesChangedEvent();
      }
    }
  }





  bool IsPaginated() const { return mPaginated; }





  void SetPaginatedScrolling(bool aResult);





  bool HasPaginatedScrolling() const { return mCanPaginatedScroll; }




  nsSize GetPageSize() { return mPageSize; }
  void SetPageSize(nsSize aSize) { mPageSize = aSize; }






  bool IsRootPaginatedDocument() { return mIsRootPaginatedDocument; }
  void SetIsRootPaginatedDocument(bool aIsRootPaginatedDocument)
    { mIsRootPaginatedDocument = aIsRootPaginatedDocument; }







  float GetPageScale() { return mPageScale; }
  void SetPageScale(float aScale) { mPageScale = aScale; }
# 530 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  float GetPrintPreviewScale() { return mPPScale; }
  void SetPrintPreviewScale(float aScale) { mPPScale = aScale; }

  nsDeviceContext* DeviceContext() const { return mDeviceContext; }
  mozilla::EventStateManager* EventStateManager() { return mEventManager; }
  nsIAtom* GetLanguageFromCharset() const { return mLanguage; }
  already_AddRefed<nsIAtom> GetContentLanguage() const;





  float GetSystemFontScale() const { return mSystemFontScale; }
  void SetSystemFontScale(float aFontScale) {
    do { } while (0);
    if (aFontScale == mSystemFontScale || IsPrintingOrPrintPreview()) {
      return;
    }

    mSystemFontScale = aFontScale;
    UpdateEffectiveTextZoom();
  }
# 562 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  float TextZoom() const { return mTextZoom; }
  void SetTextZoom(float aZoom) {
    do { } while (0);
    if (aZoom == mTextZoom)
      return;

    mTextZoom = aZoom;
    UpdateEffectiveTextZoom();
  }

protected:
  void UpdateEffectiveTextZoom();

public:
# 584 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  float EffectiveTextZoom() const { return mEffectiveTextZoom; }







  int32_t MinFontSize(nsIAtom *aLanguage) const {
    const LangGroupFontPrefs *prefs = GetFontPrefsForLang(aLanguage);
    return std::max(mBaseMinFontSize, prefs->mMinimumFontSize);
  }





  int32_t BaseMinFontSize() const {
    return mBaseMinFontSize;
  }





  void SetBaseMinFontSize(int32_t aMinFontSize) {
    if (aMinFontSize == mBaseMinFontSize)
      return;

    mBaseMinFontSize = aMinFontSize;
    if (HasCachedStyleData()) {


      MediaFeatureValuesChanged(eRestyle_ForceDescendants,
                                nsChangeHint(nsChangeHint(nsChangeHint_RepaintFrame | nsChangeHint_SyncFrameView | nsChangeHint_SchedulePaint) | nsChangeHint(nsChangeHint_NeedReflow | nsChangeHint_ReflowChangesSizeOrPosition| nsChangeHint_ClearAncestorIntrinsics | nsChangeHint_ClearDescendantIntrinsics | nsChangeHint_NeedDirtyReflow)));
    }
  }

  float GetFullZoom() { return mFullZoom; }
  void SetFullZoom(float aZoom);

  float GetOverrideDPPX() { return mOverrideDPPX; }
  void SetOverrideDPPX(float aDPPX);

  nscoord GetAutoQualityMinFontSize() {
    return DevPixelsToAppUnits(mAutoQualityMinFontSizePixelsPref);
  }
# 641 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  gfxSize ScreenSizeInchesForFontInflation(bool* aChanged = nullptr);

  static int32_t AppUnitsPerCSSPixel() { return mozilla::AppUnitsPerCSSPixel(); }
  int32_t AppUnitsPerDevPixel() const;
  static int32_t AppUnitsPerCSSInch() { return mozilla::AppUnitsPerCSSInch(); }

  static nscoord CSSPixelsToAppUnits(int32_t aPixels)
  { return NSToCoordRoundWithClamp(float(aPixels) *
             float(AppUnitsPerCSSPixel())); }

  static nscoord CSSPixelsToAppUnits(float aPixels)
  { return NSToCoordRoundWithClamp(aPixels *
             float(AppUnitsPerCSSPixel())); }

  static int32_t AppUnitsToIntCSSPixels(nscoord aAppUnits)
  { return NSAppUnitsToIntPixels(aAppUnits,
             float(AppUnitsPerCSSPixel())); }

  static float AppUnitsToFloatCSSPixels(nscoord aAppUnits)
  { return NSAppUnitsToFloatPixels(aAppUnits,
             float(AppUnitsPerCSSPixel())); }

  static double AppUnitsToDoubleCSSPixels(nscoord aAppUnits)
  { return NSAppUnitsToDoublePixels(aAppUnits,
             double(AppUnitsPerCSSPixel())); }

  nscoord DevPixelsToAppUnits(int32_t aPixels) const
  { return NSIntPixelsToAppUnits(aPixels, AppUnitsPerDevPixel()); }

  int32_t AppUnitsToDevPixels(nscoord aAppUnits) const
  { return NSAppUnitsToIntPixels(aAppUnits,
             float(AppUnitsPerDevPixel())); }

  float AppUnitsToFloatDevPixels(nscoord aAppUnits)
  { return aAppUnits / float(AppUnitsPerDevPixel()); }

  int32_t CSSPixelsToDevPixels(int32_t aPixels)
  { return AppUnitsToDevPixels(CSSPixelsToAppUnits(aPixels)); }

  float CSSPixelsToDevPixels(float aPixels)
  {
    return NSAppUnitsToFloatPixels(CSSPixelsToAppUnits(aPixels),
                                   float(AppUnitsPerDevPixel()));
  }

  int32_t DevPixelsToIntCSSPixels(int32_t aPixels)
  { return AppUnitsToIntCSSPixels(DevPixelsToAppUnits(aPixels)); }

  float DevPixelsToFloatCSSPixels(int32_t aPixels)
  { return AppUnitsToFloatCSSPixels(DevPixelsToAppUnits(aPixels)); }

  mozilla::CSSToLayoutDeviceScale CSSToDevPixelScale() const
  {
    return mozilla::CSSToLayoutDeviceScale(
        float(AppUnitsPerCSSPixel()) / float(AppUnitsPerDevPixel()));
  }


  nscoord GfxUnitsToAppUnits(gfxFloat aGfxUnits) const;

  gfxFloat AppUnitsToGfxUnits(nscoord aAppUnits) const;

  gfxRect AppUnitsToGfxUnits(const nsRect& aAppRect) const
  { return gfxRect(AppUnitsToGfxUnits(aAppRect.x),
                   AppUnitsToGfxUnits(aAppRect.y),
                   AppUnitsToGfxUnits(aAppRect.width),
                   AppUnitsToGfxUnits(aAppRect.height)); }

  static nscoord CSSTwipsToAppUnits(float aTwips)
  { return NSToCoordRoundWithClamp(
      mozilla::AppUnitsPerCSSInch() * NSTwipsToUnits((aTwips), 1.0f / 72.0f)); }


  static nsMargin CSSTwipsToAppUnits(const nsIntMargin &marginInTwips)
  { return nsMargin(CSSTwipsToAppUnits(float(marginInTwips.top)),
                    CSSTwipsToAppUnits(float(marginInTwips.right)),
                    CSSTwipsToAppUnits(float(marginInTwips.bottom)),
                    CSSTwipsToAppUnits(float(marginInTwips.left))); }

  static nscoord CSSPointsToAppUnits(float aPoints)
  { return NSToCoordRound(aPoints * mozilla::AppUnitsPerCSSInch() /
                          72.0f); }

  nscoord RoundAppUnitsToNearestDevPixels(nscoord aAppUnits) const
  { return DevPixelsToAppUnits(AppUnitsToDevPixels(aAppUnits)); }
# 737 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  nsIContent* UpdateViewportScrollbarStylesOverride();
  const ScrollbarStyles& GetViewportScrollbarStylesOverride()
  {
    return mViewportStyleScrollbar;
  }





  bool ElementWouldPropagateScrollbarStyles(mozilla::dom::Element* aElement);




  bool GetBackgroundImageDraw() const { return mDrawImageBackground; }
  void SetBackgroundImageDraw(bool aCanDraw)
  {
    mDrawImageBackground = aCanDraw;
  }

  bool GetBackgroundColorDraw() const { return mDrawColorBackground; }
  void SetBackgroundColorDraw(bool aCanDraw)
  {
    mDrawColorBackground = aCanDraw;
  }
# 772 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  bool BidiEnabled() const { return BidiEnabledInternal(); }



  virtual bool BidiEnabledExternal() const;
  bool BidiEnabledInternal() const;






  void SetBidiEnabled() const;
# 800 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  void SetVisualMode(bool aIsVisual)
  {
    mIsVisual = aIsVisual;
  }






  bool IsVisualMode() const { return mIsVisual; }

  enum class InteractionType : uint32_t {
    eClickInteraction,
    eKeyInteraction,
    eMouseMoveInteraction,
    eScrollInteraction
  };

  void RecordInteractionTime(InteractionType aType,
                             const mozilla::TimeStamp& aTimeStamp);

  void DisableInteractionTimeRecording()
  {
    mInteractionTimeEnabled = false;
  }






  void SetBidi(uint32_t aBidiOptions,
                           bool aForceRestyle = false);






  uint32_t GetBidi() const;




  void SetIsRenderingOnlySelection(bool aResult)
  {
    mIsRenderingOnlySelection = aResult;
  }

  bool IsRenderingOnlySelection() const { return mIsRenderingOnlySelection; }

  bool IsTopLevelWindowInactive();




  nsITheme* GetTheme();







  void ThemeChanged();







  void UIResolutionChanged();




  void UIResolutionChangedSync();




  void SysColorChanged();


  void SetPrintSettings(nsIPrintSettings *aPrintSettings);

  nsIPrintSettings* GetPrintSettings() { return mPrintSettings; }


  FramePropertyTable* PropertyTable() { return &mPropertyTable; }





  bool EnsureVisible();


  void CountReflows(const char * aName,
                                nsIFrame * aFrame);


  void RestyledElement() {
    ++mElementsRestyled;
  }
  void ConstructedFrame() {
    ++mFramesConstructed;
  }
  void ReflowedFrame() {
    ++mFramesReflowed;
  }

  uint64_t ElementsRestyledCount() {
    return mElementsRestyled;
  }
  uint64_t FramesConstructedCount() {
    return mFramesConstructed;
  }
  uint64_t FramesReflowedCount() {
    return mFramesReflowed;
  }





  void SetTelemetryScrollY(nscoord aScrollY)
  {
    nscoord delta = abs(aScrollY - mTelemetryScrollLastY);
    mTelemetryScrollLastY = aScrollY;

    mTelemetryScrollTotalY += delta;
    if (aScrollY > mTelemetryScrollMaxY) {
      mTelemetryScrollMaxY = aScrollY;
    }
  }
  nscoord TelemetryScrollMaxY() const
  {
    return mTelemetryScrollMaxY;
  }
  nscoord TelemetryScrollTotalY() const
  {
    return mTelemetryScrollTotalY;
  }

  static nscoord GetBorderWidthForKeyword(unsigned int aBorderWidthKeyword)
  {


    static const nscoord kBorderWidths[] = {
      CSSPixelsToAppUnits(1),
      CSSPixelsToAppUnits(3),
      CSSPixelsToAppUnits(5)
    };
    do { } while (0);

    return kBorderWidths[aBorderWidthKeyword];
  }

  gfxTextPerfMetrics *GetTextPerfMetrics() { return mTextPerf; }

  bool IsDynamic() { return (mType == eContext_PageLayout || mType == eContext_Galley); }
  bool IsScreen() { return (mMedium == nsGkAtoms::screen ||
                              mType == eContext_PageLayout ||
                              mType == eContext_PrintPreview); }
  bool IsPrintingOrPrintPreview() { return (mType == eContext_Print || mType == eContext_PrintPreview); }


  bool IsChrome() const { return mIsChrome; }
  bool IsChromeOriginImage() const { return mIsChromeOriginImage; }
  void UpdateIsChrome();


  bool HasAuthorSpecifiedRules(const nsIFrame *aFrame,
                               uint32_t ruleTypeMask) const;


  bool UseDocumentColors() const {
    do { } while (0);

    return mUseDocumentColors;
  }


  void SetPaintFlashing(bool aPaintFlashing) {
    mPaintFlashing = aPaintFlashing;
    mPaintFlashingInitialized = true;
  }



  bool GetPaintFlashing() const;

  bool SuppressingResizeReflow() const { return mSuppressResizeReflow; }

  gfxUserFontSet* GetUserFontSet(bool aFlushUserFontSet = true);




  void UserFontSetUpdated(gfxUserFontEntry* aUpdatedFont = nullptr);

  gfxMissingFontRecorder *MissingFontRecorder() { return mMissingFonts; }
  void NotifyMissingFonts();

  void FlushCounterStyles();
  void RebuildCounterStyles();




  void EnsureSafeToHandOutCSSRules();





  void NotifyInvalidation(uint64_t aTransactionId, const nsRect& aRect);

  void NotifyInvalidation(uint64_t aTransactionId, const nsIntRect& aRect);
  void NotifyDidPaintForSubtree(uint64_t aTransactionId = 0,
                                const mozilla::TimeStamp& aTimeStamp = mozilla::TimeStamp());
  void FireDOMPaintEvent(nsTArray<nsRect>* aList, uint64_t aTransactionId,
                         mozilla::TimeStamp aTimeStamp = mozilla::TimeStamp());



  static void NotifySubDocInvalidation(mozilla::layers::ContainerLayer* aContainer,
                                       const nsIntRegion& aRegion);
  void SetNotifySubDocInvalidationData(mozilla::layers::ContainerLayer* aContainer);
  static void ClearNotifySubDocInvalidationData(mozilla::layers::ContainerLayer* aContainer);
  bool IsDOMPaintEventPending();




  uint64_t GetRestyleGeneration() const;




  bool HasPendingRestyleOrReflow();





  void NotifyFontFaceSetOnRefresh();
# 1060 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  void ReflowStarted(bool aInterruptible);




  class InterruptPreventer;
  friend class InterruptPreventer;
  class InterruptPreventer {
  public:
    explicit InterruptPreventer(nsPresContext* aCtx) :
      mCtx(aCtx),
      mInterruptsEnabled(aCtx->mInterruptsEnabled),
      mHasPendingInterrupt(aCtx->mHasPendingInterrupt)
    {
      mCtx->mInterruptsEnabled = false;
      mCtx->mHasPendingInterrupt = false;
    }
    ~InterruptPreventer() {
      mCtx->mInterruptsEnabled = mInterruptsEnabled;
      mCtx->mHasPendingInterrupt = mHasPendingInterrupt;
    }

  private:
    nsPresContext* mCtx;
    bool mInterruptsEnabled;
    bool mHasPendingInterrupt;
  };
# 1096 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  bool CheckForInterrupt(nsIFrame* aFrame);




  bool HasPendingInterrupt() { return mHasPendingInterrupt; }





  void SetPendingInterruptFromTest() { mPendingInterruptFromTest = true; }







  nsIFrame* GetPrimaryFrameFor(nsIContent* aContent);

  void NotifyDestroyingFrame(nsIFrame* aFrame)
  {
    PropertyTable()->DeleteAllFor(aFrame);
  }

  virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
  virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
    return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
  }

  bool IsRootContentDocument() const;

  bool HadNonBlankPaint() const {
    return mHadNonBlankPaint;
  }

  void NotifyNonBlankPaint();

  bool IsGlyph() const {
    return mIsGlyph;
  }

  void SetIsGlyph(bool aValue) {
    mIsGlyph = aValue;
  }

  bool UsesRootEMUnits() const {
    return mUsesRootEMUnits;
  }

  void SetUsesRootEMUnits(bool aValue) {
    mUsesRootEMUnits = aValue;
  }

  bool UsesExChUnits() const {
    return mUsesExChUnits;
  }

  void SetUsesExChUnits(bool aValue) {
    mUsesExChUnits = aValue;
  }

  bool UsesViewportUnits() const {
    return mUsesViewportUnits;
  }

  void SetUsesViewportUnits(bool aValue) {
    mUsesViewportUnits = aValue;
  }




  bool ExistThrottledUpdates() const {
    return mExistThrottledUpdates;
  }

  void SetExistThrottledUpdates(bool aExistThrottledUpdates) {
    mExistThrottledUpdates = aExistThrottledUpdates;
  }

  bool IsDeviceSizePageSize();

  bool HasWarnedAboutPositionedTableParts() const {
    return mHasWarnedAboutPositionedTableParts;
  }

  void SetHasWarnedAboutPositionedTableParts() {
    mHasWarnedAboutPositionedTableParts = true;
  }

  bool HasWarnedAboutTooLargeDashedOrDottedRadius() const {
    return mHasWarnedAboutTooLargeDashedOrDottedRadius;
  }

  void SetHasWarnedAboutTooLargeDashedOrDottedRadius() {
    mHasWarnedAboutTooLargeDashedOrDottedRadius = true;
  }

protected:
  friend class nsRunnableMethod<nsPresContext>;
  void ThemeChangedInternal();
  void SysColorChangedInternal();


  void UIResolutionChangedInternal();



  void UIResolutionChangedInternalScale(double aScale);




  static bool
  UIResolutionChangedSubdocumentCallback(nsIDocument* aDocument, void* aData);

  void SetImgAnimations(nsIContent *aParent, uint16_t aMode);
  void SetSMILAnimations(nsIDocument *aDoc, uint16_t aNewMode,
                                     uint16_t aOldMode);
  void GetDocumentColorPreferences();

  void PreferenceChanged(const char* aPrefName);
  static void PrefChangedCallback(const char*, void*);

  void UpdateAfterPreferencesChanged();
  static void PrefChangedUpdateTimerCallback(nsITimer *aTimer, void *aClosure);

  void GetUserPreferences();





  const LangGroupFontPrefs* GetFontPrefsForLang(nsIAtom *aLanguage) const
  {
    nsIAtom* lang = aLanguage ? aLanguage : mLanguage.get();
    return StaticPresData::Get()->GetFontPrefsForLangHelper(lang, &mLangGroupFontPrefs);
  }

  void UpdateCharSet(const nsCString& aCharSet);

  static bool NotifyDidPaintSubdocumentCallback(nsIDocument* aDocument, void* aData);

public:
  void DoChangeCharSet(const nsCString& aCharSet);




  bool MayHavePaintEventListener();






  bool MayHavePaintEventListenerInSubDocument();
# 1264 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  void InvalidatePaintedLayers();

protected:

  void Destroy();

  void AppUnitsPerDevPixelChanged();

  void HandleRebuildCounterStyles() {
    mPostedFlushCounterStyles = false;
    FlushCounterStyles();
  }

  bool HavePendingInputEvent();


  bool HasCachedStyleData();



  already_AddRefed<nsITimer> CreateTimer(nsTimerCallbackFunc aCallback,
                                         const char* aName,
                                         uint32_t aDelay);





  nsPresContextType mType;


  nsIPresShell* mShell;
  nsCOMPtr<nsIDocument> mDocument;
  RefPtr<nsDeviceContext> mDeviceContext;




  RefPtr<mozilla::EventStateManager> mEventManager;
  RefPtr<nsRefreshDriver> mRefreshDriver;
  RefPtr<mozilla::EffectCompositor> mEffectCompositor;
  RefPtr<nsTransitionManager> mTransitionManager;
  RefPtr<nsAnimationManager> mAnimationManager;
  RefPtr<mozilla::RestyleManager> mRestyleManager;
  RefPtr<mozilla::CounterStyleManager> mCounterStyleManager;
  nsIAtom* mMedium;
  nsCOMPtr<nsIAtom> mMediaEmulated;



  nsILinkHandler* mLinkHandler;






  nsCOMPtr<nsIAtom> mLanguage;

public:





  bool mInflationDisabledForShrinkWrap;

protected:

  mozilla::WeakPtr<nsDocShell> mContainer;


  int32_t mBaseMinFontSize;
  float mSystemFontScale;
  float mTextZoom;
  float mEffectiveTextZoom;
  float mFullZoom;
  float mOverrideDPPX;
  gfxSize mLastFontInflationScreenSize;

  int32_t mCurAppUnitsPerDevPixel;
  int32_t mAutoQualityMinFontSizePixelsPref;

  nsCOMPtr<nsITheme> mTheme;
  nsCOMPtr<nsILanguageAtomService> mLangService;
  nsCOMPtr<nsIPrintSettings> mPrintSettings;
  nsCOMPtr<nsITimer> mPrefChangedTimer;

  FramePropertyTable mPropertyTable;

  struct TransactionInvalidations {
    uint64_t mTransactionId;
    nsTArray<nsRect> mInvalidations;
  };
  AutoTArray<TransactionInvalidations, 4> mTransactions;


  nsAutoPtr<gfxTextPerfMetrics> mTextPerf;

  nsAutoPtr<gfxMissingFontRecorder> mMissingFonts;

  nsRect mVisibleArea;
  nsSize mPageSize;
  float mPageScale;
  float mPPScale;

  nscolor mDefaultColor;
  nscolor mBackgroundColor;

  nscolor mLinkColor;
  nscolor mActiveLinkColor;
  nscolor mVisitedLinkColor;

  nscolor mFocusBackgroundColor;
  nscolor mFocusTextColor;

  nscolor mBodyTextColor;

  ScrollbarStyles mViewportStyleScrollbar;
  uint8_t mFocusRingWidth;

  bool mExistThrottledUpdates;

  uint16_t mImageAnimationMode;
  uint16_t mImageAnimationModePref;






  LangGroupFontPrefs mLangGroupFontPrefs;

  nscoord mBorderWidthTable[3];

  uint32_t mInterruptChecksToSkip;



  uint64_t mElementsRestyled;
  uint64_t mFramesConstructed;
  uint64_t mFramesReflowed;

  mozilla::TimeStamp mReflowStartTime;



  mozilla::TimeStamp mFirstNonBlankPaintTime;
  mozilla::TimeStamp mFirstClickTime;
  mozilla::TimeStamp mFirstKeyTime;
  mozilla::TimeStamp mFirstMouseMoveTime;
  mozilla::TimeStamp mFirstScrollTime;
  bool mInteractionTimeEnabled;


  mozilla::TimeStamp mLastStyleUpdateForAllAnimations;

  nscoord mTelemetryScrollLastY;
  nscoord mTelemetryScrollMaxY;
  nscoord mTelemetryScrollTotalY;

  unsigned mHasPendingInterrupt : 1;
  unsigned mPendingInterruptFromTest : 1;
  unsigned mInterruptsEnabled : 1;
  unsigned mUseDocumentFonts : 1;
  unsigned mUseDocumentColors : 1;
  unsigned mUnderlineLinks : 1;
  unsigned mSendAfterPaintToContent : 1;
  unsigned mUseFocusColors : 1;
  unsigned mFocusRingOnAnything : 1;
  unsigned mFocusRingStyle : 1;
  unsigned mDrawImageBackground : 1;
  unsigned mDrawColorBackground : 1;
  unsigned mNeverAnimate : 1;
  unsigned mIsRenderingOnlySelection : 1;
  unsigned mPaginated : 1;
  unsigned mCanPaginatedScroll : 1;
  unsigned mDoScaledTwips : 1;
  unsigned mIsRootPaginatedDocument : 1;
  unsigned mPrefBidiDirection : 1;
  unsigned mPrefScrollbarSide : 2;
  unsigned mPendingSysColorChanged : 1;
  unsigned mPendingThemeChanged : 1;
  unsigned mPendingUIResolutionChanged : 1;
  unsigned mPendingMediaFeatureValuesChanged : 1;
  unsigned mPrefChangePendingNeedsReflow : 1;
  unsigned mIsEmulatingMedia : 1;


  unsigned mIsGlyph : 1;


  unsigned mUsesRootEMUnits : 1;

  unsigned mUsesExChUnits : 1;

  unsigned mUsesViewportUnits : 1;


  unsigned mPendingViewportChange : 1;


  unsigned mCounterStylesDirty : 1;

  unsigned mPostedFlushCounterStyles: 1;



  unsigned mSuppressResizeReflow : 1;

  unsigned mIsVisual : 1;

  unsigned mFireAfterPaintEvents : 1;

  unsigned mIsChrome : 1;
  unsigned mIsChromeOriginImage : 1;



  mutable unsigned mPaintFlashing : 1;
  mutable unsigned mPaintFlashingInitialized : 1;

  unsigned mHasWarnedAboutPositionedTableParts : 1;

  unsigned mHasWarnedAboutTooLargeDashedOrDottedRadius : 1;


  unsigned mQuirkSheetAdded : 1;


  unsigned mNeedsPrefUpdate : 1;


  unsigned mHadNonBlankPaint : 1;
# 1509 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
protected:

  virtual ~nsPresContext();

  nscolor MakeColorPref(const nsString& aColor);

  void LastRelease();
# 1527 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
};

class nsRootPresContext final : public nsPresContext {
public:
  nsRootPresContext(nsIDocument* aDocument, nsPresContextType aType);
  virtual ~nsRootPresContext();
  virtual void Detach() override;





  void EnsureEventualDidPaintEvent(uint64_t aTransactionId);





  void CancelDidPaintTimers(uint64_t aTransactionId);




  void CancelAllDidPaintTimers();







  void RegisterPluginForGeometryUpdates(nsIContent* aPlugin);





  void UnregisterPluginForGeometryUpdates(nsIContent* aPlugin);

  bool NeedToComputePluginGeometryUpdates()
  {
    return mRegisteredPlugins.Count() > 0;
  }
# 1581 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsPresContext.h"
  void ComputePluginGeometryUpdates(nsIFrame* aFrame,
                                    nsDisplayListBuilder* aBuilder,
                                    nsDisplayList* aList);






  void ApplyPluginGeometryUpdates();





  void CollectPluginGeometryUpdates(mozilla::layers::LayerManager* aLayerManager);

  virtual bool IsRoot() override { return true; }






  void IncrementDOMGeneration() { mDOMGeneration++; }




  uint32_t GetDOMGeneration() { return mDOMGeneration; }






  void AddWillPaintObserver(nsIRunnable* aRunnable);




  void FlushWillPaintObservers();

  virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;

protected:



  void InitApplyPluginGeometryTimer();



  void CancelApplyPluginGeometryTimer();

  class RunWillPaintObservers : public mozilla::Runnable {
  public:
    explicit RunWillPaintObservers(nsRootPresContext* aPresContext)
      : Runnable("nsPresContextType::RunWillPaintObservers")
      , mPresContext(aPresContext) {}
    void Revoke() { mPresContext = nullptr; }
    virtual nsresult Run() override
    {
      if (mPresContext) {
        mPresContext->FlushWillPaintObservers();
      }
      return NS_OK;
    }

    nsRootPresContext* mPresContext;
  };

  friend class nsPresContext;

  struct NotifyDidPaintTimer {
    uint64_t mTransactionId;
    nsCOMPtr<nsITimer> mTimer;
  };
  AutoTArray<NotifyDidPaintTimer, 4> mNotifyDidPaintTimers;

  nsCOMPtr<nsITimer> mApplyPluginGeometryTimer;
  nsTHashtable<nsRefPtrHashKey<nsIContent> > mRegisteredPlugins;
  nsTArray<nsCOMPtr<nsIRunnable> > mWillPaintObservers;
  nsRevocableEventPtr<RunWillPaintObservers> mWillPaintFallbackEvent;
  uint32_t mDOMGeneration;
};
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/URLExtraData.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/URLExtraData.h"
namespace mozilla {

struct URLExtraData
{
  URLExtraData(already_AddRefed<nsIURI> aBaseURI,
               already_AddRefed<nsIURI> aReferrer,
               already_AddRefed<nsIPrincipal> aPrincipal)
    : mBaseURI(Move(aBaseURI))
    , mReferrer(Move(aReferrer))
    , mPrincipal(Move(aPrincipal))
  {
    do { } while (0);
  }

  URLExtraData(nsIURI* aBaseURI, nsIURI* aReferrer, nsIPrincipal* aPrincipal)
    : URLExtraData(do_AddRef(aBaseURI),
                   do_AddRef(aReferrer),
                   do_AddRef(aPrincipal)) {}

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<URLExtraData>::value, "Reference-counted class " "URLExtraData" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:

  nsIURI* BaseURI() const { return mBaseURI; }
  nsIURI* GetReferrer() const { return mReferrer; }
  nsIPrincipal* GetPrincipal() const { return mPrincipal; }

  static URLExtraData* Dummy() {
    do { } while (0);
    return sDummy;
  }
  static void InitDummy();
  static void ReleaseDummy();

private:
  ~URLExtraData();

  nsCOMPtr<nsIURI> mBaseURI;
  nsCOMPtr<nsIURI> mReferrer;
  nsCOMPtr<nsIPrincipal> mPrincipal;

  static StaticRefPtr<URLExtraData> sDummy;
};

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSKeywords.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSKeywords.h"
enum nsCSSKeyword : int16_t {
  eCSSKeyword_UNKNOWN = -1,

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSKeywordList.h" 1
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSKeywordList.h"
eCSSKeyword__moz_activehyperlinktext,
eCSSKeyword__moz_all,
eCSSKeyword__moz_alt_content,
eCSSKeyword__moz_available,
eCSSKeyword__moz_box,
eCSSKeyword__moz_button,
eCSSKeyword__moz_buttondefault,
eCSSKeyword__moz_buttonhoverface,
eCSSKeyword__moz_buttonhovertext,
eCSSKeyword__moz_cellhighlight,
eCSSKeyword__moz_cellhighlighttext,
eCSSKeyword__moz_center,
eCSSKeyword__moz_combobox,
eCSSKeyword__moz_comboboxtext,
eCSSKeyword__moz_block_height,
eCSSKeyword__moz_deck,
eCSSKeyword__moz_default_background_color,
eCSSKeyword__moz_default_color,
eCSSKeyword__moz_desktop,
eCSSKeyword__moz_dialog,
eCSSKeyword__moz_dialogtext,
eCSSKeyword__moz_document,
eCSSKeyword__moz_dragtargetzone,
eCSSKeyword__moz_element,
eCSSKeyword__moz_eventreerow,
eCSSKeyword__moz_field,
eCSSKeyword__moz_fieldtext,
eCSSKeyword__moz_fit_content,
eCSSKeyword__moz_fixed,
eCSSKeyword__moz_grabbing,
eCSSKeyword__moz_grab,
eCSSKeyword__moz_grid_group,
eCSSKeyword__moz_grid_line,
eCSSKeyword__moz_grid,
eCSSKeyword__moz_groupbox,
eCSSKeyword__moz_gtk_info_bar,
eCSSKeyword__moz_gtk_info_bar_text,
eCSSKeyword__moz_hidden_unscrollable,
eCSSKeyword__moz_hyperlinktext,
eCSSKeyword__moz_html_cellhighlight,
eCSSKeyword__moz_html_cellhighlighttext,
eCSSKeyword__moz_image_rect,
eCSSKeyword__moz_info,
eCSSKeyword__moz_inline_box,
eCSSKeyword__moz_inline_grid,
eCSSKeyword__moz_inline_stack,
eCSSKeyword__moz_left,
eCSSKeyword__moz_list,
eCSSKeyword__moz_mac_buttonactivetext,
eCSSKeyword__moz_mac_chrome_active,
eCSSKeyword__moz_mac_chrome_inactive,
eCSSKeyword__moz_mac_defaultbuttontext,
eCSSKeyword__moz_mac_focusring,
eCSSKeyword__moz_mac_fullscreen_button,
eCSSKeyword__moz_mac_menuselect,
eCSSKeyword__moz_mac_menushadow,
eCSSKeyword__moz_mac_menutextdisable,
eCSSKeyword__moz_mac_menutextselect,
eCSSKeyword__moz_mac_disabledtoolbartext,
eCSSKeyword__moz_mac_secondaryhighlight,
eCSSKeyword__moz_max_content,
eCSSKeyword__moz_menuhover,
eCSSKeyword__moz_menuhovertext,
eCSSKeyword__moz_menubartext,
eCSSKeyword__moz_menubarhovertext,
eCSSKeyword__moz_middle_with_baseline,
eCSSKeyword__moz_min_content,
eCSSKeyword__moz_nativehyperlinktext,
eCSSKeyword__moz_none,
eCSSKeyword__moz_oddtreerow,
eCSSKeyword__moz_popup,
eCSSKeyword__moz_pre_space,
eCSSKeyword__moz_pull_down_menu,
eCSSKeyword__moz_right,
eCSSKeyword__moz_scrollbars_horizontal,
eCSSKeyword__moz_scrollbars_none,
eCSSKeyword__moz_scrollbars_vertical,
eCSSKeyword__moz_stack,
eCSSKeyword__moz_text,
eCSSKeyword__moz_use_system_font,
eCSSKeyword__moz_visitedhyperlinktext,
eCSSKeyword__moz_window,
eCSSKeyword__moz_workspace,
eCSSKeyword__moz_zoom_in,
eCSSKeyword__moz_zoom_out,
eCSSKeyword__webkit_box,
eCSSKeyword__webkit_flex,
eCSSKeyword__webkit_inline_box,
eCSSKeyword__webkit_inline_flex,
eCSSKeyword_absolute,
eCSSKeyword_active,
eCSSKeyword_activeborder,
eCSSKeyword_activecaption,
eCSSKeyword_add,
eCSSKeyword_additive,
eCSSKeyword_alias,
eCSSKeyword_all,
eCSSKeyword_all_petite_caps,
eCSSKeyword_all_scroll,
eCSSKeyword_all_small_caps,
eCSSKeyword_alpha,
eCSSKeyword_alternate,
eCSSKeyword_alternate_reverse,
eCSSKeyword_always,
eCSSKeyword_annotation,
eCSSKeyword_appworkspace,
eCSSKeyword_auto,
eCSSKeyword_auto_fill,
eCSSKeyword_auto_fit,
eCSSKeyword_auto_flow,
eCSSKeyword_avoid,
eCSSKeyword_background,
eCSSKeyword_backwards,
eCSSKeyword_balance,
eCSSKeyword_baseline,
eCSSKeyword_bidi_override,
eCSSKeyword_blink,
eCSSKeyword_block,
eCSSKeyword_block_axis,
eCSSKeyword_blur,
eCSSKeyword_bold,
eCSSKeyword_bold_fraktur,
eCSSKeyword_bold_italic,
eCSSKeyword_bold_sans_serif,
eCSSKeyword_bold_script,
eCSSKeyword_bolder,
eCSSKeyword_border_box,
eCSSKeyword_both,
eCSSKeyword_bottom,
eCSSKeyword_bottom_outside,
eCSSKeyword_break_all,
eCSSKeyword_break_word,
eCSSKeyword_brightness,
eCSSKeyword_browser,
eCSSKeyword_bullets,
eCSSKeyword_button,
eCSSKeyword_buttonface,
eCSSKeyword_buttonhighlight,
eCSSKeyword_buttonshadow,
eCSSKeyword_buttontext,
eCSSKeyword_capitalize,
eCSSKeyword_caption,
eCSSKeyword_captiontext,
eCSSKeyword_cell,
eCSSKeyword_center,
eCSSKeyword_ch,
eCSSKeyword_character_variant,
eCSSKeyword_circle,
eCSSKeyword_cjk_decimal,
eCSSKeyword_clip,
eCSSKeyword_clone,
eCSSKeyword_close_quote,
eCSSKeyword_closest_corner,
eCSSKeyword_closest_side,
eCSSKeyword_cm,
eCSSKeyword_col_resize,
eCSSKeyword_collapse,
eCSSKeyword_color,
eCSSKeyword_color_burn,
eCSSKeyword_color_dodge,
eCSSKeyword_common_ligatures,
eCSSKeyword_column,
eCSSKeyword_column_reverse,
eCSSKeyword_condensed,
eCSSKeyword_contain,
eCSSKeyword_content_box,
eCSSKeyword_contents,
eCSSKeyword_context_fill,
eCSSKeyword_context_fill_opacity,
eCSSKeyword_context_menu,
eCSSKeyword_context_stroke,
eCSSKeyword_context_stroke_opacity,
eCSSKeyword_context_value,
eCSSKeyword_continuous,
eCSSKeyword_contrast,
eCSSKeyword_copy,
eCSSKeyword_contextual,
eCSSKeyword_cover,
eCSSKeyword_crop,
eCSSKeyword_cross,
eCSSKeyword_crosshair,
eCSSKeyword_currentcolor,
eCSSKeyword_cursive,
eCSSKeyword_cyclic,
eCSSKeyword_darken,
eCSSKeyword_dashed,
eCSSKeyword_dense,
eCSSKeyword_decimal,
eCSSKeyword_default,
eCSSKeyword_deg,
eCSSKeyword_diagonal_fractions,
eCSSKeyword_dialog,
eCSSKeyword_difference,
eCSSKeyword_digits,
eCSSKeyword_disabled,
eCSSKeyword_disc,
eCSSKeyword_disclosure_closed,
eCSSKeyword_disclosure_open,
eCSSKeyword_discretionary_ligatures,
eCSSKeyword_distribute,
eCSSKeyword_dot,
eCSSKeyword_dotted,
eCSSKeyword_double,
eCSSKeyword_double_circle,
eCSSKeyword_double_struck,
eCSSKeyword_drag,
eCSSKeyword_drop_shadow,
eCSSKeyword_e_resize,
eCSSKeyword_ease,
eCSSKeyword_ease_in,
eCSSKeyword_ease_in_out,
eCSSKeyword_ease_out,
eCSSKeyword_economy,
eCSSKeyword_element,
eCSSKeyword_elements,
eCSSKeyword_ellipse,
eCSSKeyword_ellipsis,
eCSSKeyword_em,
eCSSKeyword_embed,
eCSSKeyword_enabled,
eCSSKeyword_end,
eCSSKeyword_ethiopic_numeric,
eCSSKeyword_ex,
eCSSKeyword_exact,
eCSSKeyword_exclude,
eCSSKeyword_exclusion,
eCSSKeyword_expanded,
eCSSKeyword_extends,
eCSSKeyword_extra_condensed,
eCSSKeyword_extra_expanded,
eCSSKeyword_ew_resize,
eCSSKeyword_fallback,
eCSSKeyword_fantasy,
eCSSKeyword_farthest_side,
eCSSKeyword_farthest_corner,
eCSSKeyword_fill,
eCSSKeyword_filled,
eCSSKeyword_fill_box,
eCSSKeyword_first,
eCSSKeyword_fit_content,
eCSSKeyword_fixed,
eCSSKeyword_flat,
eCSSKeyword_flex,
eCSSKeyword_flex_end,
eCSSKeyword_flex_start,
eCSSKeyword_flip,
eCSSKeyword_flow_root,
eCSSKeyword_forwards,
eCSSKeyword_fraktur,
eCSSKeyword_frames,
eCSSKeyword_from_image,
eCSSKeyword_full_width,
eCSSKeyword_fullscreen,
eCSSKeyword_grab,
eCSSKeyword_grabbing,
eCSSKeyword_grad,
eCSSKeyword_grayscale,
eCSSKeyword_graytext,
eCSSKeyword_grid,
eCSSKeyword_groove,
eCSSKeyword_hard_light,
eCSSKeyword_hebrew,
eCSSKeyword_help,
eCSSKeyword_hidden,
eCSSKeyword_hide,
eCSSKeyword_highlight,
eCSSKeyword_highlighttext,
eCSSKeyword_historical_forms,
eCSSKeyword_historical_ligatures,
eCSSKeyword_horizontal,
eCSSKeyword_horizontal_tb,
eCSSKeyword_hue,
eCSSKeyword_hue_rotate,
eCSSKeyword_hz,
eCSSKeyword_icon,
eCSSKeyword_ignore,
eCSSKeyword_in,
eCSSKeyword_interlace,
eCSSKeyword_inactive,
eCSSKeyword_inactiveborder,
eCSSKeyword_inactivecaption,
eCSSKeyword_inactivecaptiontext,
eCSSKeyword_infinite,
eCSSKeyword_infobackground,
eCSSKeyword_infotext,
eCSSKeyword_inherit,
eCSSKeyword_initial,
eCSSKeyword_inline,
eCSSKeyword_inline_axis,
eCSSKeyword_inline_block,
eCSSKeyword_inline_end,
eCSSKeyword_inline_flex,
eCSSKeyword_inline_grid,
eCSSKeyword_inline_start,
eCSSKeyword_inline_table,
eCSSKeyword_inset,
eCSSKeyword_inside,
eCSSKeyword_inter_character,
eCSSKeyword_inter_word,
eCSSKeyword_interpolatematrix,
eCSSKeyword_accumulatematrix,
eCSSKeyword_intersect,
eCSSKeyword_isolate,
eCSSKeyword_isolate_override,
eCSSKeyword_invert,
eCSSKeyword_italic,
eCSSKeyword_japanese_formal,
eCSSKeyword_japanese_informal,
eCSSKeyword_jis78,
eCSSKeyword_jis83,
eCSSKeyword_jis90,
eCSSKeyword_jis04,
eCSSKeyword_justify,
eCSSKeyword_keep_all,
eCSSKeyword_khz,
eCSSKeyword_korean_hangul_formal,
eCSSKeyword_korean_hanja_formal,
eCSSKeyword_korean_hanja_informal,
eCSSKeyword_landscape,
eCSSKeyword_large,
eCSSKeyword_larger,
eCSSKeyword_last,
eCSSKeyword_last_baseline,
eCSSKeyword_layout,
eCSSKeyword_left,
eCSSKeyword_legacy,
eCSSKeyword_lighten,
eCSSKeyword_lighter,
eCSSKeyword_line_through,
eCSSKeyword_linear,
eCSSKeyword_lining_nums,
eCSSKeyword_list_item,
eCSSKeyword_local,
eCSSKeyword_logical,
eCSSKeyword_looped,
eCSSKeyword_lowercase,
eCSSKeyword_lr,
eCSSKeyword_lr_tb,
eCSSKeyword_ltr,
eCSSKeyword_luminance,
eCSSKeyword_luminosity,
eCSSKeyword_mandatory,
eCSSKeyword_manipulation,
eCSSKeyword_manual,
eCSSKeyword_margin_box,
eCSSKeyword_markers,
eCSSKeyword_match_parent,
eCSSKeyword_match_source,
eCSSKeyword_matrix,
eCSSKeyword_matrix3d,
eCSSKeyword_max_content,
eCSSKeyword_medium,
eCSSKeyword_menu,
eCSSKeyword_menutext,
eCSSKeyword_message_box,
eCSSKeyword_middle,
eCSSKeyword_min_content,
eCSSKeyword_minmax,
eCSSKeyword_mix,
eCSSKeyword_mixed,
eCSSKeyword_mm,
eCSSKeyword_monospace,
eCSSKeyword_move,
eCSSKeyword_ms,
eCSSKeyword_multiply,
eCSSKeyword_n_resize,
eCSSKeyword_narrower,
eCSSKeyword_ne_resize,
eCSSKeyword_nesw_resize,
eCSSKeyword_no_clip,
eCSSKeyword_no_close_quote,
eCSSKeyword_no_common_ligatures,
eCSSKeyword_no_contextual,
eCSSKeyword_no_discretionary_ligatures,
eCSSKeyword_no_drag,
eCSSKeyword_no_drop,
eCSSKeyword_no_historical_ligatures,
eCSSKeyword_no_open_quote,
eCSSKeyword_no_repeat,
eCSSKeyword_none,
eCSSKeyword_normal,
eCSSKeyword_not_allowed,
eCSSKeyword_nowrap,
eCSSKeyword_numeric,
eCSSKeyword_ns_resize,
eCSSKeyword_nw_resize,
eCSSKeyword_nwse_resize,
eCSSKeyword_oblique,
eCSSKeyword_oldstyle_nums,
eCSSKeyword_opacity,
eCSSKeyword_open,
eCSSKeyword_open_quote,
eCSSKeyword_optional,
eCSSKeyword_ordinal,
eCSSKeyword_ornaments,
eCSSKeyword_outset,
eCSSKeyword_outside,
eCSSKeyword_over,
eCSSKeyword_overlay,
eCSSKeyword_overline,
eCSSKeyword_paint,
eCSSKeyword_padding_box,
eCSSKeyword_painted,
eCSSKeyword_pan_x,
eCSSKeyword_pan_y,
eCSSKeyword_paused,
eCSSKeyword_pc,
eCSSKeyword_perspective,
eCSSKeyword_petite_caps,
eCSSKeyword_physical,
eCSSKeyword_plaintext,
eCSSKeyword_pointer,
eCSSKeyword_polygon,
eCSSKeyword_portrait,
eCSSKeyword_pre,
eCSSKeyword_pre_wrap,
eCSSKeyword_pre_line,
eCSSKeyword_preserve_3d,
eCSSKeyword_progress,
eCSSKeyword_progressive,
eCSSKeyword_proportional_nums,
eCSSKeyword_proportional_width,
eCSSKeyword_proximity,
eCSSKeyword_pt,
eCSSKeyword_px,
eCSSKeyword_rad,
eCSSKeyword_read_only,
eCSSKeyword_read_write,
eCSSKeyword_relative,
eCSSKeyword_repeat,
eCSSKeyword_repeat_x,
eCSSKeyword_repeat_y,
eCSSKeyword_reverse,
eCSSKeyword_ridge,
eCSSKeyword_right,
eCSSKeyword_rl,
eCSSKeyword_rl_tb,
eCSSKeyword_rotate,
eCSSKeyword_rotate3d,
eCSSKeyword_rotatex,
eCSSKeyword_rotatey,
eCSSKeyword_rotatez,
eCSSKeyword_round,
eCSSKeyword_row,
eCSSKeyword_row_resize,
eCSSKeyword_row_reverse,
eCSSKeyword_rtl,
eCSSKeyword_ruby,
eCSSKeyword_ruby_base,
eCSSKeyword_ruby_base_container,
eCSSKeyword_ruby_text,
eCSSKeyword_ruby_text_container,
eCSSKeyword_running,
eCSSKeyword_s,
eCSSKeyword_s_resize,
eCSSKeyword_safe,
eCSSKeyword_saturate,
eCSSKeyword_saturation,
eCSSKeyword_scale,
eCSSKeyword_scale_down,
eCSSKeyword_scale3d,
eCSSKeyword_scalex,
eCSSKeyword_scaley,
eCSSKeyword_scalez,
eCSSKeyword_screen,
eCSSKeyword_script,
eCSSKeyword_scroll,
eCSSKeyword_scrollbar,
eCSSKeyword_scrollbar_small,
eCSSKeyword_scrollbar_horizontal,
eCSSKeyword_scrollbar_vertical,
eCSSKeyword_se_resize,
eCSSKeyword_select_after,
eCSSKeyword_select_all,
eCSSKeyword_select_before,
eCSSKeyword_select_menu,
eCSSKeyword_select_same,
eCSSKeyword_self_end,
eCSSKeyword_self_start,
eCSSKeyword_semi_condensed,
eCSSKeyword_semi_expanded,
eCSSKeyword_separate,
eCSSKeyword_sepia,
eCSSKeyword_serif,
eCSSKeyword_sesame,
eCSSKeyword_show,
eCSSKeyword_sideways,
eCSSKeyword_sideways_lr,
eCSSKeyword_sideways_right,
eCSSKeyword_sideways_rl,
eCSSKeyword_simp_chinese_formal,
eCSSKeyword_simp_chinese_informal,
eCSSKeyword_simplified,
eCSSKeyword_skew,
eCSSKeyword_skewx,
eCSSKeyword_skewy,
eCSSKeyword_slashed_zero,
eCSSKeyword_slice,
eCSSKeyword_small,
eCSSKeyword_small_caps,
eCSSKeyword_small_caption,
eCSSKeyword_smaller,
eCSSKeyword_smooth,
eCSSKeyword_soft,
eCSSKeyword_soft_light,
eCSSKeyword_solid,
eCSSKeyword_space_around,
eCSSKeyword_space_between,
eCSSKeyword_space_evenly,
eCSSKeyword_span,
eCSSKeyword_spell_out,
eCSSKeyword_square,
eCSSKeyword_stacked_fractions,
eCSSKeyword_start,
eCSSKeyword_static,
eCSSKeyword_standalone,
eCSSKeyword_status_bar,
eCSSKeyword_step_end,
eCSSKeyword_step_start,
eCSSKeyword_sticky,
eCSSKeyword_stretch,
eCSSKeyword_stretch_to_fit,
eCSSKeyword_stretched,
eCSSKeyword_strict,
eCSSKeyword_stroke,
eCSSKeyword_stroke_box,
eCSSKeyword_style,
eCSSKeyword_styleset,
eCSSKeyword_stylistic,
eCSSKeyword_sub,
eCSSKeyword_subgrid,
eCSSKeyword_subtract,
eCSSKeyword_super,
eCSSKeyword_sw_resize,
eCSSKeyword_swash,
eCSSKeyword_swap,
eCSSKeyword_table,
eCSSKeyword_table_caption,
eCSSKeyword_table_cell,
eCSSKeyword_table_column,
eCSSKeyword_table_column_group,
eCSSKeyword_table_footer_group,
eCSSKeyword_table_header_group,
eCSSKeyword_table_row,
eCSSKeyword_table_row_group,
eCSSKeyword_tabular_nums,
eCSSKeyword_tailed,
eCSSKeyword_tb,
eCSSKeyword_tb_rl,
eCSSKeyword_text,
eCSSKeyword_text_bottom,
eCSSKeyword_text_top,
eCSSKeyword_thick,
eCSSKeyword_thin,
eCSSKeyword_threeddarkshadow,
eCSSKeyword_threedface,
eCSSKeyword_threedhighlight,
eCSSKeyword_threedlightshadow,
eCSSKeyword_threedshadow,
eCSSKeyword_titling_caps,
eCSSKeyword_toggle,
eCSSKeyword_top,
eCSSKeyword_top_outside,
eCSSKeyword_trad_chinese_formal,
eCSSKeyword_trad_chinese_informal,
eCSSKeyword_traditional,
eCSSKeyword_translate,
eCSSKeyword_translate3d,
eCSSKeyword_translatex,
eCSSKeyword_translatey,
eCSSKeyword_translatez,
eCSSKeyword_transparent,
eCSSKeyword_triangle,
eCSSKeyword_tri_state,
eCSSKeyword_ultra_condensed,
eCSSKeyword_ultra_expanded,
eCSSKeyword_under,
eCSSKeyword_underline,
eCSSKeyword_unicase,
eCSSKeyword_unsafe,
eCSSKeyword_unset,
eCSSKeyword_uppercase,
eCSSKeyword_upright,
eCSSKeyword_vertical,
eCSSKeyword_vertical_lr,
eCSSKeyword_vertical_rl,
eCSSKeyword_vertical_text,
eCSSKeyword_view_box,
eCSSKeyword_visible,
eCSSKeyword_visiblefill,
eCSSKeyword_visiblepainted,
eCSSKeyword_visiblestroke,
eCSSKeyword_w_resize,
eCSSKeyword_wait,
eCSSKeyword_wavy,
eCSSKeyword_weight,
eCSSKeyword_wider,
eCSSKeyword_window,
eCSSKeyword_windowframe,
eCSSKeyword_windowtext,
eCSSKeyword_words,
eCSSKeyword_wrap,
eCSSKeyword_wrap_reverse,
eCSSKeyword_write_only,
eCSSKeyword_x_large,
eCSSKeyword_x_small,
eCSSKeyword_xx_large,
eCSSKeyword_xx_small,
eCSSKeyword_zoom_in,
eCSSKeyword_zoom_out,


eCSSKeyword_radio,
eCSSKeyword_checkbox,
eCSSKeyword_button_bevel,
eCSSKeyword_toolbox,
eCSSKeyword_toolbar,
eCSSKeyword_toolbarbutton,
eCSSKeyword_toolbargripper,
eCSSKeyword_dualbutton,
eCSSKeyword_toolbarbutton_dropdown,
eCSSKeyword_button_arrow_up,
eCSSKeyword_button_arrow_down,
eCSSKeyword_button_arrow_next,
eCSSKeyword_button_arrow_previous,
eCSSKeyword_separator,
eCSSKeyword_splitter,
eCSSKeyword_statusbar,
eCSSKeyword_statusbarpanel,
eCSSKeyword_resizerpanel,
eCSSKeyword_resizer,
eCSSKeyword_listbox,
eCSSKeyword_listitem,
eCSSKeyword_numbers,
eCSSKeyword_number_input,
eCSSKeyword_treeview,
eCSSKeyword_treeitem,
eCSSKeyword_treetwisty,
eCSSKeyword_treetwistyopen,
eCSSKeyword_treeline,
eCSSKeyword_treeheader,
eCSSKeyword_treeheadercell,
eCSSKeyword_treeheadersortarrow,
eCSSKeyword_progressbar,
eCSSKeyword_progressbar_vertical,
eCSSKeyword_progresschunk,
eCSSKeyword_progresschunk_vertical,
eCSSKeyword_tab,
eCSSKeyword_tabpanels,
eCSSKeyword_tabpanel,
eCSSKeyword_tab_scroll_arrow_back,
eCSSKeyword_tab_scroll_arrow_forward,
eCSSKeyword_tooltip,
eCSSKeyword_spinner,
eCSSKeyword_spinner_upbutton,
eCSSKeyword_spinner_downbutton,
eCSSKeyword_spinner_textfield,
eCSSKeyword_scrollbarbutton_up,
eCSSKeyword_scrollbarbutton_down,
eCSSKeyword_scrollbarbutton_left,
eCSSKeyword_scrollbarbutton_right,
eCSSKeyword_scrollbartrack_horizontal,
eCSSKeyword_scrollbartrack_vertical,
eCSSKeyword_scrollbarthumb_horizontal,
eCSSKeyword_scrollbarthumb_vertical,
eCSSKeyword_sheet,
eCSSKeyword_textfield,
eCSSKeyword_textfield_multiline,
eCSSKeyword_caret,
eCSSKeyword_searchfield,
eCSSKeyword_menubar,
eCSSKeyword_menupopup,
eCSSKeyword_menuitem,
eCSSKeyword_checkmenuitem,
eCSSKeyword_radiomenuitem,
eCSSKeyword_menucheckbox,
eCSSKeyword_menuradio,
eCSSKeyword_menuseparator,
eCSSKeyword_menuarrow,
eCSSKeyword_menuimage,
eCSSKeyword_menuitemtext,
eCSSKeyword_menulist,
eCSSKeyword_menulist_button,
eCSSKeyword_menulist_text,
eCSSKeyword_menulist_textfield,
eCSSKeyword_meterbar,
eCSSKeyword_meterchunk,
eCSSKeyword_minimal_ui,
eCSSKeyword_range,
eCSSKeyword_range_thumb,
eCSSKeyword_sans_serif,
eCSSKeyword_sans_serif_bold_italic,
eCSSKeyword_sans_serif_italic,
eCSSKeyword_scale_horizontal,
eCSSKeyword_scale_vertical,
eCSSKeyword_scalethumb_horizontal,
eCSSKeyword_scalethumb_vertical,
eCSSKeyword_scalethumbstart,
eCSSKeyword_scalethumbend,
eCSSKeyword_scalethumbtick,
eCSSKeyword_groupbox,
eCSSKeyword_checkbox_container,
eCSSKeyword_radio_container,
eCSSKeyword_checkbox_label,
eCSSKeyword_radio_label,
eCSSKeyword_button_focus,
eCSSKeyword__moz_win_media_toolbox,
eCSSKeyword__moz_win_communications_toolbox,
eCSSKeyword__moz_win_browsertabbar_toolbox,
eCSSKeyword__moz_win_mediatext,
eCSSKeyword__moz_win_communicationstext,
eCSSKeyword__moz_win_glass,
eCSSKeyword__moz_win_borderless_glass,
eCSSKeyword__moz_window_titlebar,
eCSSKeyword__moz_window_titlebar_maximized,
eCSSKeyword__moz_window_frame_left,
eCSSKeyword__moz_window_frame_right,
eCSSKeyword__moz_window_frame_bottom,
eCSSKeyword__moz_window_button_close,
eCSSKeyword__moz_window_button_minimize,
eCSSKeyword__moz_window_button_maximize,
eCSSKeyword__moz_window_button_restore,
eCSSKeyword__moz_window_button_box,
eCSSKeyword__moz_window_button_box_maximized,
eCSSKeyword__moz_mac_help_button,
eCSSKeyword__moz_win_exclude_glass,
eCSSKeyword__moz_mac_vibrancy_light,
eCSSKeyword__moz_mac_vibrancy_dark,
eCSSKeyword__moz_mac_disclosure_button_closed,
eCSSKeyword__moz_mac_disclosure_button_open,
eCSSKeyword__moz_mac_source_list,
eCSSKeyword__moz_mac_source_list_selection,
eCSSKeyword__moz_mac_active_source_list_selection,
eCSSKeyword_alphabetic,
eCSSKeyword_bevel,
eCSSKeyword_butt,
eCSSKeyword_central,
eCSSKeyword_crispedges,
eCSSKeyword_evenodd,
eCSSKeyword_geometricprecision,
eCSSKeyword_hanging,
eCSSKeyword_ideographic,
eCSSKeyword_linearrgb,
eCSSKeyword_mathematical,

eCSSKeyword_miter,
eCSSKeyword_no_change,
eCSSKeyword_non_scaling_stroke,
eCSSKeyword_nonzero,
eCSSKeyword_optimizelegibility,
eCSSKeyword_optimizequality,
eCSSKeyword_optimizespeed,
eCSSKeyword_reset_size,


eCSSKeyword_srgb,
eCSSKeyword_symbolic,
eCSSKeyword_symbols,
eCSSKeyword_text_after_edge,
eCSSKeyword_text_before_edge,
eCSSKeyword_use_script,
eCSSKeyword__moz_crisp_edges,
eCSSKeyword_space,
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSKeywords.h" 2
 eCSSKeyword_COUNT
};



class nsCSSKeywords {
public:
  static void AddRefTable(void);
  static void ReleaseTable(void);


  static nsCSSKeyword LookupKeyword(const nsACString& aKeyword);
  static nsCSSKeyword LookupKeyword(const nsAString& aKeyword);


  static const nsAFlatCString& GetStringValue(nsCSSKeyword aKeyword);
};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h"
enum nsCSSPropertyID {
  eCSSProperty_UNKNOWN = -1,






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h" 1
# 328 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_align_content,
# 338 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_align_items,
# 348 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_align_self,
# 370 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_delay,
# 381 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_direction,
# 392 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_duration,
# 403 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_fill_mode,
# 414 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_iteration_count,
# 428 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_name,
# 441 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_play_state,
# 452 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_animation_timing_function,
# 463 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_appearance,
# 474 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_appearance,
# 485 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_backface_visibility,
# 501 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_attachment,
# 514 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_blend_mode,
# 527 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_clip,
# 540 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_color,
# 554 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_image,
# 569 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_origin,
# 589 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_position_x,
# 603 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_position_y,
# 617 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_repeat,
# 630 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_size,
# 645 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_binding,
# 655 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_block_size,
# 685 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_block_end_color,
# 701 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_block_end_style,
# 717 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_block_end_width,
# 741 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_block_start_color,
# 756 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_block_start_style,
# 771 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_block_start_width,
# 794 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_bottom_color,
# 807 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_border_bottom_colors,
# 819 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_bottom_left_radius,
# 832 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_bottom_right_radius,
# 845 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_bottom_style,
# 856 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_bottom_width,
# 870 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_collapse,
# 893 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_image_outset,
# 904 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_image_repeat,
# 915 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_image_slice,
# 926 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_image_source,
# 938 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_image_width,
# 955 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_end_color,
# 970 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_end_style,
# 985 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_end_width,
# 1008 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_start_color,
# 1022 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_start_style,
# 1036 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_start_width,
# 1058 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_left_color,
# 1071 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_border_left_colors,
# 1083 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_left_style,
# 1094 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_left_width,
# 1120 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_right_color,
# 1133 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_border_right_colors,
# 1145 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_right_style,
# 1156 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_right_width,
# 1170 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_spacing,
# 1194 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_top_color,
# 1207 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_border_top_colors,
# 1219 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_top_left_radius,
# 1232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_top_right_radius,
# 1245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_top_style,
# 1256 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_top_width,
# 1277 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_bottom,
# 1290 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_box_align,
# 1300 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_box_decoration_break,
# 1310 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_box_direction,
# 1320 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_box_flex,
# 1331 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_box_ordinal_group,
# 1342 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_box_orient,
# 1352 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_box_pack,
# 1362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_box_shadow,
# 1376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_box_sizing,
# 1386 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_caption_side,
# 1396 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_caret_color,
# 1407 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_clear,
# 1417 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_clip,
# 1428 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_clip_path,
# 1441 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_clip_rule,
# 1451 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_color,
# 1465 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_color_adjust,
# 1475 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_color_interpolation,
# 1485 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_color_interpolation_filters,
# 1495 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_count,
# 1508 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_fill,
# 1518 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_gap,
# 1535 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_rule_color,
# 1546 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_rule_style,
# 1556 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_rule_width,
# 1567 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_span,
# 1577 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_width,
# 1594 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_contain,
# 1607 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_content,
# 1619 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_control_character_visibility,
# 1631 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_counter_increment,
# 1641 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_counter_reset,
# 1651 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_cursor,
# 1665 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_direction,
# 1676 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_display,
# 1690 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_dominant_baseline,
# 1700 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_empty_cells,
# 1710 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_fill,
# 1720 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_fill_opacity,
# 1730 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_fill_rule,
# 1740 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_filter,
# 1758 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flex_basis,
# 1773 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flex_direction,
# 1789 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flex_grow,
# 1803 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flex_shrink,
# 1817 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flex_wrap,
# 1827 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_float_,
# 1838 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_float_edge,
# 1848 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flood_color,
# 1858 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flood_opacity,
# 1874 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_family,
# 1887 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_feature_settings,
# 1900 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_kerning,
# 1912 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_language_override,
# 1924 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_size,
# 1940 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_size_adjust,
# 1953 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_stretch,
# 1965 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_style,
# 1977 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_synthesis,
# 1996 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variant_alternates,
# 2009 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variant_caps,
# 2021 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variant_east_asian,
# 2034 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variant_ligatures,
# 2047 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variant_numeric,
# 2060 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variant_position,
# 2072 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variation_settings,
# 2086 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_weight,
# 2100 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_force_broken_image_icon,
# 2123 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_auto_columns,
# 2135 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_auto_flow,
# 2146 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_auto_rows,
# 2164 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_column_end,
# 2174 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_column_gap,
# 2186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_column_start,
# 2208 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_row_end,
# 2218 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_row_gap,
# 2230 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_row_start,
# 2246 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_template_areas,
# 2257 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_template_columns,
# 2270 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_template_rows,
# 2283 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_height,
# 2297 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_hyphens,
# 2307 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_initial_letter,
# 2318 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_image_orientation,
# 2329 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_image_region,
# 2339 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_image_rendering,
# 2349 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_ime_mode,
# 2359 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_inline_size,
# 2376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_isolation,
# 2387 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_justify_content,
# 2397 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_justify_items,
# 2408 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_justify_self,
# 2420 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__x_lang,
# 2433 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_left,
# 2446 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_letter_spacing,
# 2459 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_lighting_color,
# 2469 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_line_height,
# 2489 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_list_style_image,
# 2500 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_list_style_position,
# 2510 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_list_style_type,
# 2529 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_block_end,
# 2548 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_block_start,
# 2566 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_bottom,
# 2581 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_inline_end,
# 2598 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_inline_start,
# 2614 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_left,
# 2629 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_right,
# 2644 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin_top,
# 2665 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_marker_end,
# 2675 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_marker_mid,
# 2685 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_marker_start,
# 2714 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_clip,
# 2725 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_composite,
# 2736 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_image,
# 2749 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_mode,
# 2760 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_origin,
# 2778 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_position_x,
# 2790 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_position_y,
# 2802 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_repeat,
# 2813 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_size,
# 2827 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_type,
# 2839 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_math_display,
# 2851 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_math_variant,
# 2864 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_max_block_size,
# 2882 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_max_height,
# 2895 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_max_inline_size,
# 2912 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_max_width,
# 2925 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_min_block_size,
# 2944 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_min_font_size_ratio,
# 2957 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_min_height,
# 2970 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_min_inline_size,
# 2987 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_min_width,
# 3000 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mix_blend_mode,
# 3011 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_object_fit,
# 3021 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_object_position,
# 3032 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_offset_block_end,
# 3049 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_offset_block_start,
# 3065 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_offset_inline_end,
# 3081 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_offset_inline_start,
# 3096 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_opacity,
# 3109 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_order,
# 3119 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_orient,
# 3129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_osx_font_smoothing,
# 3147 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_outline_color,
# 3158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_outline_offset,
# 3174 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_outline_radius_bottomleft,
# 3186 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_outline_radius_bottomright,
# 3198 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_outline_radius_topleft,
# 3210 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_outline_radius_topright,
# 3222 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_outline_style,
# 3232 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_outline_width,
# 3249 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_overflow_clip_box,
# 3261 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_overflow_x,
# 3273 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_overflow_y,
# 3292 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_block_end,
# 3313 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_block_start,
# 3333 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_bottom,
# 3350 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_inline_end,
# 3370 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_inline_start,
# 3389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_left,
# 3406 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_right,
# 3423 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding_top,
# 3440 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_page_break_after,
# 3450 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_page_break_before,
# 3460 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_page_break_inside,
# 3470 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_paint_order,
# 3480 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_perspective,
# 3493 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_perspective_origin,
# 3523 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_pointer_events,
# 3534 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_position,
# 3547 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_quotes,
# 3557 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_resize,
# 3571 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_right,
# 3584 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_ruby_align,
# 3594 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_ruby_position,
# 3606 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_script_level,
# 3624 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_script_min_size,
# 3635 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_script_size_multiplier,
# 3648 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_behavior,
# 3658 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_snap_coordinate,
# 3671 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_snap_destination,
# 3683 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_snap_points_x,
# 3695 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_snap_points_y,
# 3713 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_snap_type_x,
# 3723 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_snap_type_y,
# 3733 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_shape_outside,
# 3745 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_shape_rendering,
# 3757 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__x_span,
# 3770 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_stack_sizing,
# 3780 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stop_color,
# 3790 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stop_opacity,
# 3800 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke,
# 3810 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke_dasharray,
# 3823 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke_dashoffset,
# 3834 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke_linecap,
# 3844 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke_linejoin,
# 3854 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke_miterlimit,
# 3865 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke_opacity,
# 3875 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_stroke_width,
# 3888 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__x_system_font,
# 3902 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_tab_size,
# 3913 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_table_layout,
# 3923 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_align,
# 3936 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_align_last,
# 3946 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_anchor,
# 3956 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_combine_upright,
# 3973 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_decoration_color,
# 3986 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_decoration_line,
# 3999 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_decoration_style,
# 4017 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_emphasis_color,
# 4028 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_emphasis_position,
# 4039 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_emphasis_style,
# 4050 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__webkit_text_fill_color,
# 4063 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_indent,
# 4075 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_justify,
# 4086 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_orientation,
# 4096 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_overflow,
# 4108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_rendering,
# 4118 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_shadow,
# 4133 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_text_size_adjust,
# 4149 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__webkit_text_stroke_color,
# 4162 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__webkit_text_stroke_width,
# 4175 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_transform,
# 4189 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__x_text_zoom,
# 4202 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_top,
# 4216 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_top_layer,
# 4229 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_touch_action,
# 4240 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transform,
# 4263 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transform_box,
# 4273 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transform_origin,
# 4285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transform_style,
# 4303 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transition_delay,
# 4314 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transition_duration,
# 4325 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transition_property,
# 4336 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transition_timing_function,
# 4348 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_unicode_bidi,
# 4359 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_user_focus,
# 4369 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_user_input,
# 4379 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_user_modify,
# 4389 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_user_select,
# 4399 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_vector_effect,
# 4412 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_vertical_align,
# 4426 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_visibility,
# 4436 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_white_space,
# 4448 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_width,
# 4462 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_will_change,
# 4473 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_window_dragging,
# 4484 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_window_shadow,
# 4497 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_word_break,
# 4507 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_word_spacing,
# 4521 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_overflow_wrap,
# 4531 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_writing_mode,
# 4541 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_z_index,
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h" 2



  eCSSProperty_COUNT_no_shorthands,

  eCSSProperty_COUNT_DUMMY = eCSSProperty_COUNT_no_shorthands - 1,




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h" 1
# 358 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_all,





eCSSProperty_animation,
# 495 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background,
# 582 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_background_position,
# 673 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border,





eCSSProperty_border_block_end,
# 735 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_block_start,
# 788 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_bottom,
# 880 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_color,






eCSSProperty_border_image,
# 949 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_end,
# 1002 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_inline_start,
# 1052 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_left,
# 1108 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_radius,





eCSSProperty_border_right,
# 1182 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_style,





eCSSProperty_border_top,
# 1270 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_border_width,
# 1529 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_column_rule,
# 1588 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_columns,
# 1752 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flex,
# 1783 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_flex_flow,
# 1868 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font,
# 1990 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_font_variant,
# 2111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid,





eCSSProperty_grid_area,
# 2158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_column,
# 2196 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_gap,





eCSSProperty_grid_row,
# 2240 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_grid_template,
# 2483 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_list_style,
# 2521 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_margin,
# 2659 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_marker,
# 2708 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask,
# 2771 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_mask_position,
# 3141 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_outline,
# 3168 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_outline_radius,
# 3243 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_overflow,
# 3285 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_padding,
# 3505 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_place_content,





eCSSProperty_place_items,





eCSSProperty_place_self,
# 3707 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_scroll_snap_type,
# 3967 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_decoration,
# 4011 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_text_emphasis,
# 4143 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__webkit_text_stroke,
# 4256 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty__moz_transform,
# 4297 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropList.h"
eCSSProperty_transition,
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h" 2


  eCSSProperty_COUNT,

  eCSSProperty_COUNT_DUMMY2 = eCSSProperty_COUNT - 1,




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropAliasList.h" 1
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropAliasList.h"
eCSSPropertyAlias_WordWrap,



eCSSPropertyAlias_MozTransformOrigin,



eCSSPropertyAlias_MozPerspectiveOrigin,



eCSSPropertyAlias_MozPerspective,



eCSSPropertyAlias_MozTransformStyle,



eCSSPropertyAlias_MozBackfaceVisibility,



eCSSPropertyAlias_MozBorderImage,



eCSSPropertyAlias_MozTransition,



eCSSPropertyAlias_MozTransitionDelay,



eCSSPropertyAlias_MozTransitionDuration,



eCSSPropertyAlias_MozTransitionProperty,



eCSSPropertyAlias_MozTransitionTimingFunction,



eCSSPropertyAlias_MozAnimation,



eCSSPropertyAlias_MozAnimationDelay,



eCSSPropertyAlias_MozAnimationDirection,



eCSSPropertyAlias_MozAnimationDuration,



eCSSPropertyAlias_MozAnimationFillMode,



eCSSPropertyAlias_MozAnimationIterationCount,



eCSSPropertyAlias_MozAnimationName,



eCSSPropertyAlias_MozAnimationPlayState,



eCSSPropertyAlias_MozAnimationTimingFunction,



eCSSPropertyAlias_MozBoxSizing,



eCSSPropertyAlias_MozFontFeatureSettings,



eCSSPropertyAlias_MozFontLanguageOverride,



eCSSPropertyAlias_MozPaddingEnd,



eCSSPropertyAlias_MozPaddingStart,



eCSSPropertyAlias_MozMarginEnd,



eCSSPropertyAlias_MozMarginStart,



eCSSPropertyAlias_MozBorderEnd,



eCSSPropertyAlias_MozBorderEndColor,



eCSSPropertyAlias_MozBorderEndStyle,



eCSSPropertyAlias_MozBorderEndWidth,



eCSSPropertyAlias_MozBorderStart,



eCSSPropertyAlias_MozBorderStartColor,



eCSSPropertyAlias_MozBorderStartStyle,



eCSSPropertyAlias_MozBorderStartWidth,



eCSSPropertyAlias_MozHyphens,



eCSSPropertyAlias_MozColumnCount,



eCSSPropertyAlias_MozColumnFill,



eCSSPropertyAlias_MozColumnGap,



eCSSPropertyAlias_MozColumnRule,



eCSSPropertyAlias_MozColumnRuleColor,



eCSSPropertyAlias_MozColumnRuleStyle,



eCSSPropertyAlias_MozColumnRuleWidth,



eCSSPropertyAlias_MozColumnWidth,



eCSSPropertyAlias_MozColumns,







eCSSPropertyAlias_WebkitAnimation,



eCSSPropertyAlias_WebkitAnimationDelay,



eCSSPropertyAlias_WebkitAnimationDirection,



eCSSPropertyAlias_WebkitAnimationDuration,



eCSSPropertyAlias_WebkitAnimationFillMode,



eCSSPropertyAlias_WebkitAnimationIterationCount,



eCSSPropertyAlias_WebkitAnimationName,



eCSSPropertyAlias_WebkitAnimationPlayState,



eCSSPropertyAlias_WebkitAnimationTimingFunction,




eCSSPropertyAlias_WebkitAppearance,




eCSSPropertyAlias_WebkitFilter,



eCSSPropertyAlias_WebkitTextSizeAdjust,




eCSSPropertyAlias_WebkitTransform,



eCSSPropertyAlias_WebkitTransformOrigin,



eCSSPropertyAlias_WebkitTransformStyle,



eCSSPropertyAlias_WebkitBackfaceVisibility,



eCSSPropertyAlias_WebkitPerspective,



eCSSPropertyAlias_WebkitPerspectiveOrigin,




eCSSPropertyAlias_WebkitTransition,



eCSSPropertyAlias_WebkitTransitionDelay,



eCSSPropertyAlias_WebkitTransitionDuration,



eCSSPropertyAlias_WebkitTransitionProperty,



eCSSPropertyAlias_WebkitTransitionTimingFunction,




eCSSPropertyAlias_WebkitBorderRadius,



eCSSPropertyAlias_WebkitBorderTopLeftRadius,



eCSSPropertyAlias_WebkitBorderTopRightRadius,



eCSSPropertyAlias_WebkitBorderBottomLeftRadius,



eCSSPropertyAlias_WebkitBorderBottomRightRadius,




eCSSPropertyAlias_WebkitBackgroundClip,



eCSSPropertyAlias_WebkitBackgroundOrigin,



eCSSPropertyAlias_WebkitBackgroundSize,




eCSSPropertyAlias_WebkitBorderImage,




eCSSPropertyAlias_WebkitBoxShadow,



eCSSPropertyAlias_WebkitBoxSizing,
# 376 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropAliasList.h"
eCSSPropertyAlias_WebkitBoxFlex,



eCSSPropertyAlias_WebkitBoxOrdinalGroup,



eCSSPropertyAlias_WebkitBoxOrient,



eCSSPropertyAlias_WebkitBoxDirection,



eCSSPropertyAlias_WebkitBoxAlign,



eCSSPropertyAlias_WebkitBoxPack,






eCSSPropertyAlias_WebkitFlexDirection,



eCSSPropertyAlias_WebkitFlexWrap,



eCSSPropertyAlias_WebkitFlexFlow,



eCSSPropertyAlias_WebkitOrder,



eCSSPropertyAlias_WebkitFlex,



eCSSPropertyAlias_WebkitFlexGrow,



eCSSPropertyAlias_WebkitFlexShrink,



eCSSPropertyAlias_WebkitFlexBasis,



eCSSPropertyAlias_WebkitJustifyContent,



eCSSPropertyAlias_WebkitAlignItems,



eCSSPropertyAlias_WebkitAlignSelf,



eCSSPropertyAlias_WebkitAlignContent,




eCSSPropertyAlias_WebkitUserSelect,





eCSSPropertyAlias_WebkitMask,



eCSSPropertyAlias_WebkitMaskClip,



eCSSPropertyAlias_WebkitMaskComposite,



eCSSPropertyAlias_WebkitMaskImage,



eCSSPropertyAlias_WebkitMaskOrigin,



eCSSPropertyAlias_WebkitMaskPosition,



eCSSPropertyAlias_WebkitMaskPositionX,



eCSSPropertyAlias_WebkitMaskPositionY,



eCSSPropertyAlias_WebkitMaskRepeat,



eCSSPropertyAlias_WebkitMaskSize,
# 47 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h" 2


  eCSSProperty_COUNT_with_aliases,

  eCSSProperty_COUNT_DUMMY3 = eCSSProperty_COUNT_with_aliases - 1,






  eCSSPropertyExtra_no_properties,
  eCSSPropertyExtra_all_properties,


  eCSSPropertyExtra_x_none_value,
  eCSSPropertyExtra_x_auto_value,


  eCSSPropertyExtra_variable,


  eCSSProperty_DOM
};

namespace mozilla {

template<>
inline PLDHashNumber
Hash<nsCSSPropertyID>(const nsCSSPropertyID& aValue)
{
  return uint32_t(aValue);
}

}



enum nsCSSFontDesc {
  eCSSFontDesc_UNKNOWN = -1,


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontDescList.h" 1





eCSSFontDesc_Family,
eCSSFontDesc_Style,
eCSSFontDesc_Weight,
eCSSFontDesc_Stretch,
eCSSFontDesc_Src,
eCSSFontDesc_UnicodeRange,
eCSSFontDesc_FontFeatureSettings,
eCSSFontDesc_FontLanguageOverride,
eCSSFontDesc_Display,
# 89 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h" 2

  eCSSFontDesc_COUNT
};



enum nsCSSCounterDesc {
  eCSSCounterDesc_UNKNOWN = -1,


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSCounterDescList.h" 1





eCSSCounterDesc_System,
eCSSCounterDesc_Symbols,
eCSSCounterDesc_AdditiveSymbols,
eCSSCounterDesc_Negative,
eCSSCounterDesc_Prefix,
eCSSCounterDesc_Suffix,
eCSSCounterDesc_Range,
eCSSCounterDesc_Pad,
eCSSCounterDesc_Fallback,
eCSSCounterDesc_SpeakAs,
# 99 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h" 2

  eCSSCounterDesc_COUNT
};

enum nsCSSPropertyLogicalGroup {
  eCSSPropertyLogicalGroup_UNKNOWN = -1,







# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropLogicalGroupList.h" 1
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropLogicalGroupList.h"
eCSSPropertyLogicalGroup_BorderColor,
eCSSPropertyLogicalGroup_BorderStyle,
eCSSPropertyLogicalGroup_BorderWidth,
eCSSPropertyLogicalGroup_Margin,
eCSSPropertyLogicalGroup_MaxSize,
eCSSPropertyLogicalGroup_Offset,
eCSSPropertyLogicalGroup_Padding,
eCSSPropertyLogicalGroup_MinSize,
eCSSPropertyLogicalGroup_Size,
# 112 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSPropertyID.h" 2



  eCSSPropertyLogicalGroup_COUNT
};
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructFwd.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructFwd.h"
enum nsStyleStructID {
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructFwd.h"
nsStyleStructID_None = -1,
nsStyleStructID_Inherited_Start = 0,

nsStyleStructID_DUMMY1 = nsStyleStructID_Inherited_Start - 1,





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h" 1
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h"
eStyleStruct_Font,



eStyleStruct_Color,


eStyleStruct_List,




eStyleStruct_Text,





eStyleStruct_Visibility,


eStyleStruct_UserInterface,


eStyleStruct_TableBorder,




eStyleStruct_SVG,





eStyleStruct_Variables,
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructFwd.h" 2



nsStyleStructID_Reset_Start,

nsStyleStructID_DUMMY2 = nsStyleStructID_Reset_Start - 1,





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h" 1
# 81 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h"
eStyleStruct_Background,





eStyleStruct_Position,




eStyleStruct_TextReset,





eStyleStruct_Display,




eStyleStruct_Content,




eStyleStruct_UIReset,


eStyleStruct_Table,


eStyleStruct_Margin,




eStyleStruct_Padding,




eStyleStruct_Border,





eStyleStruct_Outline,





eStyleStruct_XUL,


eStyleStruct_SVGReset,





eStyleStruct_Column,





eStyleStruct_Effects,
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructFwd.h" 2




nsStyleStructID_Length,

nsStyleStructID_Inherited_Count =
  nsStyleStructID_Reset_Start - nsStyleStructID_Inherited_Start,
nsStyleStructID_Reset_Count =
  nsStyleStructID_Length - nsStyleStructID_Reset_Start,

};




typedef decltype(nsStyleStructID(0) + nsStyleStructID(0)) nsStyleStructID_size_t;
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h" 2





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/xrecore.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFile.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFile.h"
struct PRFileDesc;
struct PRLibrary;

class nsISimpleEnumerator;
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFile.h"
class nsIFile : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    NORMAL_FILE_TYPE = 0U,
    DIRECTORY_TYPE = 1U
  };


  virtual nsresult Append(const nsAString & node) = 0;


  virtual nsresult AppendNative(const nsACString & node) = 0;


  virtual nsresult Normalize(void) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult Create(uint32_t type, uint32_t permissions) = 0;


  virtual nsresult GetLeafName(nsAString & aLeafName) = 0;
  virtual nsresult SetLeafName(const nsAString & aLeafName) = 0;


  virtual nsresult GetNativeLeafName(nsACString & aNativeLeafName) = 0;
  virtual nsresult SetNativeLeafName(const nsACString & aNativeLeafName) = 0;


  virtual nsresult CopyTo(nsIFile *newParentDir, const nsAString & newName) = 0;


  virtual nsresult CopyToNative(nsIFile *newParentDir, const nsACString & newName) = 0;


  virtual nsresult CopyToFollowingLinks(nsIFile *newParentDir, const nsAString & newName) = 0;


  virtual nsresult CopyToFollowingLinksNative(nsIFile *newParentDir, const nsACString & newName) = 0;


  virtual nsresult MoveTo(nsIFile *newParentDir, const nsAString & newName) = 0;


  virtual nsresult MoveToNative(nsIFile *newParentDir, const nsACString & newName) = 0;


  virtual nsresult RenameTo(nsIFile *newParentDir, const nsAString & newName) = 0;


  virtual nsresult RenameToNative(nsIFile *newParentDir, const nsACString & newName) = 0;


  virtual nsresult Remove(bool recursive) = 0;


  virtual nsresult GetPermissions(uint32_t *aPermissions) = 0;
  virtual nsresult SetPermissions(uint32_t aPermissions) = 0;


  virtual nsresult GetPermissionsOfLink(uint32_t *aPermissionsOfLink) = 0;
  virtual nsresult SetPermissionsOfLink(uint32_t aPermissionsOfLink) = 0;


  virtual nsresult GetLastModifiedTime(PRTime *aLastModifiedTime) = 0;
  virtual nsresult SetLastModifiedTime(PRTime aLastModifiedTime) = 0;


  virtual nsresult GetLastModifiedTimeOfLink(PRTime *aLastModifiedTimeOfLink) = 0;
  virtual nsresult SetLastModifiedTimeOfLink(PRTime aLastModifiedTimeOfLink) = 0;


  virtual nsresult GetFileSize(int64_t *aFileSize) = 0;
  virtual nsresult SetFileSize(int64_t aFileSize) = 0;


  virtual nsresult GetFileSizeOfLink(int64_t *aFileSizeOfLink) = 0;


  virtual nsresult GetTarget(nsAString & aTarget) = 0;


  virtual nsresult GetNativeTarget(nsACString & aNativeTarget) = 0;


  virtual nsresult GetPath(nsAString & aPath) = 0;


  virtual nsresult GetNativePath(nsACString & aNativePath) = 0;


  virtual nsresult Exists(bool *_retval) = 0;


  virtual nsresult IsWritable(bool *_retval) = 0;


  virtual nsresult IsReadable(bool *_retval) = 0;


  virtual nsresult IsExecutable(bool *_retval) = 0;


  virtual nsresult IsHidden(bool *_retval) = 0;


  virtual nsresult IsDirectory(bool *_retval) = 0;


  virtual nsresult IsFile(bool *_retval) = 0;


  virtual nsresult IsSymlink(bool *_retval) = 0;


  virtual nsresult IsSpecial(bool *_retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult CreateUnique(uint32_t type, uint32_t permissions) = 0;


  virtual nsresult Clone(nsIFile * *_retval) = 0;


  virtual nsresult Equals(nsIFile *inFile, bool *_retval) = 0;


  virtual nsresult Contains(nsIFile *inFile, bool *_retval) = 0;


  virtual nsresult GetParent(nsIFile * *aParent) = 0;


  virtual nsresult GetDirectoryEntries(nsISimpleEnumerator * *aDirectoryEntries) = 0;


  virtual nsresult InitWithPath(const nsAString & filePath) = 0;


  virtual nsresult InitWithNativePath(const nsACString & filePath) = 0;


  virtual nsresult InitWithFile(nsIFile *aFile) = 0;


  virtual nsresult GetFollowLinks(bool *aFollowLinks) = 0;
  virtual nsresult SetFollowLinks(bool aFollowLinks) = 0;

  enum {
    OS_READAHEAD = 1073741824U,
    DELETE_ON_CLOSE = 2147483648U
  };


  __attribute__ ((warn_unused_result)) virtual nsresult OpenNSPRFileDesc(int32_t flags, int32_t mode, PRFileDesc **_retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult OpenANSIFileDesc(const char * mode, FILE **_retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult Load(PRLibrary **_retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetDiskSpaceAvailable(int64_t *aDiskSpaceAvailable) = 0;


  virtual nsresult AppendRelativePath(const nsAString & relativeFilePath) = 0;


  virtual nsresult AppendRelativeNativePath(const nsACString & relativeFilePath) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetPersistentDescriptor(nsACString & aPersistentDescriptor) = 0;
  __attribute__ ((warn_unused_result)) virtual nsresult SetPersistentDescriptor(const nsACString & aPersistentDescriptor) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult Reveal(void) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult Launch(void) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetRelativeDescriptor(nsIFile *fromFile, nsACString & _retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult SetRelativeDescriptor(nsIFile *fromFile, const nsACString & relativeDesc) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult GetRelativePath(nsIFile *fromFile, nsACString & _retval) = 0;


  __attribute__ ((warn_unused_result)) virtual nsresult SetRelativePath(nsIFile *fromFile, const nsACString & relativeDesc) = 0;

};

  template<typename T> struct nsIFile::COMTypeInfo<nsIFile, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIFile::COMTypeInfo<nsIFile, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x2fa6884a, 0xae65, 0x412a, { 0x9d, 0x4c, 0xce, 0x6e, 0x34, 0x54, 0x4b, 0xa1 }};
# 920 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFile.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDirectoryServiceUtils.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDirectoryServiceUtils.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIProperties.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIProperties.h"
class nsIProperties : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Get(const char * prop, const nsIID & iid, void **result) = 0;


  virtual nsresult Set(const char * prop, nsISupports *value) = 0;


  virtual nsresult Has(const char * prop, bool *_retval) = 0;


  virtual nsresult Undefine(const char * prop) = 0;


  virtual nsresult GetKeys(uint32_t *count, char * **keys) = 0;

};

  template<typename T> struct nsIProperties::COMTypeInfo<nsIProperties, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIProperties::COMTypeInfo<nsIProperties, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x78650582, 0x4e93, 0x4b60, { 0x8e, 0x85, 0x26, 0xeb, 0xd3, 0xeb, 0x14, 0xca }};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDirectoryServiceUtils.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFile.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDirectoryServiceUtils.h" 2

inline nsresult
NS_GetSpecialDirectory(const char* aSpecialDirName, nsIFile** aResult)
{
  nsresult rv;
  nsCOMPtr<nsIProperties> serv(do_GetService("@mozilla.org/file/directory_service;1",
                                             &rv));
  if (((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
    return rv;
  }

  return serv->Get(aSpecialDirName, (nsIFile::COMTypeInfo<nsIFile, void>::kIID),
                   reinterpret_cast<void**>(aResult));
}
# 921 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIFile.h" 2
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h" 2
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h"
namespace mozilla {

struct StaticXREAppData;




class XREAppData
{
public:
  XREAppData() { }
  ~XREAppData() { }
  XREAppData(const XREAppData& aOther)
  {
    *this = aOther;
  }

  explicit XREAppData(const StaticXREAppData& aOther)
  {
    *this = aOther;
  }

  XREAppData& operator=(const StaticXREAppData& aOther);
  XREAppData& operator=(const XREAppData& aOther);
  XREAppData& operator=(XREAppData&& aOther) = default;

  struct NSFreePolicy
  {
    void operator()(const void* ptr) {
      free(const_cast<void*>(ptr));
    }
  };



  class CharPtr
  {
  public:
    explicit CharPtr() = default;
    explicit CharPtr(const char* v)
    {
      *this = v;
    }
    CharPtr(CharPtr&&) = default;
    ~CharPtr() = default;

    CharPtr& operator=(const char* v)
    {
      if (v) {
        mValue.reset(NS_strdup(v));
      } else {
        mValue = nullptr;
      }
      return *this;
    }
    CharPtr& operator=(const CharPtr& v)
    {
      *this = (const char*) v;
      return *this;
    }

    operator const char*() const {
      return mValue.get();
    }

  private:
    UniquePtr<const char, NSFreePolicy> mValue;
  };





  nsCOMPtr<nsIFile> directory;






  CharPtr vendor;






  CharPtr name;






  CharPtr remotingName;






  CharPtr version;




  CharPtr buildID;
# 145 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h"
  CharPtr ID;





  CharPtr copyright;




  uint32_t flags = 0;





  nsCOMPtr<nsIFile> xreDirectory;




  CharPtr minVersion;
  CharPtr maxVersion;




  CharPtr crashReporterURL;
# 190 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h"
  CharPtr profile;




  CharPtr UAName;
# 204 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h"
};
# 223 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/XREAppData.h"
struct StaticXREAppData
{
  const char* vendor;
  const char* name;
  const char* remotingName;
  const char* version;
  const char* buildID;
  const char* ID;
  const char* copyright;
  uint32_t flags;
  const char* minVersion;
  const char* maxVersion;
  const char* crashReporterURL;
  const char* profile;
  const char* UAName;
};

}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/XREChildData.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/XREChildData.h"
struct XREChildData
{
# 36 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/XREChildData.h"
};
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/XREShellData.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/XREShellData.h"
struct XREShellData
{






};
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h" 2
# 208 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
namespace mozilla {
struct BootstrapConfig;
}
int XRE_main (int argc, char* argv[], const mozilla::BootstrapConfig& aConfig);
# 220 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
nsresult XRE_GetFileFromPath (const char* aPath, nsIFile** aResult);
# 229 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
nsresult XRE_GetBinaryPath (const char* aArgv0, nsIFile** aResult);





const mozilla::Module* XRE_GetStaticModule ();
# 245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
nsresult XRE_LockProfileDirectory (nsIFile* aDirectory, nsISupports** aLockObject);
# 269 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
nsresult XRE_InitEmbedding2 (nsIFile* aLibXULDirectory, nsIFile* aAppDirectory, nsIDirectoryServiceProvider* aAppDirProvider);
# 279 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
nsresult XRE_AddStaticComponent (const mozilla::Module* aComponent);
# 300 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
enum NSLocationType
{
  NS_APP_LOCATION,
  NS_EXTENSION_LOCATION,
  NS_SKIN_LOCATION,
  NS_BOOTSTRAPPED_LOCATION
};

nsresult XRE_AddManifestLocation (NSLocationType aType, nsIFile* aLocation);
# 329 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
nsresult XRE_AddJarManifestLocation (NSLocationType aType, nsIFile* aLocation);
# 359 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
void XRE_NotifyProfile ();





void XRE_TermEmbedding ();
# 375 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsXULAppAPI.h"
nsresult XRE_ParseAppData (nsIFile* aINIFile, mozilla::XREAppData& aAppData);



enum GeckoProcessType
{
  GeckoProcessType_Default = 0,

  GeckoProcessType_Plugin,
  GeckoProcessType_Content,

  GeckoProcessType_IPDLUnitTest,

  GeckoProcessType_GMPlugin,

  GeckoProcessType_GPU,

  GeckoProcessType_End,
  GeckoProcessType_Invalid = GeckoProcessType_End
};

static const char* const kGeckoProcessTypeString[] = {
  "default",
  "plugin",
  "tab",
  "ipdlunittest",
  "geckomediaplugin",
  "gpu"
};

static_assert(sizeof(mozilla::detail::ArrayLengthHelper(kGeckoProcessTypeString)) ==
              GeckoProcessType_End,
              "Array length mismatch");

const char* XRE_ChildProcessTypeToString (GeckoProcessType aProcessType);







void XRE_SetProcessType (const char* aProcessTypeString);




bool XRE_TakeMinidumpForChild (uint32_t aChildPid, nsIFile** aDump, uint32_t* aSequence);




bool XRE_SetRemoteExceptionHandler (const char* aPipe);



namespace mozilla {
namespace gmp {
class GMPLoader;
}
}

nsresult XRE_InitChildProcess (int aArgc, char* aArgv[], const XREChildData* aChildData);




GeckoProcessType XRE_GetProcessType ();


bool XRE_IsParentProcess ();


bool XRE_IsContentProcess ();


bool XRE_IsGPUProcess ();


typedef void (*MainFunction)(void* aData);

nsresult XRE_InitParentProcess (int aArgc, char* aArgv[], MainFunction aMainFunction, void* aMainFunctionExtraData);





int XRE_RunIPDLTest (int aArgc, char* aArgv[]);



nsresult XRE_RunAppShell ();


nsresult XRE_InitCommandLine (int aArgc, char* aArgv[]);


nsresult XRE_DeinitCommandLine ();


class MessageLoop;

void XRE_ShutdownChildProcess ();


MessageLoop* XRE_GetIOMessageLoop ();


bool XRE_SendTestShellCommand (JSContext* aCx, JSString* aCommand, void* aCallback);



bool XRE_ShutdownTestShell ();


void XRE_InstallX11ErrorHandler ();


void XRE_TelemetryAccumulate (int aID, uint32_t aSample);


void XRE_StartupTimelineRecord (int aEvent, mozilla::TimeStamp aWhen);


void XRE_InitOmnijar (nsIFile* aGreOmni, nsIFile* aAppOmni);


void XRE_StopLateWriteChecks (void);


void XRE_EnableSameExecutableForContentProc ();


int XRE_XPCShellMain (int argc, char** argv, char** envp, const XREShellData* aShellData);
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h" 2
# 188 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h"
static_assert(((7<<9) &
               (1<<12)) == 0,
              "didn't leave enough room for the parse property constants");
# 289 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h"
enum nsStyleAnimType {


  eStyleAnimType_Custom,


  eStyleAnimType_Coord,



  eStyleAnimType_Sides_Top,
  eStyleAnimType_Sides_Right,
  eStyleAnimType_Sides_Bottom,
  eStyleAnimType_Sides_Left,



  eStyleAnimType_Corner_TopLeft,
  eStyleAnimType_Corner_TopRight,
  eStyleAnimType_Corner_BottomRight,
  eStyleAnimType_Corner_BottomLeft,


  eStyleAnimType_nscoord,


  eStyleAnimType_float,


  eStyleAnimType_Color,


  eStyleAnimType_ComplexColor,


  eStyleAnimType_PaintServer,


  eStyleAnimType_Shadow,


  eStyleAnimType_Discrete,


  eStyleAnimType_None
};

class nsCSSProps {
public:
  typedef mozilla::CSSEnabledState EnabledState;

  struct KTableEntry
  {



    constexpr KTableEntry(nsCSSKeyword aKeyword, int16_t aValue)
      : mKeyword(aKeyword)
      , mValue(aValue)
    {
    }

    template<typename T,
             typename = typename std::enable_if<std::is_enum<T>::value>::type>
    constexpr KTableEntry(nsCSSKeyword aKeyword, T aValue)
      : mKeyword(aKeyword)
      , mValue(static_cast<int16_t>(aValue))
    {
      static_assert(mozilla::EnumTypeFitsWithin<T, int16_t>::value,
                    "aValue must be an enum that fits within mValue");
    }

    nsCSSKeyword mKeyword;
    int16_t mValue;
  };

  static void AddRefTable(void);
  static void ReleaseTable(void);




  static nsCSSPropertyID LookupProperty(const nsAString& aProperty,
                                      EnabledState aEnabled);
  static nsCSSPropertyID LookupProperty(const nsACString& aProperty,
                                      EnabledState aEnabled);


  static nsCSSPropertyID LookupPropertyByIDLName(
      const nsAString& aPropertyIDLName,
      EnabledState aEnabled);
  static nsCSSPropertyID LookupPropertyByIDLName(
      const nsACString& aPropertyIDLName,
      EnabledState aEnabled);



  static bool IsCustomPropertyName(const nsAString& aProperty);
  static bool IsCustomPropertyName(const nsACString& aProperty);

  static inline bool IsShorthand(nsCSSPropertyID aProperty) {
    do { } while (0);

    return (aProperty >= eCSSProperty_COUNT_no_shorthands);
  }


  static bool IsInherited(nsCSSPropertyID aProperty);


  static nsCSSFontDesc LookupFontDesc(const nsAString& aProperty);
  static nsCSSFontDesc LookupFontDesc(const nsACString& aProperty);


  static nsCSSCounterDesc LookupCounterDesc(const nsAString& aProperty);
  static nsCSSCounterDesc LookupCounterDesc(const nsACString& aProperty);


  static bool IsPredefinedCounterStyle(const nsAString& aStyle);
  static bool IsPredefinedCounterStyle(const nsACString& aStyle);


  static const nsAFlatCString& GetStringValue(nsCSSPropertyID aProperty);
  static const nsAFlatCString& GetStringValue(nsCSSFontDesc aFontDesc);
  static const nsAFlatCString& GetStringValue(nsCSSCounterDesc aCounterDesc);




  static const nsAFlatCString& LookupPropertyValue(nsCSSPropertyID aProperty, int32_t aValue);



  static bool GetColorName(int32_t aPropID, nsCString &aStr);




  static int32_t FindIndexOfKeyword(nsCSSKeyword aKeyword,
                                    const KTableEntry aTable[]);



  static bool FindKeyword(nsCSSKeyword aKeyword, const KTableEntry aTable[],
                          int32_t& aValue);


  static nsCSSKeyword ValueToKeywordEnum(int32_t aValue,
                                         const KTableEntry aTable[]);
  template<typename T,
           typename = typename std::enable_if<std::is_enum<T>::value>::type>
  static nsCSSKeyword ValueToKeywordEnum(T aValue,
                                         const KTableEntry aTable[])
  {
    static_assert(mozilla::EnumTypeFitsWithin<T, int16_t>::value,
                  "aValue must be an enum that fits within KTableEntry::mValue");
    return ValueToKeywordEnum(static_cast<int16_t>(aValue), aTable);
  }

  static const nsAFlatCString& ValueToKeyword(int32_t aValue,
                                              const KTableEntry aTable[]);
  template<typename T,
           typename = typename std::enable_if<std::is_enum<T>::value>::type>
  static const nsAFlatCString& ValueToKeyword(T aValue,
                                              const KTableEntry aTable[])
  {
    static_assert(mozilla::EnumTypeFitsWithin<T, int16_t>::value,
                  "aValue must be an enum that fits within KTableEntry::mValue");
    return ValueToKeyword(static_cast<int16_t>(aValue), aTable);
  }

  static const nsStyleStructID kSIDTable[eCSSProperty_COUNT_no_shorthands];
  static const KTableEntry* const kKeywordTableTable[eCSSProperty_COUNT_no_shorthands];
  static const nsStyleAnimType kAnimTypeTable[eCSSProperty_COUNT_no_shorthands];
  static const ptrdiff_t
    kStyleStructOffsetTable[eCSSProperty_COUNT_no_shorthands];

private:
  static const uint32_t kFlagsTable[eCSSProperty_COUNT];

public:
  static inline bool PropHasFlags(nsCSSPropertyID aProperty, uint32_t aFlags)
  {
    do { } while (0);

    do { } while (0);



    return (nsCSSProps::kFlagsTable[aProperty] & aFlags) == aFlags;
  }

  static inline uint32_t PropertyParseType(nsCSSPropertyID aProperty)
  {
    do { } while (0);

    return nsCSSProps::kFlagsTable[aProperty] &
           (7<<9);
  }

  static inline uint32_t ValueRestrictions(nsCSSPropertyID aProperty)
  {
    do { } while (0);

    return nsCSSProps::kFlagsTable[aProperty] &
           (3<<13);
  }

private:

  static const uint32_t kParserVariantTable[eCSSProperty_COUNT_no_shorthands];

public:
  static inline uint32_t ParserVariant(nsCSSPropertyID aProperty) {
    do { } while (0);

    return nsCSSProps::kParserVariantTable[aProperty];
  }

private:


  static const nsCSSPropertyID *const
    kSubpropertyTable[eCSSProperty_COUNT - eCSSProperty_COUNT_no_shorthands];

public:
  static inline
  const nsCSSPropertyID * SubpropertyEntryFor(nsCSSPropertyID aProperty) {
    do { } while (0);


    return nsCSSProps::kSubpropertyTable[aProperty -
                                         eCSSProperty_COUNT_no_shorthands];
  }




  static const nsCSSPropertyID * ShorthandsContaining(nsCSSPropertyID aProperty) {
    do { } while (0);
    do { } while (0);

    return gShorthandsContainingTable[aProperty];
  }
private:





  static nsCSSPropertyID *gShorthandsContainingTable[eCSSProperty_COUNT_no_shorthands];
  static nsCSSPropertyID* gShorthandsContainingPool;
  static bool BuildShorthandsContainingTable();

private:
  static const size_t gPropertyCountInStruct[nsStyleStructID_Length];
  static const size_t gPropertyIndexInStruct[eCSSProperty_COUNT_no_shorthands];
public:




  static size_t PropertyCountInStruct(nsStyleStructID aSID) {
    do { } while (0);

    return gPropertyCountInStruct[aSID];
  }




  static size_t PropertyIndexInStruct(nsCSSPropertyID aProperty) {
    do { } while (0);

    return gPropertyIndexInStruct[aProperty];
  }

private:


  static const nsCSSPropertyID* const
    kLogicalGroupTable[eCSSPropertyLogicalGroup_COUNT];

public:
# 591 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h"
  static const nsCSSPropertyID* LogicalGroup(nsCSSPropertyID aProperty);

private:
  static bool gPropertyEnabled[eCSSProperty_COUNT_with_aliases];

private:

  static const char* const kIDLNameTable[eCSSProperty_COUNT];

public:
# 611 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h"
  static const char* PropertyIDLName(nsCSSPropertyID aProperty)
  {
    do { } while (0);

    return kIDLNameTable[aProperty];
  }

private:
  static const int32_t kIDLNameSortPositionTable[eCSSProperty_COUNT];

public:




  static int32_t PropertyIDLNameSortPosition(nsCSSPropertyID aProperty)
  {
    do { } while (0);

    return kIDLNameSortPositionTable[aProperty];
  }

  static bool IsEnabled(nsCSSPropertyID aProperty) {
    do { } while (0);




    do { } while (0);


    return gPropertyEnabled[aProperty];
  }




  static const mozilla::UseCounter gPropertyUseCounter[eCSSProperty_COUNT_no_shorthands];

public:

  static mozilla::UseCounter UseCounterFor(nsCSSPropertyID aProperty) {
    do { } while (0);

    return gPropertyUseCounter[aProperty];
  }

  static bool IsEnabled(nsCSSPropertyID aProperty, EnabledState aEnabled)
  {
    if (IsEnabled(aProperty)) {
      return true;
    }
    if (aEnabled == EnabledState::eIgnoreEnabledState) {
      return true;
    }
    if ((aEnabled & EnabledState::eInUASheets) &&
        PropHasFlags(aProperty, (1<<22)))
    {
      return true;
    }
    if ((aEnabled & EnabledState::eInChrome) &&
        PropHasFlags(aProperty, (1<<23)))
    {
      return true;
    }
    return false;
  }

public:
# 693 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSProps.h"
  static const KTableEntry kAnimationDirectionKTable[];
  static const KTableEntry kAnimationFillModeKTable[];
  static const KTableEntry kAnimationIterationCountKTable[];
  static const KTableEntry kAnimationPlayStateKTable[];
  static const KTableEntry kAnimationTimingFunctionKTable[];
  static const KTableEntry kAppearanceKTable[];
  static const KTableEntry kMozAppearanceKTable[];
  static const KTableEntry kAzimuthKTable[];
  static const KTableEntry kBackfaceVisibilityKTable[];
  static const KTableEntry kTransformStyleKTable[];
  static const KTableEntry kImageLayerAttachmentKTable[];
  static const KTableEntry kBackgroundOriginKTable[];
  static const KTableEntry kMaskOriginKTable[];
  static const KTableEntry kImageLayerPositionKTable[];
  static const KTableEntry kImageLayerRepeatKTable[];
  static const KTableEntry kImageLayerRepeatPartKTable[];
  static const KTableEntry kImageLayerSizeKTable[];
  static const KTableEntry kImageLayerCompositeKTable[];
  static const KTableEntry kImageLayerModeKTable[];


  static KTableEntry kBackgroundClipKTable[];
  static const KTableEntry kMaskClipKTable[];
  static const KTableEntry kBlendModeKTable[];
  static const KTableEntry kBorderCollapseKTable[];
  static const KTableEntry kBorderImageRepeatKTable[];
  static const KTableEntry kBorderImageSliceKTable[];
  static const KTableEntry kBorderStyleKTable[];
  static const KTableEntry kBorderWidthKTable[];
  static const KTableEntry kBoxAlignKTable[];
  static const KTableEntry kBoxDecorationBreakKTable[];
  static const KTableEntry kBoxDirectionKTable[];
  static const KTableEntry kBoxOrientKTable[];
  static const KTableEntry kBoxPackKTable[];
  static const KTableEntry kClipPathGeometryBoxKTable[];
  static const KTableEntry kCounterRangeKTable[];
  static const KTableEntry kCounterSpeakAsKTable[];
  static const KTableEntry kCounterSymbolsSystemKTable[];
  static const KTableEntry kCounterSystemKTable[];
  static const KTableEntry kDominantBaselineKTable[];
  static const KTableEntry kShapeRadiusKTable[];
  static const KTableEntry kFillRuleKTable[];
  static const KTableEntry kFilterFunctionKTable[];
  static const KTableEntry kImageRenderingKTable[];
  static const KTableEntry kShapeOutsideShapeBoxKTable[];
  static const KTableEntry kShapeRenderingKTable[];
  static const KTableEntry kStrokeLinecapKTable[];
  static const KTableEntry kStrokeLinejoinKTable[];
  static const KTableEntry kStrokeContextValueKTable[];
  static const KTableEntry kVectorEffectKTable[];
  static const KTableEntry kTextAnchorKTable[];
  static const KTableEntry kTextRenderingKTable[];
  static const KTableEntry kColorAdjustKTable[];
  static const KTableEntry kColorInterpolationKTable[];
  static const KTableEntry kColumnFillKTable[];
  static const KTableEntry kColumnSpanKTable[];
  static const KTableEntry kBoxPropSourceKTable[];
  static const KTableEntry kBoxShadowTypeKTable[];
  static const KTableEntry kBoxSizingKTable[];
  static const KTableEntry kCaptionSideKTable[];


  static KTableEntry kClearKTable[];
  static const KTableEntry kColorKTable[];
  static const KTableEntry kContentKTable[];
  static const KTableEntry kControlCharacterVisibilityKTable[];
  static const KTableEntry kCursorKTable[];
  static const KTableEntry kDirectionKTable[];


  static KTableEntry kDisplayKTable[];
  static const KTableEntry kElevationKTable[];
  static const KTableEntry kEmptyCellsKTable[];

  static const KTableEntry kAlignAllKeywords[];
  static const KTableEntry kAlignOverflowPosition[];
  static const KTableEntry kAlignSelfPosition[];
  static const KTableEntry kAlignLegacy[];
  static const KTableEntry kAlignLegacyPosition[];
  static const KTableEntry kAlignAutoNormalStretchBaseline[];
  static const KTableEntry kAlignNormalStretchBaseline[];
  static const KTableEntry kAlignNormalBaseline[];
  static const KTableEntry kAlignContentDistribution[];
  static const KTableEntry kAlignContentPosition[];

  static const KTableEntry kAutoCompletionAlignJustifySelf[];
  static const KTableEntry kAutoCompletionAlignItems[];
  static const KTableEntry kAutoCompletionAlignJustifyContent[];

  static const KTableEntry kFlexDirectionKTable[];
  static const KTableEntry kFlexWrapKTable[];


  static KTableEntry kFloatKTable[];
  static const KTableEntry kFloatEdgeKTable[];
  static const KTableEntry kFontDisplayKTable[];
  static const KTableEntry kFontKTable[];
  static const KTableEntry kFontKerningKTable[];
  static const KTableEntry kFontSizeKTable[];
  static const KTableEntry kFontSmoothingKTable[];
  static const KTableEntry kFontStretchKTable[];
  static const KTableEntry kFontStyleKTable[];
  static const KTableEntry kFontSynthesisKTable[];
  static const KTableEntry kFontVariantKTable[];
  static const KTableEntry kFontVariantAlternatesKTable[];
  static const KTableEntry kFontVariantAlternatesFuncsKTable[];
  static const KTableEntry kFontVariantCapsKTable[];
  static const KTableEntry kFontVariantEastAsianKTable[];
  static const KTableEntry kFontVariantLigaturesKTable[];
  static const KTableEntry kFontVariantNumericKTable[];
  static const KTableEntry kFontVariantPositionKTable[];
  static const KTableEntry kFontWeightKTable[];
  static const KTableEntry kGridAutoFlowKTable[];
  static const KTableEntry kGridTrackBreadthKTable[];
  static const KTableEntry kHyphensKTable[];
  static const KTableEntry kImageOrientationKTable[];
  static const KTableEntry kImageOrientationFlipKTable[];
  static const KTableEntry kIsolationKTable[];
  static const KTableEntry kIMEModeKTable[];
  static const KTableEntry kLineHeightKTable[];
  static const KTableEntry kListStylePositionKTable[];
  static const KTableEntry kListStyleKTable[];
  static const KTableEntry kMaskTypeKTable[];
  static const KTableEntry kMathVariantKTable[];
  static const KTableEntry kMathDisplayKTable[];
  static const KTableEntry kContainKTable[];
  static const KTableEntry kContextOpacityKTable[];
  static const KTableEntry kContextPatternKTable[];
  static const KTableEntry kObjectFitKTable[];
  static const KTableEntry kOrientKTable[];
  static const KTableEntry kOutlineStyleKTable[];
  static const KTableEntry kOverflowKTable[];
  static const KTableEntry kOverflowSubKTable[];
  static const KTableEntry kOverflowClipBoxKTable[];
  static const KTableEntry kOverflowWrapKTable[];
  static const KTableEntry kPageBreakKTable[];
  static const KTableEntry kPageBreakInsideKTable[];
  static const KTableEntry kPageMarksKTable[];
  static const KTableEntry kPageSizeKTable[];
  static const KTableEntry kPitchKTable[];
  static const KTableEntry kPointerEventsKTable[];
  static const KTableEntry kPositionKTable[];
  static const KTableEntry kRadialGradientShapeKTable[];
  static const KTableEntry kRadialGradientSizeKTable[];
  static const KTableEntry kRadialGradientLegacySizeKTable[];
  static const KTableEntry kResizeKTable[];
  static const KTableEntry kRubyAlignKTable[];
  static const KTableEntry kRubyPositionKTable[];
  static const KTableEntry kScrollBehaviorKTable[];
  static const KTableEntry kScrollSnapTypeKTable[];
  static const KTableEntry kSpeakKTable[];
  static const KTableEntry kSpeakHeaderKTable[];
  static const KTableEntry kSpeakNumeralKTable[];
  static const KTableEntry kSpeakPunctuationKTable[];
  static const KTableEntry kSpeechRateKTable[];
  static const KTableEntry kStackSizingKTable[];
  static const KTableEntry kTableLayoutKTable[];


  static KTableEntry kTextAlignKTable[];
  static KTableEntry kTextAlignLastKTable[];
  static const KTableEntry kTextCombineUprightKTable[];
  static const KTableEntry kTextDecorationLineKTable[];
  static const KTableEntry kTextDecorationStyleKTable[];
  static const KTableEntry kTextEmphasisPositionKTable[];
  static const KTableEntry kTextEmphasisStyleFillKTable[];
  static const KTableEntry kTextEmphasisStyleShapeKTable[];
  static const KTableEntry kTextJustifyKTable[];
  static const KTableEntry kTextOrientationKTable[];
  static const KTableEntry kTextOverflowKTable[];
  static const KTableEntry kTextSizeAdjustKTable[];
  static const KTableEntry kTextTransformKTable[];
  static const KTableEntry kTouchActionKTable[];
  static const KTableEntry kTopLayerKTable[];
  static const KTableEntry kTransformBoxKTable[];
  static const KTableEntry kTransitionTimingFunctionKTable[];
  static const KTableEntry kUnicodeBidiKTable[];
  static const KTableEntry kUserFocusKTable[];
  static const KTableEntry kUserInputKTable[];
  static const KTableEntry kUserModifyKTable[];
  static const KTableEntry kUserSelectKTable[];
  static const KTableEntry kVerticalAlignKTable[];
  static const KTableEntry kVisibilityKTable[];
  static const KTableEntry kVolumeKTable[];
  static const KTableEntry kWhitespaceKTable[];
  static const KTableEntry kWidthKTable[];
  static const KTableEntry kWindowDraggingKTable[];
  static const KTableEntry kWindowShadowKTable[];
  static const KTableEntry kWordBreakKTable[];
  static const KTableEntry kWritingModeKTable[];
};
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsProxyRelease.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsProxyRelease.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SystemGroup.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SystemGroup.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SchedulerGroup.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SchedulerGroup.h"
class nsIEventTarget;
class nsIRunnable;

namespace mozilla {
class AbstractThread;
namespace dom {
class TabGroup;
}
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SchedulerGroup.h"
class SchedulerGroup
{
public:
  SchedulerGroup();

  public: virtual MozExternalRefCountType AddRef(void) = 0; virtual MozExternalRefCountType Release(void) = 0; public:

  class AutoProcessEvent final {
  public:
    AutoProcessEvent();
    ~AutoProcessEvent();

  private:
    SchedulerGroup* mPrevRunningDispatcher;
  };


  void ValidateAccess() const
  {
    do { } while (0);
  }

  class Runnable;
  friend class Runnable;

  bool* GetValidAccessPtr() { return &mAccessValid; }

  virtual nsresult Dispatch(const char* aName,
                            TaskCategory aCategory,
                            already_AddRefed<nsIRunnable>&& aRunnable);

  virtual nsIEventTarget* EventTargetFor(TaskCategory aCategory) const;



  AbstractThread* AbstractMainThreadFor(TaskCategory aCategory);



  virtual dom::TabGroup* AsTabGroup() { return nullptr; }

  static nsresult UnlabeledDispatch(const char* aName,
                                    TaskCategory aCategory,
                                    already_AddRefed<nsIRunnable>&& aRunnable);

protected:


  virtual AbstractThread* AbstractMainThreadForImpl(TaskCategory aCategory);


  virtual already_AddRefed<nsIEventTarget>
  CreateEventTargetFor(TaskCategory aCategory);



  static SchedulerGroup* FromEventTarget(nsIEventTarget* aEventTarget);

  nsresult LabeledDispatch(const char* aName,
                           TaskCategory aCategory,
                           already_AddRefed<nsIRunnable>&& aRunnable);

  void CreateEventTargets(bool aNeedValidation);



  void Shutdown(bool aXPCOMShutdown);

  enum ValidationType {
    StartValidation,
    EndValidation,
  };
  void SetValidatingAccess(ValidationType aType);

  static SchedulerGroup* sRunningDispatcher;
  bool mAccessValid;

  nsCOMPtr<nsIEventTarget> mEventTargets[size_t(TaskCategory::Count)];
  RefPtr<AbstractThread> mAbstractThreads[size_t(TaskCategory::Count)];
};

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/SystemGroup.h" 2






namespace mozilla {

class SystemGroup
{
 public:

  static nsresult Dispatch(const char* aName,
                           TaskCategory aCategory,
                           already_AddRefed<nsIRunnable>&& aRunnable);


  static nsIEventTarget* EventTargetFor(TaskCategory aCategory);



  static AbstractThread* AbstractMainThreadFor(TaskCategory aCategory);

  static void InitStatic();
  static void Shutdown();
};

}
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsProxyRelease.h" 2







namespace detail {

template<typename T>
class ProxyReleaseEvent : public mozilla::Runnable
{
public:
  explicit ProxyReleaseEvent(already_AddRefed<T> aDoomed)
  : Runnable("ProxyReleaseEvent"), mDoomed(aDoomed.take()) {}

  virtual nsresult Run() override
  {
    do { if (mDoomed) { (mDoomed)->Release(); (mDoomed) = 0; } } while (0);
    return NS_OK;
  }

private:
  T* mDoomed;
};

template<typename T>
void
ProxyRelease(nsIEventTarget* aTarget, already_AddRefed<T> aDoomed, bool aAlwaysProxy)
{

  RefPtr<T> doomed = aDoomed;
  nsresult rv;

  if (!doomed || !aTarget) {
    return;
  }

  if (!aAlwaysProxy) {
    bool onCurrentThread = false;
    rv = aTarget->IsOnCurrentThread(&onCurrentThread);
    if (((bool)(__builtin_expect(!!(!NS_FAILED_impl(rv)), 1))) && onCurrentThread) {
      return;
    }
  }

  nsCOMPtr<nsIRunnable> ev = new ProxyReleaseEvent<T>(doomed.forget());

  rv = aTarget->Dispatch(ev, nsIEventTarget::DISPATCH_NORMAL);
  if (((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
    do { } while(0);


  }
}

template<bool nsISupportsBased>
struct ProxyReleaseChooser
{
  template<typename T>
  static void ProxyRelease(nsIEventTarget* aTarget,
                           already_AddRefed<T> aDoomed,
                           bool aAlwaysProxy)
  {
    ::detail::ProxyRelease(aTarget, mozilla::Move(aDoomed), aAlwaysProxy);
  }
};

template<>
struct ProxyReleaseChooser<true>
{


  template<typename T>
  static void ProxyRelease(nsIEventTarget* aTarget,
                           already_AddRefed<T> aDoomed,
                           bool aAlwaysProxy)
  {
    ProxyReleaseISupports(aTarget, ToSupports(aDoomed.take()), aAlwaysProxy);
  }

  static void ProxyReleaseISupports(nsIEventTarget* aTarget,
                                    nsISupports* aDoomed,
                                    bool aAlwaysProxy);
};

}
# 120 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsProxyRelease.h"
template<class T>
inline __attribute__ ((visibility ("hidden"))) void
NS_ProxyRelease(nsIEventTarget* aTarget, already_AddRefed<T> aDoomed,
                bool aAlwaysProxy = false)
{
  ::detail::ProxyReleaseChooser<mozilla::IsBaseOf<nsISupports, T>::value>
    ::ProxyRelease(aTarget, mozilla::Move(aDoomed), aAlwaysProxy);
}
# 140 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsProxyRelease.h"
template<class T>
inline __attribute__ ((visibility ("hidden"))) void
NS_ReleaseOnMainThread(already_AddRefed<T> aDoomed,
                       bool aAlwaysProxy = false)
{



  nsCOMPtr<nsIThread> mainThread;
  if (!NS_IsMainThread() || aAlwaysProxy) {
    nsresult rv = NS_GetMainThread(getter_AddRefs(mainThread));

    if (((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
      do { } while (0);
      mozilla::Unused << aDoomed.take();
      return;
    }
  }

  NS_ProxyRelease(mainThread, mozilla::Move(aDoomed), aAlwaysProxy);
}





template<class T>
inline __attribute__ ((visibility ("hidden"))) void
NS_ReleaseOnMainThreadSystemGroup(already_AddRefed<T> aDoomed,
                                  bool aAlwaysProxy = false)
{



  nsCOMPtr<nsIEventTarget> systemGroupEventTarget;
  if (!NS_IsMainThread() || aAlwaysProxy) {
    systemGroupEventTarget = mozilla::SystemGroup::EventTargetFor(mozilla::TaskCategory::Other);

    if (!systemGroupEventTarget) {
      do { } while (0);
      mozilla::Unused << aDoomed.take();
      return;
    }
  }

  NS_ProxyRelease(systemGroupEventTarget, mozilla::Move(aDoomed), aAlwaysProxy);
}
# 226 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsProxyRelease.h"
template<class T>
class nsMainThreadPtrHolder final
{
public:





  explicit nsMainThreadPtrHolder(T* aPtr, bool aStrict = true)
    : mRawPtr(nullptr)
    , mStrict(aStrict)
  {


    do { } while (0);
    ns_if_addref(mRawPtr = aPtr);
  }
  explicit nsMainThreadPtrHolder(already_AddRefed<T> aPtr, bool aString = true)
    : mRawPtr(aPtr.take())
    , mStrict(aString)
  {


  }

private:

  ~nsMainThreadPtrHolder()
  {
    if (NS_IsMainThread()) {
      do { if (mRawPtr) { (mRawPtr)->Release(); (mRawPtr) = 0; } } while (0);
    } else if (mRawPtr) {
      NS_ReleaseOnMainThread(dont_AddRef(mRawPtr));
    }
  }

public:
  T* get()
  {

    if (mStrict && (__builtin_expect(!!(!NS_IsMainThread()), 0))) {
      do { } while(0);
      do { AnnotateMozCrashReason("MOZ_CRASH(" ")"); do { *((volatile int*) __null) = 269; ::abort(); } while (0); } while (0);
    }
    return mRawPtr;
  }

  bool operator==(const nsMainThreadPtrHolder<T>& aOther) const
  {
    return mRawPtr == aOther.mRawPtr;
  }
  bool operator!() const
  {
    return !mRawPtr;
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsMainThreadPtrHolder<T> >::value, "Reference-counted class " "nsMainThreadPtrHolder<T>" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:

private:

  T* mRawPtr;


  bool mStrict;



  T& operator=(nsMainThreadPtrHolder& aOther);
  nsMainThreadPtrHolder(const nsMainThreadPtrHolder& aOther);
};

template<class T>
class nsMainThreadPtrHandle
{
  RefPtr<nsMainThreadPtrHolder<T>> mPtr;

public:
  nsMainThreadPtrHandle() : mPtr(nullptr) {}
               nsMainThreadPtrHandle(decltype(nullptr)) : mPtr(nullptr) {}
  explicit nsMainThreadPtrHandle(nsMainThreadPtrHolder<T>* aHolder)
    : mPtr(aHolder)
  {
  }
  explicit nsMainThreadPtrHandle(
      already_AddRefed<nsMainThreadPtrHolder<T>> aHolder)
    : mPtr(aHolder)
  {
  }
  nsMainThreadPtrHandle(const nsMainThreadPtrHandle& aOther)
    : mPtr(aOther.mPtr)
  {
  }
  nsMainThreadPtrHandle& operator=(const nsMainThreadPtrHandle& aOther)
  {
    mPtr = aOther.mPtr;
    return *this;
  }
  nsMainThreadPtrHandle& operator=(nsMainThreadPtrHolder<T>* aHolder)
  {
    mPtr = aHolder;
    return *this;
  }




  T* get()
  {
    if (mPtr) {
      return mPtr.get()->get();
    }
    return nullptr;
  }
  const T* get() const
  {
    if (mPtr) {
      return mPtr.get()->get();
    }
    return nullptr;
  }

  operator T*() { return get(); }
  T* operator->() { return get(); }


  bool operator==(const nsMainThreadPtrHandle<T>& aOther) const
  {
    if (!mPtr || !aOther.mPtr) {
      return mPtr == aOther.mPtr;
    }
    return *mPtr == *aOther.mPtr;
  }
  bool operator!=(const nsMainThreadPtrHandle<T>& aOther) const
  {
    return !operator==(aOther);
  }
  bool operator==(decltype(nullptr)) const { return mPtr == nullptr; }
  bool operator!=(decltype(nullptr)) const { return mPtr != nullptr; }
  bool operator!() const {
    return !mPtr || !*mPtr;
  }
};

namespace mozilla {

template<typename T>
using PtrHolder = nsMainThreadPtrHolder<T>;

template<typename T>
using PtrHandle = nsMainThreadPtrHandle<T>;

}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h" 2
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
class imgRequestProxy;
class nsIAtom;
class nsIContent;
class nsIDocument;
class nsIPrincipal;
class nsIURI;
class nsPresContext;
template <class T>
class nsPtrHashKey;

namespace mozilla {
class CSSStyleSheet;
}
# 91 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
namespace mozilla {
namespace css {

struct URLValueData
{
protected:
# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
  URLValueData(const nsAString& aString,
               already_AddRefed<URLExtraData> aExtraData);

  URLValueData(already_AddRefed<PtrHolder<nsIURI>> aURI,
               const nsAString& aString,
               already_AddRefed<URLExtraData> aExtraData);

public:




  bool Equals(const URLValueData& aOther) const;
# 126 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
  bool DefinitelyEqualURIs(const URLValueData& aOther) const;



  bool DefinitelyEqualURIsAndPrincipal(const URLValueData& aOther) const;

  nsIURI* GetURI() const;

  bool IsLocalRef() const;

  bool HasRef() const;







  bool MightHaveRef() const;

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<URLValueData>::value, "Reference-counted class " "URLValueData" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:



  already_AddRefed<nsIURI> ResolveLocalRef(nsIURI* aURI) const;
  already_AddRefed<nsIURI> ResolveLocalRef(nsIContent* aContent) const;



  void GetSourceString(nsString& aRef) const;

  bool EqualsExceptRef(nsIURI* aURI) const;

private:


  mutable PtrHandle<nsIURI> mURI;
public:
  nsString mString;
  RefPtr<URLExtraData> mExtraData;
private:
  mutable bool mURIResolved;

  mutable Maybe<bool> mIsLocalRef;
  mutable Maybe<bool> mMightHaveRef;

protected:
  virtual ~URLValueData() = default;

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:
  URLValueData(const URLValueData& aOther) = delete;
  URLValueData& operator=(const URLValueData& aOther) = delete;
};

struct URLValue final : public URLValueData
{

  URLValue(const nsAString& aString, nsIURI* aBaseURI, nsIURI* aReferrer,
           nsIPrincipal* aOriginPrincipal);
  URLValue(nsIURI* aURI, const nsAString& aString, nsIURI* aBaseURI,
           nsIURI* aReferrer, nsIPrincipal* aOriginPrincipal);


  URLValue(const nsAString& aString,
           already_AddRefed<URLExtraData> aExtraData)
    : URLValueData(aString, Move(aExtraData)) {}

  URLValue(const URLValue&) = delete;
  URLValue& operator=(const URLValue&) = delete;

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
};

struct ImageValue final : public URLValueData
{





  ImageValue(nsIURI* aURI, const nsAString& aString,
             already_AddRefed<URLExtraData> aExtraData,
             nsIDocument* aDocument);



  ImageValue(const nsAString& aString,
             already_AddRefed<URLExtraData> aExtraData);

  ImageValue(const ImageValue&) = delete;
  ImageValue& operator=(const ImageValue&) = delete;

  void Initialize(nsIDocument* aDocument);



protected:
  ~ImageValue();

public:


  nsRefPtrHashtable<nsPtrHashKey<nsIDocument>, imgRequestProxy> mRequests;

private:



};

struct GridNamedArea {
  nsString mName;
  uint32_t mColumnStart;
  uint32_t mColumnEnd;
  uint32_t mRowStart;
  uint32_t mRowEnd;
};

struct GridTemplateAreasValue final {

  nsTArray<GridNamedArea> mNamedAreas;



  nsTArray<nsString> mTemplates;



  uint32_t mNColumns;



  uint32_t NRows() const {
    return mTemplates.Length();
  }

  GridTemplateAreasValue()
    : mNColumns(0)

  {
  }

  bool operator==(const GridTemplateAreasValue& aOther) const
  {
    return mTemplates == aOther.mTemplates;
  }

  bool operator!=(const GridTemplateAreasValue& aOther) const
  {
    return !(*this == aOther);
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<GridTemplateAreasValue>::value, "Reference-counted class " "GridTemplateAreasValue" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:


  ~GridTemplateAreasValue()
  {
  }

  GridTemplateAreasValue(const GridTemplateAreasValue& aOther) = delete;
  GridTemplateAreasValue&
  operator=(const GridTemplateAreasValue& aOther) = delete;
};

class FontFamilyListRefCnt final : public FontFamilyList {
public:
    FontFamilyListRefCnt()
        : FontFamilyList()
    {}

    explicit FontFamilyListRefCnt(FontFamilyType aGenericType)
        : FontFamilyList(aGenericType)
    {}

    FontFamilyListRefCnt(const nsAString& aFamilyName,
                         QuotedName aQuoted)
        : FontFamilyList(aFamilyName, aQuoted)
    {}

    FontFamilyListRefCnt(const FontFamilyListRefCnt& aOther)
        : FontFamilyList(aOther)
    {}

    public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<FontFamilyListRefCnt>::value, "Reference-counted class " "FontFamilyListRefCnt" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:;

private:
    ~FontFamilyListRefCnt() {}
};

struct RGBAColorData
{



  float mR;
  float mG;
  float mB;
  float mA;

  RGBAColorData() = default;
               RGBAColorData(nscolor aColor)
    : mR(((uint8_t) ((aColor) & 0xff)) * (1.0f / 255.0f))
    , mG(((uint8_t) (((aColor) >> 8) & 0xff)) * (1.0f / 255.0f))
    , mB(((uint8_t) (((aColor) >> 16) & 0xff)) * (1.0f / 255.0f))
    , mA(((uint8_t) (((aColor) >> 24) & 0xff)) * (1.0f / 255.0f))
  {}
  RGBAColorData(float aR, float aG, float aB, float aA)
    : mR(aR), mG(aG), mB(aB), mA(aA) {}

  bool operator==(const RGBAColorData& aOther) const
  {
    return mR == aOther.mR && mG == aOther.mG &&
           mB == aOther.mB && mA == aOther.mA;
  }
  bool operator!=(const RGBAColorData& aOther) const
  {
    return !(*this == aOther);
  }

  nscolor ToColor() const
  {
    return ((nscolor) (((ClampColor(mA * 255.0f)) << 24) | ((ClampColor(mB * 255.0f))<<16) | ((ClampColor(mG * 255.0f))<<8) | (ClampColor(mR * 255.0f))));



  }

  RGBAColorData WithAlpha(float aAlpha) const
  {
    RGBAColorData result = *this;
    result.mA = aAlpha;
    return result;
  }
};

struct ComplexColorData
{
  RGBAColorData mColor;
  float mForegroundRatio;

  ComplexColorData() = default;
  ComplexColorData(const RGBAColorData& aColor, float aForegroundRatio)
    : mColor(aColor), mForegroundRatio(aForegroundRatio) {}
  ComplexColorData(nscolor aColor, float aForegroundRatio)
    : mColor(aColor), mForegroundRatio(aForegroundRatio) {}
  explicit ComplexColorData(const StyleComplexColor& aColor)
    : mColor(aColor.mColor)
    , mForegroundRatio(aColor.mForegroundRatio * (1.0f / 255.0f)) {}

  bool operator==(const ComplexColorData& aOther) const
  {
    return mForegroundRatio == aOther.mForegroundRatio &&
           (IsCurrentColor() || mColor == aOther.mColor);
  }
  bool operator!=(const ComplexColorData& aOther) const
  {
    return !(*this == aOther);
  }

  bool IsCurrentColor() const { return mForegroundRatio >= 1.0f; }
  bool IsNumericColor() const { return mForegroundRatio <= 0.0f; }

  StyleComplexColor ToComplexColor() const
  {
    return {mColor.ToColor(), ClampColor(mForegroundRatio * 255.0f)};
  }
};

struct ComplexColorValue final : public ComplexColorData
{

  template<typename... Args>
  explicit ComplexColorValue(Args&&... aArgs)
    : ComplexColorData(Forward<Args>(aArgs)...) {}
  ComplexColorValue(const ComplexColorValue&) = delete;

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<ComplexColorValue>::value, "Reference-counted class " "ComplexColorValue" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;

private:
  ~ComplexColorValue() {}
};

}
}

enum nsCSSUnit {
  eCSSUnit_Null = 0,
  eCSSUnit_Auto = 1,
  eCSSUnit_Inherit = 2,
  eCSSUnit_Initial = 3,
  eCSSUnit_Unset = 4,
  eCSSUnit_None = 5,
  eCSSUnit_Normal = 6,
  eCSSUnit_System_Font = 7,
  eCSSUnit_All = 8,
  eCSSUnit_Dummy = 9,

  eCSSUnit_DummyInherit = 10,


  eCSSUnit_String = 11,
  eCSSUnit_Ident = 12,
  eCSSUnit_Attr = 14,
  eCSSUnit_Local_Font = 15,
  eCSSUnit_Font_Format = 16,
  eCSSUnit_Element = 17,

  eCSSUnit_Array = 20,
  eCSSUnit_Counter = 21,
  eCSSUnit_Counters = 22,
  eCSSUnit_Cubic_Bezier = 23,
  eCSSUnit_Steps = 24,
  eCSSUnit_Symbols = 25,
  eCSSUnit_Function = 26,
# 460 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
  eCSSUnit_Calc = 30,


  eCSSUnit_Calc_Plus = 31,
  eCSSUnit_Calc_Minus = 32,
  eCSSUnit_Calc_Times_L = 33,
  eCSSUnit_Calc_Times_R = 34,
  eCSSUnit_Calc_Divided = 35,

  eCSSUnit_URL = 40,
  eCSSUnit_Image = 41,
  eCSSUnit_Gradient = 42,
  eCSSUnit_TokenStream = 43,
  eCSSUnit_GridTemplateAreas = 44,


  eCSSUnit_Pair = 50,
  eCSSUnit_Triplet = 51,
  eCSSUnit_Rect = 52,
  eCSSUnit_List = 53,
  eCSSUnit_ListDep = 54,

  eCSSUnit_SharedList = 55,

  eCSSUnit_PairList = 56,
  eCSSUnit_PairListDep = 57,


  eCSSUnit_FontFamilyList = 58,


  eCSSUnit_AtomIdent = 60,

  eCSSUnit_Integer = 70,
  eCSSUnit_Enumerated = 71,

  eCSSUnit_EnumColor = 80,
  eCSSUnit_RGBColor = 81,
  eCSSUnit_RGBAColor = 82,
  eCSSUnit_HexColor = 83,
  eCSSUnit_ShortHexColor = 84,
  eCSSUnit_HexColorAlpha = 85,
  eCSSUnit_ShortHexColorAlpha = 86,
  eCSSUnit_PercentageRGBColor = 87,



  eCSSUnit_PercentageRGBAColor = 88,



  eCSSUnit_HSLColor = 89,
  eCSSUnit_HSLAColor = 90,
  eCSSUnit_ComplexColor = 91,

  eCSSUnit_Percent = 100,
  eCSSUnit_Number = 101,


  eCSSUnit_PhysicalMillimeter = 200,



  eCSSUnit_ViewportWidth = 700,
  eCSSUnit_ViewportHeight = 701,
  eCSSUnit_ViewportMin = 702,
  eCSSUnit_ViewportMax = 703,


  eCSSUnit_EM = 800,
  eCSSUnit_XHeight = 801,
  eCSSUnit_Char = 802,
  eCSSUnit_RootEM = 803,


  eCSSUnit_Point = 900,
  eCSSUnit_Inch = 901,
  eCSSUnit_Millimeter = 902,
  eCSSUnit_Centimeter = 903,
  eCSSUnit_Pica = 904,
  eCSSUnit_Quarter = 905,
  eCSSUnit_Pixel = 906,


  eCSSUnit_Degree = 1000,
  eCSSUnit_Grad = 1001,
  eCSSUnit_Radian = 1002,
  eCSSUnit_Turn = 1003,


  eCSSUnit_Hertz = 2000,
  eCSSUnit_Kilohertz = 2001,


  eCSSUnit_Seconds = 3000,
  eCSSUnit_Milliseconds = 3001,


  eCSSUnit_FlexFraction = 4000
};

struct nsCSSValueGradient;
struct nsCSSValuePair;
struct nsCSSValuePair_heap;
struct nsCSSValueTokenStream;
struct nsCSSRect;
struct nsCSSRect_heap;
struct nsCSSValueList;
struct nsCSSValueList_heap;
struct nsCSSValueSharedList;
struct nsCSSValuePairList;
struct nsCSSValuePairList_heap;
struct nsCSSValueTriplet;
struct nsCSSValueTriplet_heap;
class nsCSSValueFloatColor;

class nsCSSValue {
public:
  struct Array;
  friend struct Array;

  friend struct mozilla::css::URLValueData;

  friend struct mozilla::css::ImageValue;


  explicit nsCSSValue(nsCSSUnit aUnit = eCSSUnit_Null)
    : mUnit(aUnit)
  {
    do { } while (0);
  }

  nsCSSValue(int32_t aValue, nsCSSUnit aUnit);
  nsCSSValue(float aValue, nsCSSUnit aUnit);
  nsCSSValue(const nsString& aValue, nsCSSUnit aUnit);
  nsCSSValue(Array* aArray, nsCSSUnit aUnit);
  explicit nsCSSValue(mozilla::css::URLValue* aValue);
  explicit nsCSSValue(mozilla::css::ImageValue* aValue);
  explicit nsCSSValue(nsCSSValueGradient* aValue);
  explicit nsCSSValue(nsCSSValueTokenStream* aValue);
  explicit nsCSSValue(mozilla::css::GridTemplateAreasValue* aValue);
  explicit nsCSSValue(mozilla::css::FontFamilyListRefCnt* aValue);
  nsCSSValue(const nsCSSValue& aCopy);
  nsCSSValue(nsCSSValue&& aOther)
    : mUnit(aOther.mUnit)
    , mValue(aOther.mValue)
  {
    aOther.mUnit = eCSSUnit_Null;
  }
  ~nsCSSValue() { Reset(); }

  nsCSSValue& operator=(const nsCSSValue& aCopy);
  nsCSSValue& operator=(nsCSSValue&& aCopy);
  bool operator==(const nsCSSValue& aOther) const;

  bool operator!=(const nsCSSValue& aOther) const
  {
    return !(*this == aOther);
  }


  enum Serialization { eNormalized, eAuthorSpecified };





  void AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
                      Serialization aValueSerialization) const;

  nsCSSUnit GetUnit() const { return mUnit; }
  bool IsLengthUnit() const
    { return eCSSUnit_PhysicalMillimeter <= mUnit && mUnit <= eCSSUnit_Pixel; }
  bool IsLengthPercentCalcUnit() const
    { return IsLengthUnit() || mUnit == eCSSUnit_Percent || IsCalcUnit(); }





  bool IsFixedLengthUnit() const
    { return mUnit == eCSSUnit_PhysicalMillimeter; }
# 651 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
  bool IsRelativeLengthUnit() const
    { return eCSSUnit_EM <= mUnit && mUnit <= eCSSUnit_RootEM; }



  static bool IsPixelLengthUnit(nsCSSUnit aUnit)
    { return eCSSUnit_Point <= aUnit && aUnit <= eCSSUnit_Pixel; }
  bool IsPixelLengthUnit() const
    { return IsPixelLengthUnit(mUnit); }
  static bool IsPercentLengthUnit(nsCSSUnit aUnit)
    { return aUnit == eCSSUnit_Percent; }
  bool IsPercentLengthUnit()
    { return IsPercentLengthUnit(mUnit); }
  static bool IsFloatUnit(nsCSSUnit aUnit)
    { return eCSSUnit_Number <= aUnit; }
  bool IsAngularUnit() const
    { return eCSSUnit_Degree <= mUnit && mUnit <= eCSSUnit_Turn; }
  bool IsFrequencyUnit() const
    { return eCSSUnit_Hertz <= mUnit && mUnit <= eCSSUnit_Kilohertz; }
  bool IsTimeUnit() const
    { return eCSSUnit_Seconds <= mUnit && mUnit <= eCSSUnit_Milliseconds; }
  bool IsCalcUnit() const
    { return eCSSUnit_Calc <= mUnit && mUnit <= eCSSUnit_Calc_Divided; }

  bool UnitHasStringValue() const
    { return eCSSUnit_String <= mUnit && mUnit <= eCSSUnit_Element; }
  bool UnitHasArrayValue() const
    { return eCSSUnit_Array <= mUnit && mUnit <= eCSSUnit_Calc_Divided; }
# 700 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
  bool IsIntegerColorUnit() const { return IsIntegerColorUnit(mUnit); }
  bool IsFloatColorUnit() const { return IsFloatColorUnit(mUnit); }
  bool IsNumericColorUnit() const { return IsNumericColorUnit(mUnit); }
  static bool IsIntegerColorUnit(nsCSSUnit aUnit)
  { return eCSSUnit_RGBColor <= aUnit && aUnit <= eCSSUnit_ShortHexColorAlpha; }
  static bool IsFloatColorUnit(nsCSSUnit aUnit)
  { return eCSSUnit_PercentageRGBColor <= aUnit &&
           aUnit <= eCSSUnit_HSLAColor; }
  static bool IsNumericColorUnit(nsCSSUnit aUnit)
  { return IsIntegerColorUnit(aUnit) || IsFloatColorUnit(aUnit); }

  int32_t GetIntValue() const
  {
    do { } while (0);



    return mValue.mInt;
  }

  nsCSSKeyword GetKeywordValue() const
  {
    do { } while (0);
    return static_cast<nsCSSKeyword>(mValue.mInt);
  }

  float GetPercentValue() const
  {
    do { } while (0);
    return mValue.mFloat;
  }

  float GetFloatValue() const
  {
    do { } while (0);
    do { } while (0);
    return mValue.mFloat;
  }

  float GetAngleValue() const
  {
    do { } while (0);

    return mValue.mFloat;
  }


  double GetAngleValueInRadians() const;


  double GetAngleValueInDegrees() const;

  nsAString& GetStringValue(nsAString& aBuffer) const
  {
    do { } while (0);
    aBuffer.Truncate();
    uint32_t len = NS_strlen(GetBufferValue(mValue.mString));
    mValue.mString->ToString(len, aBuffer);
    return aBuffer;
  }

  const char16_t* GetStringBufferValue() const
  {
    do { } while (0);
    return GetBufferValue(mValue.mString);
  }

  nscolor GetColorValue() const;
  bool IsNonTransparentColor() const;
  mozilla::StyleComplexColor GetStyleComplexColorValue() const
  {
    do { } while (0);
    return mValue.mComplexColor->ToComplexColor();
  }

  Array* GetArrayValue() const
  {
    do { } while (0);
    return mValue.mArray;
  }

  nsIURI* GetURLValue() const
  {
    do { } while (0);

    return mUnit == eCSSUnit_URL ?
      mValue.mURL->GetURI() : mValue.mImage->GetURI();
  }

  nsCSSValueGradient* GetGradientValue() const
  {
    do { } while (0);
    return mValue.mGradient;
  }

  nsCSSValueTokenStream* GetTokenStreamValue() const
  {
    do { } while (0);
    return mValue.mTokenStream;
  }

  nsCSSValueSharedList* GetSharedListValue() const
  {
    do { } while (0);
    return mValue.mSharedList;
  }

  mozilla::FontFamilyList* GetFontFamilyListValue() const
  {
    do { } while (0);

    do { } while(0);

    return mValue.mFontFamilyList;
  }


  inline nsCSSValuePair& GetPairValue();
  inline const nsCSSValuePair& GetPairValue() const;

  inline nsCSSRect& GetRectValue();
  inline const nsCSSRect& GetRectValue() const;

  inline nsCSSValueList* GetListValue();
  inline const nsCSSValueList* GetListValue() const;

  inline nsCSSValuePairList* GetPairListValue();
  inline const nsCSSValuePairList* GetPairListValue() const;

  inline nsCSSValueTriplet& GetTripletValue();
  inline const nsCSSValueTriplet& GetTripletValue() const;


  mozilla::css::URLValue* GetURLStructValue() const
  {


    do { } while (0);
    return mValue.mURL;
  }

  mozilla::css::ImageValue* GetImageStructValue() const
  {
    do { } while (0);
    return mValue.mImage;
  }

  mozilla::css::GridTemplateAreasValue* GetGridTemplateAreas() const
  {
    do { } while (0);

    return mValue.mGridTemplateAreas;
  }

  const char16_t* GetOriginalURLValue() const
  {
    do { } while (0);

    return mUnit == eCSSUnit_URL ?
             mValue.mURL->mString.get() :
             mValue.mImage->mString.get();
  }




  imgRequestProxy* GetImageValue(nsIDocument* aDocument) const;



  already_AddRefed<imgRequestProxy> GetPossiblyStaticImageValue(
      nsIDocument* aDocument, nsPresContext* aPresContext) const;

  nscoord GetFixedLength(nsPresContext* aPresContext) const;
  nscoord GetPixelLength() const;

  nsCSSValueFloatColor* GetFloatColorValue() const
  {
    do { } while (0);
    return mValue.mFloatColor;
  }

  nsIAtom* GetAtomValue() const {
    do { } while (0);
    return mValue.mAtom;
  }

  void Reset()
  {
    if (mUnit != eCSSUnit_Null)
      DoReset();
  }
private:
  void DoReset();

public:
  void SetIntValue(int32_t aValue, nsCSSUnit aUnit);
  template<typename T,
           typename = typename std::enable_if<std::is_enum<T>::value>::type>
  void SetEnumValue(T aValue)
  {
    static_assert(mozilla::EnumTypeFitsWithin<T, int32_t>::value,
                  "aValue must be an enum that fits within mValue.mInt");
    SetIntValue(static_cast<int32_t>(aValue), eCSSUnit_Enumerated);
  }
  void SetPercentValue(float aValue);
  void SetFloatValue(float aValue, nsCSSUnit aUnit);
  void SetStringValue(const nsString& aValue, nsCSSUnit aUnit);
  void SetColorValue(nscolor aValue);
  void SetIntegerColorValue(nscolor aValue, nsCSSUnit aUnit);

  void SetIntegerCoordValue(nscoord aCoord);
  void SetFloatColorValue(float aComponent1,
                          float aComponent2,
                          float aComponent3,
                          float aAlpha, nsCSSUnit aUnit);
  void SetRGBAColorValue(const mozilla::css::RGBAColorData& aValue);
  void SetComplexColorValue(
    already_AddRefed<mozilla::css::ComplexColorValue> aValue);
  void SetArrayValue(nsCSSValue::Array* aArray, nsCSSUnit aUnit);
  void SetURLValue(mozilla::css::URLValue* aURI);
  void SetImageValue(mozilla::css::ImageValue* aImage);
  void SetGradientValue(nsCSSValueGradient* aGradient);
  void SetTokenStreamValue(nsCSSValueTokenStream* aTokenStream);
  void SetGridTemplateAreas(mozilla::css::GridTemplateAreasValue* aValue);
  void SetFontFamilyListValue(mozilla::css::FontFamilyListRefCnt* aFontListValue);
  void SetPairValue(const nsCSSValuePair* aPair);
  void SetPairValue(const nsCSSValue& xValue, const nsCSSValue& yValue);
  void SetSharedListValue(nsCSSValueSharedList* aList);
  void SetDependentListValue(nsCSSValueList* aList);
  void SetDependentPairListValue(nsCSSValuePairList* aList);
  void SetTripletValue(const nsCSSValueTriplet* aTriplet);
  void SetTripletValue(const nsCSSValue& xValue, const nsCSSValue& yValue, const nsCSSValue& zValue);
  void SetAutoValue();
  void SetInheritValue();
  void SetInitialValue();
  void SetUnsetValue();
  void SetNoneValue();
  void SetAllValue();
  void SetNormalValue();
  void SetSystemFontValue();
  void SetDummyValue();
  void SetDummyInheritValue();


  void SetCalcValue(const nsStyleCoord::CalcValue* aCalc);

  nsStyleCoord::CalcValue GetCalcValue() const;



  nsCSSRect& SetRectValue();
  nsCSSValueList* SetListValue();
  nsCSSValuePairList* SetPairListValue();


  void AdoptListValue(mozilla::UniquePtr<nsCSSValueList> aValue);
  void AdoptPairListValue(mozilla::UniquePtr<nsCSSValuePairList> aValue);

  void StartImageLoad(nsIDocument* aDocument) const;


  Array* InitFunction(nsCSSKeyword aFunctionId, uint32_t aNumArgs);

  bool EqualsFunction(nsCSSKeyword aFunctionId) const;



  static already_AddRefed<nsStringBuffer>
    BufferFromString(const nsString& aValue);


  void AtomizeIdentValue();

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

  static void
  AppendSidesShorthandToString(const nsCSSPropertyID aProperties[],
                               const nsCSSValue* aValues[],
                               nsAString& aString,
                               Serialization aSerialization);
  static void
  AppendBasicShapeRadiusToString(const nsCSSPropertyID aProperties[],
                                 const nsCSSValue* aValues[],
                                 nsAString& aResult,
                                 Serialization aValueSerialization);
  static void
  AppendAlignJustifyValueToString(int32_t aValue, nsAString& aResult);

private:
  static const char16_t* GetBufferValue(nsStringBuffer* aBuffer) {
    return static_cast<char16_t*>(aBuffer->Data());
  }

  void AppendPolygonToString(nsCSSPropertyID aProperty, nsAString& aResult,
                             Serialization aValueSerialization) const;
  void AppendPositionCoordinateToString(const nsCSSValue& aValue,
                                        nsCSSPropertyID aProperty,
                                        nsAString& aResult,
                                        Serialization aSerialization) const;
  void AppendCircleOrEllipseToString(
           nsCSSKeyword aFunctionId,
           nsCSSPropertyID aProperty, nsAString& aResult,
           Serialization aValueSerialization) const;
  void AppendBasicShapePositionToString(
           nsAString& aResult,
           Serialization aValueSerialization) const;
  void AppendInsetToString(nsCSSPropertyID aProperty, nsAString& aResult,
                           Serialization aValueSerialization) const;
protected:
  nsCSSUnit mUnit;
  union {
    int32_t mInt;
    float mFloat;


    nsStringBuffer* mString;
    nscolor mColor;
    nsIAtom* mAtom;
    Array* mArray;
    mozilla::css::URLValue* mURL;
    mozilla::css::ImageValue* mImage;
    mozilla::css::GridTemplateAreasValue* mGridTemplateAreas;
    nsCSSValueGradient* mGradient;
    nsCSSValueTokenStream* mTokenStream;
    nsCSSValuePair_heap* mPair;
    nsCSSRect_heap* mRect;
    nsCSSValueTriplet_heap* mTriplet;
    nsCSSValueList_heap* mList;
    nsCSSValueList* mListDependent;
    nsCSSValueSharedList* mSharedList;
    nsCSSValuePairList_heap* mPairList;
    nsCSSValuePairList* mPairListDependent;
    nsCSSValueFloatColor* mFloatColor;
    mozilla::css::FontFamilyListRefCnt* mFontFamilyList;
    mozilla::css::ComplexColorValue* mComplexColor;
  } mValue;
};

struct nsCSSValue::Array final {


  static Array* Create(size_t aItemCount) {
    return new (aItemCount) Array(aItemCount);
  }

  nsCSSValue& operator[](size_t aIndex) {
    do { } while (0);
    return mArray[aIndex];
  }

  const nsCSSValue& operator[](size_t aIndex) const {
    do { } while (0);
    return mArray[aIndex];
  }

  nsCSSValue& Item(size_t aIndex) { return (*this)[aIndex]; }
  const nsCSSValue& Item(size_t aIndex) const { return (*this)[aIndex]; }

  size_t Count() const { return mCount; }


  nsCSSValue* ItemStorage() {
    return this->First();
  }

  bool operator==(const Array& aOther) const
  {
    if (mCount != aOther.mCount)
      return false;
    for (size_t i = 0; i < mCount; ++i)
      if ((*this)[i] != aOther[i])
        return false;
    return true;
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<Array>::value, "Reference-counted class " "Array" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:;
private:

  const size_t mCount;



  nsCSSValue mArray[1];

  void* operator new(size_t aSelfSize, size_t aItemCount) throw() {
    do { } while (0);
    return ::operator new(aSelfSize + sizeof(nsCSSValue) * (aItemCount - 1));
  }

  void operator delete(void* aPtr) { ::operator delete(aPtr); }

  nsCSSValue* First() { return mArray; }

  const nsCSSValue* First() const { return mArray; }





  explicit Array(size_t aItemCount)
    : mRefCnt(0)
    , mCount(aItemCount)
  {
    for (nsCSSValue *val = First() + 1, *val_end = First() + mCount; val != val_end; ++val) {
      new (val) nsCSSValue();
    }
  }

  ~Array()
  {
    for (nsCSSValue *val = First() + 1, *val_end = First() + mCount; val != val_end; ++val) {
      val->~nsCSSValue();
    }
  }

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;



private:
  Array(const Array& aOther) = delete;
  Array& operator=(const Array& aOther) = delete;
};


struct nsCSSValueList {
  nsCSSValueList() : mNext(nullptr) { ; }
  ~nsCSSValueList();

  nsCSSValueList* Clone() const;
  void CloneInto(nsCSSValueList* aList) const;
  void AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
                      nsCSSValue::Serialization aValueSerialization) const;

  static bool Equal(const nsCSSValueList* aList1,
                    const nsCSSValueList* aList2);

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

  nsCSSValue mValue;
  nsCSSValueList* mNext;

private:
  nsCSSValueList(const nsCSSValueList& aCopy)
    : mValue(aCopy.mValue), mNext(nullptr)
  {
                                  ;
  }




  bool operator==(nsCSSValueList const& aOther) const = delete;
  bool operator!=(const nsCSSValueList& aOther) const = delete;
};




struct nsCSSValueList_heap final : public nsCSSValueList {
  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValueList_heap>::value, "Reference-counted class " "nsCSSValueList_heap" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:

  ~nsCSSValueList_heap()
  {
  }
};





struct nsCSSValueSharedList final {
  nsCSSValueSharedList()
    : mHead(nullptr)
  {
  }


  explicit nsCSSValueSharedList(nsCSSValueList* aList)
    : mHead(aList)
  {
  }

private:

  ~nsCSSValueSharedList();

public:
  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValueSharedList>::value, "Reference-counted class " "nsCSSValueSharedList" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:

  void AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
                      nsCSSValue::Serialization aValueSerialization) const;

  bool operator==(nsCSSValueSharedList const& aOther) const;
  bool operator!=(const nsCSSValueSharedList& aOther) const
  { return !(*this == aOther); }

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

  nsCSSValueList* mHead;
};



inline nsCSSValueList*
nsCSSValue::GetListValue()
{
  if (mUnit == eCSSUnit_List)
    return mValue.mList;
  else {
    do { } while (0);
    return mValue.mListDependent;
  }
}

inline const nsCSSValueList*
nsCSSValue::GetListValue() const
{
  if (mUnit == eCSSUnit_List)
    return mValue.mList;
  else {
    do { } while (0);
    return mValue.mListDependent;
  }
}

struct nsCSSRect {
  nsCSSRect(void);
  nsCSSRect(const nsCSSRect& aCopy);
  ~nsCSSRect();

  void AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
                      nsCSSValue::Serialization aValueSerialization) const;

  bool operator==(const nsCSSRect& aOther) const {
    return mTop == aOther.mTop &&
           mRight == aOther.mRight &&
           mBottom == aOther.mBottom &&
           mLeft == aOther.mLeft;
  }

  bool operator!=(const nsCSSRect& aOther) const {
    return mTop != aOther.mTop ||
           mRight != aOther.mRight ||
           mBottom != aOther.mBottom ||
           mLeft != aOther.mLeft;
  }

  void SetAllSidesTo(const nsCSSValue& aValue);

  bool AllSidesEqualTo(const nsCSSValue& aValue) const {
    return mTop == aValue &&
           mRight == aValue &&
           mBottom == aValue &&
           mLeft == aValue;
  }

  void Reset() {
    mTop.Reset();
    mRight.Reset();
    mBottom.Reset();
    mLeft.Reset();
  }

  bool HasValue() const {
    return
      mTop.GetUnit() != eCSSUnit_Null ||
      mRight.GetUnit() != eCSSUnit_Null ||
      mBottom.GetUnit() != eCSSUnit_Null ||
      mLeft.GetUnit() != eCSSUnit_Null;
  }

  nsCSSValue mTop;
  nsCSSValue mRight;
  nsCSSValue mBottom;
  nsCSSValue mLeft;

  typedef nsCSSValue nsCSSRect::*side_type;
  static const side_type sides[4];
};




struct nsCSSRect_heap final : public nsCSSRect {
  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSRect_heap>::value, "Reference-counted class " "nsCSSRect_heap" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:

  ~nsCSSRect_heap()
  {
  }
};



inline nsCSSRect&
nsCSSValue::GetRectValue()
{
  do { } while (0);
  return *mValue.mRect;
}

inline const nsCSSRect&
nsCSSValue::GetRectValue() const
{
  do { } while (0);
  return *mValue.mRect;
}

struct nsCSSValuePair {
  nsCSSValuePair()
  {
                                  ;
  }
  explicit nsCSSValuePair(nsCSSUnit aUnit)
    : mXValue(aUnit), mYValue(aUnit)
  {
                                  ;
  }
  nsCSSValuePair(const nsCSSValue& aXValue, const nsCSSValue& aYValue)
    : mXValue(aXValue), mYValue(aYValue)
  {
                                  ;
  }
  nsCSSValuePair(const nsCSSValuePair& aCopy)
    : mXValue(aCopy.mXValue), mYValue(aCopy.mYValue)
  {
                                  ;
  }
  ~nsCSSValuePair()
  {
                                  ;
  }

  nsCSSValuePair& operator=(const nsCSSValuePair& aOther) {
    mXValue = aOther.mXValue;
    mYValue = aOther.mYValue;
    return *this;
  }

  bool operator==(const nsCSSValuePair& aOther) const {
    return mXValue == aOther.mXValue &&
           mYValue == aOther.mYValue;
  }

  bool operator!=(const nsCSSValuePair& aOther) const {
    return mXValue != aOther.mXValue ||
           mYValue != aOther.mYValue;
  }

  bool BothValuesEqualTo(const nsCSSValue& aValue) const {
    return mXValue == aValue &&
           mYValue == aValue;
  }

  void SetBothValuesTo(const nsCSSValue& aValue) {
    mXValue = aValue;
    mYValue = aValue;
  }

  void Reset() {
    mXValue.Reset();
    mYValue.Reset();
  }

  bool HasValue() const {
    return mXValue.GetUnit() != eCSSUnit_Null ||
           mYValue.GetUnit() != eCSSUnit_Null;
  }

  void AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
                      nsCSSValue::Serialization aValueSerialization) const;

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

  nsCSSValue mXValue;
  nsCSSValue mYValue;
};




struct nsCSSValuePair_heap final : public nsCSSValuePair {

  nsCSSValuePair_heap(const nsCSSValue& aXValue, const nsCSSValue& aYValue)
      : nsCSSValuePair(aXValue, aYValue)
  {}

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValuePair_heap>::value, "Reference-counted class " "nsCSSValuePair_heap" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:

  ~nsCSSValuePair_heap()
  {
  }
};

struct nsCSSValueTriplet {
    nsCSSValueTriplet()
    {
                                         ;
    }
    explicit nsCSSValueTriplet(nsCSSUnit aUnit)
        : mXValue(aUnit), mYValue(aUnit), mZValue(aUnit)
    {
                                         ;
    }
    nsCSSValueTriplet(const nsCSSValue& aXValue,
                      const nsCSSValue& aYValue,
                      const nsCSSValue& aZValue)
        : mXValue(aXValue), mYValue(aYValue), mZValue(aZValue)
    {
                                         ;
    }
    nsCSSValueTriplet(const nsCSSValueTriplet& aCopy)
        : mXValue(aCopy.mXValue), mYValue(aCopy.mYValue), mZValue(aCopy.mZValue)
    {
                                         ;
    }
    ~nsCSSValueTriplet()
    {
                                         ;
    }

    bool operator==(const nsCSSValueTriplet& aOther) const {
        return mXValue == aOther.mXValue &&
               mYValue == aOther.mYValue &&
               mZValue == aOther.mZValue;
    }

    bool operator!=(const nsCSSValueTriplet& aOther) const {
        return mXValue != aOther.mXValue ||
               mYValue != aOther.mYValue ||
               mZValue != aOther.mZValue;
    }

    bool AllValuesEqualTo(const nsCSSValue& aValue) const {
        return mXValue == aValue &&
               mYValue == aValue &&
               mZValue == aValue;
    }

    void SetAllValuesTo(const nsCSSValue& aValue) {
        mXValue = aValue;
        mYValue = aValue;
        mZValue = aValue;
    }

    void Reset() {
        mXValue.Reset();
        mYValue.Reset();
        mZValue.Reset();
    }

    bool HasValue() const {
        return mXValue.GetUnit() != eCSSUnit_Null ||
               mYValue.GetUnit() != eCSSUnit_Null ||
               mZValue.GetUnit() != eCSSUnit_Null;
    }

    void AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
                        nsCSSValue::Serialization aValueSerialization) const;

    nsCSSValue mXValue;
    nsCSSValue mYValue;
    nsCSSValue mZValue;
};




struct nsCSSValueTriplet_heap final : public nsCSSValueTriplet {

  nsCSSValueTriplet_heap(const nsCSSValue& aXValue, const nsCSSValue& aYValue, const nsCSSValue& aZValue)
    : nsCSSValueTriplet(aXValue, aYValue, aZValue)
  {}

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValueTriplet_heap>::value, "Reference-counted class " "nsCSSValueTriplet_heap" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:

  ~nsCSSValueTriplet_heap()
  {
  }
};



inline nsCSSValuePair&
nsCSSValue::GetPairValue()
{
  do { } while (0);
  return *mValue.mPair;
}

inline const nsCSSValuePair&
nsCSSValue::GetPairValue() const
{
  do { } while (0);
  return *mValue.mPair;
}

inline nsCSSValueTriplet&
nsCSSValue::GetTripletValue()
{
    do { } while (0);
    return *mValue.mTriplet;
}

inline const nsCSSValueTriplet&
nsCSSValue::GetTripletValue() const
{
    do { } while (0);
    return *mValue.mTriplet;
}


struct nsCSSValuePairList {
  nsCSSValuePairList() : mNext(nullptr) { ; }
  ~nsCSSValuePairList();

  nsCSSValuePairList* Clone() const;
  void AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
                      nsCSSValue::Serialization aValueSerialization) const;

  static bool Equal(const nsCSSValuePairList* aList1,
                    const nsCSSValuePairList* aList2);

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

  nsCSSValue mXValue;
  nsCSSValue mYValue;
  nsCSSValuePairList* mNext;

private:
  nsCSSValuePairList(const nsCSSValuePairList& aCopy)
    : mXValue(aCopy.mXValue), mYValue(aCopy.mYValue), mNext(nullptr)
  {
                                      ;
  }




  bool operator==(const nsCSSValuePairList& aOther) const = delete;
  bool operator!=(const nsCSSValuePairList& aOther) const = delete;
};




struct nsCSSValuePairList_heap final : public nsCSSValuePairList {
  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValuePairList_heap>::value, "Reference-counted class " "nsCSSValuePairList_heap" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:

  ~nsCSSValuePairList_heap()
  {
  }
};



inline nsCSSValuePairList*
nsCSSValue::GetPairListValue()
{
  if (mUnit == eCSSUnit_PairList)
    return mValue.mPairList;
  else {
    do { } while (0);
    return mValue.mPairListDependent;
  }
}

inline const nsCSSValuePairList*
nsCSSValue::GetPairListValue() const
{
  if (mUnit == eCSSUnit_PairList)
    return mValue.mPairList;
  else {
    do { } while (0);
    return mValue.mPairListDependent;
  }
}

struct nsCSSValueGradientStop {
public:
  nsCSSValueGradientStop();


  nsCSSValueGradientStop(const nsCSSValueGradientStop& aOther);
  ~nsCSSValueGradientStop();

  nsCSSValue mLocation;
  nsCSSValue mColor;


  bool mIsInterpolationHint;

  bool operator==(const nsCSSValueGradientStop& aOther) const
  {
    return (mLocation == aOther.mLocation &&
            mIsInterpolationHint == aOther.mIsInterpolationHint &&
            (mIsInterpolationHint || mColor == aOther.mColor));
  }

  bool operator!=(const nsCSSValueGradientStop& aOther) const
  {
    return !(*this == aOther);
  }

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
};

struct nsCSSValueGradient final {
  nsCSSValueGradient(bool aIsRadial, bool aIsRepeating);


  bool mIsRadial;
  bool mIsRepeating;
  bool mIsLegacySyntax;
  bool mIsExplicitSize;

  nsCSSValuePair mBgPos;
  nsCSSValue mAngle;


private:
  nsCSSValue mRadialValues[2];
public:
  nsCSSValue& GetRadialShape()
  {
    do { } while (0);
    return mRadialValues[0];
  }
  const nsCSSValue& GetRadialShape() const
  {
    do { } while (0);
    return mRadialValues[0];
  }
  nsCSSValue& GetRadialSize()
  {
    do { } while (0);
    return mRadialValues[1];
  }
  const nsCSSValue& GetRadialSize() const
  {
    do { } while (0);
    return mRadialValues[1];
  }
  nsCSSValue& GetRadiusX()
  {
    do { } while (0);
    return mRadialValues[0];
  }
  const nsCSSValue& GetRadiusX() const
  {
    do { } while (0);
    return mRadialValues[0];
  }
  nsCSSValue& GetRadiusY()
  {
    do { } while (0);
    return mRadialValues[1];
  }
  const nsCSSValue& GetRadiusY() const
  {
    do { } while (0);
    return mRadialValues[1];
  }

  InfallibleTArray<nsCSSValueGradientStop> mStops;

  bool operator==(const nsCSSValueGradient& aOther) const
  {
    if (mIsRadial != aOther.mIsRadial ||
        mIsRepeating != aOther.mIsRepeating ||
        mIsLegacySyntax != aOther.mIsLegacySyntax ||
        mIsExplicitSize != aOther.mIsExplicitSize ||
        mBgPos != aOther.mBgPos ||
        mAngle != aOther.mAngle ||
        mRadialValues[0] != aOther.mRadialValues[0] ||
        mRadialValues[1] != aOther.mRadialValues[1])
      return false;

    if (mStops.Length() != aOther.mStops.Length())
      return false;

    for (uint32_t i = 0; i < mStops.Length(); i++) {
      if (mStops[i] != aOther.mStops[i])
        return false;
    }

    return true;
  }

  bool operator!=(const nsCSSValueGradient& aOther) const
  {
    return !(*this == aOther);
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValueGradient>::value, "Reference-counted class " "nsCSSValueGradient" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:

  ~nsCSSValueGradient()
  {
  }

  nsCSSValueGradient(const nsCSSValueGradient& aOther) = delete;
  nsCSSValueGradient& operator=(const nsCSSValueGradient& aOther) = delete;
};
# 1744 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
struct nsCSSValueTokenStream final {
  nsCSSValueTokenStream();

private:

  ~nsCSSValueTokenStream();

public:
  bool operator==(const nsCSSValueTokenStream& aOther) const
  {
    bool eq;
    return mPropertyID == aOther.mPropertyID &&
           mShorthandPropertyID == aOther.mShorthandPropertyID &&
           mTokenStream.Equals(aOther.mTokenStream) &&
           mLevel == aOther.mLevel &&
           (mBaseURI == aOther.mBaseURI ||
            (mBaseURI && aOther.mBaseURI &&
             ((bool)(__builtin_expect(!!(!NS_FAILED_impl(mBaseURI->Equals(aOther.mBaseURI, &eq))), 1))) &&
             eq)) &&
           (mSheetURI == aOther.mSheetURI ||
            (mSheetURI && aOther.mSheetURI &&
             ((bool)(__builtin_expect(!!(!NS_FAILED_impl(mSheetURI->Equals(aOther.mSheetURI, &eq))), 1))) &&
             eq)) &&
           (mSheetPrincipal == aOther.mSheetPrincipal ||
            (mSheetPrincipal && aOther.mSheetPrincipal &&
             ((bool)(__builtin_expect(!!(!NS_FAILED_impl(mSheetPrincipal->Equals(aOther.mSheetPrincipal, &eq))), 1))) &&

             eq));
  }

  bool operator!=(const nsCSSValueTokenStream& aOther) const
  {
    return !(*this == aOther);
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValueTokenStream>::value, "Reference-counted class " "nsCSSValueTokenStream" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;





  nsCSSPropertyID mPropertyID;




  nsCSSPropertyID mShorthandPropertyID;





  nsString mTokenStream;

  nsCOMPtr<nsIURI> mBaseURI;
  nsCOMPtr<nsIURI> mSheetURI;
  nsCOMPtr<nsIPrincipal> mSheetPrincipal;


  uint32_t mLineNumber;
  uint32_t mLineOffset;
  mozilla::SheetType mLevel;

private:
  nsCSSValueTokenStream(const nsCSSValueTokenStream& aOther) = delete;
  nsCSSValueTokenStream& operator=(const nsCSSValueTokenStream& aOther) = delete;
};

class nsCSSValueFloatColor final {
public:
  nsCSSValueFloatColor(float aComponent1, float aComponent2, float aComponent3,
                       float aAlpha)
    : mComponent1(aComponent1)
    , mComponent2(aComponent2)
    , mComponent3(aComponent3)
    , mAlpha(aAlpha)
  {}

private:

  ~nsCSSValueFloatColor()
  {}

public:
  bool operator==(nsCSSValueFloatColor& aOther) const;

  nscolor GetColorValue(nsCSSUnit aUnit) const;
  float Comp1() const { return mComponent1; }
  float Comp2() const { return mComponent2; }
  float Comp3() const { return mComponent3; }
  float Alpha() const { return mAlpha; }
  bool IsNonTransparentColor() const;

  void AppendToString(nsCSSUnit aUnit, nsAString& aResult) const;

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSValueFloatColor>::value, "Reference-counted class " "nsCSSValueFloatColor" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

private:
# 1856 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSValue.h"
  float mComponent1;
  float mComponent2;
  float mComponent3;
  float mAlpha;

  nsCSSValueFloatColor(const nsCSSValueFloatColor& aOther) = delete;
  nsCSSValueFloatColor& operator=(const nsCSSValueFloatColor& aOther)
                                                                   = delete;
};

struct nsCSSCornerSizes {
  nsCSSCornerSizes(void);
  nsCSSCornerSizes(const nsCSSCornerSizes& aCopy);
  ~nsCSSCornerSizes();


  nsCSSValue const & GetCorner(uint32_t aCorner) const {
    return this->*corners[aCorner];
  }
  nsCSSValue & GetCorner(uint32_t aCorner) {
    return this->*corners[aCorner];
  }

  bool operator==(const nsCSSCornerSizes& aOther) const {
    int32_t corner1880 = mozilla::eCornerTopLeft; for (mozilla::Corner corner; corner1880 <= mozilla::eCornerBottomLeft && (corner = mozilla::Corner(corner1880), true); ++corner1880) {
      if (this->GetCorner(corner) != aOther.GetCorner(corner))
        return false;
    }
    return true;
  }

  bool operator!=(const nsCSSCornerSizes& aOther) const {
    int32_t corner1888 = mozilla::eCornerTopLeft; for (mozilla::Corner corner; corner1888 <= mozilla::eCornerBottomLeft && (corner = mozilla::Corner(corner1888), true); ++corner1888) {
      if (this->GetCorner(corner) != aOther.GetCorner(corner))
        return true;
    }
    return false;
  }

  bool HasValue() const {
    int32_t corner1896 = mozilla::eCornerTopLeft; for (mozilla::Corner corner; corner1896 <= mozilla::eCornerBottomLeft && (corner = mozilla::Corner(corner1896), true); ++corner1896) {
      if (this->GetCorner(corner).GetUnit() != eCSSUnit_Null)
        return true;
    }
    return false;
  }

  void Reset();

  nsCSSValue mTopLeft;
  nsCSSValue mTopRight;
  nsCSSValue mBottomRight;
  nsCSSValue mBottomLeft;

protected:
  typedef nsCSSValue nsCSSCornerSizes::*corner_type;
  static const corner_type corners[4];
};
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgIRequest.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgIRequest.h"
class imgIContainer;

class imgINotificationObserver;

class nsIURI;

class nsIPrincipal;
# 37 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgIRequest.h"
class imgIRequest : public nsIRequest {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetImage(imgIContainer * *aImage) = 0;

  enum {
    STATUS_NONE = 0,
    STATUS_SIZE_AVAILABLE = 1,
    STATUS_LOAD_COMPLETE = 2,
    STATUS_ERROR = 4,
    STATUS_FRAME_COMPLETE = 8,
    STATUS_DECODE_COMPLETE = 16,
    STATUS_IS_ANIMATED = 32,
    STATUS_HAS_TRANSPARENCY = 64
  };


  virtual nsresult GetImageStatus(uint32_t *aImageStatus) = 0;


  virtual nsresult GetImageErrorCode(nsresult *aImageErrorCode) = 0;


  virtual nsresult GetURI(nsIURI * *aURI) = 0;


  virtual nsresult GetCurrentURI(nsIURI * *aCurrentURI) = 0;


  virtual nsresult GetNotificationObserver(imgINotificationObserver * *aNotificationObserver) = 0;


  virtual nsresult GetMimeType(char * *aMimeType) = 0;


  virtual nsresult Clone(imgINotificationObserver *aObserver, imgIRequest * *_retval) = 0;


  virtual nsresult GetImagePrincipal(nsIPrincipal * *aImagePrincipal) = 0;


  virtual nsresult GetMultipart(bool *aMultipart) = 0;

  enum {
    CORS_NONE = 1,
    CORS_ANONYMOUS = 2,
    CORS_USE_CREDENTIALS = 3
  };


  virtual nsresult GetCORSMode(int32_t *aCORSMode) = 0;


  virtual nsresult CancelAndForgetObserver(nsresult aStatus) = 0;


  virtual nsresult StartDecoding(uint32_t aFlags) = 0;


  virtual bool StartDecodingWithResult(uint32_t aFlags) = 0;


  virtual nsresult LockImage(void) = 0;


  virtual nsresult UnlockImage(void) = 0;


  virtual nsresult RequestDiscard(void) = 0;


  virtual nsresult GetStaticRequest(imgIRequest * *_retval) = 0;


  virtual nsresult IncrementAnimationConsumers(void) = 0;


  virtual nsresult DecrementAnimationConsumers(void) = 0;

};

  template<typename T> struct imgIRequest::COMTypeInfo<imgIRequest, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID imgIRequest::COMTypeInfo<imgIRequest, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xdb0a945c, 0x3883, 0x424a, { 0x98, 0xd0, 0x2e, 0xe0, 0x52, 0x3b, 0x02, 0x55 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISecurityInfoProvider.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISecurityInfoProvider.h"
class nsISecurityInfoProvider : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetSecurityInfo(nsISupports * *aSecurityInfo) = 0;


  virtual nsresult GetHasTransferredData(bool *aHasTransferredData) = 0;

};

  template<typename T> struct nsISecurityInfoProvider::COMTypeInfo<nsISecurityInfoProvider, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISecurityInfoProvider::COMTypeInfo<nsISecurityInfoProvider, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xb8cc9126, 0x9319, 0x4415, { 0xaf, 0xd9, 0xb8, 0x22, 0x20, 0xd4, 0x53, 0xed }};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsPriority.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISupportsPriority.h"
class nsISupportsPriority : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    PRIORITY_HIGHEST = -20,
    PRIORITY_HIGH = -10,
    PRIORITY_NORMAL = 0,
    PRIORITY_LOW = 10,
    PRIORITY_LOWEST = 20
  };


  virtual nsresult GetPriority(int32_t *aPriority) = 0;
  virtual nsresult SetPriority(int32_t aPriority) = 0;


  virtual nsresult AdjustPriority(int32_t delta) = 0;

};

  template<typename T> struct nsISupportsPriority::COMTypeInfo<nsISupportsPriority, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsISupportsPriority::COMTypeInfo<nsISupportsPriority, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xaa578b44, 0xabd5, 0x4c19, { 0x8b, 0x14, 0x36, 0xd4, 0xde, 0x6f, 0xdc, 0x36 }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimedChannel.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimedChannel.h"
class nsIPrincipal;

namespace mozilla {
class TimeStamp;
}
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsITimedChannel.h"
class nsITimedChannel : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetTimingEnabled(bool *aTimingEnabled) = 0;
  virtual nsresult SetTimingEnabled(bool aTimingEnabled) = 0;


  virtual nsresult GetRedirectCount(uint16_t *aRedirectCount) = 0;
  virtual nsresult SetRedirectCount(uint16_t aRedirectCount) = 0;


  virtual nsresult GetChannelCreation(mozilla::TimeStamp *aChannelCreation) = 0;


  virtual nsresult GetAsyncOpen(mozilla::TimeStamp *aAsyncOpen) = 0;


  virtual nsresult GetLaunchServiceWorkerStart(mozilla::TimeStamp *aLaunchServiceWorkerStart) = 0;
  virtual nsresult SetLaunchServiceWorkerStart(mozilla::TimeStamp aLaunchServiceWorkerStart) = 0;


  virtual nsresult GetLaunchServiceWorkerEnd(mozilla::TimeStamp *aLaunchServiceWorkerEnd) = 0;
  virtual nsresult SetLaunchServiceWorkerEnd(mozilla::TimeStamp aLaunchServiceWorkerEnd) = 0;


  virtual nsresult GetDispatchFetchEventStart(mozilla::TimeStamp *aDispatchFetchEventStart) = 0;
  virtual nsresult SetDispatchFetchEventStart(mozilla::TimeStamp aDispatchFetchEventStart) = 0;


  virtual nsresult GetDispatchFetchEventEnd(mozilla::TimeStamp *aDispatchFetchEventEnd) = 0;
  virtual nsresult SetDispatchFetchEventEnd(mozilla::TimeStamp aDispatchFetchEventEnd) = 0;


  virtual nsresult GetHandleFetchEventStart(mozilla::TimeStamp *aHandleFetchEventStart) = 0;
  virtual nsresult SetHandleFetchEventStart(mozilla::TimeStamp aHandleFetchEventStart) = 0;


  virtual nsresult GetHandleFetchEventEnd(mozilla::TimeStamp *aHandleFetchEventEnd) = 0;
  virtual nsresult SetHandleFetchEventEnd(mozilla::TimeStamp aHandleFetchEventEnd) = 0;


  virtual nsresult GetDomainLookupStart(mozilla::TimeStamp *aDomainLookupStart) = 0;


  virtual nsresult GetDomainLookupEnd(mozilla::TimeStamp *aDomainLookupEnd) = 0;


  virtual nsresult GetConnectStart(mozilla::TimeStamp *aConnectStart) = 0;


  virtual nsresult GetConnectEnd(mozilla::TimeStamp *aConnectEnd) = 0;


  virtual nsresult GetRequestStart(mozilla::TimeStamp *aRequestStart) = 0;


  virtual nsresult GetResponseStart(mozilla::TimeStamp *aResponseStart) = 0;


  virtual nsresult GetResponseEnd(mozilla::TimeStamp *aResponseEnd) = 0;


  virtual nsresult GetRedirectStart(mozilla::TimeStamp *aRedirectStart) = 0;
  virtual nsresult SetRedirectStart(mozilla::TimeStamp aRedirectStart) = 0;


  virtual nsresult GetRedirectEnd(mozilla::TimeStamp *aRedirectEnd) = 0;
  virtual nsresult SetRedirectEnd(mozilla::TimeStamp aRedirectEnd) = 0;


  virtual nsresult GetInitiatorType(nsAString & aInitiatorType) = 0;
  virtual nsresult SetInitiatorType(const nsAString & aInitiatorType) = 0;


  virtual nsresult GetAllRedirectsSameOrigin(bool *aAllRedirectsSameOrigin) = 0;
  virtual nsresult SetAllRedirectsSameOrigin(bool aAllRedirectsSameOrigin) = 0;


  virtual nsresult GetAllRedirectsPassTimingAllowCheck(bool *aAllRedirectsPassTimingAllowCheck) = 0;
  virtual nsresult SetAllRedirectsPassTimingAllowCheck(bool aAllRedirectsPassTimingAllowCheck) = 0;


  virtual nsresult TimingAllowCheck(nsIPrincipal *origin, bool *_retval) = 0;

   inline bool TimingAllowCheck(nsIPrincipal* aOrigin) {
    bool allowed = false;
    return ((bool)(__builtin_expect(!!(!NS_FAILED_impl(TimingAllowCheck(aOrigin, &allowed))), 1))) && allowed;
  }

  virtual nsresult GetCacheReadStart(mozilla::TimeStamp *aCacheReadStart) = 0;


  virtual nsresult GetCacheReadEnd(mozilla::TimeStamp *aCacheReadEnd) = 0;


  virtual nsresult GetChannelCreationTime(PRTime *aChannelCreationTime) = 0;


  virtual nsresult GetAsyncOpenTime(PRTime *aAsyncOpenTime) = 0;


  virtual nsresult GetLaunchServiceWorkerStartTime(PRTime *aLaunchServiceWorkerStartTime) = 0;


  virtual nsresult GetLaunchServiceWorkerEndTime(PRTime *aLaunchServiceWorkerEndTime) = 0;


  virtual nsresult GetDispatchFetchEventStartTime(PRTime *aDispatchFetchEventStartTime) = 0;


  virtual nsresult GetDispatchFetchEventEndTime(PRTime *aDispatchFetchEventEndTime) = 0;


  virtual nsresult GetHandleFetchEventStartTime(PRTime *aHandleFetchEventStartTime) = 0;


  virtual nsresult GetHandleFetchEventEndTime(PRTime *aHandleFetchEventEndTime) = 0;


  virtual nsresult GetDomainLookupStartTime(PRTime *aDomainLookupStartTime) = 0;


  virtual nsresult GetDomainLookupEndTime(PRTime *aDomainLookupEndTime) = 0;


  virtual nsresult GetConnectStartTime(PRTime *aConnectStartTime) = 0;


  virtual nsresult GetConnectEndTime(PRTime *aConnectEndTime) = 0;


  virtual nsresult GetRequestStartTime(PRTime *aRequestStartTime) = 0;


  virtual nsresult GetResponseStartTime(PRTime *aResponseStartTime) = 0;


  virtual nsresult GetResponseEndTime(PRTime *aResponseEndTime) = 0;


  virtual nsresult GetCacheReadStartTime(PRTime *aCacheReadStartTime) = 0;


  virtual nsresult GetCacheReadEndTime(PRTime *aCacheReadEndTime) = 0;


  virtual nsresult GetRedirectStartTime(PRTime *aRedirectStartTime) = 0;


  virtual nsresult GetRedirectEndTime(PRTime *aRedirectEndTime) = 0;

};

  template<typename T> struct nsITimedChannel::COMTypeInfo<nsITimedChannel, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsITimedChannel::COMTypeInfo<nsITimedChannel, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xca63784d, 0x959c, 0x4c3a, { 0x9a, 0x59, 0x23, 0x4a, 0x2a, 0x52, 0x0d, 0xe0 }};
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannelEventSink.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannelEventSink.h"
class nsIChannel;

class nsIAsyncVerifyRedirectCallback;
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIChannelEventSink.h"
class nsIChannelEventSink : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    REDIRECT_TEMPORARY = 1U,
    REDIRECT_PERMANENT = 2U,
    REDIRECT_INTERNAL = 4U,
    REDIRECT_STS_UPGRADE = 8U
  };


  virtual nsresult AsyncOnChannelRedirect(nsIChannel *oldChannel, nsIChannel *newChannel, uint32_t flags, nsIAsyncVerifyRedirectCallback *callback) = 0;

};

  template<typename T> struct nsIChannelEventSink::COMTypeInfo<nsIChannelEventSink, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIChannelEventSink::COMTypeInfo<nsIChannelEventSink, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x0197720d, 0x37ed, 0x4e75, { 0x89, 0x56, 0xd0, 0xd2, 0x96, 0xe4, 0xd8, 0xa6 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIInterfaceRequestor.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIInterfaceRequestor.h"
class nsIInterfaceRequestor : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetInterface(const nsIID & uuid, void **result) = 0;

};

  template<typename T> struct nsIInterfaceRequestor::COMTypeInfo<nsIInterfaceRequestor, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIInterfaceRequestor::COMTypeInfo<nsIInterfaceRequestor, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x033a1470, 0x8b2a, 0x11d3, { 0xaf, 0x88, 0x00, 0xa0, 0x24, 0xff, 0xc0, 0x8c }};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThreadRetargetableStreamListener.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIThreadRetargetableStreamListener.h"
class nsIThreadRetargetableStreamListener : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult CheckListenerChain(void) = 0;

};

  template<typename T> struct nsIThreadRetargetableStreamListener::COMTypeInfo<nsIThreadRetargetableStreamListener, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIThreadRetargetableStreamListener::COMTypeInfo<nsIThreadRetargetableStreamListener, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xfb2304b8, 0xf82f, 0x4433, { 0xaf, 0x68, 0xd8, 0x74, 0xa2, 0xeb, 0xbd, 0xc1 }};
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAsyncVerifyRedirectCallback.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAsyncVerifyRedirectCallback.h"
class nsIAsyncVerifyRedirectCallback : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult OnRedirectVerifyCallback(nsresult result) = 0;

};

  template<typename T> struct nsIAsyncVerifyRedirectCallback::COMTypeInfo<nsIAsyncVerifyRedirectCallback, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIAsyncVerifyRedirectCallback::COMTypeInfo<nsIAsyncVerifyRedirectCallback, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x8d171460, 0xa716, 0x41f1, { 0x92, 0xbe, 0x8c, 0x65, 0x9d, 0xb3, 0x9b, 0x45 }};
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BlockingResourceBase.h" 1
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BlockingResourceBase.h"
namespace mozilla {
# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BlockingResourceBase.h"
class BlockingResourceBase
{
public:

  enum BlockingResourceType { eMutex, eReentrantMonitor, eCondVar };





  static const char* const kResourceTypeName[];
# 333 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/BlockingResourceBase.h"
  BlockingResourceBase(const char* aName, BlockingResourceType aType) {}

  ~BlockingResourceBase() {}


};


}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PlatformMutex.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PlatformMutex.h"
namespace mozilla {

namespace detail {

class ConditionVariableImpl;

class MutexImpl
{
public:
  struct PlatformData;

  __attribute__((weak)) __attribute__((visibility("default"))) MutexImpl();
  __attribute__((weak)) __attribute__((visibility("default"))) ~MutexImpl();

  bool operator==(const MutexImpl& rhs) {
    return platformData_ == rhs.platformData_;
  }

protected:
  __attribute__((weak)) __attribute__((visibility("default"))) void lock();
  __attribute__((weak)) __attribute__((visibility("default"))) void unlock();

private:
  MutexImpl(const MutexImpl&) = delete;
  void operator=(const MutexImpl&) = delete;
  MutexImpl(MutexImpl&&) = delete;
  void operator=(MutexImpl&&) = delete;

  PlatformData* platformData();


  void* platformData_[sizeof(pthread_mutex_t) / sizeof(void*)];
  static_assert(sizeof(pthread_mutex_t) / sizeof(void*) != 0 &&
                sizeof(pthread_mutex_t) % sizeof(void*) == 0,
                "pthread_mutex_t must have pointer alignment");




  friend class mozilla::detail::ConditionVariableImpl;
};

}

}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h" 2
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h"
namespace mozilla {






class OffTheBooksMutex : public detail::MutexImpl, BlockingResourceBase
{
public:






  explicit OffTheBooksMutex(const char* aName)
    : detail::MutexImpl()
    , BlockingResourceBase(aName, eMutex)



  {
  }

  ~OffTheBooksMutex()
  {



  }





  void Lock() { this->lock(); }




  void Unlock() { this->unlock(); }






  void AssertCurrentThreadOwns() const {}
# 87 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h"
  void AssertNotCurrentThreadOwns() const {}
# 102 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h"
private:
  OffTheBooksMutex();
  OffTheBooksMutex(const OffTheBooksMutex&);
  OffTheBooksMutex& operator=(const OffTheBooksMutex&);

  friend class CondVar;




};






class Mutex : public OffTheBooksMutex
{
public:
  explicit Mutex(const char* aName)
    : OffTheBooksMutex(aName)
  {
                         ;
  }

  ~Mutex()
  {
                         ;
  }

private:
  Mutex();
  Mutex(const Mutex&);
  Mutex& operator=(const Mutex&);
};
# 146 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h"
template<typename T>
class BaseAutoLock
{
public:
# 158 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h"
  explicit BaseAutoLock(T& aLock )
    : mLock(&aLock)
  {
    do { } while (0);
    do { } while(0);
    mLock->Lock();
  }

  ~BaseAutoLock(void)
  {
    mLock->Unlock();
  }

private:
  BaseAutoLock();
  BaseAutoLock(BaseAutoLock&);
  BaseAutoLock& operator=(BaseAutoLock&);
  static void* operator new(size_t) throw();

  T* mLock;

};

typedef BaseAutoLock<Mutex> MutexAutoLock;
typedef BaseAutoLock<OffTheBooksMutex> OffTheBooksMutexAutoLock;
# 191 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Mutex.h"
template<typename T>
class BaseAutoUnlock
{
public:
  explicit BaseAutoUnlock(T& aLock )
    : mLock(&aLock)
  {
    do { } while (0);
    do { } while(0);
    mLock->Unlock();
  }

  ~BaseAutoUnlock()
  {
    mLock->Lock();
  }

private:
  BaseAutoUnlock();
  BaseAutoUnlock(BaseAutoUnlock&);
  BaseAutoUnlock& operator=(BaseAutoUnlock&);
  static void* operator new(size_t) throw();

  T* mLock;

};

typedef BaseAutoUnlock<Mutex> MutexAutoUnlock;
typedef BaseAutoUnlock<OffTheBooksMutex> OffTheBooksMutexAutoUnlock;

}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ImageCacheKey.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ImageCacheKey.h"
class nsIDocument;
class nsIURI;

namespace mozilla {
namespace image {

class ImageURL;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/ImageCacheKey.h"
class ImageCacheKey final
{
public:
  ImageCacheKey(nsIURI* aURI, const OriginAttributes& aAttrs,
                nsIDocument* aDocument, nsresult& aRv);
  ImageCacheKey(ImageURL* aURI, const OriginAttributes& aAttrs,
                nsIDocument* aDocument);

  ImageCacheKey(const ImageCacheKey& aOther);
  ImageCacheKey(ImageCacheKey&& aOther);

  bool operator==(const ImageCacheKey& aOther) const;
  uint32_t Hash() const { return mHash; }


  const char* Spec() const;


  bool IsChrome() const { return mIsChrome; }



  void* ControlledDocument() const { return mControlledDocument; }

private:
  static uint32_t ComputeHash(ImageURL* aURI,
                              const Maybe<uint64_t>& aBlobSerial,
                              const OriginAttributes& aAttrs,
                              void* aControlledDocument);
  static void* GetControlledDocumentToken(nsIDocument* aDocument);

  RefPtr<ImageURL> mURI;
  Maybe<uint64_t> mBlobSerial;
  OriginAttributes mOriginAttributes;
  void* mControlledDocument;
  uint32_t mHash;
  bool mIsChrome;
};

}
}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequest.h" 2

class imgCacheValidator;
class imgLoader;
class imgRequestProxy;
class imgCacheEntry;
class nsIApplicationCache;
class nsIProperties;
class nsIRequest;
class nsITimedChannel;
class nsIURI;

namespace mozilla {
namespace image {
class Image;
class ImageURL;
class ProgressTracker;
}
}

struct NewPartResult;

class imgRequest final : public nsIStreamListener,
                         public nsIThreadRetargetableStreamListener,
                         public nsIChannelEventSink,
                         public nsIInterfaceRequestor,
                         public nsIAsyncVerifyRedirectCallback
{
  typedef mozilla::image::Image Image;
  typedef mozilla::image::ImageCacheKey ImageCacheKey;
  typedef mozilla::image::ImageURL ImageURL;
  typedef mozilla::image::ProgressTracker ProgressTracker;
  typedef mozilla::net::ReferrerPolicy ReferrerPolicy;

public:
  imgRequest(imgLoader* aLoader, const ImageCacheKey& aCacheKey);

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:
  virtual nsresult OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext, nsIInputStream *aInputStream, uint64_t aOffset, uint32_t aCount) override;
  virtual nsresult CheckListenerChain(void) override;
  virtual nsresult OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) override; virtual nsresult OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) override;
  virtual nsresult AsyncOnChannelRedirect(nsIChannel *oldChannel, nsIChannel *newChannel, uint32_t flags, nsIAsyncVerifyRedirectCallback *callback) override;
  virtual nsresult GetInterface(const nsIID & uuid, void **result) override;
  virtual nsresult OnRedirectVerifyCallback(nsresult result) override;

  __attribute__ ((warn_unused_result)) nsresult Init(nsIURI* aURI,
                             nsIURI* aCurrentURI,
                             bool aHadInsecureRedirect,
                             nsIRequest* aRequest,
                             nsIChannel* aChannel,
                             imgCacheEntry* aCacheEntry,
                             nsISupports* aCX,
                             nsIPrincipal* aLoadingPrincipal,
                             int32_t aCORSMode,
                             ReferrerPolicy aReferrerPolicy);

  void ClearLoader();


  void AddProxy(imgRequestProxy* proxy);

  nsresult RemoveProxy(imgRequestProxy* proxy, nsresult aStatus);




  void CancelAndAbort(nsresult aStatus);


  void ContinueCancel(nsresult aStatus);


  void ContinueEvict();


  void StartDecoding();

  inline uint64_t InnerWindowID() const {
    return mInnerWindowId;
  }





  static void SetCacheValidation(imgCacheEntry* aEntry, nsIRequest* aRequest);





  bool CacheChanged(nsIRequest* aNewRequest);

  bool GetMultipart() const;



  bool HadInsecureRedirect() const;


  int32_t GetCORSMode() const { return mCORSMode; }


  ReferrerPolicy GetReferrerPolicy() const { return mReferrerPolicy; }



  already_AddRefed<nsIPrincipal> GetLoadingPrincipal() const
  {
    nsCOMPtr<nsIPrincipal> principal = mLoadingPrincipal;
    return principal.forget();
  }




  already_AddRefed<ProgressTracker> GetProgressTracker() const;


  already_AddRefed<Image> GetImage() const;


  inline nsIPrincipal* GetPrincipal() const { return mPrincipal.get(); }


  const ImageCacheKey& CacheKey() const { return mCacheKey; }


  void ResetCacheEntry();


  nsresult GetURI(ImageURL** aURI);
  nsresult GetCurrentURI(nsIURI** aURI);
  bool IsChrome() const;

  nsresult GetImageErrorCode(void);


  bool HasTransferredData() const;


  const char* GetMimeType() const { return mContentType.get(); }



  int32_t Priority() const;



  void AdjustPriority(imgRequestProxy* aProxy, int32_t aDelta);


  nsIRequest* GetRequest() const { return mRequest; }

  nsITimedChannel* GetTimedChannel() const { return mTimedChannel; }

  nsresult GetSecurityInfo(nsISupports** aSecurityInfoOut);

  imgCacheValidator* GetValidator() const { return mValidator; }
  void SetValidator(imgCacheValidator* aValidator) { mValidator = aValidator; }

  void* LoadId() const { return mLoadId; }
  void SetLoadId(void* aLoadId) { mLoadId = aLoadId; }




  void SetCacheEntry(imgCacheEntry* aEntry);


  bool HasCacheEntry() const;




  void SetIsInCache(bool aCacheable);

  void EvictFromCache();
  void RemoveFromCache();


  void SetProperties(const nsACString& aContentType,
                     const nsACString& aContentDisposition);

  nsIProperties* Properties() const { return mProperties; }

  bool HasConsumers() const;

private:
  friend class FinishPreparingForNewPartRunnable;

  virtual ~imgRequest();

  void FinishPreparingForNewPart(const NewPartResult& aResult);

  void Cancel(nsresult aStatus);


  void UpdateCacheEntrySize();


  bool IsDecodeRequested() const;


  imgLoader* mLoader;
  nsCOMPtr<nsIRequest> mRequest;



  RefPtr<ImageURL> mURI;

  nsCOMPtr<nsIURI> mCurrentURI;


  nsCOMPtr<nsIPrincipal> mLoadingPrincipal;

  nsCOMPtr<nsIPrincipal> mPrincipal;
  nsCOMPtr<nsIProperties> mProperties;
  nsCOMPtr<nsISupports> mSecurityInfo;
  nsCOMPtr<nsIChannel> mChannel;
  nsCOMPtr<nsIInterfaceRequestor> mPrevChannelSink;
  nsCOMPtr<nsIApplicationCache> mApplicationCache;

  nsCOMPtr<nsITimedChannel> mTimedChannel;

  nsCString mContentType;


  RefPtr<imgCacheEntry> mCacheEntry;


  ImageCacheKey mCacheKey;

  void* mLoadId;



  void* mFirstProxy;

  imgCacheValidator* mValidator;
  nsCOMPtr<nsIAsyncVerifyRedirectCallback> mRedirectCallback;
  nsCOMPtr<nsIChannel> mNewRedirectChannel;


  uint64_t mInnerWindowId;



  int32_t mCORSMode;


  ReferrerPolicy mReferrerPolicy;

  nsresult mImageErrorCode;

  mutable mozilla::Mutex mMutex;




  RefPtr<ProgressTracker> mProgressTracker;
  RefPtr<Image> mImage;
  bool mIsMultiPartChannel : 1;
  bool mGotData : 1;
  bool mIsInCache : 1;
  bool mDecodeRequested : 1;
  bool mNewPartPending : 1;
  bool mHadInsecureRedirect : 1;
};
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/IProgressObserver.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/IProgressObserver.h"
namespace mozilla {
namespace image {
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/IProgressObserver.h"
class IProgressObserver : public SupportsWeakPtr<IProgressObserver>
{
public:




  public: virtual MozExternalRefCountType AddRef(void) = 0; virtual MozExternalRefCountType Release(void) = 0; public:


  virtual void Notify(int32_t aType, const nsIntRect* aRect = nullptr) = 0;
  virtual void OnLoadComplete(bool aLastPart) = 0;


  virtual void BlockOnload() = 0;
  virtual void UnblockOnload() = 0;


  virtual void SetHasImage() = 0;
  virtual bool NotificationsDeferred() const = 0;
  virtual void SetNotificationsDeferred(bool aDeferNotifications) = 0;

protected:
  virtual ~IProgressObserver() { }
};

}
}
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h" 2
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/imgRequestProxy.h"
class imgINotificationObserver;
class imgStatusNotifyRunnable;
class ProxyBehaviour;

namespace mozilla {
namespace image {
class Image;
class ImageURL;
class ProgressTracker;
}
}

class imgRequestProxy : public imgIRequest,
                        public mozilla::image::IProgressObserver,
                        public nsISupportsPriority,
                        public nsISecurityInfoProvider,
                        public nsITimedChannel
{
protected:
  virtual ~imgRequestProxy();

public:
  typedef mozilla::image::Image Image;
  typedef mozilla::image::ImageURL ImageURL;
  typedef mozilla::image::ProgressTracker ProgressTracker;

  const char* typeName() const { return "imgRequestProxy"; } size_t typeSize() const { return sizeof(*this); }
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:
  virtual nsresult GetImage(imgIContainer * *aImage) override; virtual nsresult GetImageStatus(uint32_t *aImageStatus) override; virtual nsresult GetImageErrorCode(nsresult *aImageErrorCode) override; virtual nsresult GetURI(nsIURI * *aURI) override; virtual nsresult GetCurrentURI(nsIURI * *aCurrentURI) override; virtual nsresult GetNotificationObserver(imgINotificationObserver * *aNotificationObserver) override; virtual nsresult GetMimeType(char * *aMimeType) override; virtual nsresult Clone(imgINotificationObserver *aObserver, imgIRequest * *_retval) override; virtual nsresult GetImagePrincipal(nsIPrincipal * *aImagePrincipal) override; virtual nsresult GetMultipart(bool *aMultipart) override; virtual nsresult GetCORSMode(int32_t *aCORSMode) override; virtual nsresult CancelAndForgetObserver(nsresult aStatus) override; virtual nsresult StartDecoding(uint32_t aFlags) override; virtual bool StartDecodingWithResult(uint32_t aFlags) override; virtual nsresult LockImage(void) override; virtual nsresult UnlockImage(void) override; virtual nsresult RequestDiscard(void) override; virtual nsresult GetStaticRequest(imgIRequest * *_retval) override; virtual nsresult IncrementAnimationConsumers(void) override; virtual nsresult DecrementAnimationConsumers(void) override;
  virtual nsresult GetName(nsACString & aName) override; virtual nsresult IsPending(bool *_retval) override; virtual nsresult GetStatus(nsresult *aStatus) override; virtual nsresult Cancel(nsresult aStatus) override; virtual nsresult Suspend(void) override; virtual nsresult Resume(void) override; virtual nsresult GetLoadGroup(nsILoadGroup * *aLoadGroup) override; virtual nsresult SetLoadGroup(nsILoadGroup *aLoadGroup) override; virtual nsresult GetLoadFlags(nsLoadFlags *aLoadFlags) override; virtual nsresult SetLoadFlags(nsLoadFlags aLoadFlags) override;
  virtual nsresult GetPriority(int32_t *aPriority) override; virtual nsresult SetPriority(int32_t aPriority) override; virtual nsresult AdjustPriority(int32_t delta) override;
  virtual nsresult GetSecurityInfo(nsISupports * *aSecurityInfo) override; virtual nsresult GetHasTransferredData(bool *aHasTransferredData) override;


  imgRequestProxy();



  nsresult Init(imgRequest* aOwner,
                nsILoadGroup* aLoadGroup,
                ImageURL* aURI,
                imgINotificationObserver* aObserver);

  nsresult ChangeOwner(imgRequest* aNewOwner);




  void AddToLoadGroup();
  void RemoveFromLoadGroup(bool releaseLoadGroup);

  inline bool HasObserver() const {
    return mListener != nullptr;
  }





  void NotifyListener();




  void SyncNotifyListener();


  virtual void Notify(int32_t aType,
                      const mozilla::gfx::IntRect* aRect = nullptr) override;
  virtual void OnLoadComplete(bool aLastPart) override;


  virtual void BlockOnload() override;
  virtual void UnblockOnload() override;


  virtual void SetHasImage() override;



  virtual bool NotificationsDeferred() const override
  {
    return mDeferNotifications;
  }
  virtual void SetNotificationsDeferred(bool aDeferNotifications) override
  {
    mDeferNotifications = aDeferNotifications;
  }





  void ClearAnimationConsumers();

  virtual nsresult Clone(imgINotificationObserver* aObserver,
                         imgRequestProxy** aClone);
  nsresult GetStaticRequest(imgRequestProxy** aReturn);

  nsresult GetURI(ImageURL** aURI);

protected:
  friend class mozilla::image::ProgressTracker;
  friend class imgStatusNotifyRunnable;

  class imgCancelRunnable;
  friend class imgCancelRunnable;

  class imgCancelRunnable : public mozilla::Runnable
  {
    public:
      imgCancelRunnable(imgRequestProxy* owner, nsresult status)
        : Runnable("imgCancelRunnable"), mOwner(owner), mStatus(status)
      { }

      virtual nsresult Run() override {
        mOwner->DoCancel(mStatus);
        return NS_OK;
      }

    private:
      RefPtr<imgRequestProxy> mOwner;
      nsresult mStatus;
  };


  void DoCancel(nsresult status);


  void NullOutListener();

  void DoRemoveFromLoadGroup() {
    RemoveFromLoadGroup(true);
  }





  already_AddRefed<ProgressTracker> GetProgressTracker() const;

  nsITimedChannel* TimedChannel()
  {
    if (!GetOwner()) {
      return nullptr;
    }
    return GetOwner()->GetTimedChannel();
  }

  already_AddRefed<Image> GetImage() const;
  bool HasImage() const;
  imgRequest* GetOwner() const;

  nsresult PerformClone(imgINotificationObserver* aObserver,
                        imgRequestProxy* (aAllocFn)(imgRequestProxy*),
                        imgRequestProxy** aClone);

public:
  virtual nsresult GetTimingEnabled(bool *aTimingEnabled) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetTimingEnabled(aTimingEnabled); } virtual nsresult SetTimingEnabled(bool aTimingEnabled) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetTimingEnabled(aTimingEnabled); } virtual nsresult GetRedirectCount(uint16_t *aRedirectCount) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetRedirectCount(aRedirectCount); } virtual nsresult SetRedirectCount(uint16_t aRedirectCount) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetRedirectCount(aRedirectCount); } virtual nsresult GetChannelCreation(mozilla::TimeStamp *aChannelCreation) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetChannelCreation(aChannelCreation); } virtual nsresult GetAsyncOpen(mozilla::TimeStamp *aAsyncOpen) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetAsyncOpen(aAsyncOpen); } virtual nsresult GetLaunchServiceWorkerStart(mozilla::TimeStamp *aLaunchServiceWorkerStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetLaunchServiceWorkerStart(aLaunchServiceWorkerStart); } virtual nsresult SetLaunchServiceWorkerStart(mozilla::TimeStamp aLaunchServiceWorkerStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetLaunchServiceWorkerStart(aLaunchServiceWorkerStart); } virtual nsresult GetLaunchServiceWorkerEnd(mozilla::TimeStamp *aLaunchServiceWorkerEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetLaunchServiceWorkerEnd(aLaunchServiceWorkerEnd); } virtual nsresult SetLaunchServiceWorkerEnd(mozilla::TimeStamp aLaunchServiceWorkerEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetLaunchServiceWorkerEnd(aLaunchServiceWorkerEnd); } virtual nsresult GetDispatchFetchEventStart(mozilla::TimeStamp *aDispatchFetchEventStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDispatchFetchEventStart(aDispatchFetchEventStart); } virtual nsresult SetDispatchFetchEventStart(mozilla::TimeStamp aDispatchFetchEventStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetDispatchFetchEventStart(aDispatchFetchEventStart); } virtual nsresult GetDispatchFetchEventEnd(mozilla::TimeStamp *aDispatchFetchEventEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDispatchFetchEventEnd(aDispatchFetchEventEnd); } virtual nsresult SetDispatchFetchEventEnd(mozilla::TimeStamp aDispatchFetchEventEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetDispatchFetchEventEnd(aDispatchFetchEventEnd); } virtual nsresult GetHandleFetchEventStart(mozilla::TimeStamp *aHandleFetchEventStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetHandleFetchEventStart(aHandleFetchEventStart); } virtual nsresult SetHandleFetchEventStart(mozilla::TimeStamp aHandleFetchEventStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetHandleFetchEventStart(aHandleFetchEventStart); } virtual nsresult GetHandleFetchEventEnd(mozilla::TimeStamp *aHandleFetchEventEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetHandleFetchEventEnd(aHandleFetchEventEnd); } virtual nsresult SetHandleFetchEventEnd(mozilla::TimeStamp aHandleFetchEventEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetHandleFetchEventEnd(aHandleFetchEventEnd); } virtual nsresult GetDomainLookupStart(mozilla::TimeStamp *aDomainLookupStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDomainLookupStart(aDomainLookupStart); } virtual nsresult GetDomainLookupEnd(mozilla::TimeStamp *aDomainLookupEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDomainLookupEnd(aDomainLookupEnd); } virtual nsresult GetConnectStart(mozilla::TimeStamp *aConnectStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetConnectStart(aConnectStart); } virtual nsresult GetConnectEnd(mozilla::TimeStamp *aConnectEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetConnectEnd(aConnectEnd); } virtual nsresult GetRequestStart(mozilla::TimeStamp *aRequestStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetRequestStart(aRequestStart); } virtual nsresult GetResponseStart(mozilla::TimeStamp *aResponseStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetResponseStart(aResponseStart); } virtual nsresult GetResponseEnd(mozilla::TimeStamp *aResponseEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetResponseEnd(aResponseEnd); } virtual nsresult GetRedirectStart(mozilla::TimeStamp *aRedirectStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetRedirectStart(aRedirectStart); } virtual nsresult SetRedirectStart(mozilla::TimeStamp aRedirectStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetRedirectStart(aRedirectStart); } virtual nsresult GetRedirectEnd(mozilla::TimeStamp *aRedirectEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetRedirectEnd(aRedirectEnd); } virtual nsresult SetRedirectEnd(mozilla::TimeStamp aRedirectEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetRedirectEnd(aRedirectEnd); } virtual nsresult GetInitiatorType(nsAString & aInitiatorType) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetInitiatorType(aInitiatorType); } virtual nsresult SetInitiatorType(const nsAString & aInitiatorType) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetInitiatorType(aInitiatorType); } virtual nsresult GetAllRedirectsSameOrigin(bool *aAllRedirectsSameOrigin) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetAllRedirectsSameOrigin(aAllRedirectsSameOrigin); } virtual nsresult SetAllRedirectsSameOrigin(bool aAllRedirectsSameOrigin) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetAllRedirectsSameOrigin(aAllRedirectsSameOrigin); } virtual nsresult GetAllRedirectsPassTimingAllowCheck(bool *aAllRedirectsPassTimingAllowCheck) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetAllRedirectsPassTimingAllowCheck(aAllRedirectsPassTimingAllowCheck); } virtual nsresult SetAllRedirectsPassTimingAllowCheck(bool aAllRedirectsPassTimingAllowCheck) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->SetAllRedirectsPassTimingAllowCheck(aAllRedirectsPassTimingAllowCheck); } virtual nsresult TimingAllowCheck(nsIPrincipal *origin, bool *_retval) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->TimingAllowCheck(origin, _retval); } virtual nsresult GetCacheReadStart(mozilla::TimeStamp *aCacheReadStart) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetCacheReadStart(aCacheReadStart); } virtual nsresult GetCacheReadEnd(mozilla::TimeStamp *aCacheReadEnd) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetCacheReadEnd(aCacheReadEnd); } virtual nsresult GetChannelCreationTime(PRTime *aChannelCreationTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetChannelCreationTime(aChannelCreationTime); } virtual nsresult GetAsyncOpenTime(PRTime *aAsyncOpenTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetAsyncOpenTime(aAsyncOpenTime); } virtual nsresult GetLaunchServiceWorkerStartTime(PRTime *aLaunchServiceWorkerStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetLaunchServiceWorkerStartTime(aLaunchServiceWorkerStartTime); } virtual nsresult GetLaunchServiceWorkerEndTime(PRTime *aLaunchServiceWorkerEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetLaunchServiceWorkerEndTime(aLaunchServiceWorkerEndTime); } virtual nsresult GetDispatchFetchEventStartTime(PRTime *aDispatchFetchEventStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDispatchFetchEventStartTime(aDispatchFetchEventStartTime); } virtual nsresult GetDispatchFetchEventEndTime(PRTime *aDispatchFetchEventEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDispatchFetchEventEndTime(aDispatchFetchEventEndTime); } virtual nsresult GetHandleFetchEventStartTime(PRTime *aHandleFetchEventStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetHandleFetchEventStartTime(aHandleFetchEventStartTime); } virtual nsresult GetHandleFetchEventEndTime(PRTime *aHandleFetchEventEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetHandleFetchEventEndTime(aHandleFetchEventEndTime); } virtual nsresult GetDomainLookupStartTime(PRTime *aDomainLookupStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDomainLookupStartTime(aDomainLookupStartTime); } virtual nsresult GetDomainLookupEndTime(PRTime *aDomainLookupEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetDomainLookupEndTime(aDomainLookupEndTime); } virtual nsresult GetConnectStartTime(PRTime *aConnectStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetConnectStartTime(aConnectStartTime); } virtual nsresult GetConnectEndTime(PRTime *aConnectEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetConnectEndTime(aConnectEndTime); } virtual nsresult GetRequestStartTime(PRTime *aRequestStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetRequestStartTime(aRequestStartTime); } virtual nsresult GetResponseStartTime(PRTime *aResponseStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetResponseStartTime(aResponseStartTime); } virtual nsresult GetResponseEndTime(PRTime *aResponseEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetResponseEndTime(aResponseEndTime); } virtual nsresult GetCacheReadStartTime(PRTime *aCacheReadStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetCacheReadStartTime(aCacheReadStartTime); } virtual nsresult GetCacheReadEndTime(PRTime *aCacheReadEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetCacheReadEndTime(aCacheReadEndTime); } virtual nsresult GetRedirectStartTime(PRTime *aRedirectStartTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetRedirectStartTime(aRedirectStartTime); } virtual nsresult GetRedirectEndTime(PRTime *aRedirectEndTime) override { return !TimedChannel() ? NS_ERROR_NULL_POINTER : TimedChannel()->GetRedirectEndTime(aRedirectEndTime); }

protected:
  mozilla::UniquePtr<ProxyBehaviour> mBehaviour;

private:
  friend class imgCacheValidator;
  friend imgRequestProxy* NewStaticProxy(imgRequestProxy* aThis);


  RefPtr<ImageURL> mURI;




  imgINotificationObserver* mListener;



  nsCOMPtr<nsILoadGroup> mLoadGroup;

  nsLoadFlags mLoadFlags;
  uint32_t mLockCount;
  uint32_t mAnimationConsumers;
  bool mCanceled;
  bool mIsInLoadGroup;
  bool mListenerIsStrongRef;
  bool mDecodeRequested;



  bool mDeferNotifications;
};



class imgRequestProxyStatic : public imgRequestProxy
{

public:
  imgRequestProxyStatic(Image* aImage, nsIPrincipal* aPrincipal);

  virtual nsresult GetImagePrincipal(nsIPrincipal** aPrincipal) override;

  using imgRequestProxy::Clone;

  virtual nsresult Clone(imgINotificationObserver* aObserver,
                         imgRequestProxy** aClone) override;

protected:
  friend imgRequestProxy* NewStaticProxy(imgRequestProxy*);



  nsCOMPtr<nsIPrincipal> mPrincipal;
};
# 38 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Orientation.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/Orientation.h"
namespace mozilla {
namespace image {

enum class Angle : uint8_t {
  D0,
  D90,
  D180,
  D270
};

enum class Flip : uint8_t {
  Unflipped,
  Horizontal
};






struct Orientation
{
  explicit Orientation(Angle aRotation = Angle::D0,
                       Flip mFlip = Flip::Unflipped)
    : rotation(aRotation)
    , flip(mFlip)
  { }

  bool IsIdentity() const {
    return (rotation == Angle::D0) && (flip == Flip::Unflipped);
  }

  bool SwapsWidthAndHeight() const {
    return (rotation == Angle::D90) || (rotation == Angle::D270);
  }

  bool operator==(const Orientation& aOther) const {
    return (rotation == aOther.rotation) && (flip == aOther.flip);
  }

  bool operator!=(const Orientation& aOther) const {
    return !(*this == aOther);
  }

  Angle rotation;
  Flip flip;
};

}
}
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/CounterStyleManager.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/CounterStyleManager.h"
class nsPresContext;

namespace mozilla {

class WritingMode;

typedef int32_t CounterValue;

class CounterStyleManager;
class AnonymousCounterStyle;

struct NegativeType;
struct PadType;

class CounterStyle
{
protected:
  explicit constexpr CounterStyle(int32_t aStyle)
    : mStyle(aStyle)
  {
  }

private:
  CounterStyle(const CounterStyle& aOther) = delete;
  void operator=(const CounterStyle& other) = delete;

public:
  int32_t GetStyle() const { return mStyle; }
  bool IsNone() const { return mStyle == 0; }
  bool IsCustomStyle() const { return mStyle == -1; }



  bool IsDependentStyle() const;

  virtual void GetStyleName(nsSubstring& aResult) = 0;
  virtual void GetPrefix(nsSubstring& aResult) = 0;
  virtual void GetSuffix(nsSubstring& aResult) = 0;
  void GetCounterText(CounterValue aOrdinal,
                      WritingMode aWritingMode,
                      nsSubstring& aResult,
                      bool& aIsRTL);
  virtual void GetSpokenCounterText(CounterValue aOrdinal,
                                    WritingMode aWritingMode,
                                    nsSubstring& aResult,
                                    bool& aIsBullet);



  virtual bool IsBullet() = 0;

  virtual void GetNegative(NegativeType& aResult) = 0;





  virtual bool IsOrdinalInRange(CounterValue aOrdinal) = 0;





  virtual bool IsOrdinalInAutoRange(CounterValue aOrdinal) = 0;
  virtual void GetPad(PadType& aResult) = 0;
  virtual CounterStyle* GetFallback() = 0;
  virtual uint8_t GetSpeakAs() = 0;
  virtual bool UseNegativeSign() = 0;

  virtual void CallFallbackStyle(CounterValue aOrdinal,
                                 WritingMode aWritingMode,
                                 nsSubstring& aResult,
                                 bool& aIsRTL);
  virtual bool GetInitialCounterText(CounterValue aOrdinal,
                                     WritingMode aWritingMode,
                                     nsSubstring& aResult,
                                     bool& aIsRTL) = 0;

  virtual AnonymousCounterStyle* AsAnonymous() { return nullptr; }

  public: virtual MozExternalRefCountType AddRef(void) = 0; virtual MozExternalRefCountType Release(void) = 0; public:

protected:
  int32_t mStyle;
};

class AnonymousCounterStyle final : public CounterStyle
{
public:
  explicit AnonymousCounterStyle(const nsSubstring& aContent);
  explicit AnonymousCounterStyle(const nsCSSValue::Array* aValue);

  virtual void GetStyleName(nsAString& aResult) override;
  virtual void GetPrefix(nsAString& aResult) override;
  virtual void GetSuffix(nsAString& aResult) override;
  virtual bool IsBullet() override;

  virtual void GetNegative(NegativeType& aResult) override;
  virtual bool IsOrdinalInRange(CounterValue aOrdinal) override;
  virtual bool IsOrdinalInAutoRange(CounterValue aOrdinal) override;
  virtual void GetPad(PadType& aResult) override;
  virtual CounterStyle* GetFallback() override;
  virtual uint8_t GetSpeakAs() override;
  virtual bool UseNegativeSign() override;

  virtual bool GetInitialCounterText(CounterValue aOrdinal,
                                     WritingMode aWritingMode,
                                     nsSubstring& aResult,
                                     bool& aIsRTL) override;

  virtual AnonymousCounterStyle* AsAnonymous() override { return this; }

  bool IsSingleString() const { return mSingleString; }
  uint8_t GetSystem() const { return mSystem; }
  const nsTArray<nsString>& GetSymbols() const { return mSymbols; }

  public: MozExternalRefCountType AddRef(void) override { static_assert(!mozilla::IsDestructible<AnonymousCounterStyle>::value, "Reference-counted class " "AnonymousCounterStyle" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) override { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

private:
  ~AnonymousCounterStyle() {}

  bool mSingleString;
  uint8_t mSystem;
  nsTArray<nsString> mSymbols;
};

class CounterStyleManager final
{
private:
  ~CounterStyleManager();
public:
  explicit CounterStyleManager(nsPresContext* aPresContext);

  static void InitializeBuiltinCounterStyles();

  void Disconnect();

  bool IsInitial() const
  {

    return mCacheTable.Count() == 2;
  }

  CounterStyle* BuildCounterStyle(const nsSubstring& aName);

  static CounterStyle* GetBuiltinStyle(int32_t aStyle);
  static CounterStyle* GetNoneStyle()
  {
    return GetBuiltinStyle(0);
  }
  static CounterStyle* GetDecimalStyle()
  {
    return GetBuiltinStyle(4);
  }





  bool NotifyRuleChanged();

  nsPresContext* PresContext() const { return mPresContext; }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<CounterStyleManager>::value, "Reference-counted class " "CounterStyleManager" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); ++mRefCnt; ; return mRefCnt; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); --mRefCnt; ; if (mRefCnt == 0) { mRefCnt = 1; delete(this); return 0; } return mRefCnt; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:

private:
  nsPresContext* mPresContext;
  nsRefPtrHashtable<nsStringHashKey, CounterStyle> mCacheTable;
};

}
# 40 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/X11UndefineNone.h" 1
# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h" 2

class nsIFrame;
class nsIURI;
class nsStyleContext;
class nsTextFrame;
class imgIContainer;
struct nsStyleVisibility;
namespace mozilla {
namespace dom {
class ImageTracker;
}
}
# 111 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
static_assert(int(mozilla::SheetType::Count) - 1 <=
                (0xf0000000 >> 28),
              "NS_RULE_NODE_LEVEL_MASK cannot fit SheetType");

static_assert(0x000ffffff == (1 << nsStyleStructID_Length) - 1,
              "NS_STYLE_INHERIT_MASK is not correct");

static_assert((0x01000000 & 0x000ffffff) == 0,
  "NS_RULE_NODE_IS_ANIMATION_RULE must not overlap the style struct bits.");

namespace mozilla {

struct Position {
  using Coord = nsStyleCoord::CalcValue;

  Coord mXPosition, mYPosition;


  Position() {}



  void SetInitialPercentValues(float aPercentVal);



  void SetInitialZeroValues();



  bool DependsOnPositioningAreaSize() const {
    return mXPosition.mPercent != 0.0f || mYPosition.mPercent != 0.0f;
  }

  bool operator==(const Position& aOther) const {
    return mXPosition == aOther.mXPosition &&
      mYPosition == aOther.mYPosition;
  }
  bool operator!=(const Position& aOther) const {
    return !(*this == aOther);
  }
};

}


struct nsStyleFont
{
  nsStyleFont(const nsFont& aFont, const nsPresContext* aContext);
  nsStyleFont(const nsStyleFont& aStyleFont);
  explicit nsStyleFont(const nsPresContext* aContext);
  ~nsStyleFont() {
                               ;
  }
  void FinishStyle(nsPresContext* aPresContext) {}

  nsChangeHint CalcDifference(const nsStyleFont& aNewData) const;






  static nscoord ZoomText(const nsPresContext* aPresContext, nscoord aSize);





  static nscoord UnZoomText(nsPresContext* aPresContext, nscoord aSize);
  static already_AddRefed<nsIAtom> GetLanguage(const nsPresContext* aPresContext);

  void* operator new(size_t sz, nsStyleFont* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleFont, sz);
  }
  void Destroy(nsPresContext* aContext);

  void EnableZoom(nsPresContext* aContext, bool aEnable);

  nsFont mFont;
  nscoord mSize;





  uint8_t mGenericID;



  int8_t mScriptLevel;

  uint8_t mMathVariant;

  uint8_t mMathDisplay;


  uint8_t mMinFontSizeRatio;


  bool mExplicitLanguage;



  bool mAllowZoom;


  nscoord mScriptUnconstrainedSize;
  nscoord mScriptMinSize;
  float mScriptSizeMultiplier;
  nsCOMPtr<nsIAtom> mLanguage;
};

struct nsStyleGradientStop
{
  nsStyleCoord mLocation;
  nscolor mColor;
  bool mIsInterpolationHint;


  bool operator==(const nsStyleGradientStop&) const = delete;
  bool operator!=(const nsStyleGradientStop&) const = delete;
};

class nsStyleGradient final
{
public:
  nsStyleGradient();
  uint8_t mShape;
  uint8_t mSize;

  bool mRepeating;
  bool mLegacySyntax;

  nsStyleCoord mBgPosX;
  nsStyleCoord mBgPosY;
  nsStyleCoord mAngle;

  nsStyleCoord mRadiusX;
  nsStyleCoord mRadiusY;


  nsTArray<nsStyleGradientStop> mStops;

  bool operator==(const nsStyleGradient& aOther) const;
  bool operator!=(const nsStyleGradient& aOther) const {
    return !(*this == aOther);
  }

  bool IsOpaque();
  bool HasCalc();
  uint32_t Hash(PLDHashNumber aHash);

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsStyleGradient>::value, "Reference-counted class " "nsStyleGradient" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:

private:

  ~nsStyleGradient() {}

  nsStyleGradient(const nsStyleGradient& aOther) = delete;
  nsStyleGradient& operator=(const nsStyleGradient& aOther) = delete;
};
# 305 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
class nsStyleImageRequest
{
public:
  typedef mozilla::css::URLValueData URLValueData;





  enum class Mode : uint8_t {







    Track = 0x1,





    Discard = 0x2,
  };




  nsStyleImageRequest(Mode aModeFlags,
                      imgRequestProxy* aRequestProxy,
                      mozilla::css::ImageValue* aImageValue,
                      mozilla::dom::ImageTracker* aImageTracker);



  nsStyleImageRequest(
      Mode aModeFlags,
      const nsAString& aURL,
      already_AddRefed<mozilla::URLExtraData> aExtraData);

  bool Resolve(nsPresContext* aPresContext);
  bool IsResolved() const { return mResolved; }

  imgRequestProxy* get() {
    do { } while (0);
    do { } while (0);
    return mRequestProxy.get();
  }
  const imgRequestProxy* get() const {
    return const_cast<nsStyleImageRequest*>(this)->get();
  }



  bool DefinitelyEquals(const nsStyleImageRequest& aOther) const;

  mozilla::css::ImageValue* GetImageValue() const { return mImageValue; }

  already_AddRefed<nsIURI> GetImageURI() const;
  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsStyleImageRequest>::value, "Reference-counted class " "nsStyleImageRequest" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:;

private:
  ~nsStyleImageRequest();
  nsStyleImageRequest& operator=(const nsStyleImageRequest& aOther) = delete;

  void MaybeTrackAndLock();

  RefPtr<imgRequestProxy> mRequestProxy;
  RefPtr<mozilla::css::ImageValue> mImageValue;
  RefPtr<mozilla::dom::ImageTracker> mImageTracker;


  RefPtr<mozilla::dom::DocGroup> mDocGroup;

  Mode mModeFlags;
  bool mResolved;
};

inline constexpr mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> operator |(nsStyleImageRequest::Mode a, nsStyleImageRequest::Mode b) { typedef mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<nsStyleImageRequest::Mode>::Type U; return Result(nsStyleImageRequest::Mode(U(a) | U(b))); } inline nsStyleImageRequest::Mode& operator |=(nsStyleImageRequest::Mode& a, nsStyleImageRequest::Mode b) { return a = a | b; } inline constexpr mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> operator &(nsStyleImageRequest::Mode a, nsStyleImageRequest::Mode b) { typedef mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<nsStyleImageRequest::Mode>::Type U; return Result(nsStyleImageRequest::Mode(U(a) & U(b))); } inline nsStyleImageRequest::Mode& operator &=(nsStyleImageRequest::Mode& a, nsStyleImageRequest::Mode b) { return a = a & b; } inline constexpr mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> operator ^(nsStyleImageRequest::Mode a, nsStyleImageRequest::Mode b) { typedef mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<nsStyleImageRequest::Mode>::Type U; return Result(nsStyleImageRequest::Mode(U(a) ^ U(b))); } inline nsStyleImageRequest::Mode& operator ^=(nsStyleImageRequest::Mode& a, nsStyleImageRequest::Mode b) { return a = a ^ b; } inline constexpr mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> operator~(nsStyleImageRequest::Mode a) { typedef mozilla::CastableTypedEnumResult<nsStyleImageRequest::Mode> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<nsStyleImageRequest::Mode>::Type U; return Result(nsStyleImageRequest::Mode(~(U(a)))); }

enum nsStyleImageType {
  eStyleImageType_Null,
  eStyleImageType_Image,
  eStyleImageType_Gradient,
  eStyleImageType_Element,
  eStyleImageType_URL
};

struct CachedBorderImageData
{


  void SetCachedSVGViewportSize(const mozilla::Maybe<nsSize>& aSVGViewportSize);
  const mozilla::Maybe<nsSize>& GetCachedSVGViewportSize();
  void PurgeCachedImages();
  void SetSubImage(uint8_t aIndex, imgIContainer* aSubImage);
  imgIContainer* GetSubImage(uint8_t aIndex);

private:



  mozilla::Maybe<nsSize> mCachedSVGViewportSize;
  nsCOMArray<imgIContainer> mSubImages;
};
# 422 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
struct nsStyleImage
{
  typedef mozilla::css::URLValue URLValue;
  typedef mozilla::css::URLValueData URLValueData;

  nsStyleImage();
  ~nsStyleImage();
  nsStyleImage(const nsStyleImage& aOther);
  nsStyleImage& operator=(const nsStyleImage& aOther);

  void SetNull();
  void SetImageRequest(already_AddRefed<nsStyleImageRequest> aImage);
  void SetGradientData(nsStyleGradient* aGradient);
  void SetElementId(already_AddRefed<nsIAtom> aElementId);
  void SetCropRect(mozilla::UniquePtr<nsStyleSides> aCropRect);
  void SetURLValue(already_AddRefed<URLValue> aData);

  void ResolveImage(nsPresContext* aContext) {
    do { } while (0);
    if (mType == eStyleImageType_Image && !mImage->IsResolved()) {
      mImage->Resolve(aContext);
    }
  }

  nsStyleImageType GetType() const {
    return mType;
  }
  nsStyleImageRequest* GetImageRequest() const {
    do { } while (0);
    do { } while (0);
    return mImage;
  }
  imgRequestProxy* GetImageData() const {
    return GetImageRequest()->get();
  }
  nsStyleGradient* GetGradientData() const {
    do { } while(0);
    return mGradient;
  }
  const nsIAtom* GetElementId() const {
    do { } while(0);
    return mElementId;
  }
  const mozilla::UniquePtr<nsStyleSides>& GetCropRect() const {
    do { } while(0);

    return mCropRect;
  }

  already_AddRefed<nsIURI> GetImageURI() const;

  URLValueData* GetURLValue() const;
# 484 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
  bool ComputeActualCropRect(nsIntRect& aActualCropRect,
                               bool* aIsEntireImage = nullptr) const;







  bool StartDecoding() const;




  bool IsOpaque() const;





  bool IsComplete() const;





  bool IsLoaded() const;




  bool IsEmpty() const {







    return mType == eStyleImageType_Null;
  }

  bool operator==(const nsStyleImage& aOther) const;
  bool operator!=(const nsStyleImage& aOther) const {
    return !(*this == aOther);
  }

  bool ImageDataEquals(const nsStyleImage& aOther) const
  {
    return GetType() == eStyleImageType_Image &&
           aOther.GetType() == eStyleImageType_Image &&
           GetImageData() == aOther.GetImageData();
  }



  inline void SetSubImage(uint8_t aIndex, imgIContainer* aSubImage) const;
  inline imgIContainer* GetSubImage(uint8_t aIndex) const;
  void PurgeCacheForViewportChange(
    const mozilla::Maybe<nsSize>& aSVGViewportSize,
    const bool aHasIntrinsicRatio) const;

private:
  void DoCopy(const nsStyleImage& aOther);
  void EnsureCachedBIData() const;



  mozilla::UniquePtr<CachedBorderImageData> mCachedBIData;

  nsStyleImageType mType;
  union {
    nsStyleImageRequest* mImage;
    nsStyleGradient* mGradient;
    URLValue* mURLValue;


    nsIAtom* mElementId;
  };


  mozilla::UniquePtr<nsStyleSides> mCropRect;
};

struct nsStyleColor
{
  explicit nsStyleColor(const nsPresContext* aContext);
  nsStyleColor(const nsStyleColor& aOther);
  ~nsStyleColor() {
                                ;
  }
  void FinishStyle(nsPresContext* aPresContext) {}

  nscolor CalcComplexColor(const mozilla::StyleComplexColor& aColor) const {
    return mozilla::LinearBlendColors(aColor.mColor, mColor,
                                      aColor.mForegroundRatio);
  }

  nsChangeHint CalcDifference(const nsStyleColor& aNewData) const;

  void* operator new(size_t sz, nsStyleColor* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleColor, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleColor();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleColor, this);
  }



  nscolor mColor;
};

struct nsStyleImageLayers {

  enum {
    shorthand = 0,
    color,
    image,
    repeat,
    positionX,
    positionY,
    clip,
    origin,
    size,
    attachment,
    maskMode,
    composite
  };

  enum class LayerType : uint8_t {
    Background = 0,
    Mask
  };

  explicit nsStyleImageLayers(LayerType aType);
  nsStyleImageLayers(const nsStyleImageLayers &aSource);
  ~nsStyleImageLayers() {
                                      ;
  }

  static bool IsInitialPositionForLayerType(mozilla::Position aPosition, LayerType aType);

  struct Size;
  friend struct Size;
  struct Size {
    struct Dimension : public nsStyleCoord::CalcValue {
      nscoord ResolveLengthPercentage(nscoord aAvailable) const {
        double d = double(mPercent) * double(aAvailable) + double(mLength);
        if (d < 0.0) {
          return 0;
        }
        return NSToCoordRoundWithClamp(float(d));
      }
    };
    Dimension mWidth, mHeight;

    bool IsInitialValue() const {
      return mWidthType == eAuto && mHeightType == eAuto;
    }

    nscoord ResolveWidthLengthPercentage(const nsSize& aBgPositioningArea) const {
      do { } while (0);

      return mWidth.ResolveLengthPercentage(aBgPositioningArea.width);
    }

    nscoord ResolveHeightLengthPercentage(const nsSize& aBgPositioningArea) const {
      do { } while (0);

      return mHeight.ResolveLengthPercentage(aBgPositioningArea.height);
    }





    enum DimensionType {



      eContain, eCover,

      eAuto,
      eLengthPercentage,
      eDimensionType_COUNT
    };
    uint8_t mWidthType, mHeightType;




    bool DependsOnPositioningAreaSize(const nsStyleImage& aImage) const;


    Size() {}


    void SetInitialValues();

    bool operator==(const Size& aOther) const;
    bool operator!=(const Size& aOther) const {
      return !(*this == aOther);
    }
  };

  struct Repeat;
  friend struct Repeat;
  struct Repeat {
    uint8_t mXRepeat, mYRepeat;


    Repeat() {}

    bool IsInitialValue() const {
      return mXRepeat == 0x03 &&
             mYRepeat == 0x03;
    }

    bool DependsOnPositioningAreaSize() const {
      return mXRepeat == 0x04 ||
             mYRepeat == 0x04;
    }


    void SetInitialValues() {
      mXRepeat = 0x03;
      mYRepeat = 0x03;
    }

    bool operator==(const Repeat& aOther) const {
      return mXRepeat == aOther.mXRepeat &&
             mYRepeat == aOther.mYRepeat;
    }
    bool operator!=(const Repeat& aOther) const {
      return !(*this == aOther);
    }
  };

  struct Layer;
  friend struct Layer;
  struct Layer {
    typedef mozilla::StyleGeometryBox StyleGeometryBox;

    nsStyleImage mImage;
    mozilla::Position mPosition;
    Size mSize;
    StyleGeometryBox mClip;

      StyleGeometryBox mOrigin;
    uint8_t mAttachment;





    uint8_t mBlendMode;





    uint8_t mComposite;





    uint8_t mMaskMode;





    Repeat mRepeat;



    Layer();
    ~Layer();


    void Initialize(LayerType aType);

    void ResolveImage(nsPresContext* aContext) {
      if (mImage.GetType() == eStyleImageType_Image) {
        mImage.ResolveImage(aContext);
      }
    }






    bool RenderingMightDependOnPositioningAreaSizeChange() const;


    nsChangeHint CalcDifference(const Layer& aNewLayer) const;



    bool operator==(const Layer& aOther) const;
    bool operator!=(const Layer& aOther) const {
      return !(*this == aOther);
    }
  };



  uint32_t mAttachmentCount,
           mClipCount,
           mOriginCount,
           mRepeatCount,
           mPositionXCount,
           mPositionYCount,
           mImageCount,
           mSizeCount,
           mMaskModeCount,
           mBlendModeCount,
           mCompositeCount;
# 819 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
  nsStyleAutoArray<Layer> mLayers;

  const Layer& BottomLayer() const { return mLayers[mImageCount - 1]; }

  void ResolveImages(nsPresContext* aContext) {
    for (uint32_t i = 0; i < mImageCount; ++i) {
      mLayers[i].ResolveImage(aContext);
    }
  }

  nsChangeHint CalcDifference(const nsStyleImageLayers& aNewLayers,
                              nsStyleImageLayers::LayerType aType) const;

  nsStyleImageLayers& operator=(const nsStyleImageLayers& aOther);
  nsStyleImageLayers& operator=(nsStyleImageLayers&& aOther);
  bool operator==(const nsStyleImageLayers& aOther) const;

  static const nsCSSPropertyID kBackgroundLayerTable[];
  static const nsCSSPropertyID kMaskLayerTable[];







};

struct nsStyleBackground {
  explicit nsStyleBackground(const nsPresContext* aContext);
  nsStyleBackground(const nsStyleBackground& aOther);
  ~nsStyleBackground();




  void FinishStyle(nsPresContext* aPresContext);

  void* operator new(size_t sz, nsStyleBackground* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleBackground, sz);
  }
  void Destroy(nsPresContext* aContext);

  nsChangeHint CalcDifference(const nsStyleBackground& aNewData) const;


  nscolor BackgroundColor(const nsIFrame* aFrame) const;
  nscolor BackgroundColor(nsStyleContext* aContext) const;


  bool IsTransparent(const nsIFrame* aFrame) const;
  bool IsTransparent(nsStyleContext* aContext) const;





  bool HasFixedBackground(nsIFrame* aFrame) const;



  inline bool HasLocalBackground() const;

  const nsStyleImageLayers::Layer& BottomLayer() const { return mImage.BottomLayer(); }

  nsStyleImageLayers mImage;
  mozilla::StyleComplexColor mBackgroundColor;
};






struct nsStyleMargin
{
  explicit nsStyleMargin(const nsPresContext* aContext);
  nsStyleMargin(const nsStyleMargin& aMargin);
  ~nsStyleMargin() {
                                 ;
  }
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleMargin* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleMargin, sz);
  }
  void Destroy(nsPresContext* aContext);

  nsChangeHint CalcDifference(const nsStyleMargin& aNewData) const;

  bool GetMargin(nsMargin& aMargin) const
  {
    if (!mMargin.ConvertsToLength()) {
      return false;
    }

    int32_t side919 = mozilla::eSideTop; for (mozilla::Side side; side919 <= mozilla::eSideLeft && ((side = mozilla::Side(side919)), true); ++side919) {
      aMargin.Side(side) = mMargin.ToLength(side);
    }
    return true;
  }



  inline bool HasBlockAxisAuto(mozilla::WritingMode aWM) const;
  inline bool HasInlineAxisAuto(mozilla::WritingMode aWM) const;

  nsStyleSides mMargin;
};

struct nsStylePadding
{
  explicit nsStylePadding(const nsPresContext* aContext);
  nsStylePadding(const nsStylePadding& aPadding);
  ~nsStylePadding() {
                                  ;
  }
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStylePadding* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStylePadding, sz);
  }
  void Destroy(nsPresContext* aContext);

  nsChangeHint CalcDifference(const nsStylePadding& aNewData) const;

  nsStyleSides mPadding;

  bool IsWidthDependent() const {
    return !mPadding.ConvertsToLength();
  }

  bool GetPadding(nsMargin& aPadding) const
  {
    if (!mPadding.ConvertsToLength()) {
      return false;
    }

    int32_t side963 = mozilla::eSideTop; for (mozilla::Side side; side963 <= mozilla::eSideLeft && ((side = mozilla::Side(side963)), true); ++side963) {

      aPadding.Side(side) = std::max(mPadding.ToLength(side), 0);
    }
    return true;
  }
};

struct nsBorderColors
{
  nsBorderColors* mNext;
  nscolor mColor;

  nsBorderColors() : mNext(nullptr), mColor(((nscolor) ((255 << 24) | ((0)<<16) | ((0)<<8) | (0)))) {}
  explicit nsBorderColors(const nscolor& aColor) : mNext(nullptr), mColor(aColor) {}
  ~nsBorderColors();

  nsBorderColors* Clone() const { return Clone(true); }

  static bool Equal(const nsBorderColors* c1,
                      const nsBorderColors* c2) {
    if (c1 == c2) {
      return true;
    }
    while (c1 && c2) {
      if (c1->mColor != c2->mColor) {
        return false;
      }
      c1 = c1->mNext;
      c2 = c2->mNext;
    }


    return !c1 && !c2;
  }

private:
  nsBorderColors* Clone(bool aDeep) const;
};

struct nsCSSShadowItem
{
  nscoord mXOffset;
  nscoord mYOffset;
  nscoord mRadius;
  nscoord mSpread;

  nscolor mColor;
  bool mHasColor;
  bool mInset;

  nsCSSShadowItem() : mHasColor(false) {
                                   ;
  }
  ~nsCSSShadowItem() {
                                   ;
  }

  bool operator==(const nsCSSShadowItem& aOther) const {
    return (mXOffset == aOther.mXOffset &&
            mYOffset == aOther.mYOffset &&
            mRadius == aOther.mRadius &&
            mHasColor == aOther.mHasColor &&
            mSpread == aOther.mSpread &&
            mInset == aOther.mInset &&
            (!mHasColor || mColor == aOther.mColor));
  }
  bool operator!=(const nsCSSShadowItem& aOther) const {
    return !(*this == aOther);
  }
};

class nsCSSShadowArray final
{
public:
  void* operator new(size_t aBaseSize, uint32_t aArrayLen) {





    return ::operator new(aBaseSize +
                          (aArrayLen - 1) * sizeof(nsCSSShadowItem));
  }

  explicit nsCSSShadowArray(uint32_t aArrayLen) :
    mLength(aArrayLen)
  {
    for (uint32_t i = 1; i < mLength; ++i) {


      new (&mArray[i]) nsCSSShadowItem();
    }
  }

private:

  ~nsCSSShadowArray() {
    for (uint32_t i = 1; i < mLength; ++i) {
      mArray[i].~nsCSSShadowItem();
    }
  }

public:
  uint32_t Length() const { return mLength; }
  nsCSSShadowItem* ShadowAt(uint32_t i) {
    do { } while (0);
    return &mArray[i];
  }
  const nsCSSShadowItem* ShadowAt(uint32_t i) const {
    do { } while (0);
    return &mArray[i];
  }

  bool HasShadowWithInset(bool aInset) {
    for (uint32_t i = 0; i < mLength; ++i) {
      if (mArray[i].mInset == aInset) {
        return true;
      }
    }
    return false;
  }

  bool operator==(const nsCSSShadowArray& aOther) const {
    if (mLength != aOther.Length()) {
      return false;
    }

    for (uint32_t i = 0; i < mLength; ++i) {
      if (ShadowAt(i) != aOther.ShadowAt(i)) {
        return false;
      }
    }

    return true;
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsCSSShadowArray>::value, "Reference-counted class " "nsCSSShadowArray" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:

private:
  uint32_t mLength;
  nsCSSShadowItem mArray[1];
};
# 1121 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
static bool IsVisibleBorderStyle(uint8_t aStyle)
{
  return (aStyle != 0 &&
          aStyle != 9);
}

struct nsStyleBorder
{
  explicit nsStyleBorder(const nsPresContext* aContext);
  nsStyleBorder(const nsStyleBorder& aBorder);
  ~nsStyleBorder();




  void FinishStyle(nsPresContext* aPresContext);

  void* operator new(size_t sz, nsStyleBorder* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleBorder, sz);
  }
  void Destroy(nsPresContext* aContext);

  nsChangeHint CalcDifference(const nsStyleBorder& aNewData) const;

  void EnsureBorderColors() {
    if (!mBorderColors) {
      mBorderColors = new nsBorderColors*[4];
      if (mBorderColors) {
        for (int32_t i = 0; i < 4; i++) {
          mBorderColors[i] = nullptr;
        }
      }
    }
  }

  void ClearBorderColors(mozilla::Side aSide) {
    if (mBorderColors && mBorderColors[aSide]) {
      delete mBorderColors[aSide];
      mBorderColors[aSide] = nullptr;
    }
  }






  bool HasVisibleStyle(mozilla::Side aSide) const
  {
    return IsVisibleBorderStyle(mBorderStyle[aSide]);
  }


  void SetBorderWidth(mozilla::Side aSide, nscoord aBorderWidth)
  {
    nscoord roundedWidth =
      ((aBorderWidth) == 0) ? 0 : std::max((mTwipsPerPixel), (aBorderWidth) / (mTwipsPerPixel) * (mTwipsPerPixel));
    mBorder.Side(aSide) = roundedWidth;
    if (HasVisibleStyle(aSide)) {
      mComputedBorder.Side(aSide) = roundedWidth;
    }
  }




  const nsMargin& GetComputedBorder() const
  {
    return mComputedBorder;
  }

  bool HasBorder() const
  {
    return mComputedBorder != nsMargin(0,0,0,0) || !mBorderImageSource.IsEmpty();
  }





  nscoord GetComputedBorderWidth(mozilla::Side aSide) const
  {
    return GetComputedBorder().Side(aSide);
  }

  uint8_t GetBorderStyle(mozilla::Side aSide) const
  {
    do { } while(0);
    return mBorderStyle[aSide];
  }

  void SetBorderStyle(mozilla::Side aSide, uint8_t aStyle)
  {
    do { } while(0);
    mBorderStyle[aSide] = aStyle;
    mComputedBorder.Side(aSide) =
      (HasVisibleStyle(aSide) ? mBorder.Side(aSide) : 0);
  }

  inline bool IsBorderImageLoaded() const
  {
    return mBorderImageSource.IsLoaded();
  }

  void ResolveImage(nsPresContext* aContext)
  {
    if (mBorderImageSource.GetType() == eStyleImageType_Image) {
      mBorderImageSource.ResolveImage(aContext);
    }
  }

  nsMargin GetImageOutset() const;

  void GetCompositeColors(int32_t aIndex, nsBorderColors** aColors) const
  {
    if (!mBorderColors) {
      *aColors = nullptr;
    } else {
      *aColors = mBorderColors[aIndex];
    }
  }

  void AppendBorderColor(int32_t aIndex, nscolor aColor)
  {
    do { } while(0);
    nsBorderColors* colorEntry = new nsBorderColors(aColor);
    if (!mBorderColors[aIndex]) {
      mBorderColors[aIndex] = colorEntry;
    } else {
      nsBorderColors* last = mBorderColors[aIndex];
      while (last->mNext) {
        last = last->mNext;
      }
      last->mNext = colorEntry;
    }
  }

  imgIRequest* GetBorderImageRequest() const
  {
    if (mBorderImageSource.GetType() == eStyleImageType_Image) {
      return mBorderImageSource.GetImageData();
    }
    return nullptr;
  }

public:
  nsBorderColors** mBorderColors;
  nsStyleCorners mBorderRadius;
  nsStyleImage mBorderImageSource;
  nsStyleSides mBorderImageSlice;
  nsStyleSides mBorderImageWidth;
  nsStyleSides mBorderImageOutset;

  uint8_t mBorderImageFill;
  uint8_t mBorderImageRepeatH;
  uint8_t mBorderImageRepeatV;
  mozilla::StyleFloatEdge mFloatEdge;
  mozilla::StyleBoxDecorationBreak mBoxDecorationBreak;

protected:
  uint8_t mBorderStyle[4];

public:


  union {
    struct {
      mozilla::StyleComplexColor mBorderTopColor;
      mozilla::StyleComplexColor mBorderRightColor;
      mozilla::StyleComplexColor mBorderBottomColor;
      mozilla::StyleComplexColor mBorderLeftColor;
    };
    mozilla::StyleComplexColor mBorderColor[4];
  };

  static mozilla::StyleComplexColor nsStyleBorder::*
  BorderColorFieldFor(mozilla::Side aSide) {
    switch (aSide) {
      case mozilla::eSideTop:
        return &nsStyleBorder::mBorderTopColor;
      case mozilla::eSideRight:
        return &nsStyleBorder::mBorderRightColor;
      case mozilla::eSideBottom:
        return &nsStyleBorder::mBorderBottomColor;
      case mozilla::eSideLeft:
        return &nsStyleBorder::mBorderLeftColor;
    }
    do { } while (0);
    return nullptr;
  }

protected:






  nsMargin mComputedBorder;
# 1334 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
  nsMargin mBorder;

private:
  nscoord mTwipsPerPixel;

  nsStyleBorder& operator=(const nsStyleBorder& aOther) = delete;
};
# 1349 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
static_assert(__builtin_offsetof(nsStyleBorder, mBorderTopColor) == __builtin_offsetof(nsStyleBorder, mBorderColor) + size_t(mozilla::eSideTop) * sizeof(mozilla::StyleComplexColor), "mBorder" "Top" "Color must be at same offset " "as mBorderColor[mozilla::eSide" "Top" "]");
static_assert(__builtin_offsetof(nsStyleBorder, mBorderRightColor) == __builtin_offsetof(nsStyleBorder, mBorderColor) + size_t(mozilla::eSideRight) * sizeof(mozilla::StyleComplexColor), "mBorder" "Right" "Color must be at same offset " "as mBorderColor[mozilla::eSide" "Right" "]");
static_assert(__builtin_offsetof(nsStyleBorder, mBorderBottomColor) == __builtin_offsetof(nsStyleBorder, mBorderColor) + size_t(mozilla::eSideBottom) * sizeof(mozilla::StyleComplexColor), "mBorder" "Bottom" "Color must be at same offset " "as mBorderColor[mozilla::eSide" "Bottom" "]");
static_assert(__builtin_offsetof(nsStyleBorder, mBorderLeftColor) == __builtin_offsetof(nsStyleBorder, mBorderColor) + size_t(mozilla::eSideLeft) * sizeof(mozilla::StyleComplexColor), "mBorder" "Left" "Color must be at same offset " "as mBorderColor[mozilla::eSide" "Left" "]");



struct nsStyleOutline
{
  explicit nsStyleOutline(const nsPresContext* aContext);
  nsStyleOutline(const nsStyleOutline& aOutline);
  ~nsStyleOutline() {
                                  ;
  }
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleOutline* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleOutline, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleOutline();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleOutline, this);
  }

  void RecalcData();
  nsChangeHint CalcDifference(const nsStyleOutline& aNewData) const;

  nsStyleCorners mOutlineRadius;






  nscoord mOutlineWidth;
  nscoord mOutlineOffset;
  mozilla::StyleComplexColor mOutlineColor;
  uint8_t mOutlineStyle;

  nscoord GetOutlineWidth() const
  {
    return mActualOutlineWidth;
  }

  bool ShouldPaintOutline() const
  {
    return mOutlineStyle == 10 ||
           (GetOutlineWidth() > 0 &&
            mOutlineStyle != 0);
  }

protected:



  nscoord mActualOutlineWidth;
  nscoord mTwipsPerPixel;
};







class nsStyleQuoteValues
{
public:
  typedef nsTArray<std::pair<nsString, nsString>> QuotePairArray;
  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<nsStyleQuoteValues>::value, "Reference-counted class " "nsStyleQuoteValues" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:;
  QuotePairArray mQuotePairs;

private:
  ~nsStyleQuoteValues() {}
};

struct nsStyleList
{
  explicit nsStyleList(const nsPresContext* aContext);
  nsStyleList(const nsStyleList& aStyleList);
  ~nsStyleList();

  void FinishStyle(nsPresContext* aPresContext);

  void* operator new(size_t sz, nsStyleList* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleList, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleList();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleList, this);
  }

  nsChangeHint CalcDifference(const nsStyleList& aNewData) const;

  static void Shutdown() {
    sInitialQuotes = nullptr;
    sNoneQuotes = nullptr;
  }

  imgRequestProxy* GetListStyleImage() const
  {
    return mListStyleImage ? mListStyleImage->get() : nullptr;
  }

  already_AddRefed<nsIURI> GetListStyleImageURI() const;

  void GetListStyleType(nsSubstring& aType) const { mCounterStyle->GetStyleName(aType); }
  mozilla::CounterStyle* GetCounterStyle() const
  {
    return mCounterStyle.get();
  }
  void SetCounterStyle(mozilla::CounterStyle* aStyle)
  {


    do { } while (0);
    mCounterStyle = aStyle;
  }
  void SetListStyleType(const nsSubstring& aType,
                        nsPresContext* aPresContext)
  {
    SetCounterStyle(aPresContext->CounterStyleManager()->BuildCounterStyle(aType));
  }

  const nsStyleQuoteValues::QuotePairArray& GetQuotePairs() const;

  void SetQuotesInherit(const nsStyleList* aOther);
  void SetQuotesInitial();
  void SetQuotesNone();
  void SetQuotes(nsStyleQuoteValues::QuotePairArray&& aValues);

  uint8_t mListStylePosition;
  RefPtr<nsStyleImageRequest> mListStyleImage;
private:
  RefPtr<mozilla::CounterStyle> mCounterStyle;
  RefPtr<nsStyleQuoteValues> mQuotes;
  nsStyleList& operator=(const nsStyleList& aOther) = delete;
public:
  nsRect mImageRegion;

private:

  static mozilla::StaticRefPtr<nsStyleQuoteValues> sInitialQuotes;
  static mozilla::StaticRefPtr<nsStyleQuoteValues> sNoneQuotes;
};

struct nsStyleGridLine
{


  bool mHasSpan;
  int32_t mInteger;
  nsString mLineName;




  static const int32_t kMinLine = -10000;
  static const int32_t kMaxLine = 10000;

  nsStyleGridLine()
    : mHasSpan(false)
    , mInteger(0)

  {
  }

  nsStyleGridLine(const nsStyleGridLine& aOther)
  {
    (*this) = aOther;
  }

  void operator=(const nsStyleGridLine& aOther)
  {
    mHasSpan = aOther.mHasSpan;
    mInteger = aOther.mInteger;
    mLineName = aOther.mLineName;
  }

  bool operator!=(const nsStyleGridLine& aOther) const
  {
    return mHasSpan != aOther.mHasSpan ||
           mInteger != aOther.mInteger ||
           mLineName != aOther.mLineName;
  }

  void SetToInteger(uint32_t value)
  {
    mHasSpan = false;
    mInteger = value;
    mLineName.Truncate();
  }

  void SetAuto()
  {
    mHasSpan = false;
    mInteger = 0;
    mLineName.Truncate();
  }

  bool IsAuto() const
  {
    bool haveInitialValues = mInteger == 0 && mLineName.IsEmpty();
    do { } while (0);


    return haveInitialValues;
  }
};
# 1605 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
struct nsStyleGridTemplate
{
  nsTArray<nsTArray<nsString>> mLineNameLists;
  nsTArray<nsStyleCoord> mMinTrackSizingFunctions;
  nsTArray<nsStyleCoord> mMaxTrackSizingFunctions;
  nsTArray<nsString> mRepeatAutoLineNameListBefore;
  nsTArray<nsString> mRepeatAutoLineNameListAfter;
  int16_t mRepeatAutoIndex;
  bool mIsAutoFill : 1;
  bool mIsSubgrid : 1;

  nsStyleGridTemplate()
    : mRepeatAutoIndex(-1)
    , mIsAutoFill(false)
    , mIsSubgrid(false)
  {
  }

  inline bool operator!=(const nsStyleGridTemplate& aOther) const {
    return
      mIsSubgrid != aOther.mIsSubgrid ||
      mLineNameLists != aOther.mLineNameLists ||
      mMinTrackSizingFunctions != aOther.mMinTrackSizingFunctions ||
      mMaxTrackSizingFunctions != aOther.mMaxTrackSizingFunctions ||
      mIsAutoFill != aOther.mIsAutoFill ||
      mRepeatAutoIndex != aOther.mRepeatAutoIndex ||
      mRepeatAutoLineNameListBefore != aOther.mRepeatAutoLineNameListBefore ||
      mRepeatAutoLineNameListAfter != aOther.mRepeatAutoLineNameListAfter;
  }

  bool HasRepeatAuto() const {
    return mRepeatAutoIndex != -1;
  }

  bool IsRepeatAutoIndex(uint32_t aIndex) const {
    do { } while (0);
    return int32_t(aIndex) == mRepeatAutoIndex;
  }
};

struct nsStylePosition
{
  explicit nsStylePosition(const nsPresContext* aContext);
  nsStylePosition(const nsStylePosition& aOther);
  ~nsStylePosition();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStylePosition* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStylePosition, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStylePosition();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStylePosition, this);
  }

  nsChangeHint CalcDifference(const nsStylePosition& aNewData,
                              const nsStyleVisibility* aOldStyleVisibility) const;





  uint8_t UsedAlignSelf(nsStyleContext* aParent) const;





  uint8_t ComputedJustifyItems(nsStyleContext* aParent) const;





  uint8_t UsedJustifySelf(nsStyleContext* aParent) const;

  mozilla::Position mObjectPosition;
  nsStyleSides mOffset;
  nsStyleCoord mWidth;
  nsStyleCoord mMinWidth;
  nsStyleCoord mMaxWidth;
  nsStyleCoord mHeight;
  nsStyleCoord mMinHeight;
  nsStyleCoord mMaxHeight;
  nsStyleCoord mFlexBasis;
  nsStyleCoord mGridAutoColumnsMin;
  nsStyleCoord mGridAutoColumnsMax;
  nsStyleCoord mGridAutoRowsMin;
  nsStyleCoord mGridAutoRowsMax;
  uint8_t mGridAutoFlow;
  mozilla::StyleBoxSizing mBoxSizing;

  uint16_t mAlignContent;
  uint8_t mAlignItems;
  uint8_t mAlignSelf;
  uint16_t mJustifyContent;
private:
  friend class nsRuleNode;




  uint8_t mJustifyItems;
public:
  uint8_t mJustifySelf;
  uint8_t mFlexDirection;
  uint8_t mFlexWrap;
  uint8_t mObjectFit;
  int32_t mOrder;
  float mFlexGrow;
  float mFlexShrink;
  nsStyleCoord mZIndex;
  nsStyleGridTemplate mGridTemplateColumns;
  nsStyleGridTemplate mGridTemplateRows;


  RefPtr<mozilla::css::GridTemplateAreasValue> mGridTemplateAreas;

  nsStyleGridLine mGridColumnStart;
  nsStyleGridLine mGridColumnEnd;
  nsStyleGridLine mGridRowStart;
  nsStyleGridLine mGridRowEnd;
  nsStyleCoord mGridColumnGap;
  nsStyleCoord mGridRowGap;






  bool WidthDependsOnContainer() const
    {
      return mWidth.GetUnit() == eStyleUnit_Auto ||
        WidthCoordDependsOnContainer(mWidth);
    }
# 1752 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
  bool MinWidthDependsOnContainer() const
    { return WidthCoordDependsOnContainer(mMinWidth); }
  bool MaxWidthDependsOnContainer() const
    { return WidthCoordDependsOnContainer(mMaxWidth); }
# 1764 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
  bool HeightDependsOnContainer() const
    {
      return mHeight.GetUnit() == eStyleUnit_Auto ||
        HeightCoordDependsOnContainer(mHeight);
    }



  bool MinHeightDependsOnContainer() const
    { return HeightCoordDependsOnContainer(mMinHeight); }
  bool MaxHeightDependsOnContainer() const
    { return HeightCoordDependsOnContainer(mMaxHeight); }

  bool OffsetHasPercent(mozilla::Side aSide) const
  {
    return mOffset.Get(aSide).HasPercent();
  }





  inline nsStyleCoord& ISize(mozilla::WritingMode aWM);
  inline nsStyleCoord& MinISize(mozilla::WritingMode aWM);
  inline nsStyleCoord& MaxISize(mozilla::WritingMode aWM);
  inline nsStyleCoord& BSize(mozilla::WritingMode aWM);
  inline nsStyleCoord& MinBSize(mozilla::WritingMode aWM);
  inline nsStyleCoord& MaxBSize(mozilla::WritingMode aWM);
  inline const nsStyleCoord& ISize(mozilla::WritingMode aWM) const;
  inline const nsStyleCoord& MinISize(mozilla::WritingMode aWM) const;
  inline const nsStyleCoord& MaxISize(mozilla::WritingMode aWM) const;
  inline const nsStyleCoord& BSize(mozilla::WritingMode aWM) const;
  inline const nsStyleCoord& MinBSize(mozilla::WritingMode aWM) const;
  inline const nsStyleCoord& MaxBSize(mozilla::WritingMode aWM) const;
  inline bool ISizeDependsOnContainer(mozilla::WritingMode aWM) const;
  inline bool MinISizeDependsOnContainer(mozilla::WritingMode aWM) const;
  inline bool MaxISizeDependsOnContainer(mozilla::WritingMode aWM) const;
  inline bool BSizeDependsOnContainer(mozilla::WritingMode aWM) const;
  inline bool MinBSizeDependsOnContainer(mozilla::WritingMode aWM) const;
  inline bool MaxBSizeDependsOnContainer(mozilla::WritingMode aWM) const;

private:
  static bool WidthCoordDependsOnContainer(const nsStyleCoord &aCoord);
  static bool HeightCoordDependsOnContainer(const nsStyleCoord &aCoord)
    { return aCoord.HasPercent(); }
};

struct nsStyleTextOverflowSide
{
  nsStyleTextOverflowSide() : mType(0) {}

  bool operator==(const nsStyleTextOverflowSide& aOther) const {
    return mType == aOther.mType &&
           (mType != 2 ||
            mString == aOther.mString);
  }
  bool operator!=(const nsStyleTextOverflowSide& aOther) const {
    return !(*this == aOther);
  }

  nsString mString;
  uint8_t mType;
};

struct nsStyleTextOverflow
{
  nsStyleTextOverflow() : mLogicalDirections(true) {}
  bool operator==(const nsStyleTextOverflow& aOther) const {
    return mLeft == aOther.mLeft && mRight == aOther.mRight;
  }
  bool operator!=(const nsStyleTextOverflow& aOther) const {
    return !(*this == aOther);
  }


  const nsStyleTextOverflowSide& GetLeft(uint8_t aDirection) const {
    do { } while(0);

    return !mLogicalDirections || aDirection == 0 ?
             mLeft : mRight;
  }


  const nsStyleTextOverflowSide& GetRight(uint8_t aDirection) const {
    do { } while(0);

    return !mLogicalDirections || aDirection == 0 ?
             mRight : mLeft;
  }


  const nsStyleTextOverflowSide* GetFirstValue() const {
    return mLogicalDirections ? &mRight : &mLeft;
  }


  const nsStyleTextOverflowSide* GetSecondValue() const {
    return mLogicalDirections ? nullptr : &mRight;
  }

  nsStyleTextOverflowSide mLeft;
  nsStyleTextOverflowSide mRight;
  bool mLogicalDirections;
};

struct nsStyleTextReset
{
  explicit nsStyleTextReset(const nsPresContext* aContext);
  nsStyleTextReset(const nsStyleTextReset& aOther);
  ~nsStyleTextReset();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleTextReset* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleTextReset, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleTextReset();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleTextReset, this);
  }



  bool HasTextDecorationLines() const {
    return mTextDecorationLine != 0 &&
           mTextDecorationLine != 0x10;
  }

  nsChangeHint CalcDifference(const nsStyleTextReset& aNewData) const;

  nsStyleTextOverflow mTextOverflow;

  uint8_t mTextDecorationLine;
  uint8_t mTextDecorationStyle;
  uint8_t mUnicodeBidi;
  nscoord mInitialLetterSink;
  float mInitialLetterSize;
  mozilla::StyleComplexColor mTextDecorationColor;
};

struct nsStyleText
{
  explicit nsStyleText(const nsPresContext* aContext);
  nsStyleText(const nsStyleText& aOther);
  ~nsStyleText();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleText* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleText, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleText();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleText, this);
  }

  nsChangeHint CalcDifference(const nsStyleText& aNewData) const;

  uint8_t mTextAlign;
  uint8_t mTextAlignLast;
  bool mTextAlignTrue : 1;
  bool mTextAlignLastTrue : 1;
  mozilla::StyleTextJustify mTextJustify;
  uint8_t mTextTransform;
  uint8_t mWhiteSpace;
  uint8_t mWordBreak;
  uint8_t mOverflowWrap;
  mozilla::StyleHyphens mHyphens;
  uint8_t mRubyAlign;
  uint8_t mRubyPosition;
  uint8_t mTextSizeAdjust;
  uint8_t mTextCombineUpright;
  uint8_t mControlCharacterVisibility;
  uint8_t mTextEmphasisPosition;
  uint8_t mTextEmphasisStyle;
  uint8_t mTextRendering;
  mozilla::StyleComplexColor mTextEmphasisColor;
  mozilla::StyleComplexColor mWebkitTextFillColor;
  mozilla::StyleComplexColor mWebkitTextStrokeColor;

  nsStyleCoord mTabSize;
  nsStyleCoord mWordSpacing;
  nsStyleCoord mLetterSpacing;
  nsStyleCoord mLineHeight;
  nsStyleCoord mTextIndent;
  nscoord mWebkitTextStrokeWidth;

  RefPtr<nsCSSShadowArray> mTextShadow;

  nsString mTextEmphasisStyleString;

  bool WhiteSpaceIsSignificant() const {
    return mWhiteSpace == 1 ||
           mWhiteSpace == 3 ||
           mWhiteSpace == 5;
  }

  bool NewlineIsSignificantStyle() const {
    return mWhiteSpace == 1 ||
           mWhiteSpace == 3 ||
           mWhiteSpace == 4;
  }

  bool WhiteSpaceOrNewlineIsSignificant() const {
    return mWhiteSpace == 1 ||
           mWhiteSpace == 3 ||
           mWhiteSpace == 4 ||
           mWhiteSpace == 5;
  }

  bool TabIsSignificant() const {
    return mWhiteSpace == 1 ||
           mWhiteSpace == 3;
  }

  bool WhiteSpaceCanWrapStyle() const {
    return mWhiteSpace == 0 ||
           mWhiteSpace == 3 ||
           mWhiteSpace == 4;
  }

  bool WordCanWrapStyle() const {
    return WhiteSpaceCanWrapStyle() &&
           mOverflowWrap == 1;
  }

  bool HasTextEmphasis() const {
    return !mTextEmphasisStyleString.IsEmpty();
  }

  bool HasWebkitTextStroke() const {
    return mWebkitTextStrokeWidth > 0;
  }


  inline bool HasTextShadow() const;
  inline nsCSSShadowArray* GetTextShadow() const;





  inline bool NewlineIsSignificant(const nsTextFrame* aContextFrame) const;
  inline bool WhiteSpaceCanWrap(const nsIFrame* aContextFrame) const;
  inline bool WordCanWrap(const nsIFrame* aContextFrame) const;

  mozilla::LogicalSide TextEmphasisSide(mozilla::WritingMode aWM) const;
};

struct nsStyleImageOrientation
{
  static nsStyleImageOrientation CreateAsAngleAndFlip(double aRadians,
                                                      bool aFlip) {
    uint8_t orientation(0);


    double roundedAngle = fmod(aRadians, 2 * 3.14159265358979323846);
    if (roundedAngle < 0.25 * 3.14159265358979323846) { orientation = ANGLE_0; }
    else if (roundedAngle < 0.75 * 3.14159265358979323846) { orientation = ANGLE_90; }
    else if (roundedAngle < 1.25 * 3.14159265358979323846) { orientation = ANGLE_180;}
    else if (roundedAngle < 1.75 * 3.14159265358979323846) { orientation = ANGLE_270;}
    else { orientation = ANGLE_0; }


    if (aFlip) {
      orientation |= FLIP_MASK;
    }

    return nsStyleImageOrientation(orientation);
  }

  static nsStyleImageOrientation CreateAsFlip() {
    return nsStyleImageOrientation(FLIP_MASK);
  }

  static nsStyleImageOrientation CreateAsFromImage() {
    return nsStyleImageOrientation(FROM_IMAGE_MASK);
  }


  nsStyleImageOrientation() : mOrientation(0) { }

  bool IsDefault() const { return mOrientation == 0; }
  bool IsFlipped() const { return mOrientation & FLIP_MASK; }
  bool IsFromImage() const { return mOrientation & FROM_IMAGE_MASK; }
  bool SwapsWidthAndHeight() const {
    uint8_t angle = mOrientation & ORIENTATION_MASK;
    return (angle == ANGLE_90) || (angle == ANGLE_270);
  }

  mozilla::image::Angle Angle() const {
    switch (mOrientation & ORIENTATION_MASK) {
      case ANGLE_0: return mozilla::image::Angle::D0;
      case ANGLE_90: return mozilla::image::Angle::D90;
      case ANGLE_180: return mozilla::image::Angle::D180;
      case ANGLE_270: return mozilla::image::Angle::D270;
      default:
        do { } while(0);
        return mozilla::image::Angle::D0;
    }
  }

  nsStyleCoord AngleAsCoord() const {
    switch (mOrientation & ORIENTATION_MASK) {
      case ANGLE_0: return nsStyleCoord(0.0f, eStyleUnit_Degree);
      case ANGLE_90: return nsStyleCoord(90.0f, eStyleUnit_Degree);
      case ANGLE_180: return nsStyleCoord(180.0f, eStyleUnit_Degree);
      case ANGLE_270: return nsStyleCoord(270.0f, eStyleUnit_Degree);
      default:
        do { } while(0);
        return nsStyleCoord();
    }
  }

  bool operator==(const nsStyleImageOrientation& aOther) const {
    return aOther.mOrientation == mOrientation;
  }

  bool operator!=(const nsStyleImageOrientation& aOther) const {
    return !(*this == aOther);
  }

protected:
  enum Bits {
    ORIENTATION_MASK = 0x1 | 0x2,
    FLIP_MASK = 0x4,
    FROM_IMAGE_MASK = 0x8,
  };

  enum Angles {
    ANGLE_0 = 0,
    ANGLE_90 = 1,
    ANGLE_180 = 2,
    ANGLE_270 = 3,
  };

  explicit nsStyleImageOrientation(uint8_t aOrientation)
    : mOrientation(aOrientation)
  { }

  uint8_t mOrientation;
};

struct nsStyleVisibility
{
  explicit nsStyleVisibility(const nsPresContext* aContext);
  nsStyleVisibility(const nsStyleVisibility& aVisibility);
  ~nsStyleVisibility() {
                                     ;
  }
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleVisibility* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleVisibility, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleVisibility();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleVisibility, this);
  }

  nsChangeHint CalcDifference(const nsStyleVisibility& aNewData) const;

  nsStyleImageOrientation mImageOrientation;
  uint8_t mDirection;
  uint8_t mVisible;
  uint8_t mImageRendering;
  uint8_t mWritingMode;
  uint8_t mTextOrientation;
  uint8_t mColorAdjust;

  bool IsVisible() const {
    return (mVisible == 1);
  }

  bool IsVisibleOrCollapsed() const {
    return ((mVisible == 1) ||
            (mVisible == 2));
  }
};

struct nsTimingFunction
{

  enum class Type {
    Ease,
    Linear,
    EaseIn,
    EaseOut,
    EaseInOut,
    StepStart,
    StepEnd,
    CubicBezier,
    Frames,
  };



  static bool IsSplineType(Type aType)
  {
    return aType != Type::StepStart &&
           aType != Type::StepEnd &&
           aType != Type::Frames;
  }

  explicit nsTimingFunction(int32_t aTimingFunctionType
                              = 0)
  {
    AssignFromKeyword(aTimingFunctionType);
  }

  nsTimingFunction(float x1, float y1, float x2, float y2)
    : mType(Type::CubicBezier)
  {
    mFunc.mX1 = x1;
    mFunc.mY1 = y1;
    mFunc.mX2 = x2;
    mFunc.mY2 = y2;
  }

  enum class Keyword { Implicit, Explicit };

  nsTimingFunction(Type aType, uint32_t aStepsOrFrames)
    : mType(aType)
  {
    do { } while (0);



    mStepsOrFrames = aStepsOrFrames;
  }

  nsTimingFunction(const nsTimingFunction& aOther)
  {
    *this = aOther;
  }

  Type mType;
  union {
    struct {
      float mX1;
      float mY1;
      float mX2;
      float mY2;
    } mFunc;
    struct {
      uint32_t mStepsOrFrames;
    };
  };

  nsTimingFunction&
  operator=(const nsTimingFunction& aOther)
  {
    if (&aOther == this) {
      return *this;
    }

    mType = aOther.mType;

    if (HasSpline()) {
      mFunc.mX1 = aOther.mFunc.mX1;
      mFunc.mY1 = aOther.mFunc.mY1;
      mFunc.mX2 = aOther.mFunc.mX2;
      mFunc.mY2 = aOther.mFunc.mY2;
    } else {
      mStepsOrFrames = aOther.mStepsOrFrames;
    }

    return *this;
  }

  bool operator==(const nsTimingFunction& aOther) const
  {
    if (mType != aOther.mType) {
      return false;
    }
    if (HasSpline()) {
      return mFunc.mX1 == aOther.mFunc.mX1 && mFunc.mY1 == aOther.mFunc.mY1 &&
             mFunc.mX2 == aOther.mFunc.mX2 && mFunc.mY2 == aOther.mFunc.mY2;
    }
    return mStepsOrFrames == aOther.mStepsOrFrames;
  }

  bool operator!=(const nsTimingFunction& aOther) const
  {
    return !(*this == aOther);
  }

  bool HasSpline() const { return IsSplineType(mType); }

private:
  void AssignFromKeyword(int32_t aTimingFunctionType);
};

namespace mozilla {

struct StyleTransition
{
  StyleTransition() { }
  explicit StyleTransition(const StyleTransition& aCopy);

  void SetInitialValues();



  const nsTimingFunction& GetTimingFunction() const { return mTimingFunction; }
  float GetDelay() const { return mDelay; }
  float GetDuration() const { return mDuration; }
  nsCSSPropertyID GetProperty() const { return mProperty; }
  nsIAtom* GetUnknownProperty() const { return mUnknownProperty; }

  float GetCombinedDuration() const {

    return std::max(mDuration, 0.0f) + mDelay;
  }

  void SetTimingFunction(const nsTimingFunction& aTimingFunction)
    { mTimingFunction = aTimingFunction; }
  void SetDelay(float aDelay) { mDelay = aDelay; }
  void SetDuration(float aDuration) { mDuration = aDuration; }
  void SetProperty(nsCSSPropertyID aProperty)
    {
      do { } while(0);


      mProperty = aProperty;
    }
  void SetUnknownProperty(nsCSSPropertyID aProperty,
                          const nsAString& aPropertyString);
  void CopyPropertyFrom(const StyleTransition& aOther)
    {
      mProperty = aOther.mProperty;
      mUnknownProperty = aOther.mUnknownProperty;
    }

  nsTimingFunction& TimingFunctionSlot() { return mTimingFunction; }

  bool operator==(const StyleTransition& aOther) const;
  bool operator!=(const StyleTransition& aOther) const
    { return !(*this == aOther); }

private:
  nsTimingFunction mTimingFunction;
  float mDuration;
  float mDelay;
  nsCSSPropertyID mProperty;
  nsCOMPtr<nsIAtom> mUnknownProperty;


};

struct StyleAnimation
{
  StyleAnimation() { }
  explicit StyleAnimation(const StyleAnimation& aCopy);

  void SetInitialValues();



  const nsTimingFunction& GetTimingFunction() const { return mTimingFunction; }
  float GetDelay() const { return mDelay; }
  float GetDuration() const { return mDuration; }
  const nsString& GetName() const { return mName; }
  dom::PlaybackDirection GetDirection() const { return mDirection; }
  dom::FillMode GetFillMode() const { return mFillMode; }
  uint8_t GetPlayState() const { return mPlayState; }
  float GetIterationCount() const { return mIterationCount; }

  void SetTimingFunction(const nsTimingFunction& aTimingFunction)
    { mTimingFunction = aTimingFunction; }
  void SetDelay(float aDelay) { mDelay = aDelay; }
  void SetDuration(float aDuration) { mDuration = aDuration; }
  void SetName(const nsSubstring& aName) { mName = aName; }
  void SetDirection(dom::PlaybackDirection aDirection) { mDirection = aDirection; }
  void SetFillMode(dom::FillMode aFillMode) { mFillMode = aFillMode; }
  void SetPlayState(uint8_t aPlayState) { mPlayState = aPlayState; }
  void SetIterationCount(float aIterationCount)
    { mIterationCount = aIterationCount; }

  nsTimingFunction& TimingFunctionSlot() { return mTimingFunction; }

  bool operator==(const StyleAnimation& aOther) const;
  bool operator!=(const StyleAnimation& aOther) const
    { return !(*this == aOther); }

private:
  nsTimingFunction mTimingFunction;
  float mDuration;
  float mDelay;
  nsString mName;
  dom::PlaybackDirection mDirection;
  dom::FillMode mFillMode;
  uint8_t mPlayState;
  float mIterationCount;
};

class StyleBasicShape final
{
public:
  explicit StyleBasicShape(StyleBasicShapeType type)
    : mType(type),
      mFillRule(StyleFillRule::Nonzero)
  {
    mPosition.SetInitialPercentValues(0.5f);
  }

  StyleBasicShapeType GetShapeType() const { return mType; }
  nsCSSKeyword GetShapeTypeName() const;

  StyleFillRule GetFillRule() const { return mFillRule; }
  void SetFillRule(StyleFillRule aFillRule)
  {
    do { } while (0);
    mFillRule = aFillRule;
  }

  Position& GetPosition() {
    do { } while (0);


    return mPosition;
  }
  const Position& GetPosition() const {
    do { } while (0);


    return mPosition;
  }

  bool HasRadius() const {
    do { } while (0);
    nsStyleCoord zero;
    zero.SetCoordValue(0);
    int32_t corner2404 = mozilla::eCornerTopLeftX; for (mozilla::HalfCorner corner; corner2404 <= mozilla::eCornerBottomLeftY && (corner = mozilla::HalfCorner(corner2404), true); ++corner2404) {
      if (mRadius.Get(corner) != zero) {
        return true;
      }
    }
    return false;
  }
  nsStyleCorners& GetRadius() {
    do { } while (0);
    return mRadius;
  }
  const nsStyleCorners& GetRadius() const {
    do { } while (0);
    return mRadius;
  }



  nsTArray<nsStyleCoord>& Coordinates()
  {
    return mCoordinates;
  }

  const nsTArray<nsStyleCoord>& Coordinates() const
  {
    return mCoordinates;
  }

  bool operator==(const StyleBasicShape& aOther) const
  {
    return mType == aOther.mType &&
           mFillRule == aOther.mFillRule &&
           mCoordinates == aOther.mCoordinates &&
           mPosition == aOther.mPosition &&
           mRadius == aOther.mRadius;
  }
  bool operator!=(const StyleBasicShape& aOther) const {
    return !(*this == aOther);
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<StyleBasicShape>::value, "Reference-counted class " "StyleBasicShape" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); nsrefcnt count = ++mRefCnt; ; return (nsrefcnt) count; } MozExternalRefCountType Release(void) { do { } while (0); nsrefcnt count = --mRefCnt; ; if (count == 0) { delete (this); return 0; } return count; } typedef mozilla::TrueType HasThreadSafeRefCnt; protected: ::mozilla::ThreadSafeAutoRefCnt mRefCnt; public:;

private:
  ~StyleBasicShape() {}

  StyleBasicShapeType mType;
  StyleFillRule mFillRule;




  nsTArray<nsStyleCoord> mCoordinates;

  Position mPosition;

  nsStyleCorners mRadius;
};

struct StyleShapeSource
{
  StyleShapeSource()
    : mURL(nullptr)
  {}

  StyleShapeSource(const StyleShapeSource& aSource)
    : StyleShapeSource()
  {
    if (aSource.mType == StyleShapeSourceType::URL) {
      SetURL(aSource.mURL);
    } else if (aSource.mType == StyleShapeSourceType::Shape) {
      SetBasicShape(aSource.mBasicShape, aSource.mReferenceBox);
    } else if (aSource.mType == StyleShapeSourceType::Box) {
      SetReferenceBox(aSource.mReferenceBox);
    }
  }

  ~StyleShapeSource()
  {
    ReleaseRef();
  }

  StyleShapeSource& operator=(const StyleShapeSource& aOther)
  {
    if (this == &aOther) {
      return *this;
    }

    if (aOther.mType == StyleShapeSourceType::URL) {
      SetURL(aOther.mURL);
    } else if (aOther.mType == StyleShapeSourceType::Shape) {
      SetBasicShape(aOther.mBasicShape, aOther.mReferenceBox);
    } else if (aOther.mType == StyleShapeSourceType::Box) {
      SetReferenceBox(aOther.mReferenceBox);
    } else {
      ReleaseRef();
      mReferenceBox = StyleGeometryBox::NoBox;
      mType = StyleShapeSourceType::None;
    }
    return *this;
  }

  bool operator==(const StyleShapeSource& aOther) const
  {
    return EqualsInternal<true>(aOther);
  }

  bool DefinitelyEquals(const StyleShapeSource& aOther) const
  {
    return EqualsInternal<false>(aOther);
  }

  template<bool aPrecise>
  bool EqualsInternal(const StyleShapeSource& aOther) const
  {
    if (mType != aOther.mType) {
      return false;
    }

    if (mType == StyleShapeSourceType::URL) {
      return aPrecise ? mURL->Equals(*aOther.mURL)
                      : mURL->DefinitelyEqualURIs(*aOther.mURL);
    } else if (mType == StyleShapeSourceType::Shape) {
      return *mBasicShape == *aOther.mBasicShape &&
             mReferenceBox == aOther.mReferenceBox;
    } else if (mType == StyleShapeSourceType::Box) {
      return mReferenceBox == aOther.mReferenceBox;
    }

    return true;
  }

  bool operator!=(const StyleShapeSource& aOther) const
  {
    return !(*this == aOther);
  }

  StyleShapeSourceType GetType() const
  {
    return mType;
  }

  css::URLValue* GetURL() const
  {
    do { } while (0);
    return mURL;
  }

  bool SetURL(css::URLValue* aValue)
  {
    do { } while (0);
    ReleaseRef();
    mURL = aValue;
    mURL->AddRef();
    mType = StyleShapeSourceType::URL;
    return true;
  }

  StyleBasicShape* GetBasicShape() const
  {
    do { } while (0);
    return mBasicShape;
  }

  void SetBasicShape(StyleBasicShape* aBasicShape,
                     StyleGeometryBox aReferenceBox)
  {
    do { } while(0);
    ReleaseRef();
    mBasicShape = aBasicShape;
    mBasicShape->AddRef();
    mReferenceBox = aReferenceBox;
    mType = StyleShapeSourceType::Shape;
  }

  StyleGeometryBox GetReferenceBox() const
  {
    do { } while (0);


    return mReferenceBox;
  }

  void SetReferenceBox(StyleGeometryBox aReferenceBox)
  {
    ReleaseRef();
    mReferenceBox = aReferenceBox;
    mType = StyleShapeSourceType::Box;
  }

private:
  void ReleaseRef()
  {
    if (mType == StyleShapeSourceType::Shape) {
      do { } while(0);
      mBasicShape->Release();
    } else if (mType == StyleShapeSourceType::URL) {
      do { } while(0);
      mURL->Release();
    }


    mURL = nullptr;
  }

  void* operator new(size_t) = delete;

  union {
    StyleBasicShape* mBasicShape;
    css::URLValue* mURL;
  };
  StyleShapeSourceType mType = StyleShapeSourceType::None;
  StyleGeometryBox mReferenceBox = StyleGeometryBox::NoBox;
};

}






class BindingHolder {
public:
  BindingHolder() {}
  explicit BindingHolder(mozilla::css::URLValue* aPtr) : mPtr(aPtr) {}
  operator mozilla::css::URLValue*() const { return Get(); }
  mozilla::css::URLValue* operator->() const { return Get(); }
  mozilla::css::URLValue* Get() const { return (mPtr && mPtr->GetURI()) ? mPtr.get() : nullptr; }
  mozilla::css::URLValue* ForceGet() const { return mPtr.get(); }
  void Set(mozilla::css::URLValue* aPtr) { mPtr = aPtr; }
private:
  RefPtr<mozilla::css::URLValue> mPtr;
};

struct nsStyleDisplay
{
  typedef mozilla::StyleGeometryBox StyleGeometryBox;

  explicit nsStyleDisplay(const nsPresContext* aContext);
  nsStyleDisplay(const nsStyleDisplay& aOther);
  ~nsStyleDisplay();

  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleDisplay* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleDisplay, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleDisplay();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleDisplay, this);
  }

  nsChangeHint CalcDifference(const nsStyleDisplay& aNewData) const;



  BindingHolder mBinding;
  mozilla::StyleDisplay mDisplay;
  mozilla::StyleDisplay mOriginalDisplay;




  uint8_t mContain;
private:
  friend class nsComputedDOMStyle;
  friend class nsRuleNode;
  uint8_t mMozAppearance;
  uint8_t mAppearance;
public:
  __attribute__ ((warn_unused_result)) uint8_t UsedAppearance() const {
    if (mAppearance == 0) {
      return 0;
    }
    do { } while (0);
    return mMozAppearance;
  }

  uint8_t mPosition;


  mozilla::StyleFloat mFloat;

  mozilla::StyleFloat mOriginalFloat;

  mozilla::StyleClear mBreakType;
  uint8_t mBreakInside;
  bool mBreakBefore;
  bool mBreakAfter;
  uint8_t mOverflowX;
  uint8_t mOverflowY;
  uint8_t mOverflowClipBox;
  uint8_t mResize;
  mozilla::StyleOrient mOrient;
  uint8_t mIsolation;
  uint8_t mTopLayer;
  uint8_t mWillChangeBitField;





  nsCOMArray<nsIAtom> mWillChange;

  uint8_t mTouchAction;
  uint8_t mScrollBehavior;
  uint8_t mScrollSnapTypeX;
  uint8_t mScrollSnapTypeY;
  nsStyleCoord mScrollSnapPointsX;
  nsStyleCoord mScrollSnapPointsY;
  mozilla::Position mScrollSnapDestination;
  nsTArray<mozilla::Position> mScrollSnapCoordinate;





  uint8_t mBackfaceVisibility;
  uint8_t mTransformStyle;
  StyleGeometryBox mTransformBox;
  RefPtr<nsCSSValueSharedList> mSpecifiedTransform;
  nsStyleCoord mTransformOrigin[3];
  nsStyleCoord mChildPerspective;
  nsStyleCoord mPerspectiveOrigin[2];

  nsStyleCoord mVerticalAlign;

  nsStyleAutoArray<mozilla::StyleTransition> mTransitions;



  uint32_t mTransitionTimingFunctionCount,
           mTransitionDurationCount,
           mTransitionDelayCount,
           mTransitionPropertyCount;

  nsStyleAutoArray<mozilla::StyleAnimation> mAnimations;



  uint32_t mAnimationTimingFunctionCount,
           mAnimationDurationCount,
           mAnimationDelayCount,
           mAnimationNameCount,
           mAnimationDirectionCount,
           mAnimationFillModeCount,
           mAnimationPlayStateCount,
           mAnimationIterationCountCount;

  mozilla::StyleShapeSource mShapeOutside;

  bool IsBlockInsideStyle() const {
    return mozilla::StyleDisplay::Block == mDisplay ||
           mozilla::StyleDisplay::ListItem == mDisplay ||
           mozilla::StyleDisplay::InlineBlock == mDisplay ||
           mozilla::StyleDisplay::TableCaption == mDisplay ||
           mozilla::StyleDisplay::FlowRoot == mDisplay;



  }

  bool IsBlockOutsideStyle() const {
    return mozilla::StyleDisplay::Block == mDisplay ||
           mozilla::StyleDisplay::Flex == mDisplay ||
           mozilla::StyleDisplay::WebkitBox == mDisplay ||
           mozilla::StyleDisplay::Grid == mDisplay ||
           mozilla::StyleDisplay::ListItem == mDisplay ||
           mozilla::StyleDisplay::Table == mDisplay ||
           mozilla::StyleDisplay::FlowRoot == mDisplay;
  }

  static bool IsDisplayTypeInlineOutside(mozilla::StyleDisplay aDisplay) {
    return mozilla::StyleDisplay::Inline == aDisplay ||
           mozilla::StyleDisplay::InlineBlock == aDisplay ||
           mozilla::StyleDisplay::InlineTable == aDisplay ||
           mozilla::StyleDisplay::MozInlineBox == aDisplay ||
           mozilla::StyleDisplay::InlineFlex == aDisplay ||
           mozilla::StyleDisplay::WebkitInlineBox == aDisplay ||
           mozilla::StyleDisplay::InlineGrid == aDisplay ||
           mozilla::StyleDisplay::MozInlineGrid == aDisplay ||
           mozilla::StyleDisplay::MozInlineStack == aDisplay ||
           mozilla::StyleDisplay::Ruby == aDisplay ||
           mozilla::StyleDisplay::RubyBase == aDisplay ||
           mozilla::StyleDisplay::RubyBaseContainer == aDisplay ||
           mozilla::StyleDisplay::RubyText == aDisplay ||
           mozilla::StyleDisplay::RubyTextContainer == aDisplay ||
           mozilla::StyleDisplay::Contents == aDisplay;
  }

  bool IsInlineOutsideStyle() const {
    return IsDisplayTypeInlineOutside(mDisplay);
  }

  bool IsOriginalDisplayInlineOutsideStyle() const {
    return IsDisplayTypeInlineOutside(mOriginalDisplay);
  }

  bool IsInnerTableStyle() const {
    return mozilla::StyleDisplay::TableCaption == mDisplay ||
           mozilla::StyleDisplay::TableCell == mDisplay ||
           mozilla::StyleDisplay::TableRow == mDisplay ||
           mozilla::StyleDisplay::TableRowGroup == mDisplay ||
           mozilla::StyleDisplay::TableHeaderGroup == mDisplay ||
           mozilla::StyleDisplay::TableFooterGroup == mDisplay ||
           mozilla::StyleDisplay::TableColumn == mDisplay ||
           mozilla::StyleDisplay::TableColumnGroup == mDisplay;
  }

  bool IsFloatingStyle() const {
    return mozilla::StyleFloat::None != mFloat;
  }

  bool IsAbsolutelyPositionedStyle() const {
    return 2 == mPosition ||
           3 == mPosition;
  }

  bool IsRelativelyPositionedStyle() const {
    return 1 == mPosition ||
           4 == mPosition;
  }
  bool IsPositionForcingStackingContext() const {
    return 4 == mPosition ||
           3 == mPosition;
  }

  static bool IsRubyDisplayType(mozilla::StyleDisplay aDisplay) {
    return mozilla::StyleDisplay::Ruby == aDisplay ||
           mozilla::StyleDisplay::RubyBase == aDisplay ||
           mozilla::StyleDisplay::RubyBaseContainer == aDisplay ||
           mozilla::StyleDisplay::RubyText == aDisplay ||
           mozilla::StyleDisplay::RubyTextContainer == aDisplay;
  }

  bool IsRubyDisplayType() const {
    return IsRubyDisplayType(mDisplay);
  }

  bool IsOutOfFlowStyle() const {
    return (IsAbsolutelyPositionedStyle() || IsFloatingStyle());
  }

  bool IsScrollableOverflow() const {


    return mOverflowX != 0 &&
           mOverflowX != 4;
  }

  bool IsContainPaint() const {
    return 0x8 & mContain;
  }



  bool HasTransformStyle() const {
    return mSpecifiedTransform != nullptr ||
           mTransformStyle == 1 ||
           (mWillChangeBitField & (1<<1));
  }

  bool HasPerspectiveStyle() const {
    return mChildPerspective.GetUnit() == eStyleUnit_Coord;
  }

  bool BackfaceIsHidden() const {
    return mBackfaceVisibility == 0;
  }







  inline bool IsBlockInside(const nsIFrame* aContextFrame) const;
  inline bool IsBlockOutside(const nsIFrame* aContextFrame) const;
  inline bool IsInlineOutside(const nsIFrame* aContextFrame) const;
  inline bool IsOriginalDisplayInlineOutside(const nsIFrame* aContextFrame) const;
  inline mozilla::StyleDisplay GetDisplay(const nsIFrame* aContextFrame) const;
  inline bool IsFloating(const nsIFrame* aContextFrame) const;
  inline bool IsRelativelyPositioned(const nsIFrame* aContextFrame) const;
  inline bool IsAbsolutelyPositioned(const nsIFrame* aContextFrame) const;
# 2899 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
  inline bool IsAbsPosContainingBlock(const nsIFrame* aContextFrame) const;






  template<class StyleContextLike>
  inline bool IsAbsPosContainingBlockForAppropriateFrame(
                StyleContextLike* aStyleContext) const;






  inline bool HasTransform(const nsIFrame* aContextFrame) const;






  inline bool IsFixedPosContainingBlock(const nsIFrame* aContextFrame) const;






  template<class StyleContextLike>
  inline bool IsFixedPosContainingBlockForAppropriateFrame(
                StyleContextLike* aStyleContext) const;

private:


  template<class StyleContextLike>
  inline bool HasAbsPosContainingBlockStyleInternal(
                StyleContextLike* aStyleContext) const;
  template<class StyleContextLike>
  inline bool HasFixedPosContainingBlockStyleInternal(
                StyleContextLike* aStyleContext) const;

public:



  inline mozilla::StyleFloat PhysicalFloats(mozilla::WritingMode aWM) const;
  inline mozilla::StyleClear PhysicalBreakType(mozilla::WritingMode aWM) const;
};

struct nsStyleTable
{
  explicit nsStyleTable(const nsPresContext* aContext);
  nsStyleTable(const nsStyleTable& aOther);
  ~nsStyleTable();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleTable* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleTable, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleTable();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleTable, this);
  }

  nsChangeHint CalcDifference(const nsStyleTable& aNewData) const;

  uint8_t mLayoutStrategy;
  int32_t mSpan;
};

struct nsStyleTableBorder
{
  explicit nsStyleTableBorder(const nsPresContext* aContext);
  nsStyleTableBorder(const nsStyleTableBorder& aOther);
  ~nsStyleTableBorder();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleTableBorder* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleTableBorder, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleTableBorder();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleTableBorder, this);
  }

  nsChangeHint CalcDifference(const nsStyleTableBorder& aNewData) const;

  nscoord mBorderSpacingCol;
  nscoord mBorderSpacingRow;
  uint8_t mBorderCollapse;
  uint8_t mCaptionSide;
  uint8_t mEmptyCells;
};

enum nsStyleContentType {
  eStyleContentType_String = 1,
  eStyleContentType_Image = 10,
  eStyleContentType_Attr = 20,
  eStyleContentType_Counter = 30,
  eStyleContentType_Counters = 31,
  eStyleContentType_OpenQuote = 40,
  eStyleContentType_CloseQuote = 41,
  eStyleContentType_NoOpenQuote = 42,
  eStyleContentType_NoCloseQuote = 43,
  eStyleContentType_AltContent = 50,
  eStyleContentType_Uninitialized
};

class nsStyleContentData
{
public:
  nsStyleContentData()
    : mType(eStyleContentType_Uninitialized)
  {
                                      ;
    mContent.mString = nullptr;
  }
  nsStyleContentData(const nsStyleContentData&);

  ~nsStyleContentData();
  nsStyleContentData& operator=(const nsStyleContentData& aOther);
  bool operator==(const nsStyleContentData& aOther) const;

  bool operator!=(const nsStyleContentData& aOther) const {
    return !(*this == aOther);
  }

  nsStyleContentType GetType() const { return mType; }

  char16_t* GetString() const
  {
    do { } while (0);

    return mContent.mString;
  }

  nsCSSValue::Array* GetCounters() const
  {
    do { } while (0);

    return mContent.mCounters;
  }

  nsStyleImageRequest* GetImageRequest() const
  {
    do { } while (0);
    return mContent.mImage;
  }

  imgRequestProxy* GetImage() const
  {
    return GetImageRequest()->get();
  }

  void SetKeyword(nsStyleContentType aType)
  {
    do { } while (0);




    do { } while (0);

    mType = aType;
  }

  void SetString(nsStyleContentType aType, const char16_t* aString)
  {
    do { } while (0);

    do { } while (0);
    do { } while (0);

    mType = aType;
    mContent.mString = NS_strdup(aString);
  }

  void SetCounters(nsStyleContentType aType, nsCSSValue::Array* aCounters)
  {
    do { } while (0);

    do { } while (0);
    do { } while (0);
    do { } while (0);

    mType = aType;
    mContent.mCounters = aCounters;
    mContent.mCounters->AddRef();
  }

  void SetImageRequest(already_AddRefed<nsStyleImageRequest> aRequest)
  {
    do { } while (0);

    mType = eStyleContentType_Image;
    mContent.mImage = aRequest.take();
    do { } while (0);
  }

  void Resolve(nsPresContext* aPresContext) {
    if (mType == eStyleContentType_Image && !mContent.mImage->IsResolved()) {
      mContent.mImage->Resolve(aPresContext);
    }
  }

private:
  nsStyleContentType mType;
  union {
    char16_t *mString;
    nsStyleImageRequest* mImage;
    nsCSSValue::Array* mCounters;
  } mContent;
};

struct nsStyleCounterData
{
  nsString mCounter;
  int32_t mValue;

  bool operator==(const nsStyleCounterData& aOther) const {
    return mValue == aOther.mValue && mCounter == aOther.mCounter;
  }

  bool operator!=(const nsStyleCounterData& aOther) const {
    return !(*this == aOther);
  }
};

struct nsStyleContent
{
  explicit nsStyleContent(const nsPresContext* aContext);
  nsStyleContent(const nsStyleContent& aContent);
  ~nsStyleContent();
  void FinishStyle(nsPresContext* aPresContext);

  void* operator new(size_t sz, nsStyleContent* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleContent, sz);
  }
  void Destroy(nsPresContext* aContext);

  nsChangeHint CalcDifference(const nsStyleContent& aNewData) const;

  uint32_t ContentCount() const { return mContents.Length(); }

  const nsStyleContentData& ContentAt(uint32_t aIndex) const {
    return mContents[aIndex];
  }

  nsStyleContentData& ContentAt(uint32_t aIndex) { return mContents[aIndex]; }

  void AllocateContents(uint32_t aCount) {





    mContents.Clear();
    mContents.SetLength(aCount);
  }

  uint32_t CounterIncrementCount() const { return mIncrements.Length(); }
  const nsStyleCounterData& CounterIncrementAt(uint32_t aIndex) const {
    return mIncrements[aIndex];
  }

  void AllocateCounterIncrements(uint32_t aCount) {
    mIncrements.Clear();
    mIncrements.SetLength(aCount);
  }

  void SetCounterIncrementAt(uint32_t aIndex, const nsString& aCounter, int32_t aIncrement) {
    mIncrements[aIndex].mCounter = aCounter;
    mIncrements[aIndex].mValue = aIncrement;
  }

  uint32_t CounterResetCount() const { return mResets.Length(); }
  const nsStyleCounterData& CounterResetAt(uint32_t aIndex) const {
    return mResets[aIndex];
  }

  void AllocateCounterResets(uint32_t aCount) {
    mResets.Clear();
    mResets.SetLength(aCount);
  }

  void SetCounterResetAt(uint32_t aIndex, const nsString& aCounter, int32_t aValue) {
    mResets[aIndex].mCounter = aCounter;
    mResets[aIndex].mValue = aValue;
  }

protected:
  nsTArray<nsStyleContentData> mContents;
  nsTArray<nsStyleCounterData> mIncrements;
  nsTArray<nsStyleCounterData> mResets;
};

struct nsStyleUIReset
{
  explicit nsStyleUIReset(const nsPresContext* aContext);
  nsStyleUIReset(const nsStyleUIReset& aOther);
  ~nsStyleUIReset();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleUIReset* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleUIReset, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleUIReset();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleUIReset, this);
  }

  nsChangeHint CalcDifference(const nsStyleUIReset& aNewData) const;

  mozilla::StyleUserSelect mUserSelect;
  uint8_t mForceBrokenImageIcon;
  uint8_t mIMEMode;
  mozilla::StyleWindowDragging mWindowDragging;
  uint8_t mWindowShadow;
};

struct nsCursorImage
{
  bool mHaveHotspot;
  float mHotspotX, mHotspotY;
  RefPtr<nsStyleImageRequest> mImage;

  nsCursorImage();
  nsCursorImage(const nsCursorImage& aOther);

  nsCursorImage& operator=(const nsCursorImage& aOther);

  bool operator==(const nsCursorImage& aOther) const;
  bool operator!=(const nsCursorImage& aOther) const
  {
    return !(*this == aOther);
  }

  imgRequestProxy* GetImage() const {
    return mImage->get();
  }
};

struct nsStyleUserInterface
{
  explicit nsStyleUserInterface(const nsPresContext* aContext);
  nsStyleUserInterface(const nsStyleUserInterface& aOther);
  ~nsStyleUserInterface();

  void FinishStyle(nsPresContext* aPresContext);

  void* operator new(size_t sz, nsStyleUserInterface* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleUserInterface, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleUserInterface();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleUserInterface, this);
  }

  nsChangeHint CalcDifference(const nsStyleUserInterface& aNewData) const;

  mozilla::StyleUserInput mUserInput;
  mozilla::StyleUserModify mUserModify;
  mozilla::StyleUserFocus mUserFocus;
  uint8_t mPointerEvents;

  uint8_t mCursor;
  nsTArray<nsCursorImage> mCursorImages;
  mozilla::StyleComplexColor mCaretColor;

  inline uint8_t GetEffectivePointerEvents(nsIFrame* aFrame) const;
};

struct nsStyleXUL
{
  explicit nsStyleXUL(const nsPresContext* aContext);
  nsStyleXUL(const nsStyleXUL& aSource);
  ~nsStyleXUL();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleXUL* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleXUL, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleXUL();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleXUL, this);
  }

  nsChangeHint CalcDifference(const nsStyleXUL& aNewData) const;

  float mBoxFlex;
  uint32_t mBoxOrdinal;
  mozilla::StyleBoxAlign mBoxAlign;
  mozilla::StyleBoxDirection mBoxDirection;
  mozilla::StyleBoxOrient mBoxOrient;
  mozilla::StyleBoxPack mBoxPack;
  bool mStretchStack;
};

struct nsStyleColumn
{
  explicit nsStyleColumn(const nsPresContext* aContext);
  nsStyleColumn(const nsStyleColumn& aSource);
  ~nsStyleColumn();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleColumn* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleColumn, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleColumn();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleColumn, this);
  }

  nsChangeHint CalcDifference(const nsStyleColumn& aNewData) const;





  static const uint32_t kMaxColumnCount = 1000;

  uint32_t mColumnCount;
  nsStyleCoord mColumnWidth;
  nsStyleCoord mColumnGap;

  mozilla::StyleComplexColor mColumnRuleColor;
  uint8_t mColumnRuleStyle;
  uint8_t mColumnFill;
  uint8_t mColumnSpan;

  void SetColumnRuleWidth(nscoord aWidth) {
    mColumnRuleWidth = ((aWidth) == 0) ? 0 : std::max((mTwipsPerPixel), (aWidth) / (mTwipsPerPixel) * (mTwipsPerPixel));
  }

  nscoord GetComputedColumnRuleWidth() const {
    return (IsVisibleBorderStyle(mColumnRuleStyle) ? mColumnRuleWidth : 0);
  }

protected:
  nscoord mColumnRuleWidth;
  nscoord mTwipsPerPixel;
};

enum nsStyleSVGPaintType {
  eStyleSVGPaintType_None = 1,
  eStyleSVGPaintType_Color,
  eStyleSVGPaintType_Server,
  eStyleSVGPaintType_ContextFill,
  eStyleSVGPaintType_ContextStroke
};

enum nsStyleSVGOpacitySource : uint8_t {
  eStyleSVGOpacitySource_Normal,
  eStyleSVGOpacitySource_ContextFillOpacity,
  eStyleSVGOpacitySource_ContextStrokeOpacity
};

class nsStyleSVGPaint
{
public:
  explicit nsStyleSVGPaint(nsStyleSVGPaintType aType = nsStyleSVGPaintType(0));
  nsStyleSVGPaint(const nsStyleSVGPaint& aSource);
  ~nsStyleSVGPaint();

  nsStyleSVGPaint& operator=(const nsStyleSVGPaint& aOther);

  nsStyleSVGPaintType Type() const { return mType; }

  void SetNone();
  void SetColor(nscolor aColor);
  void SetPaintServer(mozilla::css::URLValue* aPaintServer,
                      nscolor aFallbackColor);
  void SetContextValue(nsStyleSVGPaintType aType,
                       nscolor aFallbackColor);

  nscolor GetColor() const {
    do { } while (0);
    return mPaint.mColor;
  }

  mozilla::css::URLValue* GetPaintServer() const {
    do { } while (0);
    return mPaint.mPaintServer;
  }

  nscolor GetFallbackColor() const {
    do { } while (0);


    return mFallbackColor;
  }

  bool operator==(const nsStyleSVGPaint& aOther) const;
  bool operator!=(const nsStyleSVGPaint& aOther) const {
    return !(*this == aOther);
  }

private:
  void Reset();
  void Assign(const nsStyleSVGPaint& aOther);

  union {
    nscolor mColor;
    mozilla::css::URLValue* mPaintServer;
  } mPaint;
  nsStyleSVGPaintType mType;
  nscolor mFallbackColor;
};

struct nsStyleSVG
{
  explicit nsStyleSVG(const nsPresContext* aContext);
  nsStyleSVG(const nsStyleSVG& aSource);
  ~nsStyleSVG();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleSVG* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleSVG, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleSVG();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleSVG, this);
  }

  nsChangeHint CalcDifference(const nsStyleSVG& aNewData) const;

  nsStyleSVGPaint mFill;
  nsStyleSVGPaint mStroke;
  RefPtr<mozilla::css::URLValue> mMarkerEnd;
  RefPtr<mozilla::css::URLValue> mMarkerMid;
  RefPtr<mozilla::css::URLValue> mMarkerStart;
  nsTArray<nsStyleCoord> mStrokeDasharray;

  nsStyleCoord mStrokeDashoffset;
  nsStyleCoord mStrokeWidth;

  float mFillOpacity;
  float mStrokeMiterlimit;
  float mStrokeOpacity;

  mozilla::StyleFillRule mClipRule;
  uint8_t mColorInterpolation;
  uint8_t mColorInterpolationFilters;
  mozilla::StyleFillRule mFillRule;
  uint8_t mPaintOrder;
  uint8_t mShapeRendering;
  uint8_t mStrokeLinecap;
  uint8_t mStrokeLinejoin;
  uint8_t mTextAnchor;

  nsStyleSVGOpacitySource FillOpacitySource() const {
    uint8_t value = (mContextFlags & FILL_OPACITY_SOURCE_MASK) >>
                    FILL_OPACITY_SOURCE_SHIFT;
    return nsStyleSVGOpacitySource(value);
  }
  nsStyleSVGOpacitySource StrokeOpacitySource() const {
    uint8_t value = (mContextFlags & STROKE_OPACITY_SOURCE_MASK) >>
                    STROKE_OPACITY_SOURCE_SHIFT;
    return nsStyleSVGOpacitySource(value);
  }
  bool StrokeDasharrayFromObject() const {
    return mContextFlags & STROKE_DASHARRAY_CONTEXT;
  }
  bool StrokeDashoffsetFromObject() const {
    return mContextFlags & STROKE_DASHOFFSET_CONTEXT;
  }
  bool StrokeWidthFromObject() const {
    return mContextFlags & STROKE_WIDTH_CONTEXT;
  }

  void SetFillOpacitySource(nsStyleSVGOpacitySource aValue) {
    mContextFlags = (mContextFlags & ~FILL_OPACITY_SOURCE_MASK) |
                    (aValue << FILL_OPACITY_SOURCE_SHIFT);
  }
  void SetStrokeOpacitySource(nsStyleSVGOpacitySource aValue) {
    mContextFlags = (mContextFlags & ~STROKE_OPACITY_SOURCE_MASK) |
                    (aValue << STROKE_OPACITY_SOURCE_SHIFT);
  }
  void SetStrokeDasharrayFromObject(bool aValue) {
    mContextFlags = (mContextFlags & ~STROKE_DASHARRAY_CONTEXT) |
                    (aValue ? STROKE_DASHARRAY_CONTEXT : 0);
  }
  void SetStrokeDashoffsetFromObject(bool aValue) {
    mContextFlags = (mContextFlags & ~STROKE_DASHOFFSET_CONTEXT) |
                    (aValue ? STROKE_DASHOFFSET_CONTEXT : 0);
  }
  void SetStrokeWidthFromObject(bool aValue) {
    mContextFlags = (mContextFlags & ~STROKE_WIDTH_CONTEXT) |
                    (aValue ? STROKE_WIDTH_CONTEXT : 0);
  }

  bool HasMarker() const {
    return mMarkerStart || mMarkerMid || mMarkerEnd;
  }





  bool HasStroke() const {
    return mStroke.Type() != eStyleSVGPaintType_None && mStrokeOpacity > 0;
  }





  bool HasFill() const {
    return mFill.Type() != eStyleSVGPaintType_None && mFillOpacity > 0;
  }

private:



  enum {
    FILL_OPACITY_SOURCE_MASK = 0x03,
    STROKE_OPACITY_SOURCE_MASK = 0x0C,
    STROKE_DASHARRAY_CONTEXT = 0x10,
    STROKE_DASHOFFSET_CONTEXT = 0x20,
    STROKE_WIDTH_CONTEXT = 0x40,
    FILL_OPACITY_SOURCE_SHIFT = 0,
    STROKE_OPACITY_SOURCE_SHIFT = 2,
  };

  uint8_t mContextFlags;
};

struct nsStyleFilter
{
  nsStyleFilter();
  nsStyleFilter(const nsStyleFilter& aSource);
  ~nsStyleFilter();
  void FinishStyle(nsPresContext* aPresContext) {}

  nsStyleFilter& operator=(const nsStyleFilter& aOther);

  bool operator==(const nsStyleFilter& aOther) const;
  bool operator!=(const nsStyleFilter& aOther) const {
    return !(*this == aOther);
  }

  uint32_t GetType() const {
    return mType;
  }

  const nsStyleCoord& GetFilterParameter() const {
    do { } while(0);


    return mFilterParameter;
  }
  void SetFilterParameter(const nsStyleCoord& aFilterParameter,
                          int32_t aType);

  mozilla::css::URLValue* GetURL() const {
    do { } while (0);
    return mURL;
  }

  bool SetURL(mozilla::css::URLValue* aValue);

  nsCSSShadowArray* GetDropShadow() const {
    do { } while(0);
    return mDropShadow;
  }
  void SetDropShadow(nsCSSShadowArray* aDropShadow);

private:
  void ReleaseRef();

  uint32_t mType;
  nsStyleCoord mFilterParameter;
  union {
    mozilla::css::URLValue* mURL;
    nsCSSShadowArray* mDropShadow;
  };
};

template<>
struct nsTArray_CopyChooser<nsStyleFilter>
{
  typedef nsTArray_CopyWithConstructors<nsStyleFilter> Type;
};

struct nsStyleSVGReset
{
  explicit nsStyleSVGReset(const nsPresContext* aContext);
  nsStyleSVGReset(const nsStyleSVGReset& aSource);
  ~nsStyleSVGReset();




  void FinishStyle(nsPresContext* aPresContext);

  void* operator new(size_t sz, nsStyleSVGReset* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleSVGReset, sz);
  }
  void Destroy(nsPresContext* aContext);

  nsChangeHint CalcDifference(const nsStyleSVGReset& aNewData) const;

  bool HasClipPath() const {
    return mClipPath.GetType() != mozilla::StyleShapeSourceType::None;
  }

  bool HasMask() const;

  bool HasNonScalingStroke() const {
    return mVectorEffect == 1;
  }

  nsStyleImageLayers mMask;
  mozilla::StyleShapeSource mClipPath;
  nscolor mStopColor;
  nscolor mFloodColor;
  nscolor mLightingColor;

  float mStopOpacity;
  float mFloodOpacity;

  uint8_t mDominantBaseline;
  uint8_t mVectorEffect;
  uint8_t mMaskType;
};

struct nsStyleVariables
{
  nsStyleVariables();
  explicit nsStyleVariables(const nsPresContext* aContext);
  nsStyleVariables(const nsStyleVariables& aSource);
  ~nsStyleVariables();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleVariables* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleVariables, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleVariables();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleVariables, this);
  }

  nsChangeHint CalcDifference(const nsStyleVariables& aNewData) const;

  mozilla::CSSVariableValues mVariables;
};

struct nsStyleEffects
{
  explicit nsStyleEffects(const nsPresContext* aContext);
  nsStyleEffects(const nsStyleEffects& aSource);
  ~nsStyleEffects();
  void FinishStyle(nsPresContext* aPresContext) {}

  void* operator new(size_t sz, nsStyleEffects* aSelf) { return aSelf; }
  void* operator new(size_t sz, nsPresContext* aContext) {
    return aContext->PresShell()->
      AllocateByObjectID(mozilla::eArenaObjectID_nsStyleEffects, sz);
  }
  void Destroy(nsPresContext* aContext) {
    this->~nsStyleEffects();
    aContext->PresShell()->
      FreeByObjectID(mozilla::eArenaObjectID_nsStyleEffects, this);
  }

  nsChangeHint CalcDifference(const nsStyleEffects& aNewData) const;

  bool HasFilters() const {
    return !mFilters.IsEmpty();
  }

  nsTArray<nsStyleFilter> mFilters;
  RefPtr<nsCSSShadowArray> mBoxShadow;
  nsRect mClip;
  float mOpacity;
  uint8_t mClipFlags;
  uint8_t mMixBlendMode;
};
# 3729 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStruct.h"
struct nsPoint_Simple {
  nscoord x, y;
};

static_assert(sizeof(nsPoint) == sizeof(nsPoint_Simple), "Size mismatch between " "nsPoint" " and " "nsPoint_Simple"); static_assert(alignof(nsPoint) == alignof(nsPoint_Simple), "Align mismatch between " "nsPoint" " and " "nsPoint_Simple");;
static_assert(__builtin_offsetof(nsPoint, x) == __builtin_offsetof(nsPoint_Simple, x), "Field offset mismatch of " "x" " between " "nsPoint" " and " "nsPoint_Simple");;
static_assert(__builtin_offsetof(nsPoint, y) == __builtin_offsetof(nsPoint_Simple, y), "Field offset mismatch of " "y" " between " "nsPoint" " and " "nsPoint_Simple");;




struct nsMargin_Simple {
  nscoord top, right, bottom, left;
};

static_assert(sizeof(nsMargin) == sizeof(nsMargin_Simple), "Size mismatch between " "nsMargin" " and " "nsMargin_Simple"); static_assert(alignof(nsMargin) == alignof(nsMargin_Simple), "Align mismatch between " "nsMargin" " and " "nsMargin_Simple");;
static_assert(__builtin_offsetof(nsMargin, top) == __builtin_offsetof(nsMargin_Simple, top), "Field offset mismatch of " "top" " between " "nsMargin" " and " "nsMargin_Simple");;
static_assert(__builtin_offsetof(nsMargin, right) == __builtin_offsetof(nsMargin_Simple, right), "Field offset mismatch of " "right" " between " "nsMargin" " and " "nsMargin_Simple");;
static_assert(__builtin_offsetof(nsMargin, bottom) == __builtin_offsetof(nsMargin_Simple, bottom), "Field offset mismatch of " "bottom" " between " "nsMargin" " and " "nsMargin_Simple");;
static_assert(__builtin_offsetof(nsMargin, left) == __builtin_offsetof(nsMargin_Simple, left), "Field offset mismatch of " "left" " between " "nsMargin" " and " "nsMargin_Simple");;




struct nsRect_Simple {
  nscoord x, y, width, height;
};

static_assert(sizeof(nsRect) == sizeof(nsRect_Simple), "Size mismatch between " "nsRect" " and " "nsRect_Simple"); static_assert(alignof(nsRect) == alignof(nsRect_Simple), "Align mismatch between " "nsRect" " and " "nsRect_Simple");;
static_assert(__builtin_offsetof(nsRect, x) == __builtin_offsetof(nsRect_Simple, x), "Field offset mismatch of " "x" " between " "nsRect" " and " "nsRect_Simple");;
static_assert(__builtin_offsetof(nsRect, y) == __builtin_offsetof(nsRect_Simple, y), "Field offset mismatch of " "y" " between " "nsRect" " and " "nsRect_Simple");;
static_assert(__builtin_offsetof(nsRect, width) == __builtin_offsetof(nsRect_Simple, width), "Field offset mismatch of " "width" " between " "nsRect" " and " "nsRect_Simple");;
static_assert(__builtin_offsetof(nsRect, height) == __builtin_offsetof(nsRect_Simple, height), "Field offset mismatch of " "height" " between " "nsRect" " and " "nsRect_Simple");;




struct nsSize_Simple {
  nscoord width, height;
};

static_assert(sizeof(nsSize) == sizeof(nsSize_Simple), "Size mismatch between " "nsSize" " and " "nsSize_Simple"); static_assert(alignof(nsSize) == alignof(nsSize_Simple), "Align mismatch between " "nsSize" " and " "nsSize_Simple");;
static_assert(__builtin_offsetof(nsSize, width) == __builtin_offsetof(nsSize_Simple, width), "Field offset mismatch of " "width" " between " "nsSize" " and " "nsSize_Simple");;
static_assert(__builtin_offsetof(nsSize, height) == __builtin_offsetof(nsSize_Simple, height), "Field offset mismatch of " "height" " between " "nsSize" " and " "nsSize_Simple");;







template<typename T, typename Deleter = mozilla::DefaultDelete<T>>
struct UniquePtr_Simple {
  T* mPtr;
};

static_assert(sizeof(mozilla::UniquePtr<int>) == sizeof(UniquePtr_Simple<int>), "Size mismatch between " "mozilla::UniquePtr<int>" " and " "UniquePtr_Simple<int>"); static_assert(alignof(mozilla::UniquePtr<int>) == alignof(UniquePtr_Simple<int>), "Align mismatch between " "mozilla::UniquePtr<int>" " and " "UniquePtr_Simple<int>");;




template<typename T>
class nsTArray_Simple {
  T* mBuffer;
public:


  ~nsTArray_Simple() {};
};

static_assert(sizeof(nsTArray<nsStyleImageLayers::Layer>) == sizeof(nsTArray_Simple<nsStyleImageLayers::Layer>), "Size mismatch between " "nsTArray<nsStyleImageLayers::Layer>" " and " "nsTArray_Simple<nsStyleImageLayers::Layer>"); static_assert(alignof(nsTArray<nsStyleImageLayers::Layer>) == alignof(nsTArray_Simple<nsStyleImageLayers::Layer>), "Align mismatch between " "nsTArray<nsStyleImageLayers::Layer>" " and " "nsTArray_Simple<nsStyleImageLayers::Layer>");;

static_assert(sizeof(nsTArray<mozilla::StyleTransition>) == sizeof(nsTArray_Simple<mozilla::StyleTransition>), "Size mismatch between " "nsTArray<mozilla::StyleTransition>" " and " "nsTArray_Simple<mozilla::StyleTransition>"); static_assert(alignof(nsTArray<mozilla::StyleTransition>) == alignof(nsTArray_Simple<mozilla::StyleTransition>), "Align mismatch between " "nsTArray<mozilla::StyleTransition>" " and " "nsTArray_Simple<mozilla::StyleTransition>");;

static_assert(sizeof(nsTArray<mozilla::StyleAnimation>) == sizeof(nsTArray_Simple<mozilla::StyleAnimation>), "Size mismatch between " "nsTArray<mozilla::StyleAnimation>" " and " "nsTArray_Simple<mozilla::StyleAnimation>"); static_assert(alignof(nsTArray<mozilla::StyleAnimation>) == alignof(nsTArray_Simple<mozilla::StyleAnimation>), "Align mismatch between " "nsTArray<mozilla::StyleAnimation>" " and " "nsTArray_Simple<mozilla::StyleAnimation>");;







template<typename T>
class nsCOMArray_Simple {
  nsTArray<nsISupports*> mBuffer;
};

static_assert(sizeof(nsCOMArray<nsIContent>) == sizeof(nsCOMArray_Simple<nsIContent>), "Size mismatch between " "nsCOMArray<nsIContent>" " and " "nsCOMArray_Simple<nsIContent>"); static_assert(alignof(nsCOMArray<nsIContent>) == alignof(nsCOMArray_Simple<nsIContent>), "Align mismatch between " "nsCOMArray<nsIContent>" " and " "nsCOMArray_Simple<nsIContent>");;

static_assert(sizeof(nsCOMArray<nsINode>) == sizeof(nsCOMArray_Simple<nsINode>), "Size mismatch between " "nsCOMArray<nsINode>" " and " "nsCOMArray_Simple<nsINode>"); static_assert(alignof(nsCOMArray<nsINode>) == alignof(nsCOMArray_Simple<nsINode>), "Align mismatch between " "nsCOMArray<nsINode>" " and " "nsCOMArray_Simple<nsINode>");;

static_assert(sizeof(nsCOMArray<imgIContainer>) == sizeof(nsCOMArray_Simple<imgIContainer>), "Size mismatch between " "nsCOMArray<imgIContainer>" " and " "nsCOMArray_Simple<imgIContainer>"); static_assert(alignof(nsCOMArray<imgIContainer>) == alignof(nsCOMArray_Simple<imgIContainer>), "Align mismatch between " "nsCOMArray<imgIContainer>" " and " "nsCOMArray_Simple<imgIContainer>");;
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ComputedTimingFunction.h" 2

namespace mozilla {

class ComputedTimingFunction
{
public:
  static ComputedTimingFunction
  CubicBezier(double x1, double y1, double x2, double y2)
  {
    return ComputedTimingFunction(x1, y1, x2, y2);
  }
  static ComputedTimingFunction
  Steps(nsTimingFunction::Type aType, uint32_t aSteps)
  {
    do { } while (0);



    do { } while (0);
    return ComputedTimingFunction(aType, aSteps);
  }
  static ComputedTimingFunction
  Frames(uint32_t aFrames)
  {
    do { } while (0);
    return ComputedTimingFunction(nsTimingFunction::Type::Frames, aFrames);
  }

  ComputedTimingFunction() = default;
  explicit ComputedTimingFunction(const nsTimingFunction& aFunction)
  {
    Init(aFunction);
  }
  void Init(const nsTimingFunction& aFunction);



  enum class BeforeFlag {
    Unset,
    Set
  };
  double GetValue(double aPortion, BeforeFlag aBeforeFlag) const;
  const nsSMILKeySpline* GetFunction() const
  {
    do { } while(0);
    return &mTimingFunction;
  }
  nsTimingFunction::Type GetType() const { return mType; }
  bool HasSpline() const { return nsTimingFunction::IsSplineType(mType); }
  uint32_t GetSteps() const
  {
    do { } while (0);

    return mStepsOrFrames;
  }
  uint32_t GetFrames() const
  {
    do { } while (0);
    return mStepsOrFrames;
  }
  bool operator==(const ComputedTimingFunction& aOther) const
  {
    return mType == aOther.mType &&
           (HasSpline() ?
            mTimingFunction == aOther.mTimingFunction :
            mStepsOrFrames == aOther.mStepsOrFrames);
  }
  bool operator!=(const ComputedTimingFunction& aOther) const
  {
    return !(*this == aOther);
  }
  int32_t Compare(const ComputedTimingFunction& aRhs) const;
  void AppendToString(nsAString& aResult) const;

  static double GetPortion(const Maybe<ComputedTimingFunction>& aFunction,
                           double aPortion,
                           BeforeFlag aBeforeFlag)
  {
    return aFunction ? aFunction->GetValue(aPortion, aBeforeFlag) : aPortion;
  }
  static int32_t Compare(const Maybe<ComputedTimingFunction>& aLhs,
                         const Maybe<ComputedTimingFunction>& aRhs);

private:
  ComputedTimingFunction(double x1, double y1, double x2, double y2)
    : mType(nsTimingFunction::Type::CubicBezier)
    , mTimingFunction(x1, y1, x2, y2) { }
  ComputedTimingFunction(nsTimingFunction::Type aType, uint32_t aStepsOrFrames)
    : mType(aType)
    , mStepsOrFrames(aStepsOrFrames) { }

  nsTimingFunction::Type mType = nsTimingFunction::Type::Linear;
  nsSMILKeySpline mTimingFunction;
  uint32_t mStepsOrFrames;
};

}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AnimationPropertySegment.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h"
struct RawServoStyleSet;



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoArcTypeList.h" 1








struct ServoCssRules;
struct RawServoStyleSheet;
struct ServoComputedValues;
struct RawServoDeclarationBlock;
struct RawServoStyleRule;
struct RawServoImportRule;
struct RawServoAnimationValue;
struct RawServoAnimationValueMap;
struct RawServoMediaList;
struct RawServoMediaRule;
struct RawServoNamespaceRule;
struct RawServoPageRule;
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2


namespace mozilla {
class ServoElementSnapshot;
struct StyleAnimation;
struct URLExtraData;
namespace dom {
class Element;
class StyleChildrenIterator;
}
struct AnimationPropertySegment;
struct ComputedTiming;
struct Keyframe;
struct PropertyStyleAnimationValuePair;
using ComputedKeyframeValues = nsTArray<PropertyStyleAnimationValuePair>;
}

class nsCSSValue;
struct nsFontFaceRuleContainer;
class nsIDocument;
class nsINode;
class nsPresContext;
struct nsTimingFunction;

using mozilla::dom::StyleChildrenIterator;
using mozilla::ServoElementSnapshot;

typedef nsINode RawGeckoNode;
typedef mozilla::dom::Element RawGeckoElement;
typedef nsIDocument RawGeckoDocument;
typedef nsPresContext RawGeckoPresContext;
typedef mozilla::URLExtraData RawGeckoURLExtraData;
typedef nsTArray<mozilla::Keyframe> RawGeckoKeyframeList;
typedef nsTArray<mozilla::ComputedKeyframeValues> RawGeckoComputedKeyframeValuesList;
typedef nsTArray<mozilla::PropertyStyleAnimationValuePair> RawGeckoAnimationValueList;
typedef nsStyleAutoArray<mozilla::StyleAnimation> RawGeckoStyleAnimationList;
typedef nsTArray<nsFontFaceRuleContainer> RawGeckoFontFaceRuleList;
typedef mozilla::AnimationPropertySegment RawGeckoAnimationPropertySegment;
typedef mozilla::ComputedTiming RawGeckoComputedTiming;
typedef nsTArray<const RawServoStyleRule*> RawGeckoServoStyleRuleList;
# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoArcTypeList.h" 1








typedef ServoCssRules const* ServoCssRulesBorrowedOrNull; typedef ServoCssRules const* ServoCssRulesBorrowed; typedef ServoCssRules* ServoCssRulesBorrowedMut; struct ServoCssRulesStrong { ServoCssRules* mPtr; already_AddRefed<ServoCssRules> Consume(); };
typedef RawServoStyleSheet const* RawServoStyleSheetBorrowedOrNull; typedef RawServoStyleSheet const* RawServoStyleSheetBorrowed; typedef RawServoStyleSheet* RawServoStyleSheetBorrowedMut; struct RawServoStyleSheetStrong { RawServoStyleSheet* mPtr; already_AddRefed<RawServoStyleSheet> Consume(); };
typedef ServoComputedValues const* ServoComputedValuesBorrowedOrNull; typedef ServoComputedValues const* ServoComputedValuesBorrowed; typedef ServoComputedValues* ServoComputedValuesBorrowedMut; struct ServoComputedValuesStrong { ServoComputedValues* mPtr; already_AddRefed<ServoComputedValues> Consume(); };
typedef RawServoDeclarationBlock const* RawServoDeclarationBlockBorrowedOrNull; typedef RawServoDeclarationBlock const* RawServoDeclarationBlockBorrowed; typedef RawServoDeclarationBlock* RawServoDeclarationBlockBorrowedMut; struct RawServoDeclarationBlockStrong { RawServoDeclarationBlock* mPtr; already_AddRefed<RawServoDeclarationBlock> Consume(); };
typedef RawServoStyleRule const* RawServoStyleRuleBorrowedOrNull; typedef RawServoStyleRule const* RawServoStyleRuleBorrowed; typedef RawServoStyleRule* RawServoStyleRuleBorrowedMut; struct RawServoStyleRuleStrong { RawServoStyleRule* mPtr; already_AddRefed<RawServoStyleRule> Consume(); };
typedef RawServoImportRule const* RawServoImportRuleBorrowedOrNull; typedef RawServoImportRule const* RawServoImportRuleBorrowed; typedef RawServoImportRule* RawServoImportRuleBorrowedMut; struct RawServoImportRuleStrong { RawServoImportRule* mPtr; already_AddRefed<RawServoImportRule> Consume(); };
typedef RawServoAnimationValue const* RawServoAnimationValueBorrowedOrNull; typedef RawServoAnimationValue const* RawServoAnimationValueBorrowed; typedef RawServoAnimationValue* RawServoAnimationValueBorrowedMut; struct RawServoAnimationValueStrong { RawServoAnimationValue* mPtr; already_AddRefed<RawServoAnimationValue> Consume(); };
typedef RawServoAnimationValueMap const* RawServoAnimationValueMapBorrowedOrNull; typedef RawServoAnimationValueMap const* RawServoAnimationValueMapBorrowed; typedef RawServoAnimationValueMap* RawServoAnimationValueMapBorrowedMut; struct RawServoAnimationValueMapStrong { RawServoAnimationValueMap* mPtr; already_AddRefed<RawServoAnimationValueMap> Consume(); };
typedef RawServoMediaList const* RawServoMediaListBorrowedOrNull; typedef RawServoMediaList const* RawServoMediaListBorrowed; typedef RawServoMediaList* RawServoMediaListBorrowedMut; struct RawServoMediaListStrong { RawServoMediaList* mPtr; already_AddRefed<RawServoMediaList> Consume(); };
typedef RawServoMediaRule const* RawServoMediaRuleBorrowedOrNull; typedef RawServoMediaRule const* RawServoMediaRuleBorrowed; typedef RawServoMediaRule* RawServoMediaRuleBorrowedMut; struct RawServoMediaRuleStrong { RawServoMediaRule* mPtr; already_AddRefed<RawServoMediaRule> Consume(); };
typedef RawServoNamespaceRule const* RawServoNamespaceRuleBorrowedOrNull; typedef RawServoNamespaceRule const* RawServoNamespaceRuleBorrowed; typedef RawServoNamespaceRule* RawServoNamespaceRuleBorrowedMut; struct RawServoNamespaceRuleStrong { RawServoNamespaceRule* mPtr; already_AddRefed<RawServoNamespaceRule> Consume(); };
typedef RawServoPageRule const* RawServoPageRuleBorrowedOrNull; typedef RawServoPageRule const* RawServoPageRuleBorrowed; typedef RawServoPageRule* RawServoPageRuleBorrowedMut; struct RawServoPageRuleStrong { RawServoPageRule* mPtr; already_AddRefed<RawServoPageRule> Consume(); };
# 91 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2
# 105 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h"
typedef RawServoDeclarationBlockStrong const* RawServoDeclarationBlockStrongBorrowedOrNull;

typedef RawServoStyleSet* RawServoStyleSetOwned; typedef RawServoStyleSet const* RawServoStyleSetBorrowed; typedef RawServoStyleSet* RawServoStyleSetBorrowedMut;
typedef StyleChildrenIterator* StyleChildrenIteratorOwnedOrNull; typedef StyleChildrenIterator const* StyleChildrenIteratorBorrowedOrNull; typedef StyleChildrenIterator* StyleChildrenIteratorBorrowedMutOrNull;
typedef StyleChildrenIterator* StyleChildrenIteratorOwned; typedef StyleChildrenIterator const* StyleChildrenIteratorBorrowed; typedef StyleChildrenIterator* StyleChildrenIteratorBorrowedMut;
typedef ServoElementSnapshot* ServoElementSnapshotOwned; typedef ServoElementSnapshot const* ServoElementSnapshotBorrowed; typedef ServoElementSnapshot* ServoElementSnapshotBorrowedMut;






typedef RawGeckoNode const* RawGeckoNodeBorrowed;
typedef RawGeckoNode const* RawGeckoNodeBorrowedOrNull;
typedef RawGeckoElement const* RawGeckoElementBorrowed;
typedef RawGeckoElement const* RawGeckoElementBorrowedOrNull;
typedef RawGeckoDocument const* RawGeckoDocumentBorrowed;
typedef RawGeckoDocument const* RawGeckoDocumentBorrowedOrNull;
typedef StyleChildrenIterator* StyleChildrenIteratorBorrowedMut;
typedef ServoElementSnapshot* ServoElementSnapshotBorrowedMut;
typedef nsCSSValue const* nsCSSValueBorrowed;
typedef nsCSSValue* nsCSSValueBorrowedMut;
typedef RawGeckoPresContext* RawGeckoPresContextOwned; typedef RawGeckoPresContext const* RawGeckoPresContextBorrowed; typedef RawGeckoPresContext* RawGeckoPresContextBorrowedMut;
typedef RawGeckoPresContext const* RawGeckoPresContextBorrowed;
typedef RawGeckoAnimationValueList* RawGeckoAnimationValueListBorrowedMut;
typedef RawGeckoKeyframeList* RawGeckoKeyframeListBorrowedMut;
typedef RawGeckoKeyframeList const* RawGeckoKeyframeListBorrowed;
typedef RawGeckoComputedKeyframeValuesList* RawGeckoComputedKeyframeValuesListBorrowedMut;
typedef RawGeckoStyleAnimationList const* RawGeckoStyleAnimationListBorrowed;
typedef nsTimingFunction* nsTimingFunctionBorrowedMut;
typedef nsTimingFunction const* nsTimingFunctionBorrowed;
typedef RawGeckoFontFaceRuleList* RawGeckoFontFaceRuleListBorrowedMut;
typedef RawGeckoAnimationPropertySegment const* RawGeckoAnimationPropertySegmentBorrowed;
typedef RawGeckoComputedTiming const* RawGeckoComputedTimingBorrowed;
typedef RawGeckoServoStyleRuleList* RawGeckoServoStyleRuleListBorrowedMut;
# 164 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoArcTypeList.h" 1








extern "C" { void Servo_CssRules_AddRef( ServoCssRulesBorrowed ptr); void Servo_CssRules_Release( ServoCssRulesBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<ServoCssRules> { static void AddRef(ServoCssRules* aPtr) { Servo_CssRules_AddRef(aPtr); } static void Release(ServoCssRules* aPtr) { Servo_CssRules_Release(aPtr); } }; }
extern "C" { void Servo_StyleSheet_AddRef( RawServoStyleSheetBorrowed ptr); void Servo_StyleSheet_Release( RawServoStyleSheetBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoStyleSheet> { static void AddRef(RawServoStyleSheet* aPtr) { Servo_StyleSheet_AddRef(aPtr); } static void Release(RawServoStyleSheet* aPtr) { Servo_StyleSheet_Release(aPtr); } }; }
extern "C" { void Servo_ComputedValues_AddRef( ServoComputedValuesBorrowed ptr); void Servo_ComputedValues_Release( ServoComputedValuesBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<ServoComputedValues> { static void AddRef(ServoComputedValues* aPtr) { Servo_ComputedValues_AddRef(aPtr); } static void Release(ServoComputedValues* aPtr) { Servo_ComputedValues_Release(aPtr); } }; }
extern "C" { void Servo_DeclarationBlock_AddRef( RawServoDeclarationBlockBorrowed ptr); void Servo_DeclarationBlock_Release( RawServoDeclarationBlockBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoDeclarationBlock> { static void AddRef(RawServoDeclarationBlock* aPtr) { Servo_DeclarationBlock_AddRef(aPtr); } static void Release(RawServoDeclarationBlock* aPtr) { Servo_DeclarationBlock_Release(aPtr); } }; }
extern "C" { void Servo_StyleRule_AddRef( RawServoStyleRuleBorrowed ptr); void Servo_StyleRule_Release( RawServoStyleRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoStyleRule> { static void AddRef(RawServoStyleRule* aPtr) { Servo_StyleRule_AddRef(aPtr); } static void Release(RawServoStyleRule* aPtr) { Servo_StyleRule_Release(aPtr); } }; }
extern "C" { void Servo_ImportRule_AddRef( RawServoImportRuleBorrowed ptr); void Servo_ImportRule_Release( RawServoImportRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoImportRule> { static void AddRef(RawServoImportRule* aPtr) { Servo_ImportRule_AddRef(aPtr); } static void Release(RawServoImportRule* aPtr) { Servo_ImportRule_Release(aPtr); } }; }
extern "C" { void Servo_AnimationValue_AddRef( RawServoAnimationValueBorrowed ptr); void Servo_AnimationValue_Release( RawServoAnimationValueBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoAnimationValue> { static void AddRef(RawServoAnimationValue* aPtr) { Servo_AnimationValue_AddRef(aPtr); } static void Release(RawServoAnimationValue* aPtr) { Servo_AnimationValue_Release(aPtr); } }; }
extern "C" { void Servo_AnimationValueMap_AddRef( RawServoAnimationValueMapBorrowed ptr); void Servo_AnimationValueMap_Release( RawServoAnimationValueMapBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoAnimationValueMap> { static void AddRef(RawServoAnimationValueMap* aPtr) { Servo_AnimationValueMap_AddRef(aPtr); } static void Release(RawServoAnimationValueMap* aPtr) { Servo_AnimationValueMap_Release(aPtr); } }; }
extern "C" { void Servo_MediaList_AddRef( RawServoMediaListBorrowed ptr); void Servo_MediaList_Release( RawServoMediaListBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoMediaList> { static void AddRef(RawServoMediaList* aPtr) { Servo_MediaList_AddRef(aPtr); } static void Release(RawServoMediaList* aPtr) { Servo_MediaList_Release(aPtr); } }; }
extern "C" { void Servo_MediaRule_AddRef( RawServoMediaRuleBorrowed ptr); void Servo_MediaRule_Release( RawServoMediaRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoMediaRule> { static void AddRef(RawServoMediaRule* aPtr) { Servo_MediaRule_AddRef(aPtr); } static void Release(RawServoMediaRule* aPtr) { Servo_MediaRule_Release(aPtr); } }; }
extern "C" { void Servo_NamespaceRule_AddRef( RawServoNamespaceRuleBorrowed ptr); void Servo_NamespaceRule_Release( RawServoNamespaceRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoNamespaceRule> { static void AddRef(RawServoNamespaceRule* aPtr) { Servo_NamespaceRule_AddRef(aPtr); } static void Release(RawServoNamespaceRule* aPtr) { Servo_NamespaceRule_Release(aPtr); } }; }
extern "C" { void Servo_PageRule_AddRef( RawServoPageRuleBorrowed ptr); void Servo_PageRule_Release( RawServoPageRuleBorrowed ptr); } namespace mozilla { template<> struct RefPtrTraits<RawServoPageRule> { static void AddRef(RawServoPageRule* aPtr) { Servo_PageRule_AddRef(aPtr); } static void Release(RawServoPageRule* aPtr) { Servo_PageRule_Release(aPtr); } }; }
# 165 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h" 2
# 181 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingTypes.h"
extern "C" void Servo_StyleSet_Drop( RawServoStyleSetOwned ptr); namespace mozilla { template<> class DefaultDelete<RawServoStyleSet> { public: void operator()(RawServoStyleSet* aPtr) const { Servo_StyleSet_Drop(aPtr); } }; };
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h" 2








# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleTransformMatrix.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleTransformMatrix.h"
class nsIFrame;
class nsStyleContext;
class nsPresContext;
struct gfxQuaternion;
struct nsRect;
namespace mozilla {
class RuleNodeCacheConditions;
}




namespace nsStyleTransformMatrix {




  inline void ApplyPerspectiveToMatrix(mozilla::gfx::Matrix4x4& aMatrix,
                                       float aDepth)
  {
    if (aDepth >= std::numeric_limits<float>::epsilon()) {
      aMatrix.Perspective(aDepth);
    }
  }
# 66 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleTransformMatrix.h"
  class TransformReferenceBox final {
  public:
    typedef nscoord (TransformReferenceBox::*DimensionGetter)();

    explicit TransformReferenceBox()
      : mFrame(nullptr)
      , mIsCached(false)
    {}

    explicit TransformReferenceBox(const nsIFrame* aFrame)
      : mFrame(aFrame)
      , mIsCached(false)
    {
      do { } while (0);
    }

    explicit TransformReferenceBox(const nsIFrame* aFrame,
                                   const nsSize& aFallbackDimensions)
    {
      mFrame = aFrame;
      mIsCached = false;
      if (!mFrame) {
        Init(aFallbackDimensions);
      }
    }

    void Init(const nsIFrame* aFrame) {
      do { } while (0);
      mFrame = aFrame;
    }

    void Init(const nsSize& aDimensions);







    nscoord X() {
      EnsureDimensionsAreCached();
      return mX;
    }
    nscoord Y() {
      EnsureDimensionsAreCached();
      return mY;
    }




    nscoord Width() {
      EnsureDimensionsAreCached();
      return mWidth;
    }
    nscoord Height() {
      EnsureDimensionsAreCached();
      return mHeight;
    }

    bool IsEmpty() {
      return !mFrame;
    }

  private:



    TransformReferenceBox(const TransformReferenceBox&) = delete;

    void EnsureDimensionsAreCached();

    const nsIFrame* mFrame;
    nscoord mX, mY, mWidth, mHeight;
    bool mIsCached;
  };





  nsCSSKeyword TransformFunctionOf(const nsCSSValue::Array* aData);

  void SetIdentityMatrix(nsCSSValue::Array* aMatrix);

  float ProcessTranslatePart(const nsCSSValue& aValue,
                             nsStyleContext* aContext,
                             nsPresContext* aPresContext,
                             mozilla::RuleNodeCacheConditions& aConditions,
                             TransformReferenceBox* aRefBox,
                             TransformReferenceBox::DimensionGetter aDimensionGetter = nullptr);

  void
  ProcessInterpolateMatrix(mozilla::gfx::Matrix4x4& aMatrix,
                           const nsCSSValue::Array* aData,
                           nsStyleContext* aContext,
                           nsPresContext* aPresContext,
                           mozilla::RuleNodeCacheConditions& aConditions,
                           TransformReferenceBox& aBounds,
                           bool* aContains3dTransform);

  void
  ProcessAccumulateMatrix(mozilla::gfx::Matrix4x4& aMatrix,
                          const nsCSSValue::Array* aData,
                          nsStyleContext* aContext,
                          nsPresContext* aPresContext,
                          mozilla::RuleNodeCacheConditions& aConditions,
                          TransformReferenceBox& aBounds,
                          bool* aContains3dTransform);
# 195 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleTransformMatrix.h"
  mozilla::gfx::Matrix4x4 ReadTransforms(const nsCSSValueList* aList,
                                         nsStyleContext* aContext,
                                         nsPresContext* aPresContext,
                                         mozilla::RuleNodeCacheConditions& aConditions,
                                         TransformReferenceBox& aBounds,
                                         float aAppUnitsPerMatrixUnit,
                                         bool* aContains3dTransform);


  enum class ShearType {
    XYSHEAR,
    XZSHEAR,
    YZSHEAR,
    Count
  };
  using ShearArray =
    mozilla::EnumeratedArray<ShearType, ShearType::Count, float>;




  bool Decompose2DMatrix(const mozilla::gfx::Matrix& aMatrix,
                         mozilla::gfx::Point3D& aScale,
                         ShearArray& aShear,
                         gfxQuaternion& aRotate,
                         mozilla::gfx::Point3D& aTranslate);



  bool Decompose3DMatrix(const mozilla::gfx::Matrix4x4& aMatrix,
                         mozilla::gfx::Point3D& aScale,
                         ShearArray& aShear,
                         gfxQuaternion& aRotate,
                         mozilla::gfx::Point3D& aTranslate,
                         mozilla::gfx::Point4D& aPerspective);

  mozilla::gfx::Matrix CSSValueArrayTo2DMatrix(nsCSSValue::Array* aArray);
  mozilla::gfx::Matrix4x4 CSSValueArrayTo3DMatrix(nsCSSValue::Array* aArray);

  gfxSize GetScaleValue(const nsCSSValueSharedList* aList,
                        const nsIFrame* aForFrame);
}
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h" 2

class nsIFrame;
class nsStyleContext;
class gfx3DMatrix;

namespace mozilla {

namespace css {
class StyleRule;
}

namespace dom {
class Element;
}

enum class CSSPseudoElementType : uint8_t;
struct PropertyStyleAnimationValuePair;




class StyleAnimationValue {
public:
# 59 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool
  Add(nsCSSPropertyID aProperty, StyleAnimationValue& aDest,
      const StyleAnimationValue& aValueToAdd, uint32_t aCount) {
    return AddWeighted(aProperty, 1.0, aDest, aCount, aValueToAdd, aDest);
  }





  static StyleAnimationValue
  Add(nsCSSPropertyID aProperty,
      const StyleAnimationValue& aA,
      StyleAnimationValue&& aB);
# 83 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static double ComputeColorDistance(const css::RGBAColorData& aStartColor,
                                     const css::RGBAColorData& aEndColor);
# 106 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool
  ComputeDistance(nsCSSPropertyID aProperty,
                  const StyleAnimationValue& aStartValue,
                  const StyleAnimationValue& aEndValue,
                  nsStyleContext* aStyleContext,
                  double& aDistance);
# 129 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool
  Interpolate(nsCSSPropertyID aProperty,
              const StyleAnimationValue& aStartValue,
              const StyleAnimationValue& aEndValue,
              double aPortion,
              StyleAnimationValue& aResultValue) {
    return AddWeighted(aProperty, 1.0 - aPortion, aStartValue,
                       aPortion, aEndValue, aResultValue);
  }
# 153 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool
  AddWeighted(nsCSSPropertyID aProperty,
              double aCoeff1, const StyleAnimationValue& aValue1,
              double aCoeff2, const StyleAnimationValue& aValue2,
              StyleAnimationValue& aResultValue);







  static StyleAnimationValue
  Accumulate(nsCSSPropertyID aProperty,
             const StyleAnimationValue& aA,
             StyleAnimationValue&& aB,
             uint64_t aCount = 1);
# 203 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool
  ComputeValue(nsCSSPropertyID aProperty,
               mozilla::dom::Element* aTargetElement,
               nsStyleContext* aStyleContext,
               const nsAString& aSpecifiedValue,
               bool aUseSVGMode,
               StyleAnimationValue& aComputedValue,
               bool* aIsContextSensitive = nullptr);
# 222 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool
  ComputeValues(nsCSSPropertyID aProperty,
                mozilla::CSSEnabledState aEnabledState,
                mozilla::dom::Element* aTargetElement,
                nsStyleContext* aStyleContext,
                const nsAString& aSpecifiedValue,
                bool aUseSVGMode,
                nsTArray<PropertyStyleAnimationValuePair>& aResult);





  static __attribute__ ((warn_unused_result)) bool
  ComputeValues(nsCSSPropertyID aProperty,
                mozilla::CSSEnabledState aEnabledState,
                mozilla::dom::Element* aTargetElement,
                nsStyleContext* aStyleContext,
                const nsCSSValue& aSpecifiedValue,
                bool aUseSVGMode,
                nsTArray<PropertyStyleAnimationValuePair>& aResult);
# 261 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool
  UncomputeValue(nsCSSPropertyID aProperty,
                 const StyleAnimationValue& aComputedValue,
                 nsCSSValue& aSpecifiedValue);
  static __attribute__ ((warn_unused_result)) bool
  UncomputeValue(nsCSSPropertyID aProperty,
                 StyleAnimationValue&& aComputedValue,
                 nsCSSValue& aSpecifiedValue);
  static __attribute__ ((warn_unused_result)) bool
  UncomputeValue(nsCSSPropertyID aProperty,
                 const StyleAnimationValue& aComputedValue,
                 nsAString& aSpecifiedValue);
# 288 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StyleAnimationValue.h"
  static __attribute__ ((warn_unused_result)) bool ExtractComputedValue(
    nsCSSPropertyID aProperty,
    nsStyleContext* aStyleContext,
    StyleAnimationValue& aComputedValue);

  static already_AddRefed<nsCSSValue::Array>
    AppendTransformFunction(nsCSSKeyword aTransformFunction,
                            nsCSSValueList**& aListTail);




  enum Unit {
    eUnit_Null,
    eUnit_Normal,
    eUnit_Auto,
    eUnit_None,
    eUnit_Enumerated,
    eUnit_Visibility,

    eUnit_Integer,
    eUnit_Coord,
    eUnit_Percent,
    eUnit_Float,
    eUnit_Color,

    eUnit_CurrentColor,
    eUnit_ComplexColor,
    eUnit_Calc,

    eUnit_ObjectPosition,

    eUnit_URL,
    eUnit_DiscreteCSSValue,
    eUnit_CSSValuePair,
    eUnit_CSSValueTriplet,
    eUnit_CSSRect,
    eUnit_Dasharray,
    eUnit_Shadow,
    eUnit_Shape,
    eUnit_Filter,
    eUnit_Transform,
    eUnit_BackgroundPositionCoord,
    eUnit_CSSValuePairList,
    eUnit_UnparsedString
  };

private:
  Unit mUnit;
  union {
    int32_t mInt;
    nscoord mCoord;
    float mFloat;
    nsCSSValue* mCSSValue;
    nsCSSValuePair* mCSSValuePair;
    nsCSSValueTriplet* mCSSValueTriplet;
    nsCSSRect* mCSSRect;
    nsCSSValue::Array* mCSSValueArray;
    nsCSSValueList* mCSSValueList;
    nsCSSValueSharedList* mCSSValueSharedList;
    nsCSSValuePairList* mCSSValuePairList;
    nsStringBuffer* mString;
    css::ComplexColorValue* mComplexColor;
  } mValue;

public:
  Unit GetUnit() const {
    do { } while(0);
    return mUnit;
  }



  bool IsNull() const {
    return mUnit == eUnit_Null;
  }

  int32_t GetIntValue() const {
    do { } while(0);
    return mValue.mInt;
  }
  nscoord GetCoordValue() const {
    do { } while(0);
    return mValue.mCoord;
  }
  float GetPercentValue() const {
    do { } while(0);
    return mValue.mFloat;
  }
  float GetFloatValue() const {
    do { } while(0);
    return mValue.mFloat;
  }
  nsCSSValue* GetCSSValueValue() const {
    do { } while(0);
    return mValue.mCSSValue;
  }
  nsCSSValuePair* GetCSSValuePairValue() const {
    do { } while(0);
    return mValue.mCSSValuePair;
  }
  nsCSSValueTriplet* GetCSSValueTripletValue() const {
    do { } while(0);
    return mValue.mCSSValueTriplet;
  }
  nsCSSRect* GetCSSRectValue() const {
    do { } while(0);
    return mValue.mCSSRect;
  }
  nsCSSValue::Array* GetCSSValueArrayValue() const {
    do { } while(0);
    return mValue.mCSSValueArray;
  }
  nsCSSValueList* GetCSSValueListValue() const {
    do { } while(0);
    return mValue.mCSSValueList;
  }
  nsCSSValueSharedList* GetCSSValueSharedListValue() const {
    do { } while(0);
    return mValue.mCSSValueSharedList;
  }
  nsCSSValuePairList* GetCSSValuePairListValue() const {
    do { } while(0);
    return mValue.mCSSValuePairList;
  }
  const char16_t* GetStringBufferValue() const {
    do { } while(0);
    return GetBufferValue(mValue.mString);
  }

  void GetStringValue(nsAString& aBuffer) const {
    do { } while(0);
    aBuffer.Truncate();
    uint32_t len = NS_strlen(GetBufferValue(mValue.mString));
    mValue.mString->ToString(len, aBuffer);
  }


  gfxSize GetScaleValue(const nsIFrame* aForFrame) const;

  const css::ComplexColorData& GetComplexColorData() const {
    do { } while (0);
    return *mValue.mComplexColor;
  }
  StyleComplexColor GetStyleComplexColorValue() const {
    return GetComplexColorData().ToComplexColor();
  }

  UniquePtr<nsCSSValueList> TakeCSSValueListValue() {
    nsCSSValueList* list = GetCSSValueListValue();
    mValue.mCSSValueList = nullptr;
    mUnit = eUnit_Null;
    return UniquePtr<nsCSSValueList>(list);
  }
  UniquePtr<nsCSSValuePairList> TakeCSSValuePairListValue() {
    nsCSSValuePairList* list = GetCSSValuePairListValue();
    mValue.mCSSValuePairList = nullptr;
    mUnit = eUnit_Null;
    return UniquePtr<nsCSSValuePairList>(list);
  }

  explicit StyleAnimationValue(Unit aUnit = eUnit_Null) : mUnit(aUnit) {
    do { } while(0);


  }
  StyleAnimationValue(const StyleAnimationValue& aOther)
    : mUnit(eUnit_Null) { *this = aOther; }
  StyleAnimationValue(StyleAnimationValue&& aOther)
    : mUnit(aOther.mUnit)
    , mValue(aOther.mValue)
  {
    aOther.mUnit = eUnit_Null;
  }
  enum IntegerConstructorType { IntegerConstructor };
  StyleAnimationValue(int32_t aInt, Unit aUnit, IntegerConstructorType);
  enum CoordConstructorType { CoordConstructor };
  StyleAnimationValue(nscoord aLength, CoordConstructorType);
  enum PercentConstructorType { PercentConstructor };
  StyleAnimationValue(float aPercent, PercentConstructorType);
  enum FloatConstructorType { FloatConstructor };
  StyleAnimationValue(float aFloat, FloatConstructorType);
  enum ColorConstructorType { ColorConstructor };
  StyleAnimationValue(nscolor aColor, ColorConstructorType);

  ~StyleAnimationValue() { FreeValue(); }

  void SetNormalValue();
  void SetAutoValue();
  void SetNoneValue();
  void SetIntValue(int32_t aInt, Unit aUnit);
  template<typename T,
           typename = typename std::enable_if<std::is_enum<T>::value>::type>
  void SetEnumValue(T aInt)
  {
    static_assert(mozilla::EnumTypeFitsWithin<T, int32_t>::value,
                  "aValue must be an enum that fits within mValue.mInt");
    SetIntValue(static_cast<int32_t>(aInt), eUnit_Enumerated);
  }
  void SetCoordValue(nscoord aCoord);
  void SetPercentValue(float aPercent);
  void SetFloatValue(float aFloat);
  void SetColorValue(nscolor aColor);
  void SetCurrentColorValue();
  void SetComplexColorValue(const StyleComplexColor& aColor);
  void SetComplexColorValue(already_AddRefed<css::ComplexColorValue> aValue);
  void SetUnparsedStringValue(const nsString& aString);
  void SetCSSValueArrayValue(nsCSSValue::Array* aValue, Unit aUnit);



  void SetAndAdoptCSSValueValue(nsCSSValue *aValue, Unit aUnit);
  void SetAndAdoptCSSValuePairValue(nsCSSValuePair *aValue, Unit aUnit);
  void SetAndAdoptCSSValueTripletValue(nsCSSValueTriplet *aValue, Unit aUnit);
  void SetAndAdoptCSSRectValue(nsCSSRect *aValue, Unit aUnit);
  void SetAndAdoptCSSValueListValue(nsCSSValueList *aValue, Unit aUnit);
  void SetAndAdoptCSSValuePairListValue(nsCSSValuePairList *aValue);

  void SetTransformValue(nsCSSValueSharedList* aList);

  StyleAnimationValue& operator=(const StyleAnimationValue& aOther);
  StyleAnimationValue& operator=(StyleAnimationValue&& aOther)
  {
    do { } while (0);
    if (this != &aOther) {
      FreeValue();
      mUnit = aOther.mUnit;
      mValue = aOther.mValue;
      aOther.mUnit = eUnit_Null;
    }
    return *this;
  }

  bool operator==(const StyleAnimationValue& aOther) const;
  bool operator!=(const StyleAnimationValue& aOther) const
    { return !(*this == aOther); }

private:
  void FreeValue();

  static const char16_t* GetBufferValue(nsStringBuffer* aBuffer) {
    return static_cast<char16_t*>(aBuffer->Data());
  }

  static bool IsIntUnit(Unit aUnit) {
    return aUnit == eUnit_Enumerated || aUnit == eUnit_Visibility ||
           aUnit == eUnit_Integer;
  }
  static bool IsCSSValueUnit(Unit aUnit) {
    return aUnit == eUnit_Color ||
           aUnit == eUnit_Calc ||
           aUnit == eUnit_ObjectPosition ||
           aUnit == eUnit_URL ||
           aUnit == eUnit_DiscreteCSSValue;
  }
  static bool IsCSSValuePairUnit(Unit aUnit) {
    return aUnit == eUnit_CSSValuePair;
  }
  static bool IsCSSValueTripletUnit(Unit aUnit) {
    return aUnit == eUnit_CSSValueTriplet;
  }
  static bool IsCSSRectUnit(Unit aUnit) {
    return aUnit == eUnit_CSSRect;
  }
  static bool IsCSSValueArrayUnit(Unit aUnit) {
    return aUnit == eUnit_Shape;
  }
  static bool IsCSSValueListUnit(Unit aUnit) {
    return aUnit == eUnit_Dasharray || aUnit == eUnit_Filter ||
           aUnit == eUnit_Shadow ||
           aUnit == eUnit_BackgroundPositionCoord;
  }
  static bool IsCSSValueSharedListValue(Unit aUnit) {
    return aUnit == eUnit_Transform;
  }
  static bool IsCSSValuePairListUnit(Unit aUnit) {
    return aUnit == eUnit_CSSValuePairList;
  }
  static bool IsStringUnit(Unit aUnit) {
    return aUnit == eUnit_UnparsedString;
  }
};

struct AnimationValue
{





  StyleAnimationValue mGecko;
  RefPtr<RawServoAnimationValue> mServo;

  bool operator==(const AnimationValue& aOther) const;
  bool operator!=(const AnimationValue& aOther) const;

  bool IsNull() const { return mGecko.IsNull() && !mServo; }

  float GetOpacity() const;



  gfxSize GetScaleValue(const nsIFrame* aFrame) const;


  void SerializeSpecifiedValue(nsCSSPropertyID aProperty,
                               nsAString& aString) const;


  bool IsInterpolableWith(nsCSSPropertyID aProperty,
                          const AnimationValue& aToValue) const;
};

struct PropertyStyleAnimationValuePair
{
  nsCSSPropertyID mProperty;
  AnimationValue mValue;
};
}
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AnimationPropertySegment.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BaseKeyframeTypesBinding.h" 1





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BaseKeyframeTypesBinding.h" 1
# 7 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/BaseKeyframeTypesBinding.h" 2






namespace mozilla {
namespace dom {

struct BaseComputedKeyframeAtoms;
struct BaseKeyframeAtoms;
struct BasePropertyIndexedKeyframeAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

enum class CompositeOperation : uint8_t {
  Replace,
  Add,
  Accumulate,
  EndGuard_
};

namespace CompositeOperationValues {
extern const EnumEntry strings[4];
}

bool
ToJSValue(JSContext* aCx, CompositeOperation aArgument, JS::MutableHandle<JS::Value> aValue);


struct BaseKeyframe : public DictionaryBase
{
                        Optional<CompositeOperation> mComposite;
                        nsString mEasing;
                        Nullable<double> mOffset;
                        bool mSimulateComputeValuesFailure;

  BaseKeyframe();

  explicit inline BaseKeyframe(const FastDictionaryInitializer& )
  {

  }

  explicit inline BaseKeyframe(const BaseKeyframe& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  BaseKeyframe&
  operator=(const BaseKeyframe& aOther);

private:
  static bool
  InitIds(JSContext* cx, BaseKeyframeAtoms* atomsCache);
};

namespace binding_detail {
struct FastBaseKeyframe : public BaseKeyframe
{
  inline FastBaseKeyframe()
    : BaseKeyframe(FastDictionaryInitializer())
  {

  }
};
}


struct BasePropertyIndexedKeyframe : public DictionaryBase
{
                        Optional<CompositeOperation> mComposite;
                        nsString mEasing;

  BasePropertyIndexedKeyframe();

  explicit inline BasePropertyIndexedKeyframe(const FastDictionaryInitializer& )
  {

  }

  explicit inline BasePropertyIndexedKeyframe(const BasePropertyIndexedKeyframe& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  BasePropertyIndexedKeyframe&
  operator=(const BasePropertyIndexedKeyframe& aOther);

private:
  static bool
  InitIds(JSContext* cx, BasePropertyIndexedKeyframeAtoms* atomsCache);
};

namespace binding_detail {
struct FastBasePropertyIndexedKeyframe : public BasePropertyIndexedKeyframe
{
  inline FastBasePropertyIndexedKeyframe()
    : BasePropertyIndexedKeyframe(FastDictionaryInitializer())
  {

  }
};
}


struct BaseComputedKeyframe : public BaseKeyframe
{
                        Optional<double> mComputedOffset;

  BaseComputedKeyframe();

  explicit inline BaseComputedKeyframe(const FastDictionaryInitializer& )
    : BaseKeyframe(FastDictionaryInitializer())
  {

  }

  explicit inline BaseComputedKeyframe(const BaseComputedKeyframe& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  BaseComputedKeyframe&
  operator=(const BaseComputedKeyframe& aOther);

private:
  static bool
  InitIds(JSContext* cx, BaseComputedKeyframeAtoms* atomsCache);
};

namespace binding_detail {
struct FastBaseComputedKeyframe : public BaseComputedKeyframe
{
  inline FastBaseComputedKeyframe()
    : BaseComputedKeyframe(FastDictionaryInitializer())
  {

  }
};
}


}
}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AnimationPropertySegment.h" 2

namespace mozilla {

struct AnimationPropertySegment
{
  float mFromKey, mToKey;


  AnimationValue mFromValue, mToValue;

  Maybe<ComputedTimingFunction> mTimingFunction;
  dom::CompositeOperation mFromComposite = dom::CompositeOperation::Replace;
  dom::CompositeOperation mToComposite = dom::CompositeOperation::Replace;

  bool HasReplaceableValues() const
  {
    return HasReplaceableFromValue() && HasReplaceableToValue();
  }

  bool HasReplaceableFromValue() const
  {
    return !mFromValue.IsNull() &&
           mFromComposite == dom::CompositeOperation::Replace;
  }

  bool HasReplaceableToValue() const
  {
    return !mToValue.IsNull() &&
           mToComposite == dom::CompositeOperation::Replace;
  }

  bool operator==(const AnimationPropertySegment& aOther) const
  {
    return mFromKey == aOther.mFromKey &&
           mToKey == aOther.mToKey &&
           mFromValue == aOther.mFromValue &&
           mToValue == aOther.mToValue &&
           mTimingFunction == aOther.mTimingFunction &&
           mFromComposite == aOther.mFromComposite &&
           mToComposite == aOther.mToComposite;
  }
  bool operator!=(const AnimationPropertySegment& aOther) const
  {
    return !(*this == aOther);
  }
};

}
# 8 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ComputedTiming.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ComputedTiming.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StickyTimeDuration.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StickyTimeDuration.h"
namespace mozilla {
# 29 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StickyTimeDuration.h"
class StickyTimeDurationValueCalculator
{
public:
  static int64_t
  Add(int64_t aA, int64_t aB)
  {
    do { } while (0);






    if (aA == (9223372036854775807L) || aB == (9223372036854775807L)) {
      return (9223372036854775807L);
    }


    if (aA == (-9223372036854775807L -1) || aB == (-9223372036854775807L -1)) {
      return (-9223372036854775807L -1);
    }

    return aA + aB;
  }




  static int64_t
  Subtract(int64_t aA, int64_t aB)
  {
    do { } while (0);





    if (aA == (9223372036854775807L) || aB == (-9223372036854775807L -1)) {
      return (9223372036854775807L);
    }


    if (aA == (-9223372036854775807L -1) || aB == (9223372036854775807L)) {
      return (-9223372036854775807L -1);
    }

    return aA - aB;
  }

  template <typename T>
  static int64_t
  Multiply(int64_t aA, T aB) {

    return Multiply(aA, static_cast<int64_t>(aB));
  }

  static int64_t
  Divide(int64_t aA, int64_t aB) {
    do { } while (0);
    do { } while (0);







    if (aA == (9223372036854775807L) || aA == (-9223372036854775807L -1)) {
      return (aA >= 0) ^ (aB >= 0) ? (-9223372036854775807L -1) : (9223372036854775807L);
    }


    if (aB == (9223372036854775807L) || aB == (-9223372036854775807L -1)) {
      return 0;
    }

    return aA / aB;
  }

  static double
  DivideDouble(int64_t aA, int64_t aB)
  {
    do { } while (0);
    do { } while (0);







    if (aA == (9223372036854775807L) || aA == (-9223372036854775807L -1)) {
      return (aA >= 0) ^ (aB >= 0)
             ? NegativeInfinity<double>()
             : PositiveInfinity<double>();
    }


    if (aB == (9223372036854775807L) || aB == (-9223372036854775807L -1)) {
      return 0.0;
    }

    return static_cast<double>(aA) / aB;
  }

  static int64_t
  Modulo(int64_t aA, int64_t aB)
  {
    do { } while (0);


    return aA % aB;
  }
};

template <>
inline int64_t
StickyTimeDurationValueCalculator::Multiply<int64_t>(int64_t aA,
                                                          int64_t aB)
{
  do { } while (0);
# 160 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StickyTimeDuration.h"
  if (aA == (9223372036854775807L) || aA == (-9223372036854775807L -1) ||
      aB == (9223372036854775807L) || aB == (-9223372036854775807L -1)) {
    return (aA >= 0) ^ (aB >= 0) ? (-9223372036854775807L -1) : (9223372036854775807L);
  }

  return aA * aB;
}

template <>
inline int64_t
StickyTimeDurationValueCalculator::Multiply<double>(int64_t aA, double aB)
{
  do { } while (0);






  if (aA == (9223372036854775807L) || aA == (-9223372036854775807L -1) || IsInfinite(aB)) {
    return (aA >= 0) ^ (aB >= 0.0) ? (-9223372036854775807L -1) : (9223372036854775807L);
  }

  return aA * aB;
}

template <>
inline int64_t
StickyTimeDurationValueCalculator::Multiply<float>(int64_t aA, float aB)
{
  do { } while (0);


  return Multiply(aA, static_cast<double>(aB));
}
# 205 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/StickyTimeDuration.h"
typedef BaseTimeDuration<StickyTimeDurationValueCalculator>
  StickyTimeDuration;



inline StickyTimeDuration
operator+(const TimeDuration& aA, const StickyTimeDuration& aB)
{
  return StickyTimeDuration(aA) + aB;
}
inline StickyTimeDuration
operator+(const StickyTimeDuration& aA, const TimeDuration& aB)
{
  return aA + StickyTimeDuration(aB);
}

inline StickyTimeDuration
operator-(const TimeDuration& aA, const StickyTimeDuration& aB)
{
  return StickyTimeDuration(aA) - aB;
}
inline StickyTimeDuration
operator-(const StickyTimeDuration& aA, const TimeDuration& aB)
{
  return aA - StickyTimeDuration(aB);
}

inline StickyTimeDuration&
operator+=(StickyTimeDuration &aA, const TimeDuration& aB)
{
  return aA += StickyTimeDuration(aB);
}
inline StickyTimeDuration&
operator-=(StickyTimeDuration &aA, const TimeDuration& aB)
{
  return aA -= StickyTimeDuration(aB);
}

inline double
operator/(const TimeDuration& aA, const StickyTimeDuration& aB)
{
  return StickyTimeDuration(aA) / aB;
}
inline double
operator/(const StickyTimeDuration& aA, const TimeDuration& aB)
{
  return aA / StickyTimeDuration(aB);
}

inline StickyTimeDuration
operator%(const TimeDuration& aA, const StickyTimeDuration& aB)
{
  return StickyTimeDuration(aA) % aB;
}
inline StickyTimeDuration
operator%(const StickyTimeDuration& aA, const TimeDuration& aB)
{
  return aA % StickyTimeDuration(aB);
}

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ComputedTiming.h" 2








namespace mozilla {





struct ComputedTiming
{



  StickyTimeDuration mActiveDuration;

  StickyTimeDuration mActiveTime;



  StickyTimeDuration mEndTime;




  Nullable<double> mProgress;

  uint64_t mCurrentIteration = 0;


  double mIterations = 1.0;
  double mIterationStart = 0.0;
  StickyTimeDuration mDuration;


  dom::FillMode mFill = dom::FillMode::None;
  bool FillsForwards() const {
    do { } while (0);

    return mFill == dom::FillMode::Both ||
           mFill == dom::FillMode::Forwards;
  }
  bool FillsBackwards() const {
    do { } while (0);

    return mFill == dom::FillMode::Both ||
           mFill == dom::FillMode::Backwards;
  }

  enum class AnimationPhase {
    Idle,
    Before,
    Active,
    After
  };
  AnimationPhase mPhase = AnimationPhase::Idle;

  ComputedTimingFunction::BeforeFlag mBeforeFlag =
    ComputedTimingFunction::BeforeFlag::Unset;

};

}
# 9 "<built-in>" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Keyframe.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Keyframe.h"
struct RawServoDeclarationBlock;
namespace mozilla {
namespace dom {
enum class CompositeOperation : uint8_t;
}




struct PropertyValuePair
{
  nsCSSPropertyID mProperty;



  nsCSSValue mValue;


  RefPtr<RawServoDeclarationBlock> mServoDeclarationBlock;

  bool operator==(const PropertyValuePair&) const;
};
# 56 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/Keyframe.h"
struct Keyframe
{
  Keyframe() = default;
  Keyframe(const Keyframe& aOther) = default;
  Keyframe(Keyframe&& aOther)
  {
    *this = Move(aOther);
  }

  Keyframe& operator=(const Keyframe& aOther) = default;
  Keyframe& operator=(Keyframe&& aOther)
  {
    mOffset = aOther.mOffset;
    mComputedOffset = aOther.mComputedOffset;
    mTimingFunction = Move(aOther.mTimingFunction);
    mComposite = Move(aOther.mComposite);
    mPropertyValues = Move(aOther.mPropertyValues);
    return *this;
  }

  Maybe<double> mOffset;
  static constexpr double kComputedOffsetNotSet = -1.0;
  double mComputedOffset = kComputedOffsetNotSet;
  Maybe<ComputedTimingFunction> mTimingFunction;

  Maybe<dom::CompositeOperation> mComposite;
  nsTArray<PropertyValuePair> mPropertyValues;
};

}
# 11 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrName.h" 1
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrName.h"
class nsAttrName
{
public:
  nsAttrName(const nsAttrName& aOther)
    : mBits(aOther.mBits)
  {
    AddRefInternalName();
  }

  explicit nsAttrName(nsIAtom* aAtom)
    : mBits(reinterpret_cast<uintptr_t>(aAtom))
  {
    do { } while(0);
    (aAtom)->AddRef();
  }

  explicit nsAttrName(mozilla::dom::NodeInfo* aNodeInfo)
  {
    do { } while(0);
    if (aNodeInfo->NamespaceEquals(kNameSpaceID_None)) {
      mBits = reinterpret_cast<uintptr_t>(aNodeInfo->NameAtom());
      (aNodeInfo->NameAtom())->AddRef();
    }
    else {
      mBits = reinterpret_cast<uintptr_t>(aNodeInfo) |
              1;
      (aNodeInfo)->AddRef();
    }
  }

  ~nsAttrName()
  {
    ReleaseInternalName();
  }

  void SetTo(mozilla::dom::NodeInfo* aNodeInfo)
  {
    do { } while(0);

    ReleaseInternalName();
    if (aNodeInfo->NamespaceEquals(kNameSpaceID_None)) {
      mBits = reinterpret_cast<uintptr_t>(aNodeInfo->NameAtom());
      (aNodeInfo->NameAtom())->AddRef();
    }
    else {
      mBits = reinterpret_cast<uintptr_t>(aNodeInfo) |
              1;
      (aNodeInfo)->AddRef();
    }
  }

  void SetTo(nsIAtom* aAtom)
  {
    do { } while(0);

    ReleaseInternalName();
    mBits = reinterpret_cast<uintptr_t>(aAtom);
    (aAtom)->AddRef();
  }

  bool IsAtom() const
  {
    return !(mBits & 1);
  }

  mozilla::dom::NodeInfo* NodeInfo() const
  {
    do { } while(0);
    return reinterpret_cast<mozilla::dom::NodeInfo*>(mBits & ~1);
  }

  nsIAtom* Atom() const
  {
    do { } while(0);
    return reinterpret_cast<nsIAtom*>(mBits);
  }

  bool Equals(const nsAttrName& aOther) const
  {
    return mBits == aOther.mBits;
  }


  bool Equals(nsIAtom* aAtom) const
  {
    return reinterpret_cast<uintptr_t>(aAtom) == mBits;
  }


  bool Equals(const nsAString& aLocalName) const
  {
    return IsAtom() && Atom()->Equals(aLocalName);
  }

  bool Equals(nsIAtom* aLocalName, int32_t aNamespaceID) const
  {
    if (aNamespaceID == kNameSpaceID_None) {
      return Equals(aLocalName);
    }
    return !IsAtom() && NodeInfo()->Equals(aLocalName, aNamespaceID);
  }

  bool Equals(mozilla::dom::NodeInfo* aNodeInfo) const
  {
    return Equals(aNodeInfo->NameAtom(), aNodeInfo->NamespaceID());
  }

  int32_t NamespaceID() const
  {
    return IsAtom() ? kNameSpaceID_None : NodeInfo()->NamespaceID();
  }

  int32_t NamespaceEquals(int32_t aNamespaceID) const
  {
    return aNamespaceID == kNameSpaceID_None ?
           IsAtom() :
           (!IsAtom() && NodeInfo()->NamespaceEquals(aNamespaceID));
  }

  nsIAtom* LocalName() const
  {
    return IsAtom() ? Atom() : NodeInfo()->NameAtom();
  }

  nsIAtom* GetPrefix() const
  {
    return IsAtom() ? nullptr : NodeInfo()->GetPrefixAtom();
  }

  bool QualifiedNameEquals(const nsAString& aName) const
  {
    return IsAtom() ? Atom()->Equals(aName) :
                      NodeInfo()->QualifiedNameEquals(aName);
  }

  void GetQualifiedName(nsAString& aStr) const
  {
    if (IsAtom()) {
      Atom()->ToString(aStr);
    }
    else {
      aStr = NodeInfo()->QualifiedName();
    }
  }


  void GetPrefix(nsAString& aStr) const
  {
    if (IsAtom()) {
      SetDOMStringToNull(aStr);
    }
    else {
      NodeInfo()->GetPrefix(aStr);
    }
  }


  uint32_t HashValue() const
  {



    return mBits - 0;
  }

  bool IsSmaller(nsIAtom* aOther) const
  {
    return mBits < reinterpret_cast<uintptr_t>(aOther);
  }

private:

  void AddRefInternalName()
  {
    if (IsAtom()) {
      (Atom())->AddRef();
    } else {
      (NodeInfo())->AddRef();
    }
  }

  void ReleaseInternalName()
  {
    if (IsAtom()) {
      Atom()->Release();
    } else {
      NodeInfo()->Release();
    }
  }

  uintptr_t mBits;
};
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" 1
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/SVGAttrValueWrapper.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/SVGAttrValueWrapper.h"
class nsSVGAngle;
class nsSVGIntegerPair;
class nsSVGLength2;
class nsSVGNumberPair;
class nsSVGViewBox;

namespace mozilla {
class SVGLengthList;
class SVGNumberList;
class SVGPathData;
class SVGPointList;
class SVGAnimatedPreserveAspectRatio;
class SVGStringList;
class SVGTransformList;
}

namespace mozilla {

class SVGAttrValueWrapper
{
public:
  static void ToString(const nsSVGAngle* aAngle, nsAString& aResult);
  static void ToString(const nsSVGIntegerPair* aIntegerPair,
                       nsAString& aResult);
  static void ToString(const nsSVGLength2* aLength, nsAString& aResult);
  static void ToString(const mozilla::SVGLengthList* aLengthList,
                       nsAString& aResult);
  static void ToString(const mozilla::SVGNumberList* aNumberList,
                       nsAString& aResult);
  static void ToString(const nsSVGNumberPair* aNumberPair, nsAString& aResult);
  static void ToString(const mozilla::SVGPathData* aPathData,
                       nsAString& aResult);
  static void ToString(const mozilla::SVGPointList* aPointList,
                       nsAString& aResult);
  static void ToString(
    const mozilla::SVGAnimatedPreserveAspectRatio* aPreserveAspectRatio,
    nsAString& aResult);
  static void ToString(const mozilla::SVGStringList* aStringList,
                       nsAString& aResult);
  static void ToString(const mozilla::SVGTransformList* aTransformList,
                       nsAString& aResult);
  static void ToString(const nsSVGViewBox* aViewBox, nsAString& aResult);
};

}
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h" 2
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
class nsAString;
class nsIDocument;
class nsStyledElement;
struct MiscContainer;

namespace mozilla {
class DeclarationBlock;
namespace css {
struct URLValue;
struct ImageValue;
}
}
# 75 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
class nsCheapString : public nsString {
public:
  explicit nsCheapString(nsStringBuffer* aBuf)
  {
    if (aBuf)
      aBuf->ToString(aBuf->StorageSize()/sizeof(char16_t) - 1, *this);
  }
};

class nsAttrValue {
  friend struct MiscContainer;
public:
  typedef nsTArray< nsCOMPtr<nsIAtom> > AtomArray;


  enum ValueType {
    eString = 0x00,

    eAtom = 0x02,
    eInteger = 0x03,
    eColor = 0x07,
    eEnum = 0x0B,
    ePercent = 0x0F,


    eCSSDeclaration = 0x10,
    eURL,
    eImage,
    eAtomArray,
    eDoubleValue,
    eIntMarginValue,
    eSVGAngle,
    eSVGTypesBegin = eSVGAngle,
    eSVGIntegerPair,
    eSVGLength,
    eSVGLengthList,
    eSVGNumberList,
    eSVGNumberPair,
    eSVGPathData,
    eSVGPointList,
    eSVGPreserveAspectRatio,
    eSVGStringList,
    eSVGTransformList,
    eSVGViewBox,
    eSVGTypesEnd = eSVGViewBox,
  };

  nsAttrValue();
  nsAttrValue(const nsAttrValue& aOther);
  explicit nsAttrValue(const nsAString& aValue);
  explicit nsAttrValue(nsIAtom* aValue);
  nsAttrValue(already_AddRefed<mozilla::DeclarationBlock> aValue,
              const nsAString* aSerialized);
  explicit nsAttrValue(const nsIntMargin& aValue);
  ~nsAttrValue();

  inline const nsAttrValue& operator=(const nsAttrValue& aOther);

  static nsresult Init();
  static void Shutdown();

  ValueType Type() const;





  inline bool StoresOwnData() const;

  void Reset();

  void SetTo(const nsAttrValue& aOther);
  void SetTo(const nsAString& aValue);
  void SetTo(nsIAtom* aValue);
  void SetTo(int16_t aInt);
  void SetTo(int32_t aInt, const nsAString* aSerialized);
  void SetTo(double aValue, const nsAString* aSerialized);
  void SetTo(already_AddRefed<mozilla::DeclarationBlock> aValue,
             const nsAString* aSerialized);
  void SetTo(mozilla::css::URLValue* aValue, const nsAString* aSerialized);
  void SetTo(const nsIntMargin& aValue);
  void SetTo(const nsSVGAngle& aValue, const nsAString* aSerialized);
  void SetTo(const nsSVGIntegerPair& aValue, const nsAString* aSerialized);
  void SetTo(const nsSVGLength2& aValue, const nsAString* aSerialized);
  void SetTo(const mozilla::SVGLengthList& aValue,
             const nsAString* aSerialized);
  void SetTo(const mozilla::SVGNumberList& aValue,
             const nsAString* aSerialized);
  void SetTo(const nsSVGNumberPair& aValue, const nsAString* aSerialized);
  void SetTo(const mozilla::SVGPathData& aValue, const nsAString* aSerialized);
  void SetTo(const mozilla::SVGPointList& aValue, const nsAString* aSerialized);
  void SetTo(const mozilla::SVGAnimatedPreserveAspectRatio& aValue,
             const nsAString* aSerialized);
  void SetTo(const mozilla::SVGStringList& aValue,
             const nsAString* aSerialized);
  void SetTo(const mozilla::SVGTransformList& aValue,
             const nsAString* aSerialized);
  void SetTo(const nsSVGViewBox& aValue, const nsAString* aSerialized);
# 181 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  void SetToSerialized(const nsAttrValue& aValue);

  void SwapValueWith(nsAttrValue& aOther);

  void ToString(nsAString& aResult) const;
  inline void ToString(mozilla::dom::DOMString& aResult) const;





  already_AddRefed<nsIAtom> GetAsAtom() const;



  inline bool IsEmptyString() const;
  const nsCheapString GetStringValue() const;
  inline nsIAtom* GetAtomValue() const;
  inline int32_t GetIntegerValue() const;
  bool GetColorValue(nscolor& aColor) const;
  inline int16_t GetEnumValue() const;
  inline float GetPercentValue() const;
  inline AtomArray* GetAtomArrayValue() const;
  inline mozilla::DeclarationBlock* GetCSSDeclarationValue() const;
  inline mozilla::css::URLValue* GetURLValue() const;
  inline mozilla::css::ImageValue* GetImageValue() const;
  inline double GetDoubleValue() const;
  bool GetIntMarginValue(nsIntMargin& aMargin) const;







  void GetEnumString(nsAString& aResult, bool aRealTag) const;




  uint32_t GetAtomCount() const;


  nsIAtom* AtomAt(int32_t aIndex) const;

  uint32_t HashValue() const;
  bool Equals(const nsAttrValue& aOther) const;

  bool Equals(const nsAString& aValue, nsCaseTreatment aCaseSensitive) const;
  bool Equals(nsIAtom* aValue, nsCaseTreatment aCaseSensitive) const;
# 239 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool EqualsAsStrings(const nsAttrValue& aOther) const;





  bool Contains(nsIAtom* aValue, nsCaseTreatment aCaseSensitive) const;





  bool Contains(const nsAString& aValue) const;

  void ParseAtom(const nsAString& aValue);
  void ParseAtomArray(const nsAString& aValue);
  void ParseStringOrAtom(const nsAString& aValue);
# 267 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  struct EnumTable {



    constexpr EnumTable(const char* aTag, int16_t aValue)
      : tag(aTag)
      , value(aValue)
    {
    }

    template<typename T,
             typename = typename std::enable_if<std::is_enum<T>::value>::type>
    constexpr EnumTable(const char* aTag, T aValue)
      : tag(aTag)
      , value(static_cast<int16_t>(aValue))
    {
      static_assert(mozilla::EnumTypeFitsWithin<T, int16_t>::value,
                    "aValue must be an enum that fits within int16_t");
    }


    const char* tag;

    int16_t value;
  };
# 304 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParseEnumValue(const nsAString& aValue,
                        const EnumTable* aTable,
                        bool aCaseSensitive,
                        const EnumTable* aDefaultValue = nullptr);
# 319 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParseSpecialIntValue(const nsAString& aString);
# 328 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParseIntValue(const nsAString& aString) {
    return ParseIntWithBounds(aString, (-2147483647-1), (2147483647));
  }
# 340 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParseIntWithBounds(const nsAString& aString, int32_t aMin,
                            int32_t aMax = (2147483647));
# 352 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  void ParseIntWithFallback(const nsAString& aString, int32_t aDefault,
                            int32_t aMax = (2147483647));
# 363 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParseNonNegativeIntValue(const nsAString& aString);
# 378 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParsePositiveIntValue(const nsAString& aString);
# 387 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParseColor(const nsAString& aString);







  bool ParseDoubleValue(const nsAString& aString);





  bool ParseLazyURIValue(const nsAString& aString);
# 410 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  bool ParseIntMarginValue(const nsAString& aString);






  void LoadImage(nsIDocument* aDocument);







  bool ParseStyleAttribute(const nsAString& aString,
                           nsStyledElement* aElement);

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:

  enum ValueBaseType {
    eStringBase = eString,
    eOtherBase = 0x01,
    eAtomBase = eAtom,
    eIntegerBase = 0x03
  };

  inline ValueBaseType BaseType() const;
  inline bool IsSVGType(ValueType aType) const;
# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrValue.h"
  int16_t GetEnumTableIndex(const EnumTable* aTable);

  inline void SetPtrValueAndType(void* aValue, ValueBaseType aType);
  void SetIntValueAndType(int32_t aValue, ValueType aType,
                          const nsAString* aStringValue);
  void SetColorValue(nscolor aColor, const nsAString& aString);
  void SetMiscAtomOrString(const nsAString* aValue);
  void ResetMiscAtomOrString();
  void SetSVGType(ValueType aType, const void* aValue,
                  const nsAString* aSerialized);
  inline void ResetIfSet();

  inline void* GetPtr() const;
  inline MiscContainer* GetMiscContainer() const;
  inline int32_t GetIntInternal() const;



  MiscContainer* ClearMiscContainer();


  MiscContainer* EnsureEmptyMiscContainer();
  bool EnsureEmptyAtomArray();
  already_AddRefed<nsStringBuffer>
    GetStringBuffer(const nsAString& aValue) const;


  int32_t EnumTableEntryToValue(const EnumTable* aEnumTable,
                                const EnumTable* aTableEntry);

  static nsTArray<const EnumTable*>* sEnumTableArray;

  uintptr_t mBits;
};

inline const nsAttrValue&
nsAttrValue::operator=(const nsAttrValue& aOther)
{
  SetTo(aOther);
  return *this;
}

inline nsIAtom*
nsAttrValue::GetAtomValue() const
{
  do { } while(0);
  return reinterpret_cast<nsIAtom*>(GetPtr());
}

inline nsAttrValue::ValueBaseType
nsAttrValue::BaseType() const
{
  return static_cast<ValueBaseType>(mBits & (uintptr_t(3)));
}

inline void*
nsAttrValue::GetPtr() const
{
  do { } while(0);

  return reinterpret_cast<void*>(mBits & (~(uintptr_t(3))));
}

inline bool
nsAttrValue::IsEmptyString() const
{
  return !mBits;
}

inline void
nsAttrValue::ToString(mozilla::dom::DOMString& aResult) const
{
  switch (Type()) {
    case eString:
    {
      nsStringBuffer* str = static_cast<nsStringBuffer*>(GetPtr());
      if (str) {
        aResult.SetStringBuffer(str, str->StorageSize()/sizeof(char16_t) - 1);
      }

      return;
    }
    case eAtom:
    {
      nsIAtom *atom = static_cast<nsIAtom*>(GetPtr());
      aResult.SetStringBuffer(atom->GetStringBuffer(), atom->GetLength());
      break;
    }
    default:
    {
      ToString(aResult.AsAString());
    }
  }
}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h" 2



namespace mozilla {

namespace dom {
class Element;
}






struct ServoAttrSnapshot
{
  nsAttrName mName;
  nsAttrValue mValue;

  ServoAttrSnapshot(const nsAttrName& aName, const nsAttrValue& aValue)
    : mName(aName)
    , mValue(aValue)
  {
  }
};





enum class ServoElementSnapshotFlags : uint8_t
{
  State = 1 << 0,
  Attributes = 1 << 1,
  All = State | Attributes
};

inline constexpr mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> operator |(ServoElementSnapshotFlags a, ServoElementSnapshotFlags b) { typedef mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<ServoElementSnapshotFlags>::Type U; return Result(ServoElementSnapshotFlags(U(a) | U(b))); } inline ServoElementSnapshotFlags& operator |=(ServoElementSnapshotFlags& a, ServoElementSnapshotFlags b) { return a = a | b; } inline constexpr mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> operator &(ServoElementSnapshotFlags a, ServoElementSnapshotFlags b) { typedef mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<ServoElementSnapshotFlags>::Type U; return Result(ServoElementSnapshotFlags(U(a) & U(b))); } inline ServoElementSnapshotFlags& operator &=(ServoElementSnapshotFlags& a, ServoElementSnapshotFlags b) { return a = a & b; } inline constexpr mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> operator ^(ServoElementSnapshotFlags a, ServoElementSnapshotFlags b) { typedef mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<ServoElementSnapshotFlags>::Type U; return Result(ServoElementSnapshotFlags(U(a) ^ U(b))); } inline ServoElementSnapshotFlags& operator ^=(ServoElementSnapshotFlags& a, ServoElementSnapshotFlags b) { return a = a ^ b; } inline constexpr mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> operator~(ServoElementSnapshotFlags a) { typedef mozilla::CastableTypedEnumResult<ServoElementSnapshotFlags> Result; typedef mozilla::detail::UnsignedIntegerTypeForEnum<ServoElementSnapshotFlags>::Type U; return Result(ServoElementSnapshotFlags(~(U(a)))); }
# 61 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoElementSnapshot.h"
class ServoElementSnapshot
{
  typedef dom::BorrowedAttrInfo BorrowedAttrInfo;
  typedef dom::Element Element;
  typedef EventStates::ServoType ServoStateType;

public:
  typedef ServoElementSnapshotFlags Flags;

  explicit ServoElementSnapshot(const Element* aElement);
  ~ServoElementSnapshot();

  bool HasAttrs() { return HasAny(Flags::Attributes); }

  bool HasState() { return HasAny(Flags::State); }




  void AddState(EventStates aState)
  {
    if (!HasAny(Flags::State)) {
      mState = aState.ServoValue();
      mContains |= Flags::State;
    }
  }




  void AddAttrs(Element* aElement);




  BorrowedAttrInfo GetAttrInfoAt(uint32_t aIndex) const
  {
    if (aIndex >= mAttrs.Length()) {
      return BorrowedAttrInfo(nullptr, nullptr);
    }
    return BorrowedAttrInfo(&mAttrs[aIndex].mName, &mAttrs[aIndex].mValue);
  }

  const nsAttrValue* GetParsedAttr(nsIAtom* aLocalName) const
  {
    return GetParsedAttr(aLocalName, kNameSpaceID_None);
  }

  const nsAttrValue* GetParsedAttr(nsIAtom* aLocalName,
                                   int32_t aNamespaceID) const
  {
    uint32_t i, len = mAttrs.Length();
    if (aNamespaceID == kNameSpaceID_None) {

      for (i = 0; i < len; ++i) {
        if (mAttrs[i].mName.Equals(aLocalName)) {
          return &mAttrs[i].mValue;
        }
      }

      return nullptr;
    }

    for (i = 0; i < len; ++i) {
      if (mAttrs[i].mName.Equals(aLocalName, aNamespaceID)) {
        return &mAttrs[i].mValue;
      }
    }

    return nullptr;
  }

  bool IsInChromeDocument() const
  {
    return mIsInChromeDocument;
  }

  bool HasAny(Flags aFlags) { return bool(mContains & aFlags); }

private:




  Flags mContains;
  nsTArray<ServoAttrSnapshot> mAttrs;
  ServoStateType mState;
  bool mIsHTMLElementInHTMLDocument;
  bool mIsInChromeDocument;
};

}
# 12 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FragmentOrElement.h" 1
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FragmentOrElement.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrAndChildArray.h" 1
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrAndChildArray.h"
class nsINode;
class nsIContent;
class nsMappedAttributes;
class nsHTMLStyleSheet;
class nsRuleWalker;
class nsMappedAttributeElement;
# 48 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsAttrAndChildArray.h"
class nsAttrAndChildArray
{
  typedef mozilla::dom::BorrowedAttrInfo BorrowedAttrInfo;
public:
  nsAttrAndChildArray();
  ~nsAttrAndChildArray();

  uint32_t ChildCount() const
  {
    return mImpl ? (mImpl->mAttrAndChildCount >> 10) : 0;
  }
  nsIContent* ChildAt(uint32_t aPos) const
  {
    do { } while(0);
    return reinterpret_cast<nsIContent*>(mImpl->mBuffer[AttrSlotsSize() + aPos]);
  }
  nsIContent* GetSafeChildAt(uint32_t aPos) const;
  nsIContent * const * GetChildArray(uint32_t* aChildCount) const;
  nsresult AppendChild(nsIContent* aChild)
  {
    return InsertChildAt(aChild, ChildCount());
  }
  nsresult InsertChildAt(nsIContent* aChild, uint32_t aPos);
  void RemoveChildAt(uint32_t aPos);


  already_AddRefed<nsIContent> TakeChildAt(uint32_t aPos);
  int32_t IndexOfChild(const nsINode* aPossibleChild) const;

  bool HasAttrs() const
  {
    return MappedAttrCount() || (AttrSlotCount() && AttrSlotIsTaken(0));
  }

  uint32_t AttrCount() const;
  const nsAttrValue* GetAttr(nsIAtom* aLocalName,
                             int32_t aNamespaceID = kNameSpaceID_None) const;


  const nsAttrValue* GetAttr(const nsAString& aName) const;


  const nsAttrValue* GetAttr(const nsAString& aName,
                             nsCaseTreatment aCaseSensitive) const;
  const nsAttrValue* AttrAt(uint32_t aPos) const;

  nsresult SetAndSwapAttr(nsIAtom* aLocalName, nsAttrValue& aValue);
  nsresult SetAndSwapAttr(mozilla::dom::NodeInfo* aName, nsAttrValue& aValue);



  nsresult RemoveAttrAt(uint32_t aPos, nsAttrValue& aValue);


  const nsAttrName* AttrNameAt(uint32_t aPos) const;


  BorrowedAttrInfo AttrInfoAt(uint32_t aPos) const;


  const nsAttrName* GetSafeAttrNameAt(uint32_t aPos) const;

  const nsAttrName* GetExistingAttrNameFromQName(const nsAString& aName) const;
  int32_t IndexOfAttr(nsIAtom* aLocalName, int32_t aNamespaceID = kNameSpaceID_None) const;

  nsresult SetAndTakeMappedAttr(nsIAtom* aLocalName, nsAttrValue& aValue,
                                nsMappedAttributeElement* aContent,
                                nsHTMLStyleSheet* aSheet);
  nsresult SetMappedAttrStyleSheet(nsHTMLStyleSheet* aSheet) {
    if (!mImpl || !mImpl->mMappedAttrs) {
      return NS_OK;
    }
    return DoSetMappedAttrStyleSheet(aSheet);
  }
  void WalkMappedAttributeStyleRules(nsRuleWalker* aRuleWalker);

  void Compact();

  bool CanFitMoreAttrs() const
  {
    return AttrSlotCount() < ((1 << 10) - 1) ||
           !AttrSlotIsTaken(((1 << 10) - 1) - 1);
  }

  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
  bool HasMappedAttrs() const
  {
    return MappedAttrCount();
  }
  const nsMappedAttributes* GetMapped() const;


  nsresult ForceMapped(nsMappedAttributeElement* aContent, nsIDocument* aDocument);



  void ClearMappedServoStyle();

private:
  nsAttrAndChildArray(const nsAttrAndChildArray& aOther) = delete;
  nsAttrAndChildArray& operator=(const nsAttrAndChildArray& aOther) = delete;

  void Clear();

  uint32_t NonMappedAttrCount() const;
  uint32_t MappedAttrCount() const;


  nsMappedAttributes*
  GetModifiableMapped(nsMappedAttributeElement* aContent,
                      nsHTMLStyleSheet* aSheet,
                      bool aWillAddAttr,
                      int32_t aAttrCount = 1);
  nsresult MakeMappedUnique(nsMappedAttributes* aAttributes);

  uint32_t AttrSlotsSize() const
  {
    return AttrSlotCount() * (sizeof(InternalAttr) / sizeof(void*));
  }

  uint32_t AttrSlotCount() const
  {
    return mImpl ? mImpl->mAttrAndChildCount & ((1 << 10) - 1) : 0;
  }

  bool AttrSlotIsTaken(uint32_t aSlot) const
  {
    do { } while(0);
    return mImpl->mBuffer[aSlot * (sizeof(InternalAttr) / sizeof(void*))];
  }

  void SetChildCount(uint32_t aCount)
  {
    mImpl->mAttrAndChildCount =
        (mImpl->mAttrAndChildCount & ((1 << 10) - 1)) |
        (aCount << 10);
  }

  void SetAttrSlotCount(uint32_t aCount)
  {
    mImpl->mAttrAndChildCount =
        (mImpl->mAttrAndChildCount & ~((1 << 10) - 1)) |
        aCount;
  }

  void SetAttrSlotAndChildCount(uint32_t aSlotCount, uint32_t aChildCount)
  {
    mImpl->mAttrAndChildCount = aSlotCount |
      (aChildCount << 10);
  }

  bool GrowBy(uint32_t aGrowSize);
  bool AddAttrSlot();






  inline void SetChildAtPos(void** aPos, nsIContent* aChild, uint32_t aIndex,
                            uint32_t aChildCount);




  nsresult DoSetMappedAttrStyleSheet(nsHTMLStyleSheet* aSheet);

  struct InternalAttr
  {
    nsAttrName mName;
    nsAttrValue mValue;
  };

  struct Impl {
    uint32_t mAttrAndChildCount;
    uint32_t mBufferSize;
    nsMappedAttributes* mMappedAttrs;
    void* mBuffer[1];
  };

  Impl* mImpl;
};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FragmentOrElement.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
struct CharacterDataChangeInfo;
template<class E> class nsCOMArray;
class nsCycleCollectionTraversalCallback;
namespace mozilla {
struct NonOwningAnimationTarget;
namespace dom {
class Animation;
}
}

class nsNodeUtils
{
public:






  static void CharacterDataWillChange(nsIContent* aContent,
                                      CharacterDataChangeInfo* aInfo);







  static void CharacterDataChanged(nsIContent* aContent,
                                   CharacterDataChangeInfo* aInfo);
# 57 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static void AttributeWillChange(mozilla::dom::Element* aElement,
                                  int32_t aNameSpaceID,
                                  nsIAtom* aAttribute,
                                  int32_t aModType,
                                  const nsAttrValue* aNewValue);
# 73 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static void AttributeChanged(mozilla::dom::Element* aElement,
                               int32_t aNameSpaceID,
                               nsIAtom* aAttribute,
                               int32_t aModType,
                               const nsAttrValue* aOldValue);
# 86 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static void AttributeSetToCurrentValue(mozilla::dom::Element* aElement,
                                         int32_t aNameSpaceID,
                                         nsIAtom* aAttribute);
# 97 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static void ContentAppended(nsIContent* aContainer,
                              nsIContent* aFirstNewContent,
                              int32_t aNewIndexInContainer);







  static void NativeAnonymousChildListChange(nsIContent* aContent,
                                             bool aIsRemove);
# 117 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static void ContentInserted(nsINode* aContainer,
                              nsIContent* aChild,
                              int32_t aIndexInContainer);







  static void ContentRemoved(nsINode* aContainer,
                             nsIContent* aChild,
                             int32_t aIndexInContainer,
                             nsIContent* aPreviousSibling);





  static inline void ParentChainChanged(nsIContent *aContent)
  {
    nsINode::nsSlots* slots = aContent->GetExistingSlots();
    if (slots && !slots->mMutationObservers.IsEmpty()) {
      do { nsTObserverArray<nsIMutationObserver *>::ForwardIterator iter_(slots->mMutationObservers); nsIMutationObserver* obs_; while (iter_.HasMore()) { obs_ = iter_.GetNext(); obs_ -> ParentChainChanged (aContent) ; } } while(0);



    }
  }






  static mozilla::Maybe<mozilla::NonOwningAnimationTarget>
    GetTargetForAnimation(const mozilla::dom::Animation* aAnimation);





  static void AnimationAdded(mozilla::dom::Animation* aAnimation);
  static void AnimationChanged(mozilla::dom::Animation* aAnimation);
  static void AnimationRemoved(mozilla::dom::Animation* aAnimation);





  static void LastRelease(nsINode* aNode);
# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static nsresult Clone(nsINode *aNode, bool aDeep,
                        nsNodeInfoManager *aNewNodeInfoManager,
                        nsCOMArray<nsINode> &aNodesWithProperties,
                        nsINode **aResult)
  {
    return CloneAndAdopt(aNode, true, aDeep, aNewNodeInfoManager,
                         nullptr, aNodesWithProperties, nullptr, aResult);
  }




  static nsresult Clone(nsINode *aNode, bool aDeep, nsINode **aResult)
  {
    nsCOMArray<nsINode> dummyNodeWithProperties;
    return CloneAndAdopt(aNode, true, aDeep, nullptr, nullptr,
                         dummyNodeWithProperties, aNode->GetParent(), aResult);
  }
# 223 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static nsresult Adopt(nsINode *aNode, nsNodeInfoManager *aNewNodeInfoManager,
                        JS::Handle<JSObject*> aReparentScope,
                        nsCOMArray<nsINode> &aNodesWithProperties)
  {
    nsCOMPtr<nsINode> node;
    nsresult rv = CloneAndAdopt(aNode, false, true, aNewNodeInfoManager,
                                aReparentScope, aNodesWithProperties,
                                nullptr, getter_AddRefs(node));

    nsMutationGuard::DidMutate();

    return rv;
  }







  static void TraverseUserData(nsINode* aNode,
                               nsCycleCollectionTraversalCallback &aCb);
# 254 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static nsresult CloneNodeImpl(nsINode *aNode, bool aDeep, nsINode **aResult);






  static void UnlinkUserData(nsINode *aNode);






  static bool IsTemplateElement(const nsINode *aNode);
# 277 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static nsIContent* GetFirstChildOfTemplateOrNode(nsINode* aNode);

private:
# 309 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsNodeUtils.h"
  static nsresult CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
                                nsNodeInfoManager *aNewNodeInfoManager,
                                JS::Handle<JSObject*> aReparentScope,
                                nsCOMArray<nsINode> &aNodesWithProperties,
                                nsINode *aParent, nsINode **aResult);

  enum class AnimationMutationType
  {
    Added,
    Changed,
    Removed
  };






  static void AnimationMutated(mozilla::dom::Animation* aAnimation,
                               AnimationMutationType aMutatedType);

};
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FragmentOrElement.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHTMLCollection.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHTMLCollection.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMHTMLCollection.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMHTMLCollection.h"
class nsIDOMHTMLCollection : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetLength(uint32_t *aLength) = 0;


  virtual nsresult Item(uint32_t index, nsIDOMNode * *_retval) = 0;


  virtual nsresult NamedItem(const nsAString & name, nsIDOMNode * *_retval) = 0;

};

  template<typename T> struct nsIDOMHTMLCollection::COMTypeInfo<nsIDOMHTMLCollection, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMHTMLCollection::COMTypeInfo<nsIDOMHTMLCollection, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xbb07f567, 0x5b37, 0x4172, { 0x92, 0xaa, 0x7d, 0x00, 0xce, 0xed, 0x48, 0x09 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHTMLCollection.h" 2





class nsINode;
class nsString;

namespace mozilla {
namespace dom {
class Element;
}
}
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIHTMLCollection.h"
class nsIHTMLCollection : public nsIDOMHTMLCollection
{
public:
  template<typename T, typename U> struct COMTypeInfo;




  virtual nsINode* GetParentObject() = 0;

  using nsIDOMHTMLCollection::Item;
  using nsIDOMHTMLCollection::NamedItem;

  uint32_t Length()
  {
    uint32_t length;
    GetLength(&length);
    return length;
  }
  virtual mozilla::dom::Element* GetElementAt(uint32_t index) = 0;
  mozilla::dom::Element* Item(uint32_t index)
  {
    return GetElementAt(index);
  }
  mozilla::dom::Element* IndexedGetter(uint32_t index, bool& aFound)
  {
    mozilla::dom::Element* item = Item(index);
    aFound = !!item;
    return item;
  }
  mozilla::dom::Element* NamedItem(const nsAString& aName)
  {
    bool dummy;
    return NamedGetter(aName, dummy);
  }
  mozilla::dom::Element* NamedGetter(const nsAString& aName, bool& aFound)
  {
    return GetFirstNamedElement(aName, aFound);
  }
  virtual mozilla::dom::Element*
  GetFirstNamedElement(const nsAString& aName, bool& aFound) = 0;

  virtual void GetSupportedNames(nsTArray<nsString>& aNames) = 0;

  JSObject* GetWrapperPreserveColor()
  {
    return GetWrapperPreserveColorInternal();
  }
  JSObject* GetWrapper()
  {
    JSObject* obj = GetWrapperPreserveColor();
    if (obj) {
      JS::ExposeObjectToActiveJS(obj);
    }
    return obj;
  }
  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) = 0;
protected:
  virtual JSObject* GetWrapperPreserveColorInternal() = 0;
};

template<typename T> struct nsIHTMLCollection::COMTypeInfo<nsIHTMLCollection, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIHTMLCollection::COMTypeInfo<nsIHTMLCollection, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x4e169191, 0x5196, 0x4e17, { 0xa4, 0x79, 0xd5, 0x35, 0x0b, 0x5b, 0x0a, 0xcd } };
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FragmentOrElement.h" 2


class ContentUnbinder;
class nsContentList;
class nsDOMAttributeMap;
class nsDOMTokenList;
class nsIControllers;
class nsICSSDeclaration;
class nsIDocument;
class nsDOMStringMap;
class nsIURI;

namespace mozilla {
class DeclarationBlock;
namespace dom {
struct CustomElementData;
class DOMIntersectionObserver;
class Element;
}
}





class nsNodeWeakReference final : public nsIWeakReference
{
public:
  explicit nsNodeWeakReference(nsINode* aNode)
    : mNode(aNode)
  {
  }


  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:


  virtual nsresult QueryReferent(const nsIID & uuid, void **result) override;
  virtual size_t SizeOfOnlyThis(mozilla::MallocSizeOf aMallocSizeOf) const override;

  void NoticeNodeDestruction()
  {
    mNode = nullptr;
  }

private:
  ~nsNodeWeakReference();

  nsINode* mNode;
};




class nsNodeSupportsWeakRefTearoff final : public nsISupportsWeakReference
{
public:
  explicit nsNodeSupportsWeakRefTearoff(nsINode* aNode)
    : mNode(aNode)
  {
  }


  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:


  virtual nsresult GetWeakReference(nsIWeakReference * *_retval) override;

  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "nsNodeSupportsWeakRefTearoff"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<nsNodeSupportsWeakRefTearoff>(p)->DeleteCycleCollectable(); } static nsNodeSupportsWeakRefTearoff* Downcast(nsISupports* s) { return static_cast<nsNodeSupportsWeakRefTearoff*>(static_cast<nsNodeSupportsWeakRefTearoff*>(s)); } static nsISupports* Upcast(nsNodeSupportsWeakRefTearoff *p) { return static_cast<nsISupports*>(static_cast<nsNodeSupportsWeakRefTearoff*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &nsNodeSupportsWeakRefTearoff::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

private:
  ~nsNodeSupportsWeakRefTearoff() {}

  nsCOMPtr<nsINode> mNode;
};





namespace mozilla {
namespace dom {

class ShadowRoot;

class FragmentOrElement : public nsIContent
{
public:
  explicit FragmentOrElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
  explicit FragmentOrElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:

  virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;


  virtual uint32_t GetChildCount() const override;
  virtual nsIContent *GetChildAt(uint32_t aIndex) const override;
  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const override;
  virtual int32_t IndexOf(const nsINode* aPossibleChild) const override;
  virtual nsresult InsertChildAt(nsIContent* aKid, uint32_t aIndex,
                                 bool aNotify) override;
  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) override;
  virtual void GetTextContentInternal(nsAString& aTextContent,
                                      mozilla::OOMReporter& aError) override;
  virtual void SetTextContentInternal(const nsAString& aTextContent,
                                      mozilla::ErrorResult& aError) override;


  virtual already_AddRefed<nsINodeList> GetChildren(uint32_t aFilter) override;
  virtual const nsTextFragment *GetText() override;
  virtual uint32_t TextLength() const override;
  virtual nsresult SetText(const char16_t* aBuffer, uint32_t aLength,
                           bool aNotify) override;

  nsresult SetText(const nsAString& aStr, bool aNotify)
  {
    return SetText(aStr.BeginReading(), aStr.Length(), aNotify);
  }
  virtual nsresult AppendText(const char16_t* aBuffer, uint32_t aLength,
                              bool aNotify) override;
  virtual bool TextIsOnlyWhitespace() override;
  virtual bool ThreadSafeTextIsOnlyWhitespace() const override;
  virtual bool HasTextForTranslation() override;
  virtual void AppendTextTo(nsAString& aResult) override;
  __attribute__ ((warn_unused_result))
  virtual bool AppendTextTo(nsAString& aResult, const mozilla::fallible_t&) override;
  virtual nsIContent *GetBindingParent() const override;
  virtual nsXBLBinding *GetXBLBinding() const override;
  virtual void SetXBLBinding(nsXBLBinding* aBinding,
                             nsBindingManager* aOldBindingManager = nullptr) override;
  virtual ShadowRoot *GetContainingShadow() const override;
  virtual nsTArray<nsIContent*> &DestInsertionPoints() override;
  virtual nsTArray<nsIContent*> *GetExistingDestInsertionPoints() const override;
  virtual void SetShadowRoot(ShadowRoot* aBinding) override;
  virtual nsIContent *GetXBLInsertionParent() const override;
  virtual void SetXBLInsertionParent(nsIContent* aContent) override;
  virtual bool IsLink(nsIURI** aURI) const override;

  virtual void DestroyContent() override;
  virtual void SaveSubtreeState() override;

  virtual nsresult WalkContentStyleRules(nsRuleWalker* aRuleWalker) override;

  nsIHTMLCollection* Children();
  uint32_t ChildElementCount()
  {
    return Children()->Length();
  }







  void SetIsElementInStyleScopeFlagOnSubtree(bool aInStyleScope);

public:




  static void FireNodeInserted(nsIDocument* aDoc,
                               nsINode* aParent,
                               nsTArray<nsCOMPtr<nsIContent> >& aNodes);

  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = true) : nsXPCOMCycleCollectionParticipant(true) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "FragmentOrElement"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<FragmentOrElement>(p)->DeleteCycleCollectable(); } static FragmentOrElement* Downcast(nsISupports* s) { return static_cast<FragmentOrElement*>(static_cast<FragmentOrElement*>(s)); } static nsISupports* Upcast(FragmentOrElement *p) { return static_cast<nsISupports*>(static_cast<FragmentOrElement*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &FragmentOrElement::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;




  void FireNodeRemovedForChildren();

  virtual bool OwnedOnlyByTheDOMTree() override
  {
    uint32_t rc = mRefCnt.get();
    if (GetParent()) {
      --rc;
    }
    rc -= mAttrsAndChildren.ChildCount();
    return rc == 0;
  }

  virtual bool IsPurple() override
  {
    return mRefCnt.IsPurple();
  }

  virtual void RemovePurple() override
  {
    mRefCnt.RemovePurple();
  }

  static void ClearContentUnbinder();
  static bool CanSkip(nsINode* aNode, bool aRemovingAllowed);
  static bool CanSkipInCC(nsINode* aNode);
  static bool CanSkipThis(nsINode* aNode);
  static void RemoveBlackMarkedNode(nsINode* aNode);
  static void MarkNodeChildren(nsINode* aNode);
  static void InitCCCallbacks();
  static void MarkUserData(void* aObject, nsIAtom* aKey, void* aChild,
                           void *aData);




  static bool IsHTMLVoid(nsIAtom* aLocalName);
protected:
  virtual ~FragmentOrElement();





  nsresult CopyInnerTo(FragmentOrElement* aDest);

public:
# 252 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/FragmentOrElement.h"
  class nsDOMSlots : public nsINode::nsSlots
  {
  public:
    nsDOMSlots();
    virtual ~nsDOMSlots();

    void Traverse(nsCycleCollectionTraversalCallback &cb, bool aIsXUL);
    void Unlink(bool aIsXUL);

    size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;






    nsCOMPtr<nsICSSDeclaration> mStyle;





    nsDOMStringMap* mDataset;





    nsCOMPtr<nsICSSDeclaration> mSMILOverrideStyle;




    RefPtr<mozilla::DeclarationBlock> mSMILOverrideStyleDeclaration;





    RefPtr<nsDOMAttributeMap> mAttributeMap;

    union {




      nsIContent* mBindingParent;




      nsIControllers* mControllers;
    };




    RefPtr<nsContentList> mChildrenList;




    RefPtr<nsDOMTokenList> mClassList;




    RefPtr<ShadowRoot> mShadowRoot;




    RefPtr<ShadowRoot> mContainingShadow;





    nsTArray<nsIContent*> mDestInsertionPoints;




    RefPtr<nsXBLBinding> mXBLBinding;




    nsCOMPtr<nsIContent> mXBLInsertionParent;




    RefPtr<CustomElementData> mCustomElementData;




    nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>
      mRegisteredIntersectionObservers;
  };

protected:
  void GetMarkup(bool aIncludeSelf, nsAString& aMarkup);
  void SetInnerHTMLInternal(const nsAString& aInnerHTML, ErrorResult& aError);


  virtual nsINode::nsSlots* CreateSlots() override;

  nsDOMSlots *DOMSlots()
  {
    return static_cast<nsDOMSlots*>(Slots());
  }

  nsDOMSlots *GetExistingDOMSlots() const
  {
    return static_cast<nsDOMSlots*>(GetExistingSlots());
  }







  void SetIsElementInStyleScopeFlagOnShadowTree(bool aInStyleScope);

  friend class ::ContentUnbinder;



  nsAttrAndChildArray mAttrsAndChildren;
};

}
}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DirectionalityUtils.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DirectionalityUtils.h"
class nsIContent;
class nsAString;
class nsAttrValue;
class nsTextNode;

namespace mozilla {
namespace dom {
class Element;
}
}

namespace mozilla {

enum Directionality : uint8_t {
  eDir_NotSet,
  eDir_RTL,
  eDir_LTR,
  eDir_Auto
};
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DirectionalityUtils.h"
Directionality RecomputeDirectionality(mozilla::dom::Element* aElement,
                                       bool aNotify = true);
# 49 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DirectionalityUtils.h"
void SetDirectionalityOnDescendants(mozilla::dom::Element* aElement,
                                    Directionality aDir,
                                    bool aNotify = true);







void WalkDescendantsResetAutoDirection(mozilla::dom::Element* aElement);
# 69 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DirectionalityUtils.h"
void WalkDescendantsSetDirAuto(mozilla::dom::Element* aElement,
                               bool aNotify = true);






void WalkDescendantsClearAncestorDirAuto(mozilla::dom::Element* aElement);







bool TextNodeWillChangeDirection(nsIContent* aTextNode, Directionality* aOldDir,
                                 uint32_t aOffset);





void TextNodeChangedDirection(nsTextNode* aTextNode, Directionality aOldDir,
                              bool aNotify);





void SetDirectionFromNewTextNode(nsTextNode* aTextNode);







void ResetDirectionSetByTextNode(nsTextNode* aTextNode);





void SetDirectionalityFromValue(mozilla::dom::Element* aElement,
                                const nsAString& aValue,
                                bool aNotify);
# 125 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DirectionalityUtils.h"
void OnSetDirAttr(mozilla::dom::Element* aElement,
                  const nsAttrValue* aNewValue,
                  bool hadValidDir,
                  bool hadDirAuto,
                  bool aNotify);






void SetDirOnBind(mozilla::dom::Element* aElement, nsIContent* aParent);






void ResetDir(mozilla::dom::Element* aElement);
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMElement.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMElement.h"
class nsIDOMMozNamedAttrMap;
# 33 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMElement.h"
class nsIDOMElement : public nsIDOMNode {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetTagName(nsAString & aTagName) = 0;


  virtual nsresult GetAttributes(nsIDOMMozNamedAttrMap * *aAttributes) = 0;


  virtual nsresult GetAttribute(const nsAString & name, nsAString & _retval) = 0;


  virtual nsresult SetAttribute(const nsAString & name, const nsAString & value) = 0;


  virtual nsresult HasAttribute(const nsAString & name, bool *_retval) = 0;


  virtual nsresult GetAttributeNode(const nsAString & name, nsIDOMAttr * *_retval) = 0;


  virtual nsresult GetAttributeNodeNS(const nsAString & namespaceURI, const nsAString & localName, nsIDOMAttr * *_retval) = 0;

};

  template<typename T> struct nsIDOMElement::COMTypeInfo<nsIDOMElement, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMElement::COMTypeInfo<nsIDOMElement, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x6289999b, 0x1008, 0x4269, { 0xb4, 0x2a, 0x41, 0x3e, 0xc5, 0xa9, 0xd3, 0xf4 }};
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILinkHandler.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILinkHandler.h"
class nsIContent;
class nsIDocShell;
class nsIInputStream;
class nsIRequest;
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILinkHandler.h"
class nsILinkHandler : public nsISupports
{
public:
  template<typename T, typename U> struct COMTypeInfo;
# 43 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILinkHandler.h"
  virtual nsresult OnLinkClick(nsIContent* aContent,
                         nsIURI* aURI,
                         const char16_t* aTargetSpec,
                         const nsAString& aFileName,
                         nsIInputStream* aPostDataStream,
                         nsIInputStream* aHeadersDataStream,
                         bool aIsTrusted,
                         nsIPrincipal* aTriggeringPrincipal) = 0;
# 71 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILinkHandler.h"
  virtual nsresult OnLinkClickSync(nsIContent* aContent,
                             nsIURI* aURI,
                             const char16_t* aTargetSpec,
                             const nsAString& aFileName,
                             nsIInputStream* aPostDataStream = 0,
                             nsIInputStream* aHeadersDataStream = 0,
                             bool aNoOpenerImplied = false,
                             nsIDocShell** aDocShell = 0,
                             nsIRequest** aRequest = 0,
                             nsIPrincipal* aTriggeringPrincipal = nullptr) = 0;
# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsILinkHandler.h"
  virtual nsresult OnOverLink(nsIContent* aContent,
                        nsIURI* aURLSpec,
                        const char16_t* aTargetSpec) = 0;




  virtual nsresult OnLeaveLink() = 0;
};

template<typename T> struct nsILinkHandler::COMTypeInfo<nsILinkHandler, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsILinkHandler::COMTypeInfo<nsILinkHandler, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xceb9aade, 0x43da, 0x4f1a, { 0xac, 0x8a, 0xc7, 0x09, 0xfb, 0x22, 0x46, 0x64 } };
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINodeList.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINodeList.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMNodeList.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMNodeList.h"
class nsIDOMNodeList : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult Item(uint32_t index, nsIDOMNode * *_retval) = 0;


  virtual nsresult GetLength(uint32_t *aLength) = 0;

};

  template<typename T> struct nsIDOMNodeList::COMTypeInfo<nsIDOMNodeList, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMNodeList::COMTypeInfo<nsIDOMNodeList, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x450cf0ba, 0xde90, 0x4f86, { 0x85, 0xbf, 0xe1, 0x0c, 0xc8, 0xb8, 0x71, 0x3f }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsINodeList.h" 2








class nsIContent;
class nsINode;




class nsINodeList : public nsIDOMNodeList,
                    public nsWrapperCache
{
public:
  template<typename T, typename U> struct COMTypeInfo;





  virtual int32_t IndexOf(nsIContent* aContent) = 0;




  virtual nsINode* GetParentObject() = 0;

  using nsIDOMNodeList::Item;

  uint32_t Length()
  {
    uint32_t length;
    GetLength(&length);
    return length;
  }
  virtual nsIContent* Item(uint32_t aIndex) = 0;
  nsIContent* IndexedGetter(uint32_t aIndex, bool& aFound)
  {
    nsIContent* item = Item(aIndex);
    aFound = !!item;
    return item;
  }
};




template<typename T> struct nsINodeList::COMTypeInfo<nsINodeList, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsINodeList::COMTypeInfo<nsINodeList, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xadb5e54c, 0x6e96, 0x4102, { 0x8d, 0x40, 0xe0, 0x12, 0x3d, 0xcf, 0x48, 0x7a } };
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMAttributeMap.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMAttributeMap.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Attr.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Attr.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAttribute.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIAttribute.h"
class nsDOMAttributeMap;





class nsIAttribute : public nsINode
{
public:
  template<typename T, typename U> struct COMTypeInfo;

  virtual void SetMap(nsDOMAttributeMap *aMap) = 0;

  nsDOMAttributeMap *GetMap()
  {
    return mAttrMap;
  }

  mozilla::dom::NodeInfo *NodeInfo() const
  {
    return mNodeInfo;
  }





  virtual nsresult SetOwnerDocument(nsIDocument* aDocument) = 0;

protected:

  nsIAttribute(nsDOMAttributeMap *aAttrMap,
               already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);

  virtual ~nsIAttribute();

  RefPtr<nsDOMAttributeMap> mAttrMap;
};

template<typename T> struct nsIAttribute::COMTypeInfo<nsIAttribute, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIAttribute::COMTypeInfo<nsIAttribute, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x84d43da7, 0xb45d, 0x47ae, { 0x8f, 0xbf, 0x95, 0x26, 0x78, 0x4d, 0x5e, 0x47 } };
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Attr.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMAttr.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMAttr.h"
class nsIDOMAttr : public nsIDOMNode {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetName(nsAString & aName) = 0;


  virtual nsresult GetSpecified(bool *aSpecified) = 0;


  virtual nsresult GetValue(nsAString & aValue) = 0;
  virtual nsresult SetValue(const nsAString & aValue) = 0;


  virtual nsresult GetOwnerElement(nsIDOMElement * *aOwnerElement) = 0;


  virtual nsresult GetIsId(bool *aIsId) = 0;

};

  template<typename T> struct nsIDOMAttr::COMTypeInfo<nsIDOMAttr, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMAttr::COMTypeInfo<nsIDOMAttr, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x7db491e8, 0xa3a3, 0x4432, { 0xad, 0x67, 0xe6, 0xc3, 0x3e, 0x24, 0xac, 0x6d }};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Attr.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMText.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMText.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCharacterData.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCharacterData.h"
class nsIDOMCharacterData : public nsIDOMNode {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetData(nsAString & aData) = 0;
  virtual nsresult SetData(const nsAString & aData) = 0;


  virtual nsresult GetLength(uint32_t *aLength) = 0;


  virtual nsresult SubstringData(uint32_t offset, uint32_t count, nsAString & _retval) = 0;


  virtual nsresult AppendData(const nsAString & arg) = 0;


  virtual nsresult InsertData(uint32_t offset, const nsAString & arg) = 0;


  virtual nsresult DeleteData(uint32_t offset, uint32_t count) = 0;


  virtual nsresult ReplaceData(uint32_t offset, uint32_t count, const nsAString & arg) = 0;

};

  template<typename T> struct nsIDOMCharacterData::COMTypeInfo<nsIDOMCharacterData, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMCharacterData::COMTypeInfo<nsIDOMCharacterData, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x4109a2d2, 0xe7af, 0x445d, { 0xbb, 0x72, 0xc7, 0xc9, 0xb8, 0x75, 0xf3, 0x5e }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMText.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMText.h"
class nsIDOMText : public nsIDOMCharacterData {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult SplitText(uint32_t offset, nsIDOMText * *_retval) = 0;


  virtual nsresult GetWholeText(nsAString & aWholeText) = 0;

};

  template<typename T> struct nsIDOMText::COMTypeInfo<nsIDOMText, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMText::COMTypeInfo<nsIDOMText, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x67273994, 0x6aff, 0x4091, { 0x9d, 0xe9, 0xb7, 0x88, 0xa2, 0x49, 0xf7, 0x83 }};
# 18 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Attr.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStubMutationObserver.h" 1
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStubMutationObserver.h"
class nsStubMutationObserver : public nsIMutationObserver {
public:
  virtual void CharacterDataWillChange(nsIDocument* aDocument, nsIContent* aContent, CharacterDataChangeInfo* aInfo) override; virtual void CharacterDataChanged(nsIDocument* aDocument, nsIContent* aContent, CharacterDataChangeInfo* aInfo) override; virtual void AttributeWillChange(nsIDocument* aDocument, mozilla::dom::Element* aElement, int32_t aNameSpaceID, nsIAtom* aAttribute, int32_t aModType, const nsAttrValue* aNewValue) override; virtual void NativeAnonymousChildListChange(nsIDocument* aDocument, nsIContent* aContent, bool aIsRemove) override; virtual void AttributeChanged(nsIDocument* aDocument, mozilla::dom::Element* aElement, int32_t aNameSpaceID, nsIAtom* aAttribute, int32_t aModType, const nsAttrValue* aOldValue) override; virtual void ContentAppended(nsIDocument* aDocument, nsIContent* aContainer, nsIContent* aFirstNewContent, int32_t aNewIndexInContainer) override; virtual void ContentInserted(nsIDocument* aDocument, nsIContent* aContainer, nsIContent* aChild, int32_t aIndexInContainer) override; virtual void ContentRemoved(nsIDocument* aDocument, nsIContent* aContainer, nsIContent* aChild, int32_t aIndexInContainer, nsIContent* aPreviousSibling) override; virtual void NodeWillBeDestroyed(const nsINode* aNode) override; virtual void ParentChainChanged(nsIContent *aContent) override;
};
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Attr.h" 2

class nsIDocument;

namespace mozilla {
class EventChainPreVisitor;
namespace dom {



class Attr final : public nsIAttribute,
                   public nsIDOMAttr
{
  virtual ~Attr() {}

public:
  Attr(nsDOMAttributeMap* aAttrMap,
       already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
       const nsAString& aValue);

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:


  virtual nsresult GetNodeName(nsAString& aNodeName) final override { aNodeName = nsINode::NodeName(); return NS_OK; } virtual nsresult GetNodeValue(nsAString& aNodeValue) final override { nsINode::GetNodeValue(aNodeValue); return NS_OK; } virtual nsresult SetNodeValue(const nsAString& aNodeValue) final override { mozilla::ErrorResult rv; nsINode::SetNodeValue(aNodeValue, rv); return rv.StealNSResult(); } virtual nsresult GetNodeType(uint16_t* aNodeType) final override { *aNodeType = nsINode::NodeType(); return NS_OK; } virtual nsresult GetParentNode(nsIDOMNode** aParentNode) final override { return nsINode::GetParentNode(aParentNode); } virtual nsresult GetChildNodes(nsIDOMNodeList** aChildNodes) final override { return nsINode::GetChildNodes(aChildNodes); } virtual nsresult GetFirstChild(nsIDOMNode** aFirstChild) final override { return nsINode::GetFirstChild(aFirstChild); } virtual nsresult GetLastChild(nsIDOMNode** aLastChild) final override { return nsINode::GetLastChild(aLastChild); } virtual nsresult GetPreviousSibling(nsIDOMNode** aPreviousSibling) final override { return nsINode::GetPreviousSibling(aPreviousSibling); } virtual nsresult GetNextSibling(nsIDOMNode** aNextSibling) final override { return nsINode::GetNextSibling(aNextSibling); } virtual nsresult GetOwnerDocument(nsIDOMDocument** aOwnerDocument) final override { return nsINode::GetOwnerDocument(aOwnerDocument); } virtual nsresult RemoveChild(nsIDOMNode* aOldChild, nsIDOMNode** aResult) final override { return nsINode::RemoveChild(aOldChild, aResult); } virtual nsresult HasChildNodes(bool* aResult) final override { *aResult = nsINode::HasChildNodes(); return NS_OK; } virtual nsresult CloneNode(bool aDeep, uint8_t aArgc, nsIDOMNode** aResult) final override { if (aArgc == 0) { aDeep = true; } mozilla::ErrorResult rv; nsCOMPtr<nsINode> clone = nsINode::CloneNode(aDeep, rv); if (rv.Failed()) { return rv.StealNSResult(); } *aResult = clone.forget().take()->AsDOMNode(); return NS_OK; } virtual nsresult GetNamespaceURI(nsAString& aNamespaceURI) final override { nsINode::GetNamespaceURI(aNamespaceURI); return NS_OK; } virtual nsresult GetPrefix(nsAString& aPrefix) final override { nsINode::GetPrefix(aPrefix); return NS_OK; } virtual nsresult GetLocalName(nsAString& aLocalName) final override { aLocalName = nsINode::LocalName(); return NS_OK; } virtual nsresult GetTextContent(nsAString& aTextContent) final override { mozilla::ErrorResult rv; nsINode::GetTextContent(aTextContent, rv); return rv.StealNSResult(); } virtual nsresult SetTextContent(const nsAString& aTextContent) final override { mozilla::ErrorResult rv; nsINode::SetTextContent(aTextContent, rv); return rv.StealNSResult(); }
  virtual void GetTextContentInternal(nsAString& aTextContent,
                                      OOMReporter& aError) override;
  virtual void SetTextContentInternal(const nsAString& aTextContent,
                                      ErrorResult& aError) override;
  virtual void GetNodeValueInternal(nsAString& aNodeValue) override;
  virtual void SetNodeValueInternal(const nsAString& aNodeValue,
                                    ErrorResult& aError) override;


  virtual nsresult GetName(nsAString & aName) override; virtual nsresult GetSpecified(bool *aSpecified) override; virtual nsresult GetValue(nsAString & aValue) override; virtual nsresult SetValue(const nsAString & aValue) override; virtual nsresult GetOwnerElement(nsIDOMElement * *aOwnerElement) override; virtual nsresult GetIsId(bool *aIsId) override;

  virtual nsresult GetEventTargetParent(EventChainPreVisitor& aVisitor) override;


  void SetMap(nsDOMAttributeMap *aMap) override;
  Element* GetElement() const;
  nsresult SetOwnerDocument(nsIDocument* aDocument) override;


  virtual bool IsNodeOfType(uint32_t aFlags) const override;
  virtual uint32_t GetChildCount() const override;
  virtual nsIContent *GetChildAt(uint32_t aIndex) const override;
  virtual nsIContent * const * GetChildArray(uint32_t* aChildCount) const override;
  virtual int32_t IndexOf(const nsINode* aPossibleChild) const override;
  virtual nsresult InsertChildAt(nsIContent* aKid, uint32_t aIndex,
                                 bool aNotify) override;
  virtual void RemoveChildAt(uint32_t aIndex, bool aNotify) override;
  virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const override;
  virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const override;

  static void Initialize();
  static void Shutdown();

  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = true) : nsXPCOMCycleCollectionParticipant(true) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "Attr"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<Attr>(p)->DeleteCycleCollectable(); } static Attr* Downcast(nsISupports* s) { return static_cast<Attr*>(static_cast<nsIAttribute*>(s)); } static nsISupports* Upcast(Attr *p) { return static_cast<nsISupports*>(static_cast<nsIAttribute*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &Attr::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;


  virtual nsIDOMNode* AsDOMNode() override { return this; }


  virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;




  void SetValue(const nsAString& aValue, ErrorResult& aRv);

  bool Specified() const;





  Element* GetOwnerElement(ErrorResult& aRv);

protected:
  virtual Element* GetNameSpaceElement() override
  {
    return GetElement();
  }

  static bool sInitialized;

private:
  nsString mValue;
};

}
}
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMAttributeMap.h" 2


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMMozNamedAttrMap.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMMozNamedAttrMap.h"
class nsIDOMMozNamedAttrMap : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetNamedItem(const nsAString & name, nsIDOMAttr * *_retval) = 0;


  virtual nsresult SetNamedItem(nsIDOMAttr *arg, nsIDOMAttr * *_retval) = 0;


  virtual nsresult RemoveNamedItem(const nsAString & name, nsIDOMAttr * *_retval) = 0;


  virtual nsresult Item(uint32_t index, nsIDOMAttr * *_retval) = 0;


  virtual nsresult GetLength(uint32_t *aLength) = 0;


  virtual nsresult GetNamedItemNS(const nsAString & namespaceURI, const nsAString & localName, nsIDOMAttr * *_retval) = 0;


  virtual nsresult SetNamedItemNS(nsIDOMAttr *arg, nsIDOMAttr * *_retval) = 0;


  virtual nsresult RemoveNamedItemNS(const nsAString & namespaceURI, const nsAString & localName, nsIDOMAttr * *_retval) = 0;

};

  template<typename T> struct nsIDOMMozNamedAttrMap::COMTypeInfo<nsIDOMMozNamedAttrMap, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMMozNamedAttrMap::COMTypeInfo<nsIDOMMozNamedAttrMap, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xcb5564cd, 0x26ec, 0x418f, { 0xa6, 0xd6, 0x1d, 0x57, 0xcd, 0x2c, 0x97, 0x1c }};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMAttributeMap.h" 2




class nsIAtom;
class nsIDocument;




class nsAttrKey
{
public:



  int32_t mNamespaceID;





  void* mLocalName;

  nsAttrKey(int32_t aNs, nsIAtom* aName)
    : mNamespaceID(aNs), mLocalName(aName) {}

  nsAttrKey(const nsAttrKey& aAttr)
    : mNamespaceID(aAttr.mNamespaceID), mLocalName(aAttr.mLocalName) {}
};




class nsAttrHashKey : public PLDHashEntryHdr
{
public:
  typedef const nsAttrKey& KeyType;
  typedef const nsAttrKey* KeyTypePointer;

  explicit nsAttrHashKey(KeyTypePointer aKey) : mKey(*aKey) {}
  nsAttrHashKey(const nsAttrHashKey& aCopy) : mKey(aCopy.mKey) {}
  ~nsAttrHashKey() {}

  KeyType GetKey() const { return mKey; }
  bool KeyEquals(KeyTypePointer aKey) const
    {
      return mKey.mLocalName == aKey->mLocalName &&
             mKey.mNamespaceID == aKey->mNamespaceID;
    }

  static KeyTypePointer KeyToPointer(KeyType aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
    {
      if (!aKey)
        return 0;

      return mozilla::HashGeneric(aKey->mNamespaceID, aKey->mLocalName);
    }
  enum { ALLOW_MEMMOVE = true };

private:
  nsAttrKey mKey;
};


class nsDOMAttributeMap final : public nsIDOMMozNamedAttrMap
                              , public nsWrapperCache
{
public:
  typedef mozilla::dom::Attr Attr;
  typedef mozilla::dom::Element Element;
  typedef mozilla::ErrorResult ErrorResult;

  explicit nsDOMAttributeMap(Element *aContent);

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = true) : nsXPCOMCycleCollectionParticipant(true) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "nsDOMAttributeMap"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<nsDOMAttributeMap>(p)->DeleteCycleCollectable(); } static nsDOMAttributeMap* Downcast(nsISupports* s) { return static_cast<nsDOMAttributeMap*>(static_cast<nsDOMAttributeMap*>(s)); } static nsISupports* Upcast(nsDOMAttributeMap *p) { return static_cast<nsISupports*>(static_cast<nsDOMAttributeMap*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &nsDOMAttributeMap::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;


  virtual nsresult GetNamedItem(const nsAString & name, nsIDOMAttr * *_retval) override; virtual nsresult SetNamedItem(nsIDOMAttr *arg, nsIDOMAttr * *_retval) override; virtual nsresult RemoveNamedItem(const nsAString & name, nsIDOMAttr * *_retval) override; virtual nsresult Item(uint32_t index, nsIDOMAttr * *_retval) override; virtual nsresult GetLength(uint32_t *aLength) override; virtual nsresult GetNamedItemNS(const nsAString & namespaceURI, const nsAString & localName, nsIDOMAttr * *_retval) override; virtual nsresult SetNamedItemNS(nsIDOMAttr *arg, nsIDOMAttr * *_retval) override; virtual nsresult RemoveNamedItemNS(const nsAString & namespaceURI, const nsAString & localName, nsIDOMAttr * *_retval) override;

  void DropReference();

  Element* GetContent()
  {
    return mContent;
  }





  nsresult SetOwnerDocument(nsIDocument* aDocument);





  void DropAttribute(int32_t aNamespaceID, nsIAtom* aLocalName);
# 127 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMAttributeMap.h"
  uint32_t Count() const;

  typedef nsRefPtrHashtable<nsAttrHashKey, Attr> AttrCache;

  static void BlastSubtreeToPieces(nsINode *aNode);

  Element* GetParentObject() const
  {
    return mContent;
  }
  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;


  Attr* GetNamedItem(const nsAString& aAttrName);
  Attr* NamedGetter(const nsAString& aAttrName, bool& aFound);
  already_AddRefed<Attr>
  RemoveNamedItem(mozilla::dom::NodeInfo* aNodeInfo, ErrorResult& aError);
  already_AddRefed<Attr>
  RemoveNamedItem(const nsAString& aName, ErrorResult& aError);

  Attr* Item(uint32_t aIndex);
  Attr* IndexedGetter(uint32_t aIndex, bool& aFound);
  uint32_t Length() const;

  Attr*
  GetNamedItemNS(const nsAString& aNamespaceURI,
                 const nsAString& aLocalName);
  already_AddRefed<Attr>
  SetNamedItemNS(Attr& aNode, ErrorResult& aError);
  already_AddRefed<Attr>
  RemoveNamedItemNS(const nsAString& aNamespaceURI, const nsAString& aLocalName,
                    ErrorResult& aError);

  void
  GetSupportedNames(nsTArray<nsString>& aNames);

  size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

protected:
  virtual ~nsDOMAttributeMap();

private:
  nsCOMPtr<Element> mContent;




  AttrCache mAttributeCache;

  already_AddRefed<mozilla::dom::NodeInfo>
  GetAttrNodeInfo(const nsAString& aNamespaceURI,
                  const nsAString& aLocalName);

  Attr* GetAttribute(mozilla::dom::NodeInfo* aNodeInfo);
};





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 1
# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsDOMAttributeMap.h" 2
# 28 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/DisplayItemClip.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/DisplayItemClip.h"
class gfxContext;
class nsPresContext;
class nsRegion;

namespace mozilla {
namespace gfx {
class DrawTarget;
class Path;
}
}

namespace mozilla {







class DisplayItemClip {
  typedef mozilla::gfx::Color Color;
  typedef mozilla::gfx::DrawTarget DrawTarget;
  typedef mozilla::gfx::Path Path;

public:
  struct RoundedRect {
    nsRect mRect;

    nscoord mRadii[8];

    RoundedRect operator+(const nsPoint& aOffset) const {
      RoundedRect r = *this;
      r.mRect += aOffset;
      return r;
    }
    bool operator==(const RoundedRect& aOther) const {
      if (!mRect.IsEqualInterior(aOther.mRect)) {
        return false;
      }

      int32_t corner54 = mozilla::eCornerTopLeftX; for (mozilla::HalfCorner corner; corner54 <= mozilla::eCornerBottomLeftY && (corner = mozilla::HalfCorner(corner54), true); ++corner54) {
        if (mRadii[corner] != aOther.mRadii[corner]) {
          return false;
        }
      }
      return true;
    }
    bool operator!=(const RoundedRect& aOther) const {
      return !(*this == aOther);
    }
  };


  DisplayItemClip() : mHaveClipRect(false) {}

  void SetTo(const nsRect& aRect);
  void SetTo(const nsRect& aRect, const nscoord* aRadii);
  void SetTo(const nsRect& aRect, const nsRect& aRoundedRect, const nscoord* aRadii);
  void IntersectWith(const DisplayItemClip& aOther);




  void ApplyTo(gfxContext* aContext, nsPresContext* aPresContext,
               uint32_t aBegin = 0, uint32_t aEnd = (4294967295U));

  void ApplyRectTo(gfxContext* aContext, int32_t A2D) const;



  void ApplyRoundedRectClipsTo(gfxContext* aContext, int32_t A2DPRInt32,
                               uint32_t aBegin, uint32_t aEnd) const;


  void FillIntersectionOfRoundedRectClips(gfxContext* aContext,
                                          const Color& aColor,
                                          int32_t aAppUnitsPerDevPixel,
                                          uint32_t aBegin,
                                          uint32_t aEnd) const;

  already_AddRefed<Path> MakeRoundedRectPath(DrawTarget& aDrawTarget,
                                                  int32_t A2D,
                                                  const RoundedRect &aRoundRect) const;






  bool MayIntersect(const nsRect& aRect) const;




  nsRect ApproximateIntersectInward(const nsRect& aRect) const;
# 117 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/DisplayItemClip.h"
  bool ComputeRegionInClips(DisplayItemClip* aOldClip,
                            const nsPoint& aShift,
                            nsRegion* aCombined) const;





  bool IsRectClippedByRoundedCorner(const nsRect& aRect) const;



  bool IsRectAffectedByClip(const nsRect& aRect) const;
  bool IsRectAffectedByClip(const nsIntRect& aRect, float aXScale, float aYScale, int32_t A2D) const;


  nsRect NonRoundedIntersection() const;



  nsRect ApplyNonRoundedIntersection(const nsRect& aRect) const;


  void RemoveRoundedCorners();



  void AddOffsetAndComputeDifference(uint32_t aStart, const nsPoint& aPoint, const nsRect& aBounds,
                                     const DisplayItemClip& aOther, uint32_t aOtherStart, const nsRect& aOtherBounds,
                                     nsRegion* aDifference);

  bool operator==(const DisplayItemClip& aOther) const {
    return mHaveClipRect == aOther.mHaveClipRect &&
           (!mHaveClipRect || mClipRect.IsEqualInterior(aOther.mClipRect)) &&
           mRoundedClipRects == aOther.mRoundedClipRects;
  }
  bool operator!=(const DisplayItemClip& aOther) const {
    return !(*this == aOther);
  }

  bool HasClip() const { return mHaveClipRect; }
  const nsRect& GetClipRect() const
  {
    do { } while(0);
    return mClipRect;
  }

  void MoveBy(nsPoint aPoint);

  nsCString ToString() const;





  uint32_t GetCommonRoundedRectCount(const DisplayItemClip& aOther,
                                     uint32_t aMax) const;
  uint32_t GetRoundedRectCount() const { return mRoundedClipRects.Length(); }
  void AppendRoundedRects(nsTArray<RoundedRect>* aArray, uint32_t aCount) const;

  static const DisplayItemClip& NoClip();

  static void Shutdown();

private:
  nsRect mClipRect;
  nsTArray<RoundedRect> mRoundedClipRects;


  bool mHaveClipRect;
};

}
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollbarMediator.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollbarMediator.h"
class nsScrollbarFrame;
class nsIFrame;

class nsIScrollbarMediator : public nsQueryFrame
{
public:
  static const nsQueryFrame::FrameIID kFrameIID = nsQueryFrame::nsIScrollbarMediator_id; typedef nsIScrollbarMediator Has_NS_DECL_QUERYFRAME_TARGET;
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollbarMediator.h"
  enum ScrollSnapMode { DISABLE_SNAP, ENABLE_SNAP };






  virtual void ScrollByPage(nsScrollbarFrame* aScrollbar, int32_t aDirection,
                            ScrollSnapMode aSnap = DISABLE_SNAP) = 0;
  virtual void ScrollByWhole(nsScrollbarFrame* aScrollbar, int32_t aDirection,
                            ScrollSnapMode aSnap = DISABLE_SNAP) = 0;
  virtual void ScrollByLine(nsScrollbarFrame* aScrollbar, int32_t aDirection,
                            ScrollSnapMode aSnap = DISABLE_SNAP) = 0;






  virtual void RepeatButtonScroll(nsScrollbarFrame* aScrollbar) = 0;







  virtual void ThumbMoved(nsScrollbarFrame* aScrollbar,
                          nscoord aOldPos,
                          nscoord aNewPos) = 0;




  virtual void ScrollbarReleased(nsScrollbarFrame* aScrollbar) = 0;
  virtual void VisibilityChanged(bool aVisible) = 0;





  virtual nsIFrame* GetScrollbarBox(bool aVertical) = 0;




  virtual void ScrollbarActivityStarted() const = 0;
  virtual void ScrollbarActivityStopped() const = 0;

  virtual bool IsScrollbarOnRight() const = 0;





  virtual bool ShouldSuppressScrollbarRepaints() const = 0;
};
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h"
# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 1 3
# 37 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3




namespace std __attribute__ ((__visibility__ ("default")))
{

namespace __cxx11 {
# 64 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
    {
      struct __xfer_bufptrs;
    public:

      typedef _CharT char_type;
      typedef _Traits traits_type;


      typedef _Alloc allocator_type;
      typedef typename traits_type::int_type int_type;
      typedef typename traits_type::pos_type pos_type;
      typedef typename traits_type::off_type off_type;

      typedef basic_streambuf<char_type, traits_type> __streambuf_type;
      typedef basic_string<char_type, _Traits, _Alloc> __string_type;
      typedef typename __string_type::size_type __size_type;

    protected:

      ios_base::openmode _M_mode;


      __string_type _M_string;

    public:
# 99 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
      : __streambuf_type(), _M_mode(__mode), _M_string()
      { }
# 112 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_stringbuf(const __string_type& __str,
        ios_base::openmode __mode = ios_base::in | ios_base::out)
      : __streambuf_type(), _M_mode(), _M_string(__str.data(), __str.size())
      { _M_stringbuf_init(__mode); }


      basic_stringbuf(const basic_stringbuf&) = delete;

      basic_stringbuf(basic_stringbuf&& __rhs)
      : basic_stringbuf(std::move(__rhs), __xfer_bufptrs(__rhs, this))
      { __rhs._M_sync(const_cast<char_type*>(__rhs._M_string.data()), 0, 0); }



      basic_stringbuf&
      operator=(const basic_stringbuf&) = delete;

      basic_stringbuf&
      operator=(basic_stringbuf&& __rhs)
      {
 __xfer_bufptrs __st{__rhs, this};
 const __streambuf_type& __base = __rhs;
 __streambuf_type::operator=(__base);
 this->pubimbue(__rhs.getloc());
 _M_mode = __rhs._M_mode;
 _M_string = std::move(__rhs._M_string);
 __rhs._M_sync(const_cast<char_type*>(__rhs._M_string.data()), 0, 0);
 return *this;
      }

      void
      swap(basic_stringbuf& __rhs)
      {
 __xfer_bufptrs __l_st{*this, std::__addressof(__rhs)};
 __xfer_bufptrs __r_st{__rhs, this};
 __streambuf_type& __base = __rhs;
 __streambuf_type::swap(__base);
 __rhs.pubimbue(this->pubimbue(__rhs.getloc()));
 std::swap(_M_mode, __rhs._M_mode);
 std::swap(_M_string, __rhs._M_string);
      }
# 165 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      __string_type
      str() const
      {
 __string_type __ret;
 if (this->pptr())
   {

     if (this->pptr() > this->egptr())
       __ret = __string_type(this->pbase(), this->pptr());
     else
        __ret = __string_type(this->pbase(), this->egptr());
   }
 else
   __ret = _M_string;
 return __ret;
      }
# 189 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      void
      str(const __string_type& __s)
      {


 _M_string.assign(__s.data(), __s.size());
 _M_stringbuf_init(_M_mode);
      }

    protected:

      void
      _M_stringbuf_init(ios_base::openmode __mode)
      {
 _M_mode = __mode;
 __size_type __len = 0;
 if (_M_mode & (ios_base::ate | ios_base::app))
   __len = _M_string.size();
 _M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
      }

      virtual streamsize
      showmanyc()
      {
 streamsize __ret = -1;
 if (_M_mode & ios_base::in)
   {
     _M_update_egptr();
     __ret = this->egptr() - this->gptr();
   }
 return __ret;
      }

      virtual int_type
      underflow();

      virtual int_type
      pbackfail(int_type __c = traits_type::eof());

      virtual int_type
      overflow(int_type __c = traits_type::eof());
# 242 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      virtual __streambuf_type*
      setbuf(char_type* __s, streamsize __n)
      {
 if (__s && __n >= 0)
   {






     _M_string.clear();


     _M_sync(__s, __n, 0);
   }
 return this;
      }

      virtual pos_type
      seekoff(off_type __off, ios_base::seekdir __way,
       ios_base::openmode __mode = ios_base::in | ios_base::out);

      virtual pos_type
      seekpos(pos_type __sp,
       ios_base::openmode __mode = ios_base::in | ios_base::out);




      void
      _M_sync(char_type* __base, __size_type __i, __size_type __o);



      void
      _M_update_egptr()
      {
 const bool __testin = _M_mode & ios_base::in;
 if (this->pptr() && this->pptr() > this->egptr())
   {
     if (__testin)
       this->setg(this->eback(), this->gptr(), this->pptr());
     else
       this->setg(this->pptr(), this->pptr(), this->pptr());
   }
      }



      void
      _M_pbump(char_type* __pbeg, char_type* __pend, off_type __off);

    private:




      struct __xfer_bufptrs
      {
 __xfer_bufptrs(const basic_stringbuf& __from, basic_stringbuf* __to)
 : _M_to{__to}, _M_goff{-1, -1, -1}, _M_poff{-1, -1, -1}
 {
   const _CharT* __str = __from._M_string.data();
   if (__from.eback())
     {
     _M_goff[0] = __from.eback() - __str;
     _M_goff[1] = __from.gptr() - __str;
     _M_goff[2] = __from.egptr() - __str;
     }
   if (__from.pbase())
     {
       _M_poff[0] = __from.pbase() - __str;
       _M_poff[1] = __from.pptr() - __from.pbase();
       _M_poff[2] = __from.epptr() - __str;
     }
 }

 ~__xfer_bufptrs()
 {
   char_type* __str = const_cast<char_type*>(_M_to->_M_string.data());
   if (_M_goff[0] != -1)
     _M_to->setg(__str+_M_goff[0], __str+_M_goff[1], __str+_M_goff[2]);
   if (_M_poff[0] != -1)
     _M_to->_M_pbump(__str+_M_poff[0], __str+_M_poff[2], _M_poff[1]);
 }

 basic_stringbuf* _M_to;
 off_type _M_goff[3];
 off_type _M_poff[3];
      };
# 343 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      basic_stringbuf(basic_stringbuf&& __rhs, __xfer_bufptrs&&)
      : __streambuf_type(static_cast<const __streambuf_type&>(__rhs)),
      _M_mode(__rhs._M_mode), _M_string(std::move(__rhs._M_string))
      { }

    };
# 366 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
  template<typename _CharT, typename _Traits, typename _Alloc>
    class basic_istringstream : public basic_istream<_CharT, _Traits>
    {
    public:

      typedef _CharT char_type;
      typedef _Traits traits_type;


      typedef _Alloc allocator_type;
      typedef typename traits_type::int_type int_type;
      typedef typename traits_type::pos_type pos_type;
      typedef typename traits_type::off_type off_type;


      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
      typedef basic_istream<char_type, traits_type> __istream_type;

    private:
      __stringbuf_type _M_stringbuf;

    public:
# 402 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_istringstream(ios_base::openmode __mode = ios_base::in)
      : __istream_type(), _M_stringbuf(__mode | ios_base::in)
      { this->init(&_M_stringbuf); }
# 420 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_istringstream(const __string_type& __str,
     ios_base::openmode __mode = ios_base::in)
      : __istream_type(), _M_stringbuf(__str, __mode | ios_base::in)
      { this->init(&_M_stringbuf); }







      ~basic_istringstream()
      { }


      basic_istringstream(const basic_istringstream&) = delete;

      basic_istringstream(basic_istringstream&& __rhs)
      : __istream_type(std::move(__rhs)),
      _M_stringbuf(std::move(__rhs._M_stringbuf))
      { __istream_type::set_rdbuf(&_M_stringbuf); }



      basic_istringstream&
      operator=(const basic_istringstream&) = delete;

      basic_istringstream&
      operator=(basic_istringstream&& __rhs)
      {
 __istream_type::operator=(std::move(__rhs));
 _M_stringbuf = std::move(__rhs._M_stringbuf);
 return *this;
      }

      void
      swap(basic_istringstream& __rhs)
      {
 __istream_type::swap(__rhs);
 _M_stringbuf.swap(__rhs._M_stringbuf);
      }
# 471 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      __stringbuf_type*
      rdbuf() const
      { return const_cast<__stringbuf_type*>(&_M_stringbuf); }





      __string_type
      str() const
      { return _M_stringbuf.str(); }







      void
      str(const __string_type& __s)
      { _M_stringbuf.str(__s); }
    };
# 510 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
  template <typename _CharT, typename _Traits, typename _Alloc>
    class basic_ostringstream : public basic_ostream<_CharT, _Traits>
    {
    public:

      typedef _CharT char_type;
      typedef _Traits traits_type;


      typedef _Alloc allocator_type;
      typedef typename traits_type::int_type int_type;
      typedef typename traits_type::pos_type pos_type;
      typedef typename traits_type::off_type off_type;


      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
      typedef basic_ostream<char_type, traits_type> __ostream_type;

    private:
      __stringbuf_type _M_stringbuf;

    public:
# 546 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_ostringstream(ios_base::openmode __mode = ios_base::out)
      : __ostream_type(), _M_stringbuf(__mode | ios_base::out)
      { this->init(&_M_stringbuf); }
# 564 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_ostringstream(const __string_type& __str,
     ios_base::openmode __mode = ios_base::out)
      : __ostream_type(), _M_stringbuf(__str, __mode | ios_base::out)
      { this->init(&_M_stringbuf); }







      ~basic_ostringstream()
      { }


      basic_ostringstream(const basic_ostringstream&) = delete;

      basic_ostringstream(basic_ostringstream&& __rhs)
      : __ostream_type(std::move(__rhs)),
      _M_stringbuf(std::move(__rhs._M_stringbuf))
      { __ostream_type::set_rdbuf(&_M_stringbuf); }



      basic_ostringstream&
      operator=(const basic_ostringstream&) = delete;

      basic_ostringstream&
      operator=(basic_ostringstream&& __rhs)
      {
 __ostream_type::operator=(std::move(__rhs));
 _M_stringbuf = std::move(__rhs._M_stringbuf);
 return *this;
      }

      void
      swap(basic_ostringstream& __rhs)
      {
 __ostream_type::swap(__rhs);
 _M_stringbuf.swap(__rhs._M_stringbuf);
      }
# 615 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      __stringbuf_type*
      rdbuf() const
      { return const_cast<__stringbuf_type*>(&_M_stringbuf); }





      __string_type
      str() const
      { return _M_stringbuf.str(); }







      void
      str(const __string_type& __s)
      { _M_stringbuf.str(__s); }
    };
# 654 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
  template <typename _CharT, typename _Traits, typename _Alloc>
    class basic_stringstream : public basic_iostream<_CharT, _Traits>
    {
    public:

      typedef _CharT char_type;
      typedef _Traits traits_type;


      typedef _Alloc allocator_type;
      typedef typename traits_type::int_type int_type;
      typedef typename traits_type::pos_type pos_type;
      typedef typename traits_type::off_type off_type;


      typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
      typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
      typedef basic_iostream<char_type, traits_type> __iostream_type;

    private:
      __stringbuf_type _M_stringbuf;

    public:
# 689 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
      : __iostream_type(), _M_stringbuf(__m)
      { this->init(&_M_stringbuf); }
# 705 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      explicit
      basic_stringstream(const __string_type& __str,
    ios_base::openmode __m = ios_base::out | ios_base::in)
      : __iostream_type(), _M_stringbuf(__str, __m)
      { this->init(&_M_stringbuf); }







      ~basic_stringstream()
      { }


      basic_stringstream(const basic_stringstream&) = delete;

      basic_stringstream(basic_stringstream&& __rhs)
      : __iostream_type(std::move(__rhs)),
      _M_stringbuf(std::move(__rhs._M_stringbuf))
      { __iostream_type::set_rdbuf(&_M_stringbuf); }



      basic_stringstream&
      operator=(const basic_stringstream&) = delete;

      basic_stringstream&
      operator=(basic_stringstream&& __rhs)
      {
 __iostream_type::operator=(std::move(__rhs));
 _M_stringbuf = std::move(__rhs._M_stringbuf);
 return *this;
      }

      void
      swap(basic_stringstream& __rhs)
      {
 __iostream_type::swap(__rhs);
 _M_stringbuf.swap(__rhs._M_stringbuf);
      }
# 756 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 3
      __stringbuf_type*
      rdbuf() const
      { return const_cast<__stringbuf_type*>(&_M_stringbuf); }





      __string_type
      str() const
      { return _M_stringbuf.str(); }







      void
      str(const __string_type& __s)
      { _M_stringbuf.str(__s); }
    };



  template <class _CharT, class _Traits, class _Allocator>
    inline void
    swap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x,
  basic_stringbuf<_CharT, _Traits, _Allocator>& __y)
    { __x.swap(__y); }


  template <class _CharT, class _Traits, class _Allocator>
    inline void
    swap(basic_istringstream<_CharT, _Traits, _Allocator>& __x,
  basic_istringstream<_CharT, _Traits, _Allocator>& __y)
    { __x.swap(__y); }


  template <class _CharT, class _Traits, class _Allocator>
    inline void
    swap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x,
  basic_ostringstream<_CharT, _Traits, _Allocator>& __y)
    { __x.swap(__y); }


  template <class _CharT, class _Traits, class _Allocator>
    inline void
    swap(basic_stringstream<_CharT, _Traits, _Allocator>& __x,
  basic_stringstream<_CharT, _Traits, _Allocator>& __y)
    { __x.swap(__y); }


}

}


# 1 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/sstream.tcc" 1 3
# 38 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/sstream.tcc" 3

namespace std __attribute__ ((__visibility__ ("default")))
{


  template <class _CharT, class _Traits, class _Alloc>
    typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
    basic_stringbuf<_CharT, _Traits, _Alloc>::
    pbackfail(int_type __c)
    {
      int_type __ret = traits_type::eof();
      if (this->eback() < this->gptr())
 {


   const bool __testeof = traits_type::eq_int_type(__c, __ret);
   if (!__testeof)
     {
       const bool __testeq = traits_type::eq(traits_type::
          to_char_type(__c),
          this->gptr()[-1]);
       const bool __testout = this->_M_mode & ios_base::out;
       if (__testeq || __testout)
  {
    this->gbump(-1);
    if (!__testeq)
      *this->gptr() = traits_type::to_char_type(__c);
    __ret = __c;
  }
     }
   else
     {
       this->gbump(-1);
       __ret = traits_type::not_eof(__c);
     }
 }
      return __ret;
    }

  template <class _CharT, class _Traits, class _Alloc>
    typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
    basic_stringbuf<_CharT, _Traits, _Alloc>::
    overflow(int_type __c)
    {
      const bool __testout = this->_M_mode & ios_base::out;
      if (__builtin_expect(!__testout, false))
 return traits_type::eof();

      const bool __testeof = traits_type::eq_int_type(__c, traits_type::eof());
      if (__builtin_expect(__testeof, false))
 return traits_type::not_eof(__c);

      const __size_type __capacity = _M_string.capacity();
      const __size_type __max_size = _M_string.max_size();
      const bool __testput = this->pptr() < this->epptr();
      if (__builtin_expect(!__testput && __capacity == __max_size, false))
 return traits_type::eof();



      const char_type __conv = traits_type::to_char_type(__c);
      if (!__testput)
 {
# 110 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/sstream.tcc" 3
   const __size_type __opt_len = std::max(__size_type(2 * __capacity),
       __size_type(512));
   const __size_type __len = std::min(__opt_len, __max_size);
   __string_type __tmp;
   __tmp.reserve(__len);
   if (this->pbase())
     __tmp.assign(this->pbase(), this->epptr() - this->pbase());
   __tmp.push_back(__conv);
   _M_string.swap(__tmp);
   _M_sync(const_cast<char_type*>(_M_string.data()),
    this->gptr() - this->eback(), this->pptr() - this->pbase());
 }
      else
 *this->pptr() = __conv;
      this->pbump(1);
      return __c;
    }

  template <class _CharT, class _Traits, class _Alloc>
    typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
    basic_stringbuf<_CharT, _Traits, _Alloc>::
    underflow()
    {
      int_type __ret = traits_type::eof();
      const bool __testin = this->_M_mode & ios_base::in;
      if (__testin)
 {

   _M_update_egptr();

   if (this->gptr() < this->egptr())
     __ret = traits_type::to_int_type(*this->gptr());
 }
      return __ret;
    }

  template <class _CharT, class _Traits, class _Alloc>
    typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
    basic_stringbuf<_CharT, _Traits, _Alloc>::
    seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
    {
      pos_type __ret = pos_type(off_type(-1));
      bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
      bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
      const bool __testboth = __testin && __testout && __way != ios_base::cur;
      __testin &= !(__mode & ios_base::out);
      __testout &= !(__mode & ios_base::in);



      const char_type* __beg = __testin ? this->eback() : this->pbase();
      if ((__beg || !__off) && (__testin || __testout || __testboth))
 {
   _M_update_egptr();

   off_type __newoffi = __off;
   off_type __newoffo = __newoffi;
   if (__way == ios_base::cur)
     {
       __newoffi += this->gptr() - __beg;
       __newoffo += this->pptr() - __beg;
     }
   else if (__way == ios_base::end)
     __newoffo = __newoffi += this->egptr() - __beg;

   if ((__testin || __testboth)
       && __newoffi >= 0
       && this->egptr() - __beg >= __newoffi)
     {
       this->setg(this->eback(), this->eback() + __newoffi,
    this->egptr());
       __ret = pos_type(__newoffi);
     }
   if ((__testout || __testboth)
       && __newoffo >= 0
       && this->egptr() - __beg >= __newoffo)
     {
       _M_pbump(this->pbase(), this->epptr(), __newoffo);
       __ret = pos_type(__newoffo);
     }
 }
      return __ret;
    }

  template <class _CharT, class _Traits, class _Alloc>
    typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
    basic_stringbuf<_CharT, _Traits, _Alloc>::
    seekpos(pos_type __sp, ios_base::openmode __mode)
    {
      pos_type __ret = pos_type(off_type(-1));
      const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
      const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;

      const char_type* __beg = __testin ? this->eback() : this->pbase();
      if ((__beg || !off_type(__sp)) && (__testin || __testout))
 {
   _M_update_egptr();

   const off_type __pos(__sp);
   const bool __testpos = (0 <= __pos
      && __pos <= this->egptr() - __beg);
   if (__testpos)
     {
       if (__testin)
  this->setg(this->eback(), this->eback() + __pos,
      this->egptr());
       if (__testout)
  _M_pbump(this->pbase(), this->epptr(), __pos);
       __ret = __sp;
     }
 }
      return __ret;
    }

  template <class _CharT, class _Traits, class _Alloc>
    void
    basic_stringbuf<_CharT, _Traits, _Alloc>::
    _M_sync(char_type* __base, __size_type __i, __size_type __o)
    {
      const bool __testin = _M_mode & ios_base::in;
      const bool __testout = _M_mode & ios_base::out;
      char_type* __endg = __base + _M_string.size();
      char_type* __endp = __base + _M_string.capacity();

      if (__base != _M_string.data())
 {

   __endg += __i;
   __i = 0;
   __endp = __endg;
 }

      if (__testin)
 this->setg(__base, __base + __i, __endg);
      if (__testout)
 {
   _M_pbump(__base, __endp, __o);



   if (!__testin)
     this->setg(__endg, __endg, __endg);
 }
    }

  template <class _CharT, class _Traits, class _Alloc>
    void
    basic_stringbuf<_CharT, _Traits, _Alloc>::
    _M_pbump(char_type* __pbeg, char_type* __pend, off_type __off)
    {
      this->setp(__pbeg, __pend);
      while (__off > __gnu_cxx::__numeric_traits<int>::__max)
 {
   this->pbump(__gnu_cxx::__numeric_traits<int>::__max);
   __off -= __gnu_cxx::__numeric_traits<int>::__max;
 }
      this->pbump(__off);
    }




  extern template class basic_stringbuf<char>;
  extern template class basic_istringstream<char>;
  extern template class basic_ostringstream<char>;
  extern template class basic_stringstream<char>;


  extern template class basic_stringbuf<wchar_t>;
  extern template class basic_istringstream<wchar_t>;
  extern template class basic_ostringstream<wchar_t>;
  extern template class basic_stringstream<wchar_t>;




}
# 814 "/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/sstream" 2 3
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h" 2
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/LoggingConstants.h" 1








namespace mozilla {
namespace gfx {




const int LOG_CRITICAL = 1;
const int LOG_WARNING = 2;
const int LOG_DEBUG = 3;
const int LOG_DEBUG_PRLOG = 4;
const int LOG_EVERYTHING = 5;




const int LOG_DEFAULT = LOG_CRITICAL;


}
}
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h" 2


extern mozilla::LogModule* GetGFX2DLog();


namespace mozilla {
namespace gfx {


inline mozilla::LogLevel PRLogLevelForLevel(int aLevel) {
  switch (aLevel) {
  case LOG_CRITICAL:
    return LogLevel::Error;
  case LOG_WARNING:
    return LogLevel::Warning;
  case LOG_DEBUG:
    return LogLevel::Debug;
  case LOG_DEBUG_PRLOG:
    return LogLevel::Debug;
  case LOG_EVERYTHING:
    return LogLevel::Error;
  }
  return LogLevel::Debug;
}


class LoggingPrefs
{
public:





  static int32_t sGfxLogLevel;
};
# 92 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h"
enum class LogReason : int {
  MustBeMoreThanThis = -1,


  D3D11InvalidCallDeviceRemoved = 0,
  D3D11InvalidCall,
  D3DLockTimeout,
  D3D10FinalizeFrame,
  D3D11FinalizeFrame,
  D3D10SyncLock,
  D3D11SyncLock,
  D2D1NoWriteMap,
  JobStatusError,
  FilterInputError,
  FilterInputData,
  FilterInputRect,
  FilterInputSet,
  FilterInputFormat,
  FilterNodeD2D1Target,
  FilterNodeD2D1Backend,
  SourceSurfaceIncompatible,
  GlyphAllocFailedCairo,
  GlyphAllocFailedCG,
  InvalidRect,
  CannotDraw3D,
  IncompatibleBasicTexturedEffect,
  InvalidFont,
  PAllocTextureBackendMismatch,
  GetFontFileDataFailed,
  MessageChannelCloseFailure,
  MessageChannelInvalidHandle,
  TextureAliveAfterShutdown,
  InvalidContext,
  InvalidCommandList,
  AsyncTransactionTimeout,
  TextureCreation,
  InvalidCacheSurface,
  AlphaWithBasicClient,
  UnbalancedClipStack,
  ProcessingError,
  InvalidDrawTarget,
  NativeFontResourceNotFound,

  MustBeLessThanThis = 101,
};

struct BasicLogger
{



  static bool ShouldOutputMessage(int aLevel) {
    if (LoggingPrefs::sGfxLogLevel >= aLevel) {




      if (mozilla::detail::log_test(GetGFX2DLog(), PRLogLevelForLevel(aLevel))) {
        return true;
      } else

      if ((LoggingPrefs::sGfxLogLevel >= LOG_DEBUG_PRLOG) ||
                 (aLevel < LOG_DEBUG)) {
        return true;
      }

    }
    return false;
  }


  static void CrashAction(LogReason aReason) {}

  static void OutputMessage(const std::string &aString,
                            int aLevel,
                            bool aNoNewline) {
# 177 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h"
    if (LoggingPrefs::sGfxLogLevel >= aLevel) {




      if (mozilla::detail::log_test(GetGFX2DLog(), PRLogLevelForLevel(aLevel))) {
        do { if (mozilla::detail::log_test(GetGFX2DLog(), PRLogLevelForLevel(aLevel))) { mozilla::detail::log_print(GetGFX2DLog(), PRLogLevelForLevel(aLevel), "%s%s", aString.c_str(), aNoNewline ? "" : "\n"); } } while (0);
      } else

      if ((LoggingPrefs::sGfxLogLevel >= LOG_DEBUG_PRLOG) ||
                 (aLevel < LOG_DEBUG)) {
        printf("%s%s", aString.c_str(), aNoNewline ? "" : "\n");
      }

    }
  }
};

struct CriticalLogger {
  static void OutputMessage(const std::string &aString, int aLevel, bool aNoNewline);
  static void CrashAction(LogReason aReason);
};





typedef mozilla::Tuple<int32_t,std::string,double> LoggingRecordEntry;



typedef std::vector<LoggingRecordEntry> LoggingRecord;
class LogForwarder {
public:
  virtual ~LogForwarder() {}
  virtual void Log(const std::string &aString) = 0;
  virtual void CrashAction(LogReason aReason) = 0;
  virtual bool UpdateStringsVector(const std::string& aString) = 0;


  virtual LoggingRecord LoggingRecordCopy() = 0;
};

class NoLog
{
public:
  NoLog() {}
  ~NoLog() {}


               NoLog(const NoLog&) {}

  template<typename T>
  NoLog &operator <<(const T &aLogText) { return *this; }
};

enum class LogOptions : int {
  NoNewline = 0x01,
  AutoPrefix = 0x02,
  AssertOnCall = 0x04,
  CrashAction = 0x08,
};

template<typename T>
struct Hexa {
  explicit Hexa(T aVal) : mVal(aVal) {}
  T mVal;
};
template<typename T>
Hexa<T> hexa(T val) { return Hexa<T>(val); }

template<int L, typename Logger = BasicLogger>
class Log
{
public:


  static int DefaultOptions(bool aWithAssert = true) {
    return (int(LogOptions::AutoPrefix) |
            (aWithAssert ? int(LogOptions::AssertOnCall) : 0));
  }





  explicit Log(int aOptions = Log::DefaultOptions(L == LOG_CRITICAL),
               LogReason aReason = LogReason::MustBeMoreThanThis)
  : mOptions(0)
  , mLogIt(false)
  {
    Init(aOptions, BasicLogger::ShouldOutputMessage(L), aReason);
  }

  ~Log() {
    Flush();
  }

  void Flush() {
    if ((__builtin_expect(!!(!LogIt()), 1))) return;

    std::string str = mMessage.str();
    if (!str.empty()) {
      WriteLog(str);
    }
    mMessage.str("");
  }

  Log &operator <<(char aChar) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aChar;
    }
    return *this;
  }
  Log &operator <<(const std::string &aLogText) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aLogText;
    }
    return *this;
  }
  Log &operator <<(const char aStr[]) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << static_cast<const char*>(aStr);
    }
    return *this;
  }
  Log &operator <<(bool aBool) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << (aBool ? "true" : "false");
    }
    return *this;
  }
  Log &operator <<(int aInt) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aInt;
    }
    return *this;
  }
  Log &operator <<(unsigned int aInt) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aInt;
    }
    return *this;
  }
  Log &operator <<(long aLong) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aLong;
    }
    return *this;
  }
  Log &operator <<(unsigned long aLong) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aLong;
    }
    return *this;
  }
  Log &operator <<(long long aLong) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aLong;
    }
    return *this;
  }
  Log &operator <<(unsigned long long aLong) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aLong;
    }
    return *this;
  }
  Log &operator <<(Float aFloat) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aFloat;
    }
    return *this;
  }
  Log &operator <<(double aDouble) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << aDouble;
    }
    return *this;
  }
  template <typename T, typename Sub, typename Coord>
  Log &operator <<(const BasePoint<T, Sub, Coord>& aPoint) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << "Point" << aPoint;
    }
    return *this;
  }
  template <typename T, typename Sub>
  Log &operator <<(const BaseSize<T, Sub>& aSize) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << "Size(" << aSize.width << "," << aSize.height << ")";
    }
    return *this;
  }
  template <typename T, typename Sub, typename Point, typename SizeT, typename Margin>
  Log &operator <<(const BaseRect<T, Sub, Point, SizeT, Margin>& aRect) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << "Rect" << aRect;
    }
    return *this;
  }
  Log &operator<<(const Matrix& aMatrix) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << "Matrix(" << aMatrix._11 << " " << aMatrix._12 << " ; " << aMatrix._21 << " " << aMatrix._22 << " ; " << aMatrix._31 << " " << aMatrix._32 << ")";
    }
    return *this;
  }
  template<typename T>
  Log &operator<<(Hexa<T> aHex) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      mMessage << std::showbase << std::hex
               << aHex.mVal
               << std::noshowbase << std::dec;
    }
    return *this;
  }

  Log& operator<<(SurfaceFormat aFormat) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      switch(aFormat) {
        case SurfaceFormat::B8G8R8A8:
          mMessage << "SurfaceFormat::B8G8R8A8";
          break;
        case SurfaceFormat::B8G8R8X8:
          mMessage << "SurfaceFormat::B8G8R8X8";
          break;
        case SurfaceFormat::R8G8B8A8:
          mMessage << "SurfaceFormat::R8G8B8A8";
          break;
        case SurfaceFormat::R8G8B8X8:
          mMessage << "SurfaceFormat::R8G8B8X8";
          break;
        case SurfaceFormat::R5G6B5_UINT16:
          mMessage << "SurfaceFormat::R5G6B5_UINT16";
          break;
        case SurfaceFormat::A8:
          mMessage << "SurfaceFormat::A8";
          break;
        case SurfaceFormat::YUV:
          mMessage << "SurfaceFormat::YUV";
          break;
        case SurfaceFormat::UNKNOWN:
          mMessage << "SurfaceFormat::UNKNOWN";
          break;
        default:
          mMessage << "Invalid SurfaceFormat (" << (int)aFormat << ")";
          break;
      }
    }
    return *this;
  }

  Log& operator<<(SurfaceType aType) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      switch(aType) {
        case SurfaceType::DATA:
          mMessage << "SurfaceType::DATA";
          break;
        case SurfaceType::D2D1_BITMAP:
          mMessage << "SurfaceType::D2D1_BITMAP";
          break;
        case SurfaceType::D2D1_DRAWTARGET:
          mMessage << "SurfaceType::D2D1_DRAWTARGET";
          break;
        case SurfaceType::CAIRO:
          mMessage << "SurfaceType::CAIRO";
          break;
        case SurfaceType::CAIRO_IMAGE:
          mMessage << "SurfaceType::CAIRO_IMAGE";
          break;
        case SurfaceType::COREGRAPHICS_IMAGE:
          mMessage << "SurfaceType::COREGRAPHICS_IMAGE";
          break;
        case SurfaceType::COREGRAPHICS_CGCONTEXT:
          mMessage << "SurfaceType::COREGRAPHICS_CGCONTEXT";
          break;
        case SurfaceType::SKIA:
          mMessage << "SurfaceType::SKIA";
          break;
        case SurfaceType::DUAL_DT:
          mMessage << "SurfaceType::DUAL_DT";
          break;
        case SurfaceType::D2D1_1_IMAGE:
          mMessage << "SurfaceType::D2D1_1_IMAGE";
          break;
        case SurfaceType::RECORDING:
          mMessage << "SurfaceType::RECORDING";
          break;
        case SurfaceType::TILED:
          mMessage << "SurfaceType::TILED";
          break;
        case SurfaceType::DATA_SHARED:
          mMessage << "SurfaceType::DATA_SHARED";
          break;
        default:
          mMessage << "Invalid SurfaceType (" << (int)aType << ")";
          break;
      }
    }
    return *this;
  }

  inline bool LogIt() const { return mLogIt; }
  inline bool NoNewline() const { return mOptions & int(LogOptions::NoNewline); }
  inline bool AutoPrefix() const { return mOptions & int(LogOptions::AutoPrefix); }
  inline bool ValidReason() const { return (int)mReason > (int)LogReason::MustBeMoreThanThis && (int)mReason < (int)LogReason::MustBeLessThanThis; }



               Log(const Log& log) { Init(log.mOptions, false, log.mReason); }

private:

  void Init(int aOptions, bool aLogIt, LogReason aReason) {
    mOptions = aOptions;
    mReason = aReason;
    mLogIt = aLogIt;
    if (mLogIt) {
      if (AutoPrefix()) {
        if (mOptions & int(LogOptions::AssertOnCall)) {
          mMessage << "[GFX" << L;
        } else {
          mMessage << "[GFX" << L << "-";
        }
      }
      if ((mOptions & int(LogOptions::CrashAction)) && ValidReason()) {
        mMessage << " " << (int)mReason;
      }
      if (AutoPrefix()) {
        mMessage << "]: ";
      }
    }
  }

  void WriteLog(const std::string &aString) {
    if ((__builtin_expect(!!(LogIt()), 0))) {
      Logger::OutputMessage(aString, L, NoNewline());
# 522 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h"
      if ((mOptions & int(LogOptions::CrashAction)) && ValidReason()) {
        Logger::CrashAction(mReason);
      }
    }
  }

  std::stringstream mMessage;
  int mOptions;
  LogReason mReason;
  bool mLogIt;
};

typedef Log<LOG_DEBUG> DebugLog;
typedef Log<LOG_WARNING> WarningLog;
typedef Log<LOG_CRITICAL, CriticalLogger> CriticalLog;
# 591 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h"
inline bool MOZ2D_error_if_impl(bool aCondition, const char* aExpr,
                                const char* aFile, int32_t aLine)
{
  if ((__builtin_expect(!!(aCondition), 0))) {
    mozilla::gfx::CriticalLog() << aExpr << " at " << aFile << ":" << aLine;
  }
  return aCondition;
}
# 618 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/gfx/Logging.h"
const int INDENT_PER_LEVEL = 2;

class TreeLog
{
public:
  explicit TreeLog(const std::string& aPrefix = "")
        : mLog(int(LogOptions::NoNewline)),
          mPrefix(aPrefix),
          mDepth(0),
          mStartOfLine(true),
          mConditionedOnPref(false),
          mPrefFunction(nullptr) {}

  template <typename T>
  TreeLog& operator<<(const T& aObject) {
    if (mConditionedOnPref && !mPrefFunction()) {
      return *this;
    }
    if (mStartOfLine) {
      mLog << '[' << mPrefix << "] " << std::string(mDepth * INDENT_PER_LEVEL, ' ');
      mStartOfLine = false;
    }
    mLog << aObject;
    if (EndsInNewline(aObject)) {


      mLog.Flush();
      mStartOfLine = true;
    }
    return *this;
  }

  void IncreaseIndent() { ++mDepth; }
  void DecreaseIndent() {
    do { } while (0);
    --mDepth;
  }

  void ConditionOnPrefFunction(bool(*aPrefFunction)()) {
    mConditionedOnPref = true;
    mPrefFunction = aPrefFunction;
  }
private:
  Log<LOG_DEBUG> mLog;
  std::string mPrefix;
  uint32_t mDepth;
  bool mStartOfLine;
  bool mConditionedOnPref;
  bool (*mPrefFunction)();

  template <typename T>
  static bool EndsInNewline(const T& aObject) {
    return false;
  }

  static bool EndsInNewline(const std::string& aString) {
    return !aString.empty() && aString[aString.length() - 1] == '\n';
  }

  static bool EndsInNewline(char aChar) {
    return aChar == '\n';
  }

  static bool EndsInNewline(const char* aString) {
    return EndsInNewline(std::string(aString));
  }
};

class TreeAutoIndent
{
public:
  explicit TreeAutoIndent(TreeLog& aTreeLog) : mTreeLog(aTreeLog) {
    mTreeLog.IncreaseIndent();
  }

  TreeAutoIndent(const TreeAutoIndent& aTreeAutoIndent) :
      TreeAutoIndent(aTreeAutoIndent.mTreeLog) {
    mTreeLog.IncreaseIndent();
  }

  TreeAutoIndent& operator=(const TreeAutoIndent& aTreeAutoIndent) = delete;

  ~TreeAutoIndent() {
    mTreeLog.DecreaseIndent();
  }
private:
  TreeLog& mTreeLog;
};

}
}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h" 2





namespace IPC {
template <typename T> struct ParamTraits;
}

namespace mozilla {
namespace layers {





struct ScrollUpdateInfo {
  uint32_t mScrollGeneration;
  CSSPoint mScrollOffset;
};







struct FrameMetrics {
  friend struct IPC::ParamTraits<mozilla::layers::FrameMetrics>;
public:

  typedef uint64_t ViewID;
  static const ViewID NULL_SCROLL_ID;
  static const ViewID START_SCROLL_ID = 2;


  enum ScrollOffsetUpdateType : uint8_t {
    eNone,
    eMainThread,
    ePending,


    eUserAction,



    eRestore,




    eSentinel
  };

  FrameMetrics()
    : mScrollId(NULL_SCROLL_ID)
    , mPresShellResolution(1)
    , mCompositionBounds(0, 0, 0, 0)
    , mDisplayPort(0, 0, 0, 0)
    , mCriticalDisplayPort(0, 0, 0, 0)
    , mScrollableRect(0, 0, 0, 0)
    , mCumulativeResolution()
    , mDevPixelsPerCSSPixel(1)
    , mScrollOffset(0, 0)
    , mZoom()
    , mScrollGeneration(0)
    , mSmoothScrollOffset(0, 0)
    , mRootCompositionSize(0, 0)
    , mDisplayPortMargins(0, 0, 0, 0)
    , mPresShellId(-1)
    , mViewport(0, 0, 0, 0)
    , mExtraResolution()
    , mPaintRequestTime()
    , mScrollUpdateType(eNone)
    , mIsRootContent(false)
    , mDoSmoothScroll(false)
    , mUseDisplayPortMargins(false)
    , mIsScrollInfoLayer(false)
  {
  }



  bool operator==(const FrameMetrics& aOther) const
  {

    return mScrollId == aOther.mScrollId &&
           mPresShellResolution == aOther.mPresShellResolution &&
           mCompositionBounds.IsEqualEdges(aOther.mCompositionBounds) &&
           mDisplayPort.IsEqualEdges(aOther.mDisplayPort) &&
           mCriticalDisplayPort.IsEqualEdges(aOther.mCriticalDisplayPort) &&
           mScrollableRect.IsEqualEdges(aOther.mScrollableRect) &&
           mCumulativeResolution == aOther.mCumulativeResolution &&
           mDevPixelsPerCSSPixel == aOther.mDevPixelsPerCSSPixel &&
           mScrollOffset == aOther.mScrollOffset &&

           mScrollGeneration == aOther.mScrollGeneration &&
           mSmoothScrollOffset == aOther.mSmoothScrollOffset &&
           mRootCompositionSize == aOther.mRootCompositionSize &&
           mDisplayPortMargins == aOther.mDisplayPortMargins &&
           mPresShellId == aOther.mPresShellId &&
           mViewport.IsEqualEdges(aOther.mViewport) &&
           mExtraResolution == aOther.mExtraResolution &&
           mPaintRequestTime == aOther.mPaintRequestTime &&
           mScrollUpdateType == aOther.mScrollUpdateType &&
           mIsRootContent == aOther.mIsRootContent &&
           mDoSmoothScroll == aOther.mDoSmoothScroll &&
           mUseDisplayPortMargins == aOther.mUseDisplayPortMargins &&
           mIsScrollInfoLayer == aOther.mIsScrollInfoLayer;
  }

  bool operator!=(const FrameMetrics& aOther) const
  {
    return !operator==(aOther);
  }

  bool IsScrollable() const
  {
    return mScrollId != NULL_SCROLL_ID;
  }

  CSSToScreenScale2D DisplayportPixelsPerCSSPixel() const
  {







    return mZoom * ParentLayerToLayerScale(1.0f) / mExtraResolution;
  }

  CSSToLayerScale2D LayersPixelsPerCSSPixel() const
  {
    return mDevPixelsPerCSSPixel * mCumulativeResolution;
  }


  LayerToParentLayerScale GetAsyncZoom() const
  {


    return (mZoom / LayersPixelsPerCSSPixel()).ToScaleFactor();
  }







  CSSRect GetExpandedScrollableRect() const
  {
    CSSRect scrollableRect = mScrollableRect;
    CSSSize compSize = CalculateCompositedSizeInCssPixels();
    if (scrollableRect.width < compSize.width) {
      scrollableRect.x = std::max(0.f,
                                  scrollableRect.x - (compSize.width - scrollableRect.width));
      scrollableRect.width = compSize.width;
    }

    if (scrollableRect.height < compSize.height) {
      scrollableRect.y = std::max(0.f,
                                  scrollableRect.y - (compSize.height - scrollableRect.height));
      scrollableRect.height = compSize.height;
    }

    return scrollableRect;
  }

  CSSSize CalculateCompositedSizeInCssPixels() const
  {
    if (GetZoom() == CSSToParentLayerScale2D(0, 0)) {
      return CSSSize();
    }
    return mCompositionBounds.Size() / GetZoom();
  }

  CSSRect CalculateCompositedRectInCssPixels() const
  {
    if (GetZoom() == CSSToParentLayerScale2D(0, 0)) {
      return CSSRect();
    }
    return mCompositionBounds / GetZoom();
  }

  CSSSize CalculateBoundedCompositedSizeInCssPixels() const
  {
    CSSSize size = CalculateCompositedSizeInCssPixels();
    size.width = std::min(size.width, mRootCompositionSize.width);
    size.height = std::min(size.height, mRootCompositionSize.height);
    return size;
  }

  CSSRect CalculateScrollRange() const
  {
    CSSSize scrollPortSize = CalculateCompositedSizeInCssPixels();
    CSSRect scrollRange = mScrollableRect;
    scrollRange.width = std::max(scrollRange.width - scrollPortSize.width, 0.0f);
    scrollRange.height = std::max(scrollRange.height - scrollPortSize.height, 0.0f);
    return scrollRange;
  }

  void ScrollBy(const CSSPoint& aPoint)
  {
    mScrollOffset += aPoint;
  }

  void ZoomBy(float aScale)
  {
    ZoomBy(gfxSize(aScale, aScale));
  }

  void ZoomBy(const gfxSize& aScale)
  {
    mZoom.xScale *= aScale.width;
    mZoom.yScale *= aScale.height;
  }

  void CopyScrollInfoFrom(const FrameMetrics& aOther)
  {
    mScrollOffset = aOther.mScrollOffset;
    mScrollGeneration = aOther.mScrollGeneration;
  }

  void CopySmoothScrollInfoFrom(const FrameMetrics& aOther)
  {
    mSmoothScrollOffset = aOther.mSmoothScrollOffset;
    mScrollGeneration = aOther.mScrollGeneration;
    mDoSmoothScroll = aOther.mDoSmoothScroll;
  }

  void UpdatePendingScrollInfo(const ScrollUpdateInfo& aInfo)
  {
    mScrollOffset = aInfo.mScrollOffset;
    mScrollGeneration = aInfo.mScrollGeneration;
    mScrollUpdateType = ePending;
  }

  void SetRepaintDrivenByUserAction(bool aUserAction)
  {
    mScrollUpdateType = aUserAction ? eUserAction : eNone;
  }

public:
  void SetPresShellResolution(float aPresShellResolution)
  {
    mPresShellResolution = aPresShellResolution;
  }

  float GetPresShellResolution() const
  {
    return mPresShellResolution;
  }

  void SetCompositionBounds(const ParentLayerRect& aCompositionBounds)
  {
    mCompositionBounds = aCompositionBounds;
  }

  const ParentLayerRect& GetCompositionBounds() const
  {
    return mCompositionBounds;
  }

  void SetDisplayPort(const CSSRect& aDisplayPort)
  {
    mDisplayPort = aDisplayPort;
  }

  const CSSRect& GetDisplayPort() const
  {
    return mDisplayPort;
  }

  void SetCriticalDisplayPort(const CSSRect& aCriticalDisplayPort)
  {
    mCriticalDisplayPort = aCriticalDisplayPort;
  }

  const CSSRect& GetCriticalDisplayPort() const
  {
    return mCriticalDisplayPort;
  }

  void SetCumulativeResolution(const LayoutDeviceToLayerScale2D& aCumulativeResolution)
  {
    mCumulativeResolution = aCumulativeResolution;
  }

  const LayoutDeviceToLayerScale2D& GetCumulativeResolution() const
  {
    return mCumulativeResolution;
  }

  void SetDevPixelsPerCSSPixel(const CSSToLayoutDeviceScale& aDevPixelsPerCSSPixel)
  {
    mDevPixelsPerCSSPixel = aDevPixelsPerCSSPixel;
  }

  const CSSToLayoutDeviceScale& GetDevPixelsPerCSSPixel() const
  {
    return mDevPixelsPerCSSPixel;
  }

  void SetIsRootContent(bool aIsRootContent)
  {
    mIsRootContent = aIsRootContent;
  }

  bool IsRootContent() const
  {
    return mIsRootContent;
  }

  void SetScrollOffset(const CSSPoint& aScrollOffset)
  {
    mScrollOffset = aScrollOffset;
  }

  const CSSPoint& GetScrollOffset() const
  {
    return mScrollOffset;
  }

  void SetSmoothScrollOffset(const CSSPoint& aSmoothScrollDestination)
  {
    mSmoothScrollOffset = aSmoothScrollDestination;
  }

  const CSSPoint& GetSmoothScrollOffset() const
  {
    return mSmoothScrollOffset;
  }

  void SetZoom(const CSSToParentLayerScale2D& aZoom)
  {
    mZoom = aZoom;
  }

  const CSSToParentLayerScale2D& GetZoom() const
  {
    return mZoom;
  }

  void SetScrollOffsetUpdated(uint32_t aScrollGeneration)
  {
    mScrollUpdateType = eMainThread;
    mScrollGeneration = aScrollGeneration;
  }

  void SetScrollOffsetRestored(uint32_t aScrollGeneration)
  {
    mScrollUpdateType = eRestore;
    mScrollGeneration = aScrollGeneration;
  }

  void SetSmoothScrollOffsetUpdated(int32_t aScrollGeneration)
  {
    mDoSmoothScroll = true;
    mScrollGeneration = aScrollGeneration;
  }

  ScrollOffsetUpdateType GetScrollUpdateType() const
  {
    return mScrollUpdateType;
  }

  bool GetScrollOffsetUpdated() const
  {
    return mScrollUpdateType != eNone;
  }

  bool GetDoSmoothScroll() const
  {
    return mDoSmoothScroll;
  }

  uint32_t GetScrollGeneration() const
  {
    return mScrollGeneration;
  }

  ViewID GetScrollId() const
  {
    return mScrollId;
  }

  void SetScrollId(ViewID scrollId)
  {
    mScrollId = scrollId;
  }

  void SetRootCompositionSize(const CSSSize& aRootCompositionSize)
  {
    mRootCompositionSize = aRootCompositionSize;
  }

  const CSSSize& GetRootCompositionSize() const
  {
    return mRootCompositionSize;
  }

  void SetDisplayPortMargins(const ScreenMargin& aDisplayPortMargins)
  {
    mDisplayPortMargins = aDisplayPortMargins;
  }

  const ScreenMargin& GetDisplayPortMargins() const
  {
    return mDisplayPortMargins;
  }

  void SetUseDisplayPortMargins(bool aValue)
  {
    mUseDisplayPortMargins = aValue;
  }

  bool GetUseDisplayPortMargins() const
  {
    return mUseDisplayPortMargins;
  }

  uint32_t GetPresShellId() const
  {
    return mPresShellId;
  }

  void SetPresShellId(uint32_t aPresShellId)
  {
    mPresShellId = aPresShellId;
  }

  void SetViewport(const CSSRect& aViewport)
  {
    mViewport = aViewport;
  }

  const CSSRect& GetViewport() const
  {
    return mViewport;
  }

  void SetExtraResolution(const ScreenToLayerScale2D& aExtraResolution)
  {
    mExtraResolution = aExtraResolution;
  }

  const ScreenToLayerScale2D& GetExtraResolution() const
  {
    return mExtraResolution;
  }

  const CSSRect& GetScrollableRect() const
  {
    return mScrollableRect;
  }

  void SetScrollableRect(const CSSRect& aScrollableRect)
  {
    mScrollableRect = aScrollableRect;
  }

  void SetPaintRequestTime(const TimeStamp& aTime) {
    mPaintRequestTime = aTime;
  }
  const TimeStamp& GetPaintRequestTime() const {
    return mPaintRequestTime;
  }

  void SetIsScrollInfoLayer(bool aIsScrollInfoLayer) {
    mIsScrollInfoLayer = aIsScrollInfoLayer;
  }
  bool IsScrollInfoLayer() const {
    return mIsScrollInfoLayer;
  }

private:

  ViewID mScrollId;
# 506 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  float mPresShellResolution;
# 523 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  ParentLayerRect mCompositionBounds;
# 536 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  CSSRect mDisplayPort;







  CSSRect mCriticalDisplayPort;
# 557 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  CSSRect mScrollableRect;
# 566 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  LayoutDeviceToLayerScale2D mCumulativeResolution;
# 575 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  CSSToLayoutDeviceScale mDevPixelsPerCSSPixel;
# 592 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  CSSPoint mScrollOffset;





  CSSToParentLayerScale2D mZoom;


  uint32_t mScrollGeneration;



  CSSPoint mSmoothScrollOffset;


  CSSSize mRootCompositionSize;



  ScreenMargin mDisplayPortMargins;

  uint32_t mPresShellId;
# 625 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  CSSRect mViewport;



  ScreenToLayerScale2D mExtraResolution;


  TimeStamp mPaintRequestTime;



  ScrollOffsetUpdateType mScrollUpdateType;


  bool mIsRootContent:1;



  bool mDoSmoothScroll:1;



  bool mUseDisplayPortMargins:1;


  bool mIsScrollInfoLayer:1;
# 668 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
  void SetDoSmoothScroll(bool aValue) {
    mDoSmoothScroll = aValue;
  }
};

struct ScrollSnapInfo {
  ScrollSnapInfo()
    : mScrollSnapTypeX(0)
    , mScrollSnapTypeY(0)
  {}

  bool operator==(const ScrollSnapInfo& aOther) const
  {
    return mScrollSnapTypeX == aOther.mScrollSnapTypeX &&
           mScrollSnapTypeY == aOther.mScrollSnapTypeY &&
           mScrollSnapIntervalX == aOther.mScrollSnapIntervalX &&
           mScrollSnapIntervalY == aOther.mScrollSnapIntervalY &&
           mScrollSnapDestination == aOther.mScrollSnapDestination &&
           mScrollSnapCoordinates == aOther.mScrollSnapCoordinates;
  }



  uint8_t mScrollSnapTypeX;
  uint8_t mScrollSnapTypeY;


  Maybe<nscoord> mScrollSnapIntervalX;
  Maybe<nscoord> mScrollSnapIntervalY;



  nsPoint mScrollSnapDestination;



  nsTArray<nsPoint> mScrollSnapCoordinates;
};





struct LayerClip {
  friend struct IPC::ParamTraits<mozilla::layers::LayerClip>;

public:
  LayerClip()
    : mClipRect()
    , mMaskLayerIndex()
  {}

  explicit LayerClip(const ParentLayerIntRect& aClipRect)
    : mClipRect(aClipRect)
    , mMaskLayerIndex()
  {}

  bool operator==(const LayerClip& aOther) const
  {
    return mClipRect == aOther.mClipRect &&
           mMaskLayerIndex == aOther.mMaskLayerIndex;
  }

  void SetClipRect(const ParentLayerIntRect& aClipRect) {
    mClipRect = aClipRect;
  }
  const ParentLayerIntRect& GetClipRect() const {
    return mClipRect;
  }

  void SetMaskLayerIndex(const Maybe<size_t>& aIndex) {
    mMaskLayerIndex = aIndex;
  }
  const Maybe<size_t>& GetMaskLayerIndex() const {
    return mMaskLayerIndex;
  }

private:
  ParentLayerIntRect mClipRect;



  Maybe<size_t> mMaskLayerIndex;
};

typedef Maybe<LayerClip> MaybeLayerClip;
# 762 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
struct ScrollMetadata {
  friend struct IPC::ParamTraits<mozilla::layers::ScrollMetadata>;

  typedef FrameMetrics::ViewID ViewID;
public:
  static StaticAutoPtr<const ScrollMetadata> sNullMetadata;

  ScrollMetadata()
    : mMetrics()
    , mSnapInfo()
    , mScrollParentId(FrameMetrics::NULL_SCROLL_ID)
    , mBackgroundColor()
    , mContentDescription()
    , mLineScrollAmount(0, 0)
    , mPageScrollAmount(0, 0)
    , mScrollClip()
    , mHasScrollgrab(false)
    , mAllowVerticalScrollWithWheel(false)
    , mIsLayersIdRoot(false)
    , mUsesContainerScrolling(false)
    , mForceDisableApz(false)
  {}

  bool operator==(const ScrollMetadata& aOther) const
  {
    return mMetrics == aOther.mMetrics &&
           mSnapInfo == aOther.mSnapInfo &&
           mScrollParentId == aOther.mScrollParentId &&
           mBackgroundColor == aOther.mBackgroundColor &&

           mLineScrollAmount == aOther.mLineScrollAmount &&
           mPageScrollAmount == aOther.mPageScrollAmount &&
           mScrollClip == aOther.mScrollClip &&
           mHasScrollgrab == aOther.mHasScrollgrab &&
           mAllowVerticalScrollWithWheel == aOther.mAllowVerticalScrollWithWheel &&
           mIsLayersIdRoot == aOther.mIsLayersIdRoot &&
           mUsesContainerScrolling == aOther.mUsesContainerScrolling &&
           mForceDisableApz == aOther.mForceDisableApz;
  }

  bool operator!=(const ScrollMetadata& aOther) const
  {
    return !operator==(aOther);
  }

  bool IsDefault() const
  {
    ScrollMetadata def;

    def.mMetrics.SetPresShellId(mMetrics.GetPresShellId());
    return (def == *this);
  }

  FrameMetrics& GetMetrics() { return mMetrics; }
  const FrameMetrics& GetMetrics() const { return mMetrics; }

  void SetSnapInfo(ScrollSnapInfo&& aSnapInfo) {
    mSnapInfo = Move(aSnapInfo);
  }
  const ScrollSnapInfo& GetSnapInfo() const { return mSnapInfo; }

  ViewID GetScrollParentId() const {
    return mScrollParentId;
  }

  void SetScrollParentId(ViewID aParentId) {
    mScrollParentId = aParentId;
  }
  const gfx::Color& GetBackgroundColor() const {
    return mBackgroundColor;
  }
  void SetBackgroundColor(const gfx::Color& aBackgroundColor) {
    mBackgroundColor = aBackgroundColor;
  }
  const nsCString& GetContentDescription() const {
    return mContentDescription;
  }
  void SetContentDescription(const nsCString& aContentDescription) {
    mContentDescription = aContentDescription;
  }
  const LayoutDeviceIntSize& GetLineScrollAmount() const {
    return mLineScrollAmount;
  }
  void SetLineScrollAmount(const LayoutDeviceIntSize& size) {
    mLineScrollAmount = size;
  }
  const LayoutDeviceIntSize& GetPageScrollAmount() const {
    return mPageScrollAmount;
  }
  void SetPageScrollAmount(const LayoutDeviceIntSize& size) {
    mPageScrollAmount = size;
  }

  void SetScrollClip(const Maybe<LayerClip>& aScrollClip) {
    mScrollClip = aScrollClip;
  }
  const Maybe<LayerClip>& GetScrollClip() const {
    return mScrollClip;
  }
  bool HasScrollClip() const {
    return mScrollClip.isSome();
  }
  const LayerClip& ScrollClip() const {
    return mScrollClip.ref();
  }
  LayerClip& ScrollClip() {
    return mScrollClip.ref();
  }

  bool HasMaskLayer() const {
    return HasScrollClip() && ScrollClip().GetMaskLayerIndex();
  }
  Maybe<ParentLayerIntRect> GetClipRect() const {
    return mScrollClip.isSome() ? Some(mScrollClip->GetClipRect()) : Nothing();
  }

  void SetHasScrollgrab(bool aHasScrollgrab) {
    mHasScrollgrab = aHasScrollgrab;
  }
  bool GetHasScrollgrab() const {
    return mHasScrollgrab;
  }
  bool AllowVerticalScrollWithWheel() const {
    return mAllowVerticalScrollWithWheel;
  }
  void SetAllowVerticalScrollWithWheel(bool aValue) {
    mAllowVerticalScrollWithWheel = aValue;
  }
  void SetIsLayersIdRoot(bool aValue) {
    mIsLayersIdRoot = aValue;
  }
  bool IsLayersIdRoot() const {
    return mIsLayersIdRoot;
  }


  void SetUsesContainerScrolling(bool aValue);
  bool UsesContainerScrolling() const {
    return mUsesContainerScrolling;
  }
  void SetForceDisableApz(bool aForceDisable) {
    mForceDisableApz = aForceDisable;
  }
  bool IsApzForceDisabled() const {
    return mForceDisableApz;
  }

private:
  FrameMetrics mMetrics;


  ScrollSnapInfo mSnapInfo;


  ViewID mScrollParentId;


  gfx::Color mBackgroundColor;




  nsCString mContentDescription;


  LayoutDeviceIntSize mLineScrollAmount;


  LayoutDeviceIntSize mPageScrollAmount;







  Maybe<LayerClip> mScrollClip;


  bool mHasScrollgrab:1;


  bool mAllowVerticalScrollWithWheel:1;



  bool mIsLayersIdRoot:1;



  bool mUsesContainerScrolling:1;



  bool mForceDisableApz:1;
# 967 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
};
# 977 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/FrameMetrics.h"
struct ScrollableLayerGuid {
  uint64_t mLayersId;
  uint32_t mPresShellId;
  FrameMetrics::ViewID mScrollId;

  ScrollableLayerGuid()
    : mLayersId(0)
    , mPresShellId(0)
    , mScrollId(0)
  {
  }

  ScrollableLayerGuid(uint64_t aLayersId, uint32_t aPresShellId,
                      FrameMetrics::ViewID aScrollId)
    : mLayersId(aLayersId)
    , mPresShellId(aPresShellId)
    , mScrollId(aScrollId)
  {
  }

  ScrollableLayerGuid(uint64_t aLayersId, const FrameMetrics& aMetrics)
    : mLayersId(aLayersId)
    , mPresShellId(aMetrics.GetPresShellId())
    , mScrollId(aMetrics.GetScrollId())
  {
  }

  ScrollableLayerGuid(const ScrollableLayerGuid& other)
    : mLayersId(other.mLayersId)
    , mPresShellId(other.mPresShellId)
    , mScrollId(other.mScrollId)
  {
  }

  ~ScrollableLayerGuid()
  {
  }

  bool operator==(const ScrollableLayerGuid& other) const
  {
    return mLayersId == other.mLayersId
        && mPresShellId == other.mPresShellId
        && mScrollId == other.mScrollId;
  }

  bool operator!=(const ScrollableLayerGuid& other) const
  {
    return !(*this == other);
  }

  bool operator<(const ScrollableLayerGuid& other) const
  {
    if (mLayersId < other.mLayersId) {
      return true;
    }
    if (mLayersId == other.mLayersId) {
      if (mPresShellId < other.mPresShellId) {
        return true;
      }
      if (mPresShellId == other.mPresShellId) {
        return mScrollId < other.mScrollId;
      }
    }
    return false;
  }

  uint32_t Hash() const
  {
    return HashGeneric(mLayersId, mPresShellId, mScrollId);
  }
};

template <int LogLevel>
gfx::Log<LogLevel>& operator<<(gfx::Log<LogLevel>& log, const ScrollableLayerGuid& aGuid) {
  return log << '(' << aGuid.mLayersId << ',' << aGuid.mPresShellId << ',' << aGuid.mScrollId << ')';
}

struct ZoomConstraints {
  bool mAllowZoom;
  bool mAllowDoubleTapZoom;
  CSSToParentLayerScale mMinZoom;
  CSSToParentLayerScale mMaxZoom;

  ZoomConstraints()
    : mAllowZoom(true)
    , mAllowDoubleTapZoom(true)
  {
                                   ;
  }

  ZoomConstraints(bool aAllowZoom,
                  bool aAllowDoubleTapZoom,
                  const CSSToParentLayerScale& aMinZoom,
                  const CSSToParentLayerScale& aMaxZoom)
    : mAllowZoom(aAllowZoom)
    , mAllowDoubleTapZoom(aAllowDoubleTapZoom)
    , mMinZoom(aMinZoom)
    , mMaxZoom(aMaxZoom)
  {
                                   ;
  }

  ZoomConstraints(const ZoomConstraints& other)
    : mAllowZoom(other.mAllowZoom)
    , mAllowDoubleTapZoom(other.mAllowDoubleTapZoom)
    , mMinZoom(other.mMinZoom)
    , mMaxZoom(other.mMaxZoom)
  {
                                   ;
  }

  ~ZoomConstraints()
  {
                                   ;
  }

  bool operator==(const ZoomConstraints& other) const
  {
    return mAllowZoom == other.mAllowZoom
        && mAllowDoubleTapZoom == other.mAllowDoubleTapZoom
        && mMinZoom == other.mMinZoom
        && mMaxZoom == other.mMaxZoom;
  }

  bool operator!=(const ZoomConstraints& other) const
  {
    return !(*this == other);
  }
};

typedef Maybe<ZoomConstraints> MaybeZoomConstraints;

}
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h" 2




class nsBoxLayoutState;
class nsIScrollPositionListener;
class nsIFrame;
class nsPresContext;
class nsIContent;
class nsRenderingContext;
class nsIAtom;
class nsDisplayListBuilder;

namespace mozilla {
struct ContainerLayerParameters;
namespace layers {
class Layer;
}
}






class nsIScrollableFrame : public nsIScrollbarMediator {
public:
  typedef mozilla::CSSIntPoint CSSIntPoint;
  typedef mozilla::ContainerLayerParameters ContainerLayerParameters;
  typedef mozilla::layers::FrameMetrics FrameMetrics;
  typedef mozilla::layers::ScrollSnapInfo ScrollSnapInfo;

  static const nsQueryFrame::FrameIID kFrameIID = nsQueryFrame::nsIScrollableFrame_id; typedef nsIScrollableFrame Has_NS_DECL_QUERYFRAME_TARGET;





  virtual nsIFrame* GetScrolledFrame() const = 0;






  virtual mozilla::ScrollbarStyles GetScrollbarStyles() const = 0;

  enum { HORIZONTAL = 0x01, VERTICAL = 0x02 };





  virtual uint32_t GetScrollbarVisibility() const = 0;





  uint32_t GetPerceivedScrollingDirections() const;






  virtual nsMargin GetActualScrollbarSizes() const = 0;





  virtual nsMargin GetDesiredScrollbarSizes(nsBoxLayoutState* aState) = 0;





  virtual nsMargin GetDesiredScrollbarSizes(nsPresContext* aPresContext,
                                            nsRenderingContext* aRC) = 0;



  virtual nscoord
  GetNondisappearingScrollbarWidth(nsPresContext* aPresContext,
                                   nsRenderingContext* aRC,
                                   mozilla::WritingMode aWM) = 0;
# 122 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual nsRect GetScrolledRect() const = 0;





  virtual nsRect GetScrollPortRect() const = 0;





  virtual nsPoint GetScrollPosition() const = 0;



  virtual nsPoint GetLogicalScrollPosition() const = 0;
# 147 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual nsRect GetScrollRange() const = 0;




  virtual nsSize GetScrollPositionClampingScrollPortSize() const = 0;




  virtual nsSize GetLineScrollAmount() const = 0;




  virtual nsSize GetPageScrollAmount() const = 0;
# 191 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  enum ScrollMode { INSTANT, SMOOTH, SMOOTH_MSD, NORMAL };
# 200 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  enum ScrollMomentum { NOT_MOMENTUM, SYNTHESIZED_MOMENTUM_EVENT };
# 210 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual void ScrollTo(nsPoint aScrollPosition, ScrollMode aMode,
                        const nsRect* aRange = nullptr,
                        nsIScrollbarMediator::ScrollSnapMode aSnap
                          = nsIScrollbarMediator::DISABLE_SNAP) = 0;
# 231 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual void ScrollToCSSPixels(const CSSIntPoint& aScrollPosition,
                                 nsIScrollableFrame::ScrollMode aMode
                                   = nsIScrollableFrame::INSTANT) = 0;
# 242 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual void ScrollToCSSPixelsApproximate(const mozilla::CSSPoint& aScrollPosition,
                                            nsIAtom *aOrigin = nullptr) = 0;





  virtual CSSIntPoint GetScrollPositionCSSPixels() = 0;



  enum ScrollUnit { DEVICE_PIXELS, LINES, PAGES, WHOLE };
# 264 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual void ScrollBy(nsIntPoint aDelta, ScrollUnit aUnit, ScrollMode aMode,
                        nsIntPoint* aOverflow = nullptr,
                        nsIAtom* aOrigin = nullptr,
                        ScrollMomentum aMomentum = NOT_MOMENTUM,
                        nsIScrollbarMediator::ScrollSnapMode aSnap
                          = nsIScrollbarMediator::DISABLE_SNAP) = 0;







  virtual void ScrollSnap() = 0;
# 288 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual void ScrollToRestoredPosition() = 0;





  virtual void AddScrollPositionListener(nsIScrollPositionListener* aListener) = 0;



  virtual void RemoveScrollPositionListener(nsIScrollPositionListener* aListener) = 0;





  virtual void CurPosAttributeChanged(nsIContent* aChild) = 0;





  virtual nsresult PostScrolledAreaEventForCurrentArea() = 0;






  virtual bool IsScrollingActive(nsDisplayListBuilder* aBuilder) = 0;




  virtual bool IsProcessingAsyncScroll() = 0;




  virtual void ResetScrollPositionForLayerPixelAlignment() = 0;



  virtual bool DidHistoryRestore() const = 0;





  virtual void ClearDidHistoryRestore() = 0;




  virtual bool IsRectNearlyVisible(const nsRect& aRect) = 0;




  virtual nsRect ExpandRectToNearlyVisible(const nsRect& aRect) const = 0;





  virtual nsIAtom* LastScrollOrigin() = 0;
# 362 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual void AllowScrollOriginDowngrade() = 0;
# 377 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual nsIAtom* LastSmoothScrollOrigin() = 0;




  virtual uint32_t CurrentScrollGeneration() = 0;




  virtual nsPoint LastScrollDestination() = 0;





  virtual void ResetScrollInfoIfGeneration(uint32_t aGeneration) = 0;




  virtual bool WantAsyncScroll() const = 0;




  virtual mozilla::Maybe<mozilla::layers::ScrollMetadata> ComputeScrollMetadata(
    mozilla::layers::Layer* aLayer,
    nsIFrame* aContainerReferenceFrame,
    const ContainerLayerParameters& aParameters,
    const mozilla::DisplayItemClip* aClip) const = 0;




  virtual bool IsIgnoringViewportClipping() const = 0;




  virtual void MarkScrollbarsDirtyForReflow() const = 0;

  virtual void SetTransformingByAPZ(bool aTransforming) = 0;
  virtual bool IsTransformingByAPZ() const = 0;







  virtual void SetScrollableByAPZ(bool aScrollable) = 0;




  virtual void SetZoomableByAPZ(bool aZoomable) = 0;




  virtual bool UsesContainerScrolling() const = 0;
# 449 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIScrollableFrame.h"
  virtual bool DecideScrollableLayer(nsDisplayListBuilder* aBuilder,
                                     nsRect* aDirtyRect,
                                     bool aAllowCreateDisplayPort) = 0;






  virtual void NotifyApproximateFrameVisibilityUpdate(bool aIgnoreDisplayPort) = 0;






  virtual bool GetDisplayPortAtLastApproximateFrameVisibilityUpdate(nsRect* aDisplayPort) = 0;






  virtual void TriggerDisplayPortExpiration() = 0;




  virtual ScrollSnapInfo GetScrollSnapInfo() const = 0;







  virtual bool DragScroll(mozilla::WidgetEvent* aEvent) = 0;

  virtual void AsyncScrollbarDragRejected() = 0;






  virtual bool IsRootScrollFrameOfDocument() const = 0;
};
# 32 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISMILAttr.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISMILAttr.h"
class nsSMILValue;
class nsIContent;
class nsAString;

namespace mozilla {
namespace dom {
class SVGAnimationElement;
}
}
# 31 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISMILAttr.h"
class nsISMILAttr
{
public:
# 53 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISMILAttr.h"
  virtual nsresult ValueFromString(const nsAString& aStr,
                                   const mozilla::dom::SVGAnimationElement* aSrcElement,
                                   nsSMILValue& aValue,
                                   bool& aPreventCachingOfSandwich) const = 0;







  virtual nsSMILValue GetBaseValue() const = 0;







  virtual void ClearAnimValue() = 0;







  virtual nsresult SetAnimValue(const nsSMILValue& aValue) = 0;
# 90 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsISMILAttr.h"
  virtual const nsIContent* GetTargetNode() const { return nullptr; }




  virtual ~nsISMILAttr() {}
};
# 34 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRect.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRect.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMClientRect.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMClientRect.h"
class nsIDOMClientRect : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetLeft(float *aLeft) = 0;


  virtual nsresult GetTop(float *aTop) = 0;


  virtual nsresult GetRight(float *aRight) = 0;


  virtual nsresult GetBottom(float *aBottom) = 0;


  virtual nsresult GetWidth(float *aWidth) = 0;


  virtual nsresult GetHeight(float *aHeight) = 0;

};

  template<typename T> struct nsIDOMClientRect::COMTypeInfo<nsIDOMClientRect, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMClientRect::COMTypeInfo<nsIDOMClientRect, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xb2f824c4, 0xd9d3, 0x499b, { 0x8d, 0x3b, 0x45, 0xc8, 0x24, 0x54, 0x97, 0xc6 }};
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRect.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMClientRectList.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMClientRectList.h"
class nsIDOMClientRectList : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetLength(uint32_t *aLength) = 0;


  virtual nsresult Item(uint32_t index, nsIDOMClientRect * *_retval) = 0;

};

  template<typename T> struct nsIDOMClientRectList::COMTypeInfo<nsIDOMClientRectList, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMClientRectList::COMTypeInfo<nsIDOMClientRectList, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xf474c567, 0xcbcb, 0x458f, { 0xab, 0xad, 0xae, 0x42, 0x36, 0x3d, 0xa2, 0x87 }};
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRect.h" 2
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRect.h"
struct nsRect;

namespace mozilla {
namespace dom {

class DOMRectReadOnly : public nsISupports
                      , public nsWrapperCache
{
protected:
  virtual ~DOMRectReadOnly() {}

public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "DOMRectReadOnly"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<DOMRectReadOnly>(p)->DeleteCycleCollectable(); } static DOMRectReadOnly* Downcast(nsISupports* s) { return static_cast<DOMRectReadOnly*>(static_cast<DOMRectReadOnly*>(s)); } static nsISupports* Upcast(DOMRectReadOnly *p) { return static_cast<nsISupports*>(static_cast<DOMRectReadOnly*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &DOMRectReadOnly::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

  explicit DOMRectReadOnly(nsISupports* aParent)
    : mParent(aParent)
  {
  }

  nsISupports* GetParentObject() const
  {
    do { } while (0);
    return mParent;
  }
  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;

  virtual double X() const = 0;
  virtual double Y() const = 0;
  virtual double Width() const = 0;
  virtual double Height() const = 0;

  double Left() const
  {
    double x = X(), w = Width();
    return std::min(x, x + w);
  }
  double Top() const
  {
    double y = Y(), h = Height();
    return std::min(y, y + h);
  }
  double Right() const
  {
    double x = X(), w = Width();
    return std::max(x, x + w);
  }
  double Bottom() const
  {
    double y = Y(), h = Height();
    return std::max(y, y + h);
  }

protected:
  nsCOMPtr<nsISupports> mParent;
};

class DOMRect final : public DOMRectReadOnly
                    , public nsIDOMClientRect
{
public:
  explicit DOMRect(nsISupports* aParent, double aX = 0, double aY = 0,
                   double aWidth = 0, double aHeight = 0)
    : DOMRectReadOnly(aParent)
    , mX(aX)
    , mY(aY)
    , mWidth(aWidth)
    , mHeight(aHeight)
  {
  }

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override;
  virtual nsresult GetLeft(float *aLeft) override; virtual nsresult GetTop(float *aTop) override; virtual nsresult GetRight(float *aRight) override; virtual nsresult GetBottom(float *aBottom) override; virtual nsresult GetWidth(float *aWidth) override; virtual nsresult GetHeight(float *aHeight) override;

  static already_AddRefed<DOMRect>
  Constructor(const GlobalObject& aGlobal, ErrorResult& aRV);
  static already_AddRefed<DOMRect>
  Constructor(const GlobalObject& aGlobal, double aX, double aY,
              double aWidth, double aHeight, ErrorResult& aRV);

  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;

  void SetRect(float aX, float aY, float aWidth, float aHeight) {
    mX = aX; mY = aY; mWidth = aWidth; mHeight = aHeight;
  }
  void SetLayoutRect(const nsRect& aLayoutRect);

  virtual double X() const override
  {
    return mX;
  }
  virtual double Y() const override
  {
    return mY;
  }
  virtual double Width() const override
  {
    return mWidth;
  }
  virtual double Height() const override
  {
    return mHeight;
  }

  void SetX(double aX)
  {
    mX = aX;
  }
  void SetY(double aY)
  {
    mY = aY;
  }
  void SetWidth(double aWidth)
  {
    mWidth = aWidth;
  }
  void SetHeight(double aHeight)
  {
    mHeight = aHeight;
  }

protected:
  double mX, mY, mWidth, mHeight;

private:
  ~DOMRect() {};
};

class DOMRectList final : public nsIDOMClientRectList,
                          public nsWrapperCache
{
  ~DOMRectList() {}

public:
  explicit DOMRectList(nsISupports *aParent) : mParent(aParent)
  {
  }

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "DOMRectList"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<DOMRectList>(p)->DeleteCycleCollectable(); } static DOMRectList* Downcast(nsISupports* s) { return static_cast<DOMRectList*>(static_cast<DOMRectList*>(s)); } static nsISupports* Upcast(DOMRectList *p) { return static_cast<nsISupports*>(static_cast<DOMRectList*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &DOMRectList::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

  virtual nsresult GetLength(uint32_t *aLength) override; virtual nsresult Item(uint32_t index, nsIDOMClientRect * *_retval) override;

  virtual JSObject* WrapObject(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override;

  nsISupports* GetParentObject()
  {
    return mParent;
  }

  void Append(DOMRect* aElement) { mArray.AppendElement(aElement); }

  static DOMRectList* FromSupports(nsISupports* aSupports)
  {
# 187 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRect.h"
    return static_cast<DOMRectList*>(aSupports);
  }

  uint32_t Length()
  {
    return mArray.Length();
  }
  DOMRect* Item(uint32_t aIndex)
  {
    return mArray.SafeElementAt(aIndex);
  }
  DOMRect* IndexedGetter(uint32_t aIndex, bool& aFound)
  {
    aFound = aIndex < mArray.Length();
    if (!aFound) {
      return nullptr;
    }
    return mArray[aIndex];
  }

protected:
  nsTArray<RefPtr<DOMRect> > mArray;
  nsCOMPtr<nsISupports> mParent;
};

}
}
# 35 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMTokenListSupportedTokens.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMTokenListSupportedTokens.h"
namespace mozilla {
namespace dom {


typedef const char* const DOMTokenListSupportedToken;






typedef DOMTokenListSupportedToken* DOMTokenListSupportedTokenArray;

}
}
# 39 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ElementBinding.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ElementBinding.h"
namespace mozilla {
namespace dom {

class Element;
struct ElementAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;
struct ScrollIntoViewOptionsAtoms;

}
}

namespace mozilla {
namespace dom {

enum class ScrollLogicalPosition : uint8_t {
  Start,
  End,
  EndGuard_
};

namespace ScrollLogicalPositionValues {
extern const EnumEntry strings[3];
}

bool
ToJSValue(JSContext* aCx, ScrollLogicalPosition aArgument, JS::MutableHandle<JS::Value> aValue);


struct ScrollIntoViewOptions : public ScrollOptions
{
                        ScrollLogicalPosition mBlock;

  ScrollIntoViewOptions();

  explicit inline ScrollIntoViewOptions(const FastDictionaryInitializer& )
    : ScrollOptions(FastDictionaryInitializer())
  {

  }

  explicit inline ScrollIntoViewOptions(const ScrollIntoViewOptions& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  Init(const nsAString& aJSON);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  bool
  ToJSON(nsAString& aJSON) const;

  void
  TraceDictionary(JSTracer* trc);

  ScrollIntoViewOptions&
  operator=(const ScrollIntoViewOptions& aOther);

private:
  static bool
  InitIds(JSContext* cx, ScrollIntoViewOptionsAtoms* atomsCache);
};

namespace binding_detail {
struct FastScrollIntoViewOptions : public ScrollIntoViewOptions
{
  inline FastScrollIntoViewOptions()
    : ScrollIntoViewOptions(FastDictionaryInitializer())
  {

  }
};
}


namespace ElementBinding {

  typedef mozilla::dom::Element NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::Element* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 121 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/ElementBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JSObject*
  GetProtoObject(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 41 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMIntersectionObserver.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMIntersectionObserver.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/IntersectionObserverBinding.h" 1





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRectBinding.h" 1
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRectBinding.h"
namespace mozilla {
namespace dom {

class DOMRect;
struct DOMRectAtoms;
struct DOMRectInitAtoms;
class DOMRectReadOnly;
struct DOMRectReadOnlyAtoms;
struct NativePropertyHooks;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

struct DOMRectInit : public DictionaryBase
{
                        double mHeight;
                        double mWidth;
                        double mX;
                        double mY;

  DOMRectInit();

  explicit inline DOMRectInit(const FastDictionaryInitializer& )
  {

  }

  explicit inline DOMRectInit(const DOMRectInit& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);

  DOMRectInit&
  operator=(const DOMRectInit& aOther);

private:
  static bool
  InitIds(JSContext* cx, DOMRectInitAtoms* atomsCache);
};

namespace binding_detail {
struct FastDOMRectInit : public DOMRectInit
{
  inline FastDOMRectInit()
    : DOMRectInit(FastDictionaryInitializer())
  {

  }
};
}


namespace DOMRectBinding {

  typedef mozilla::dom::DOMRect NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::DOMRect* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 104 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRectBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



namespace DOMRectReadOnlyBinding {

  typedef mozilla::dom::DOMRectReadOnly NativeType;

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::DOMRectReadOnly* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 149 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMRectBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JSObject*
  GetProtoObject(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 7 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/IntersectionObserverBinding.h" 2





# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/IntersectionObserverBinding.h" 2





namespace mozilla {
namespace dom {

class DOMIntersectionObserver;
struct DOMIntersectionObserverAtoms;
class DOMIntersectionObserverEntry;
struct DOMIntersectionObserverEntryAtoms;
struct DOMRectInit;
class DoubleOrDoubleSequence;
class Element;
class IntersectionCallback;
struct IntersectionObserverEntryInitAtoms;
struct IntersectionObserverInitAtoms;
struct NativePropertyHooks;
class OwningDoubleOrDoubleSequence;
class ProtoAndIfaceCache;

}
}

namespace mozilla {
namespace dom {

class DoubleOrDoubleSequence
{
  friend class DoubleOrDoubleSequenceArgument;
  enum Type
  {
    eUninitialized,
    eDouble,
    eDoubleSequence
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<binding_detail::AutoSequence<double> > mDoubleSequence;

  };

  Type mType;
  Value mValue;

  DoubleOrDoubleSequence(const DoubleOrDoubleSequence&) = delete;
  DoubleOrDoubleSequence& operator=(const DoubleOrDoubleSequence&) = delete;
public:
  explicit inline DoubleOrDoubleSequence()
    : mType(eUninitialized)
  {
  }

  inline ~DoubleOrDoubleSequence()
  {
    Uninit();
  }

  inline double&
  RawSetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    do { } while (0);
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline double&
  SetAsDouble()
  {
    if (mType == eDouble) {
      return mValue.mDouble.Value();
    }
    Uninit();
    mType = eDouble;
    return mValue.mDouble.SetValue();
  }

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline binding_detail::AutoSequence<double>&
  RawSetAsDoubleSequence()
  {
    if (mType == eDoubleSequence) {
      return mValue.mDoubleSequence.Value();
    }
    do { } while (0);
    mType = eDoubleSequence;
    return mValue.mDoubleSequence.SetValue();
  }

  inline binding_detail::AutoSequence<double>&
  SetAsDoubleSequence()
  {
    if (mType == eDoubleSequence) {
      return mValue.mDoubleSequence.Value();
    }
    Uninit();
    mType = eDoubleSequence;
    return mValue.mDoubleSequence.SetValue();
  }

  inline bool
  IsDoubleSequence() const
  {
    return mType == eDoubleSequence;
  }

  inline binding_detail::AutoSequence<double>&
  GetAsDoubleSequence()
  {
    do { } while (0);
    return mValue.mDoubleSequence.Value();
  }

  inline const Sequence<double>&
  GetAsDoubleSequence() const
  {
    do { } while (0);
    return mValue.mDoubleSequence.Value();
  }

  inline void
  Uninit()
  {
    switch (mType) {
      case eUninitialized: {
        break;
      }
      case eDouble: {
        DestroyDouble();
        break;
      }
      case eDoubleSequence: {
        DestroyDoubleSequence();
        break;
      }
    }
  }

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

private:
  inline void
  DestroyDouble()
  {
    do { } while (0);
    mValue.mDouble.Destroy();
    mType = eUninitialized;
  }

  inline void
  DestroyDoubleSequence()
  {
    do { } while (0);
    mValue.mDoubleSequence.Destroy();
    mType = eUninitialized;
  }
};


class OwningDoubleOrDoubleSequence : public AllOwningUnionBase
{
  friend void ImplCycleCollectionUnlink(OwningDoubleOrDoubleSequence& aUnion);
  enum Type
  {
    eUninitialized,
    eDouble,
    eDoubleSequence
  };

  union Value
  {
    UnionMember<double > mDouble;
    UnionMember<Sequence<double> > mDoubleSequence;

  };

  Type mType;
  Value mValue;

public:
  explicit inline OwningDoubleOrDoubleSequence()
    : mType(eUninitialized)
  {
  }

  explicit inline OwningDoubleOrDoubleSequence(const OwningDoubleOrDoubleSequence& aOther)
    : mType(eUninitialized)
  {
    *this = aOther;
  }

  inline ~OwningDoubleOrDoubleSequence()
  {
    Uninit();
  }

  double&
  RawSetAsDouble();

  double&
  SetAsDouble();

  bool
  TrySetToDouble(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsDouble() const
  {
    return mType == eDouble;
  }

  inline double&
  GetAsDouble()
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  inline double const &
  GetAsDouble() const
  {
    do { } while (0);
    return mValue.mDouble.Value();
  }

  Sequence<double>&
  RawSetAsDoubleSequence();

  Sequence<double>&
  SetAsDoubleSequence();

  bool
  TrySetToDoubleSequence(JSContext* cx, JS::Handle<JS::Value> value, bool& tryNext, bool passedToJSImpl = false);

  inline bool
  IsDoubleSequence() const
  {
    return mType == eDoubleSequence;
  }

  inline Sequence<double>&
  GetAsDoubleSequence()
  {
    do { } while (0);
    return mValue.mDoubleSequence.Value();
  }

  inline Sequence<double> const &
  GetAsDoubleSequence() const
  {
    do { } while (0);
    return mValue.mDoubleSequence.Value();
  }

  void
  Uninit();

  bool
  ToJSVal(JSContext* cx, JS::Handle<JSObject*> scopeObj, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceUnion(JSTracer* trc);

  OwningDoubleOrDoubleSequence&
  operator=(const OwningDoubleOrDoubleSequence& aOther);

private:
  void
  DestroyDouble();

  void
  DestroyDoubleSequence();
};


struct IntersectionObserverEntryInit : public DictionaryBase
{
                        DOMRectInit mBoundingClientRect;
                        DOMRectInit mIntersectionRect;
                        DOMRectInit mRootBounds;
                        OwningNonNull<mozilla::dom::Element> mTarget;
                        double mTime;

  IntersectionObserverEntryInit();

  explicit inline IntersectionObserverEntryInit(const FastDictionaryInitializer& )
    : mBoundingClientRect(FastDictionaryInitializer()),
      mIntersectionRect(FastDictionaryInitializer()),
      mRootBounds(FastDictionaryInitializer())
  {

  }

  explicit inline IntersectionObserverEntryInit(const IntersectionObserverEntryInit& aOther)
    : mBoundingClientRect(FastDictionaryInitializer()),
      mIntersectionRect(FastDictionaryInitializer()),
      mRootBounds(FastDictionaryInitializer())
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);

  IntersectionObserverEntryInit&
  operator=(const IntersectionObserverEntryInit& aOther);

private:
  static bool
  InitIds(JSContext* cx, IntersectionObserverEntryInitAtoms* atomsCache);
};

namespace binding_detail {
struct FastIntersectionObserverEntryInit : public IntersectionObserverEntryInit
{
  inline FastIntersectionObserverEntryInit()
    : IntersectionObserverEntryInit(FastDictionaryInitializer())
  {

  }
};
}


struct IntersectionObserverInit : public DictionaryBase
{
                        RefPtr<mozilla::dom::Element> mRoot;
                        nsString mRootMargin;
                        OwningDoubleOrDoubleSequence mThreshold;

  IntersectionObserverInit();

  explicit inline IntersectionObserverInit(const FastDictionaryInitializer& )
  {

  }

  explicit inline IntersectionObserverInit(const IntersectionObserverInit& aOther)
  {
    *this = aOther;
  }

  bool
  Init(JSContext* cx, JS::Handle<JS::Value> val, const char* sourceDescription = "Value", bool passedToJSImpl = false);

  bool
  ToObjectInternal(JSContext* cx, JS::MutableHandle<JS::Value> rval) const;

  void
  TraceDictionary(JSTracer* trc);

  IntersectionObserverInit&
  operator=(const IntersectionObserverInit& aOther);

private:
  static bool
  InitIds(JSContext* cx, IntersectionObserverInitAtoms* atomsCache);
};

namespace binding_detail {
struct FastIntersectionObserverInit : public IntersectionObserverInit
{
  inline FastIntersectionObserverInit()
    : IntersectionObserverInit(FastDictionaryInitializer())
  {

  }
};
}


class IntersectionCallback : public CallbackFunction
{
public:
  explicit inline IntersectionCallback(JSContext* aCx, JS::Handle<JSObject*> aCallback, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCx, aCallback, aIncumbentGlobal)
  {
    do { } while (0);
  }

  explicit inline IntersectionCallback(JS::Handle<JSObject*> aCallback, const FastCallbackConstructor& )
    : CallbackFunction(aCallback, FastCallbackConstructor())
  {
    do { } while (0);
  }

  explicit inline IntersectionCallback(JS::Handle<JSObject*> aCallback, JS::Handle<JSObject*> aAsyncStack, nsIGlobalObject* aIncumbentGlobal)
    : CallbackFunction(aCallback, aAsyncStack, aIncumbentGlobal)
  {
    do { } while (0);
  }

  explicit inline IntersectionCallback(CallbackFunction* aOther)
    : CallbackFunction(aOther)
  {
  }

  template <typename T>
  inline void
  Call(const T& thisVal, const Sequence<OwningNonNull<DOMIntersectionObserverEntry>>& entries, DOMIntersectionObserver& observer, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "IntersectionCallback";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    JS::Rooted<JS::Value> thisValJS(s.GetContext());
    if (!ToJSValue(s.GetContext(), thisVal, &thisValJS)) {
      aRv.Throw(NS_ERROR_FAILURE);
      return;
    }
    return Call(s.GetContext(), thisValJS, entries, observer, aRv);
  }

  inline void
  Call(const Sequence<OwningNonNull<DOMIntersectionObserverEntry>>& entries, DOMIntersectionObserver& observer, ErrorResult& aRv, const char* aExecutionReason = nullptr, ExceptionHandling aExceptionHandling = eReportExceptions, JSCompartment* aCompartment = nullptr)
  {
    do { } while (0);
    if (!aExecutionReason) {
      aExecutionReason = "IntersectionCallback";
    }
    CallSetup s(this, aRv, aExecutionReason, aExceptionHandling, aCompartment);
    if (!s.GetContext()) {
      do { } while (0);
      return;
    }
    return Call(s.GetContext(), JS::UndefinedHandleValue, entries, observer, aRv);
  }

  template <typename T>
  inline void
  Call(const T& thisVal, const Sequence<OwningNonNull<DOMIntersectionObserverEntry>>& entries, DOMIntersectionObserver& observer, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(thisVal, entries, observer, rv, aExecutionReason);
  }

  inline void
  Call(const Sequence<OwningNonNull<DOMIntersectionObserverEntry>>& entries, DOMIntersectionObserver& observer, const char* aExecutionReason = nullptr)
  {
    IgnoredErrorResult rv;
    return Call(entries, observer, rv, aExecutionReason, eReportExceptions, nullptr);
  }

  inline bool
  operator==(const IntersectionCallback& aOther) const
  {
    return CallbackFunction::operator==(aOther);
  }

private:
  void Call(JSContext* cx, JS::Handle<JS::Value> aThisVal, const Sequence<OwningNonNull<DOMIntersectionObserverEntry>>& entries, DOMIntersectionObserver& observer, ErrorResult& aRv);
};


namespace binding_detail {
class FastIntersectionCallback : public IntersectionCallback
{
public:
  explicit inline FastIntersectionCallback(JS::Handle<JSObject*> aCallback)
    : IntersectionCallback(aCallback, FastCallbackConstructor())
  {
  }

  inline void
  Trace(JSTracer* aTracer)
  {
    IntersectionCallback::Trace(aTracer);
  }

  inline void
  FinishSlowJSInitIfMoreThanOneOwner(JSContext* aCx)
  {
    IntersectionCallback::FinishSlowJSInitIfMoreThanOneOwner(aCx);
  }
};
}


namespace IntersectionObserverBinding {

  typedef mozilla::dom::DOMIntersectionObserver NativeType;

  bool
  ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj);

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::DOMIntersectionObserver* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 558 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/IntersectionObserverBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



namespace IntersectionObserverEntryBinding {

  typedef mozilla::dom::DOMIntersectionObserverEntry NativeType;

  bool
  ConstructorEnabled(JSContext* aCx, JS::Handle<JSObject*> aObj);

  JSObject*
  DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal);

  const JSClass*
  GetJSClass();

  bool
  Wrap(JSContext* aCx, mozilla::dom::DOMIntersectionObserverEntry* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector);

  template <class T>
  inline JSObject* Wrap(JSContext* aCx, T* aObject, JS::Handle<JSObject*> aGivenProto)
  {
    JS::Rooted<JSObject*> reflector(aCx);
    return Wrap(aCx, aObject, aObject, aGivenProto, &reflector) ? reflector.get() : nullptr;
  }
# 606 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/IntersectionObserverBinding.h"
  extern const NativePropertyHooks sNativePropertyHooks[];

  void
  CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal);

  JS::Handle<JSObject*>
  GetProtoObjectHandle(JSContext* aCx);

  JS::Handle<JSObject*>
  GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal = true);

  JSObject*
  GetConstructorObject(JSContext* aCx);

}



}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/DOMIntersectionObserver.h" 2



using mozilla::dom::DOMRect;
using mozilla::dom::Element;

namespace mozilla {
namespace dom {

class DOMIntersectionObserver;

class DOMIntersectionObserverEntry final : public nsISupports,
                                           public nsWrapperCache
{
  ~DOMIntersectionObserverEntry() {}

public:
  DOMIntersectionObserverEntry(nsISupports* aOwner,
                               DOMHighResTimeStamp aTime,
                               RefPtr<DOMRect> aRootBounds,
                               RefPtr<DOMRect> aBoundingClientRect,
                               RefPtr<DOMRect> aIntersectionRect,
                               bool aIsIntersecting,
                               Element* aTarget,
                               double aIntersectionRatio)
  : mOwner(aOwner),
    mTime(aTime),
    mRootBounds(aRootBounds),
    mBoundingClientRect(aBoundingClientRect),
    mIntersectionRect(aIntersectionRect),
    mIsIntersecting(aIsIntersecting),
    mTarget(aTarget),
    mIntersectionRatio(aIntersectionRatio)
  {
  }
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "DOMIntersectionObserverEntry"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<DOMIntersectionObserverEntry>(p)->DeleteCycleCollectable(); } static DOMIntersectionObserverEntry* Downcast(nsISupports* s) { return static_cast<DOMIntersectionObserverEntry*>(static_cast<DOMIntersectionObserverEntry*>(s)); } static nsISupports* Upcast(DOMIntersectionObserverEntry *p) { return static_cast<nsISupports*>(static_cast<DOMIntersectionObserverEntry*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &DOMIntersectionObserverEntry::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

  nsISupports* GetParentObject() const
  {
    return mOwner;
  }

  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override
  {
    return mozilla::dom::IntersectionObserverEntryBinding::Wrap(aCx, this, aGivenProto);
  }

  DOMHighResTimeStamp Time()
  {
    return mTime;
  }

  DOMRect* GetRootBounds()
  {
    return mRootBounds;
  }

  DOMRect* BoundingClientRect()
  {
    return mBoundingClientRect;
  }

  DOMRect* IntersectionRect()
  {
    return mIntersectionRect;
  }

  bool IsIntersecting()
  {
    return mIsIntersecting;
  }

  double IntersectionRatio()
  {
    return mIntersectionRatio;
  }

  Element* Target()
  {
    return mTarget;
  }

protected:
  nsCOMPtr<nsISupports> mOwner;
  DOMHighResTimeStamp mTime;
  RefPtr<DOMRect> mRootBounds;
  RefPtr<DOMRect> mBoundingClientRect;
  RefPtr<DOMRect> mIntersectionRect;
  bool mIsIntersecting;
  RefPtr<Element> mTarget;
  double mIntersectionRatio;
};





class DOMIntersectionObserver final : public nsISupports,
                                      public nsWrapperCache
{
  virtual ~DOMIntersectionObserver() {
    Disconnect();
  }

public:
  DOMIntersectionObserver(already_AddRefed<nsPIDOMWindowInner>&& aOwner,
                          mozilla::dom::IntersectionCallback& aCb)
  : mOwner(aOwner), mDocument(mOwner->GetExtantDoc()), mCallback(&aCb), mConnected(false)
  {
  }
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "DOMIntersectionObserver"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<DOMIntersectionObserver>(p)->DeleteCycleCollectable(); } static DOMIntersectionObserver* Downcast(nsISupports* s) { return static_cast<DOMIntersectionObserver*>(static_cast<DOMIntersectionObserver*>(s)); } static nsISupports* Upcast(DOMIntersectionObserver *p) { return static_cast<nsISupports*>(static_cast<DOMIntersectionObserver*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &DOMIntersectionObserver::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;
  template<typename T, typename U> struct COMTypeInfo;

  static already_AddRefed<DOMIntersectionObserver>
  Constructor(const mozilla::dom::GlobalObject& aGlobal,
              mozilla::dom::IntersectionCallback& aCb,
              mozilla::ErrorResult& aRv);
  static already_AddRefed<DOMIntersectionObserver>
  Constructor(const mozilla::dom::GlobalObject& aGlobal,
              mozilla::dom::IntersectionCallback& aCb,
              const mozilla::dom::IntersectionObserverInit& aOptions,
              mozilla::ErrorResult& aRv);

  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override
  {
    return mozilla::dom::IntersectionObserverBinding::Wrap(aCx, this, aGivenProto);
  }

  nsISupports* GetParentObject() const
  {
    return mOwner;
  }

  Element* GetRoot() const {
    return mRoot;
  }

  void GetRootMargin(mozilla::dom::DOMString& aRetVal);
  void GetThresholds(nsTArray<double>& aRetVal);
  void Observe(Element& aTarget);
  void Unobserve(Element& aTarget);

  void UnlinkTarget(Element& aTarget);
  void Disconnect();

  void TakeRecords(nsTArray<RefPtr<DOMIntersectionObserverEntry>>& aRetVal);

  mozilla::dom::IntersectionCallback* IntersectionCallback() { return mCallback; }

  bool SetRootMargin(const nsAString& aString);

  void Update(nsIDocument* aDocument, DOMHighResTimeStamp time);
  void Notify();

protected:
  void Connect();
  void QueueIntersectionObserverEntry(Element* aTarget,
                                      DOMHighResTimeStamp time,
                                      const Maybe<nsRect>& aRootRect,
                                      const nsRect& aTargetRect,
                                      const Maybe<nsRect>& aIntersectionRect,
                                      double aIntersectionRatio);

  nsCOMPtr<nsPIDOMWindowInner> mOwner;
  RefPtr<nsIDocument> mDocument;
  RefPtr<mozilla::dom::IntersectionCallback> mCallback;
  RefPtr<Element> mRoot;
  nsCSSRect mRootMargin;
  nsTArray<double> mThresholds;
  nsTHashtable<nsPtrHashKey<Element>> mObservationTargets;
  nsTArray<RefPtr<DOMIntersectionObserverEntry>> mQueuedEntries;
  bool mConnected;
};

template<typename T> struct DOMIntersectionObserver::COMTypeInfo<DOMIntersectionObserver, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID DOMIntersectionObserver::COMTypeInfo<DOMIntersectionObserver, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0x8570a575, 0xe303, 0x4d18, { 0xb6, 0xb1, 0x4d, 0x2b, 0x49, 0xd8, 0xef, 0x94 } };

}
}
# 45 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h" 2

class mozAutoDocUpdate;
class nsIFrame;
class nsIDOMMozNamedAttrMap;
class nsIMozBrowserFrame;
class nsIURI;
class nsIScrollableFrame;
class nsAttrValueOrString;
class nsContentList;
class nsDOMTokenList;
struct nsRect;
class nsFocusManager;
class nsGlobalWindow;
class nsICSSDeclaration;
class nsISMILAttr;
class nsDocument;
class nsDOMStringMap;

namespace mozilla {
class DeclarationBlock;
namespace dom {
  struct AnimationFilter;
  struct ScrollIntoViewOptions;
  struct ScrollToOptions;
  class DOMIntersectionObserver;
  class ElementOrCSSPseudoElement;
  class UnrestrictedDoubleOrKeyframeAnimationOptions;
  enum class CallerType : uint32_t;
}
}


already_AddRefed<nsContentList>
NS_GetContentList(nsINode* aRootNode,
                  int32_t aMatchNameSpaceId,
                  const nsAString& aTagname);




enum {

  ELEMENT_HAS_PENDING_RESTYLE = NODE_SHARED_RESTYLE_BIT_1,




  ELEMENT_IS_POTENTIAL_RESTYLE_ROOT = NODE_SHARED_RESTYLE_BIT_2,





  ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (NODE_TYPE_SPECIFIC_BITS_OFFSET + (0)))),




  ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (NODE_TYPE_SPECIFIC_BITS_OFFSET + (1)))),



  ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (NODE_TYPE_SPECIFIC_BITS_OFFSET + (2)))),


  ELEMENT_PENDING_RESTYLE_FLAGS =
    ELEMENT_HAS_PENDING_RESTYLE |
    ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE,


  ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS =
    ELEMENT_IS_POTENTIAL_RESTYLE_ROOT |
    ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT,


  ELEMENT_ALL_RESTYLE_FLAGS = ELEMENT_PENDING_RESTYLE_FLAGS |
                              ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS |
                              ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR,


  ELEMENT_HAS_SCROLLGRAB = (nsWrapperCache::FlagsType(1U) << (WRAPPER_CACHE_FLAGS_BITS_USED + (NODE_TYPE_SPECIFIC_BITS_OFFSET + (3)))),


  ELEMENT_TYPE_SPECIFIC_BITS_OFFSET = NODE_TYPE_SPECIFIC_BITS_OFFSET + 4
};




static_assert(WRAPPER_CACHE_FLAGS_BITS_USED + (ELEMENT_TYPE_SPECIFIC_BITS_OFFSET) <= sizeof(nsWrapperCache::FlagsType) * 8, "Not enough space for our bits");

namespace mozilla {
enum class CSSPseudoElementType : uint8_t;
class EventChainPostVisitor;
class EventChainPreVisitor;
class EventChainVisitor;
class EventListenerManager;
class EventStateManager;

namespace dom {

class Animation;
class CustomElementRegistry;
class Link;
class DOMRect;
class DOMRectList;
class DestinationInsertionPointList;
class Grid;






class Element : public FragmentOrElement
{
public:

  explicit Element(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo) :
    FragmentOrElement(aNodeInfo),
    mState((mozilla::EventStates(mozilla::EventStates::InternalType(1) << 29)))
  {
    do { } while (0);

    SetIsElement();
  }

  ~Element()
  {

    do { } while(0);

  }



  template<typename T, typename U> struct COMTypeInfo;

  virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override;





  EventStates State() const
  {


    return mState;
  }
# 206 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  void UpdateState(bool aNotify);




  void UpdateLinkState(EventStates aState);

  virtual int32_t TabIndexDefault()
  {
    return -1;
  }




  int32_t TabIndex();




  void SetTabIndex(int32_t aTabIndex, mozilla::ErrorResult& aError);




  virtual void Focus(mozilla::ErrorResult& aError);




  virtual void Blur(mozilla::ErrorResult& aError);





  EventStates StyleState() const
  {
    if (!HasLockedStyleStates()) {
      return mState;
    }
    return StyleStateFromLocks();
  }





  struct StyleStateLocks {

    EventStates mLocks;

    EventStates mValues;
  };




  StyleStateLocks LockedStyleStates() const;





  void LockStyleStates(EventStates aStates, bool aEnabled);




  void UnlockStyleStates(EventStates aStates);




  void ClearStyleStateLocks();




  DeclarationBlock* GetInlineStyleDeclaration() const;




  const nsMappedAttributes* GetMappedAttributes() const;

  void ClearMappedServoStyle() {
    mAttrsAndChildren.ClearMappedServoStyle();
  }





  virtual nsresult SetInlineStyleDeclaration(DeclarationBlock* aDeclaration,
                                             const nsAString* aSerialized,
                                             bool aNotify);





  virtual DeclarationBlock* GetSMILOverrideStyleDeclaration();






  virtual nsresult SetSMILOverrideStyleDeclaration(
    DeclarationBlock* aDeclaration, bool aNotify);





  virtual UniquePtr<nsISMILAttr> GetAnimatedAttr(int32_t aNamespaceID,
                                                 nsIAtom* aName)
  {
    return nullptr;
  }
# 336 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual nsICSSDeclaration* GetSMILOverrideStyle();




  virtual bool IsLabelable() const;




  virtual bool IsInteractiveHTMLContent(bool aIgnoreTabindex) const;
# 356 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual nsIMozBrowserFrame* GetAsMozBrowserFrame() { return nullptr; }
# 365 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual bool IsAttributeMapped(const nsIAtom* aAttribute) const;







  virtual nsChangeHint GetAttributeChangeHint(const nsIAtom* aAttribute,
                                              int32_t aModType) const;

  inline Directionality GetDirectionality() const {
    if (HasFlag(NODE_HAS_DIRECTION_RTL)) {
      return eDir_RTL;
    }

    if (HasFlag(NODE_HAS_DIRECTION_LTR)) {
      return eDir_LTR;
    }

    return eDir_NotSet;
  }

  inline void SetDirectionality(Directionality aDir, bool aNotify) {
    UnsetFlags(NODE_ALL_DIRECTION_FLAGS);
    if (!aNotify) {
      RemoveStatesSilently(((mozilla::EventStates(mozilla::EventStates::InternalType(1) << 44)) | (mozilla::EventStates(mozilla::EventStates::InternalType(1) << 45))));
    }

    switch (aDir) {
      case (eDir_RTL):
        SetFlags(NODE_HAS_DIRECTION_RTL);
        if (!aNotify) {
          AddStatesSilently((mozilla::EventStates(mozilla::EventStates::InternalType(1) << 45)));
        }
        break;

      case(eDir_LTR):
        SetFlags(NODE_HAS_DIRECTION_LTR);
        if (!aNotify) {
          AddStatesSilently((mozilla::EventStates(mozilla::EventStates::InternalType(1) << 44)));
        }
        break;

      default:
        break;
    }






    if (aNotify) {
      UpdateState(true);
    }
  }

  bool GetBindingURL(nsIDocument* aDocument, css::URLValue **aResult);





  inline bool HasDirAuto() const {
    return (!HasFixedDir() &&
            (HasValidDir() || IsHTMLElement(nsGkAtoms::bdi)));
  }

  Directionality GetComputedDirectionality() const;

  inline Element* GetFlattenedTreeParentElement() const;
  inline Element* GetFlattenedTreeParentElementForStyle() const;

  bool HasDirtyDescendantsForServo() const
  {
    do { } while (0);
    return HasFlag(NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
  }

  void SetHasDirtyDescendantsForServo() {
    do { } while (0);
    SetFlags(NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
  }

  void UnsetHasDirtyDescendantsForServo() {
    do { } while (0);
    UnsetFlags(NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO);
  }

  inline void NoteDirtyDescendantsForServo();





  bool HasServoData() const {

    return !!mServoData.Get();



  }

  void ClearServoData();







  inline CustomElementData* GetCustomElementData() const
  {
    nsDOMSlots *slots = GetExistingDOMSlots();
    if (slots) {
      return slots->mCustomElementData;
    }
    return nullptr;
  }







  void SetCustomElementData(CustomElementData* aData);

protected:






  virtual EventStates IntrinsicState() const;







  void AddStatesSilently(EventStates aStates)
  {
    mState |= aStates;
  }







  void RemoveStatesSilently(EventStates aStates)
  {
    mState &= ~aStates;
  }

private:


  friend class mozilla::EventStateManager;
  friend class ::nsGlobalWindow;
  friend class ::nsFocusManager;


  friend class CustomElementRegistry;


  friend class Link;

  void NotifyStateChange(EventStates aStates);

  void NotifyStyleStateChange(EventStates aStates);


  EventStates StyleStateFromLocks() const;

protected:




  virtual void AddStates(EventStates aStates)
  {
    do { } while(0);

    AddStatesSilently(aStates);
    NotifyStateChange(aStates);
  }
  virtual void RemoveStates(EventStates aStates)
  {
    do { } while(0);

    RemoveStatesSilently(aStates);
    NotifyStateChange(aStates);
  }
public:

  void AddManuallyManagedStates(EventStates aStates)
  {
    do { } while (0);

    AddStates(aStates);
  }
  void RemoveManuallyManagedStates(EventStates aStates)
  {
    do { } while (0);

    RemoveStates(aStates);
  }

  virtual void UpdateEditableState(bool aNotify) override;

  virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                              nsIContent* aBindingParent,
                              bool aCompileEventHandlers) override;
  virtual void UnbindFromTree(bool aDeep = true,
                              bool aNullParent = true) override;
# 597 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  already_AddRefed<mozilla::dom::NodeInfo>
  GetExistingAttrNameFromQName(const nsAString& aStr) const;

  nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                   const nsAString& aValue, bool aNotify)
  {
    return SetAttr(aNameSpaceID, aName, nullptr, aValue, aNotify);
  }
# 622 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  bool MaybeCheckSameAttrVal(int32_t aNamespaceID, nsIAtom* aName,
                             nsIAtom* aPrefix,
                             const nsAttrValueOrString& aValue,
                             bool aNotify, nsAttrValue& aOldValue,
                             uint8_t* aModType, bool* aHasListeners);

  bool OnlyNotifySameValueSet(int32_t aNamespaceID, nsIAtom* aName,
                              nsIAtom* aPrefix,
                              const nsAttrValueOrString& aValue,
                              bool aNotify, nsAttrValue& aOldValue,
                              uint8_t* aModType, bool* aHasListeners);

  virtual nsresult SetAttr(int32_t aNameSpaceID, nsIAtom* aName, nsIAtom* aPrefix,
                           const nsAString& aValue, bool aNotify) override;


  nsresult SetParsedAttr(int32_t aNameSpaceID, nsIAtom* aName, nsIAtom* aPrefix,
                         nsAttrValue& aParsedValue, bool aNotify);


  bool GetAttr(int32_t aNameSpaceID, nsIAtom* aName,
               nsAString& aResult) const;
  inline bool HasAttr(int32_t aNameSpaceID, nsIAtom* aName) const;

  inline bool AttrValueIs(int32_t aNameSpaceID, nsIAtom* aName,
                          const nsAString& aValue,
                          nsCaseTreatment aCaseSensitive) const;
  inline bool AttrValueIs(int32_t aNameSpaceID, nsIAtom* aName,
                          nsIAtom* aValue,
                          nsCaseTreatment aCaseSensitive) const;
  virtual int32_t FindAttrValueIn(int32_t aNameSpaceID,
                                  nsIAtom* aName,
                                  AttrValuesArray* aValues,
                                  nsCaseTreatment aCaseSensitive) const override;
  virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
                             bool aNotify) override;
  virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const override;
  virtual BorrowedAttrInfo GetAttrInfoAt(uint32_t aIndex) const override;
  virtual uint32_t GetAttrCount() const override;
  virtual bool IsNodeOfType(uint32_t aFlags) const override;






  const nsAttrValue* GetClasses() const {
    if (MayHaveClass()) {
      return DoGetClasses();
    }
    return nullptr;
  }
# 685 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  void Describe(nsAString& aOutDescription) const override;




  struct MappedAttributeEntry {
    nsIAtom** attribute;
  };







  template<size_t N>
  static bool
  FindAttributeDependence(const nsIAtom* aAttribute,
                          const MappedAttributeEntry* const (&aMaps)[N])
  {
    return FindAttributeDependence(aAttribute, aMaps, N);
  }

  static nsIAtom*** HTMLSVGPropertiesToTraverseAndUnlink();

private:
  void DescribeAttribute(uint32_t index, nsAString& aOutDescription) const;

  static bool
  FindAttributeDependence(const nsIAtom* aAttribute,
                          const MappedAttributeEntry* const aMaps[],
                          uint32_t aMapCount);

protected:
  inline bool GetAttr(int32_t aNameSpaceID, nsIAtom* aName,
                      DOMString& aResult) const
  {
    do { } while(0);
    do { } while(0);

    do { } while (0);

    const nsAttrValue* val = mAttrsAndChildren.GetAttr(aName, aNameSpaceID);
    if (val) {
      val->ToString(aResult);
      return true;
    }

    return false;
  }

public:
  bool HasAttrs() const { return mAttrsAndChildren.HasAttrs(); }

  inline bool GetAttr(const nsAString& aName, DOMString& aResult) const
  {
    do { } while (0);

    const nsAttrValue* val = mAttrsAndChildren.GetAttr(aName);
    if (val) {
      val->ToString(aResult);
      return true;
    }

    return false;
  }

  void GetTagName(nsAString& aTagName) const
  {
    aTagName = NodeName();
  }
  void GetId(nsAString& aId) const
  {
    GetAttr(kNameSpaceID_None, nsGkAtoms::id, aId);
  }
  void GetId(DOMString& aId) const
  {
    GetAttr(kNameSpaceID_None, nsGkAtoms::id, aId);
  }
  void SetId(const nsAString& aId)
  {
    SetAttr(kNameSpaceID_None, nsGkAtoms::id, aId, true);
  }
  void GetClassName(nsAString& aClassName)
  {
    GetAttr(kNameSpaceID_None, nsGkAtoms::_class, aClassName);
  }
  void GetClassName(DOMString& aClassName)
  {
    GetAttr(kNameSpaceID_None, nsGkAtoms::_class, aClassName);
  }
  void SetClassName(const nsAString& aClassName)
  {
    SetAttr(kNameSpaceID_None, nsGkAtoms::_class, aClassName, true);
  }

  nsDOMTokenList* ClassList();
  nsDOMAttributeMap* Attributes()
  {
    nsDOMSlots* slots = DOMSlots();
    if (!slots->mAttributeMap) {
      slots->mAttributeMap = new nsDOMAttributeMap(this);
    }

    return slots->mAttributeMap;
  }

  void GetAttributeNames(nsTArray<nsString>& aResult);

  void GetAttribute(const nsAString& aName, nsString& aReturn)
  {
    DOMString str;
    GetAttribute(aName, str);
    str.ToString(aReturn);
  }

  void GetAttribute(const nsAString& aName, DOMString& aReturn);
  void GetAttributeNS(const nsAString& aNamespaceURI,
                      const nsAString& aLocalName,
                      nsAString& aReturn);
  void SetAttribute(const nsAString& aName, const nsAString& aValue,
                    ErrorResult& aError);
  void SetAttributeNS(const nsAString& aNamespaceURI,
                      const nsAString& aLocalName,
                      const nsAString& aValue,
                      ErrorResult& aError);
  void RemoveAttribute(const nsAString& aName,
                       ErrorResult& aError);
  void RemoveAttributeNS(const nsAString& aNamespaceURI,
                         const nsAString& aLocalName,
                         ErrorResult& aError);
  bool HasAttribute(const nsAString& aName) const
  {
    return InternalGetAttrNameFromQName(aName) != nullptr;
  }
  bool HasAttributeNS(const nsAString& aNamespaceURI,
                      const nsAString& aLocalName) const;
  bool HasAttributes() const
  {
    return HasAttrs();
  }
  Element* Closest(const nsAString& aSelector,
                   ErrorResult& aResult);
  bool Matches(const nsAString& aSelector,
               ErrorResult& aError);
  already_AddRefed<nsIHTMLCollection>
    GetElementsByTagName(const nsAString& aQualifiedName);
  already_AddRefed<nsIHTMLCollection>
    GetElementsByTagNameNS(const nsAString& aNamespaceURI,
                           const nsAString& aLocalName,
                           ErrorResult& aError);
  already_AddRefed<nsIHTMLCollection>
    GetElementsByClassName(const nsAString& aClassNames);

  CSSPseudoElementType GetPseudoElementType() const {
    if (!HasProperties()) {
      return CSSPseudoElementType::NotPseudo;
    }
    nsresult rv = NS_OK;
    auto raw = GetProperty(nsGkAtoms::pseudoProperty, &rv);
    if (rv == NS_PROPTABLE_PROP_NOT_THERE) {
      return CSSPseudoElementType::NotPseudo;
    }
    return CSSPseudoElementType(reinterpret_cast<uintptr_t>(raw));
  }

  void SetPseudoElementType(CSSPseudoElementType aPseudo) {
    static_assert(sizeof(CSSPseudoElementType) <= sizeof(uintptr_t),
                  "Need to be able to store this in a void*");
    do { } while (0);
    SetProperty(nsGkAtoms::pseudoProperty, reinterpret_cast<void*>(aPseudo));
  }

private:





  nsINode* InsertAdjacent(const nsAString& aWhere,
                          nsINode* aNode,
                          ErrorResult& aError);

public:
  Element* InsertAdjacentElement(const nsAString& aWhere,
                                 Element& aElement,
                                 ErrorResult& aError);

  void InsertAdjacentText(const nsAString& aWhere,
                          const nsAString& aData,
                          ErrorResult& aError);

  void SetPointerCapture(int32_t aPointerId, ErrorResult& aError)
  {
    bool activeState = false;
    if (!nsIPresShell::GetPointerInfo(aPointerId, activeState)) {
      aError.Throw(NS_ERROR_DOM_INVALID_POINTER_ERR);
      return;
    }
    if (!IsInUncomposedDoc()) {
      aError.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
      return;
    }
    if (!activeState) {
      return;
    }
    nsIPresShell::SetPointerCapturingContent(aPointerId, this);
  }
  void ReleasePointerCapture(int32_t aPointerId, ErrorResult& aError)
  {
    bool activeState = false;
    if (!nsIPresShell::GetPointerInfo(aPointerId, activeState)) {
      aError.Throw(NS_ERROR_DOM_INVALID_POINTER_ERR);
      return;
    }
    if (HasPointerCapture(aPointerId)) {
      nsIPresShell::ReleasePointerCapturingContent(aPointerId);
    }
  }
  bool HasPointerCapture(long aPointerId)
  {
    nsIPresShell::PointerCaptureInfo* pointerCaptureInfo =
      nsIPresShell::GetPointerCaptureInfo(aPointerId);
    if (pointerCaptureInfo && pointerCaptureInfo->mPendingContent == this) {
      return true;
    }
    return false;
  }
  void SetCapture(bool aRetargetToElement)
  {



    if (!nsIPresShell::GetCapturingContent()) {
      nsIPresShell::SetCapturingContent(this, 4 |
        (aRetargetToElement ? 2 : 0));
    }
  }

  void SetCaptureAlways(bool aRetargetToElement)
  {
    nsIPresShell::SetCapturingContent(this,
        4 | 1 |
        (aRetargetToElement ? 2 : 0));
  }

  void ReleaseCapture()
  {
    if (nsIPresShell::GetCapturingContent() == this) {
      nsIPresShell::SetCapturingContent(nullptr, 0);
    }
  }

  void RequestFullscreen(CallerType aCallerType, ErrorResult& aError);
  void RequestPointerLock(CallerType aCallerType);
  Attr* GetAttributeNode(const nsAString& aName);
  already_AddRefed<Attr> SetAttributeNode(Attr& aNewAttr,
                                          ErrorResult& aError);
  already_AddRefed<Attr> RemoveAttributeNode(Attr& aOldAttr,
                                             ErrorResult& aError);
  Attr* GetAttributeNodeNS(const nsAString& aNamespaceURI,
                           const nsAString& aLocalName);
  already_AddRefed<Attr> SetAttributeNodeNS(Attr& aNewAttr,
                                            ErrorResult& aError);

  already_AddRefed<DOMRectList> GetClientRects();
  already_AddRefed<DOMRect> GetBoundingClientRect();

  already_AddRefed<ShadowRoot> CreateShadowRoot(ErrorResult& aError);
  already_AddRefed<DestinationInsertionPointList> GetDestinationInsertionPoints();

  ShadowRoot *FastGetShadowRoot() const
  {
    nsDOMSlots* slots = GetExistingDOMSlots();
    return slots ? slots->mShadowRoot.get() : nullptr;
  }

  void ScrollIntoView();
  void ScrollIntoView(bool aTop);
  void ScrollIntoView(const ScrollIntoViewOptions &aOptions);
  void Scroll(double aXScroll, double aYScroll);
  void Scroll(const ScrollToOptions& aOptions);
  void ScrollTo(double aXScroll, double aYScroll);
  void ScrollTo(const ScrollToOptions& aOptions);
  void ScrollBy(double aXScrollDif, double aYScrollDif);
  void ScrollBy(const ScrollToOptions& aOptions);




  bool ScrollByNoFlush(int32_t aDx, int32_t aDy);
  int32_t ScrollTop();
  void SetScrollTop(int32_t aScrollTop);
  int32_t ScrollLeft();
  void SetScrollLeft(int32_t aScrollLeft);
  int32_t ScrollWidth();
  int32_t ScrollHeight();
  void MozScrollSnap();
  int32_t ClientTop()
  {
    return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().y);
  }
  int32_t ClientLeft()
  {
    return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().x);
  }
  int32_t ClientWidth()
  {
    return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().width);
  }
  int32_t ClientHeight()
  {
    return nsPresContext::AppUnitsToIntCSSPixels(GetClientAreaRect().height);
  }
  int32_t ScrollTopMin()
  {
    nsIScrollableFrame* sf = GetScrollFrame();
    return sf ?
           nsPresContext::AppUnitsToIntCSSPixels(sf->GetScrollRange().y) : 0;
  }
  int32_t ScrollTopMax()
  {
    nsIScrollableFrame* sf = GetScrollFrame();
    return sf ?
           nsPresContext::AppUnitsToIntCSSPixels(sf->GetScrollRange().YMost()) :
           0;
  }
  int32_t ScrollLeftMin()
  {
    nsIScrollableFrame* sf = GetScrollFrame();
    return sf ?
           nsPresContext::AppUnitsToIntCSSPixels(sf->GetScrollRange().x) : 0;
  }
  int32_t ScrollLeftMax()
  {
    nsIScrollableFrame* sf = GetScrollFrame();
    return sf ?
           nsPresContext::AppUnitsToIntCSSPixels(sf->GetScrollRange().XMost()) :
           0;
  }

  void GetGridFragments(nsTArray<RefPtr<Grid>>& aResult);

  already_AddRefed<Animation>
  Animate(JSContext* aContext,
          JS::Handle<JSObject*> aKeyframes,
          const UnrestrictedDoubleOrKeyframeAnimationOptions& aOptions,
          ErrorResult& aError);



  static already_AddRefed<Animation>
  Animate(const Nullable<ElementOrCSSPseudoElement>& aTarget,
          JSContext* aContext,
          JS::Handle<JSObject*> aKeyframes,
          const UnrestrictedDoubleOrKeyframeAnimationOptions& aOptions,
          ErrorResult& aError);




  void GetAnimations(const AnimationFilter& filter,
                     nsTArray<RefPtr<Animation>>& aAnimations);
  static void GetAnimationsUnsorted(Element* aElement,
                                    CSSPseudoElementType aPseudoType,
                                    nsTArray<RefPtr<Animation>>& aAnimations);

  virtual nsresult GetInnerHTML(nsAString& aInnerHTML);
  virtual void SetInnerHTML(const nsAString& aInnerHTML, ErrorResult& aError);
  void GetOuterHTML(nsAString& aOuterHTML);
  void SetOuterHTML(const nsAString& aOuterHTML, ErrorResult& aError);
  void InsertAdjacentHTML(const nsAString& aPosition, const nsAString& aText,
                          ErrorResult& aError);
# 1068 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  nsresult SetEventHandler(nsIAtom* aEventName,
                           const nsAString& aValue,
                           bool aDefer = true);




  nsresult LeaveLink(nsPresContext* aPresContext);

  static bool ShouldBlur(nsIContent *aContent);
# 1089 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  static nsresult DispatchClickEvent(nsPresContext* aPresContext,
                                     WidgetInputEvent* aSourceEvent,
                                     nsIContent* aTarget,
                                     bool aFullDispatch,
                                     const EventFlags* aFlags,
                                     nsEventStatus* aStatus);
# 1103 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  using nsIContent::DispatchEvent;
  static nsresult DispatchEvent(nsPresContext* aPresContext,
                                WidgetEvent* aEvent,
                                nsIContent* aTarget,
                                bool aFullDispatch,
                                nsEventStatus* aStatus);
# 1117 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  nsIFrame* GetPrimaryFrame(FlushType aType);

  nsIFrame* GetPrimaryFrame() const { return nsIContent::GetPrimaryFrame(); }

  const nsAttrValue* GetParsedAttr(nsIAtom* aAttr) const
  {
    return mAttrsAndChildren.GetAttr(aAttr);
  }

  const nsAttrValue* GetParsedAttr(nsIAtom* aAttr, int32_t aNameSpaceID) const
  {
    return mAttrsAndChildren.GetAttr(aAttr, aNameSpaceID);
  }






  nsDOMAttributeMap *GetAttributeMap()
  {
    nsDOMSlots *slots = GetExistingDOMSlots();

    return slots ? slots->mAttributeMap.get() : nullptr;
  }

  virtual void RecompileScriptEventListeners()
  {
  }
# 1155 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual BorrowedAttrInfo GetAttrInfo(int32_t aNamespaceID, nsIAtom* aName) const;
# 1166 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual void NodeInfoChanged(nsIDocument* aOldDoc) {}






  static void ParseCORSValue(const nsAString& aValue, nsAttrValue& aResult);




  static CORSMode StringToCORSMode(const nsAString& aValue);





  static CORSMode AttrValueToCORSMode(const nsAttrValue* aValue);

  virtual JSObject* WrapObject(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) final override;

  nsINode* GetScopeChainParent() const override;




  nsIEditor* GetEditorInternal();
# 1203 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  bool GetBoolAttr(nsIAtom* aAttr) const
  {
    return HasAttr(kNameSpaceID_None, aAttr);
  }
# 1216 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  nsresult SetBoolAttr(nsIAtom* aAttr, bool aValue);
# 1227 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  void GetEnumAttr(nsIAtom* aAttr,
                   const char* aDefault,
                   nsAString& aResult) const;
# 1245 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  void GetEnumAttr(nsIAtom* aAttr,
                   const char* aDefaultMissing,
                   const char* aDefaultInvalid,
                   nsAString& aResult) const;




  void UnsetAttr(nsIAtom* aAttr, ErrorResult& aError)
  {
    aError = UnsetAttr(kNameSpaceID_None, aAttr, true);
  }




  void SetAttr(nsIAtom* aAttr, const nsAString& aValue, ErrorResult& aError)
  {
    aError = SetAttr(kNameSpaceID_None, aAttr, aValue, true);
  }






  void SetOrRemoveNullableStringAttr(nsIAtom* aName, const nsAString& aValue,
                                     ErrorResult& aError);
# 1288 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  float FontSizeInflation();

  net::ReferrerPolicy GetReferrerPolicyAsEnum();






  already_AddRefed<nsDOMStringMap> Dataset();


  void ClearDataset();

  void RegisterIntersectionObserver(DOMIntersectionObserver* aObserver);
  void UnregisterIntersectionObserver(DOMIntersectionObserver* aObserver);
  bool UpdateIntersectionObservation(DOMIntersectionObserver* aObserver, int32_t threshold);

protected:




  static const bool kFireMutationEvent = true;
  static const bool kDontFireMutationEvent = false;
  static const bool kNotifyDocumentObservers = true;
  static const bool kDontNotifyDocumentObservers = false;
  static const bool kCallAfterSetAttr = true;
  static const bool kDontCallAfterSetAttr = false;
# 1347 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  nsresult SetAttrAndNotify(int32_t aNamespaceID,
                            nsIAtom* aName,
                            nsIAtom* aPrefix,
                            const nsAttrValue& aOldValue,
                            nsAttrValue& aParsedValue,
                            uint8_t aModType,
                            bool aFireMutation,
                            bool aNotify,
                            bool aCallAfterSetAttr,
                            nsIDocument* aComposedDocument,
                            const mozAutoDocUpdate& aGuard);
# 1368 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  void Scroll(const CSSIntPoint& aScroll, const ScrollOptions& aOptions);
# 1381 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual bool ParseAttribute(int32_t aNamespaceID,
                                nsIAtom* aAttribute,
                                const nsAString& aValue,
                                nsAttrValue& aResult);
# 1398 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual bool SetMappedAttribute(nsIAtom* aName,
                                  nsAttrValue& aValue,
                                  nsresult* aRetval);
# 1418 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual nsresult BeforeSetAttr(int32_t aNamespaceID, nsIAtom* aName,
                                 const nsAttrValueOrString* aValue,
                                 bool aNotify)
  {
    return NS_OK;
  }
# 1439 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual nsresult AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName,
                                const nsAttrValue* aValue, bool aNotify)
  {
    return NS_OK;
  }





  virtual EventListenerManager*
    GetEventListenerManagerForAttr(nsIAtom* aAttrName, bool* aDefer);






  const nsAttrName*
  InternalGetAttrNameFromQName(const nsAString& aStr,
                               nsAutoString* aNameToUse = nullptr) const;

  nsIFrame* GetStyledFrame();

  virtual Element* GetNameSpaceElement() override
  {
    return this;
  }

  Attr* GetAttributeNodeNSInternal(const nsAString& aNamespaceURI,
                                   const nsAString& aLocalName);

  inline void RegisterActivityObserver();
  inline void UnregisterActivityObserver();




  void AddToIdTable(nsIAtom* aId);
  void RemoveFromIdTable();
# 1493 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  bool CheckHandleEventForLinksPrecondition(EventChainVisitor& aVisitor,
                                            nsIURI** aURI) const;




  nsresult GetEventTargetParentForLinks(EventChainPreVisitor& aVisitor);




  nsresult PostHandleEventForLinks(EventChainPostVisitor& aVisitor);
# 1516 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/Element.h"
  virtual void GetLinkTarget(nsAString& aTarget);

  nsDOMTokenList* GetTokenList(nsIAtom* aAtom,
                               const DOMTokenListSupportedTokenArray aSupportedTokens = nullptr);

  nsDataHashtable<nsRefPtrHashKey<DOMIntersectionObserver>, int32_t>*
    RegisteredIntersectionObservers();

private:




  const nsAttrValue* DoGetClasses() const;





  nsRect GetClientAreaRect();

  nsIScrollableFrame* GetScrollFrame(nsIFrame **aStyledFrame = nullptr,
                                     bool aFlushLayout = true);


  EventStates mState;


  mozilla::ServoCell<ServoNodeData*> mServoData;

};

class RemoveFromBindingManagerRunnable : public mozilla::Runnable
{
public:
  RemoveFromBindingManagerRunnable(nsBindingManager* aManager,
                                   nsIContent* aContent,
                                   nsIDocument* aDoc);

  virtual nsresult Run() override;
private:
  virtual ~RemoveFromBindingManagerRunnable();
  RefPtr<nsBindingManager> mManager;
  RefPtr<nsIContent> mContent;
  nsCOMPtr<nsIDocument> mDoc;
};

class DestinationInsertionPointList : public nsINodeList
{
public:
  explicit DestinationInsertionPointList(Element* aElement);

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "DestinationInsertionPointList"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<DestinationInsertionPointList>(p)->DeleteCycleCollectable(); } static DestinationInsertionPointList* Downcast(nsISupports* s) { return static_cast<DestinationInsertionPointList*>(static_cast<DestinationInsertionPointList*>(s)); } static nsISupports* Upcast(DestinationInsertionPointList *p) { return static_cast<nsISupports*>(static_cast<DestinationInsertionPointList*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &DestinationInsertionPointList::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;


  virtual nsresult Item(uint32_t index, nsIDOMNode * *_retval) override; virtual nsresult GetLength(uint32_t *aLength) override;


  virtual nsIContent* Item(uint32_t aIndex) override;
  virtual int32_t IndexOf(nsIContent* aContent) override;
  virtual nsINode* GetParentObject() override { return mParent; }
  virtual uint32_t Length() const;
  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
protected:
  virtual ~DestinationInsertionPointList();

  RefPtr<Element> mParent;
  nsCOMArray<nsIContent> mDestinationPoints;
};

template<typename T> struct Element::COMTypeInfo<Element, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID Element::COMTypeInfo<Element, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xc67ed254, 0xfd3b, 0x4b10, { 0x96, 0xa2, 0xc5, 0x8b, 0x7b, 0x64, 0x97, 0xd1 } };

inline bool
Element::HasAttr(int32_t aNameSpaceID, nsIAtom* aName) const
{
  do { } while(0);
  do { } while(0);


  return mAttrsAndChildren.IndexOfAttr(aName, aNameSpaceID) >= 0;
}

inline bool
Element::AttrValueIs(int32_t aNameSpaceID,
                     nsIAtom* aName,
                     const nsAString& aValue,
                     nsCaseTreatment aCaseSensitive) const
{
  do { } while(0);
  do { } while(0);

  const nsAttrValue* val = mAttrsAndChildren.GetAttr(aName, aNameSpaceID);
  return val && val->Equals(aValue, aCaseSensitive);
}

inline bool
Element::AttrValueIs(int32_t aNameSpaceID,
                     nsIAtom* aName,
                     nsIAtom* aValue,
                     nsCaseTreatment aCaseSensitive) const
{
  do { } while(0);
  do { } while(0);
  do { } while(0);

  const nsAttrValue* val = mAttrsAndChildren.GetAttr(aName, aNameSpaceID);
  return val && val->Equals(aValue, aCaseSensitive);
}

}
}

inline mozilla::dom::Element* nsINode::AsElement()
{
  do { } while (0);
  return static_cast<mozilla::dom::Element*>(this);
}

inline const mozilla::dom::Element* nsINode::AsElement() const
{
  do { } while (0);
  return static_cast<const mozilla::dom::Element*>(this);
}

inline void nsINode::UnsetRestyleFlagsIfGecko()
{
  if (IsElement() && !AsElement()->IsStyledByServo()) {
    UnsetFlags(ELEMENT_ALL_RESTYLE_FLAGS);
  }
}
# 13 "<built-in>" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
struct gfxFontStyle;

struct LookAndFeelInt
{
  int32_t id;
  int32_t value;
};

namespace mozilla {

class LookAndFeel
{
public:


  enum ColorID : uint8_t {




    eColorID_WindowBackground,
    eColorID_WindowForeground,
    eColorID_WidgetBackground,
    eColorID_WidgetForeground,
    eColorID_WidgetSelectBackground,
    eColorID_WidgetSelectForeground,
    eColorID_Widget3DHighlight,
    eColorID_Widget3DShadow,
    eColorID_TextBackground,
    eColorID_TextForeground,
    eColorID_TextSelectBackground,
    eColorID_TextSelectForeground,
    eColorID_TextSelectForegroundCustom,
    eColorID_TextSelectBackgroundDisabled,
    eColorID_TextSelectBackgroundAttention,
    eColorID_TextHighlightBackground,
    eColorID_TextHighlightForeground,

    eColorID_IMERawInputBackground,
    eColorID_IMERawInputForeground,
    eColorID_IMERawInputUnderline,
    eColorID_IMESelectedRawTextBackground,
    eColorID_IMESelectedRawTextForeground,
    eColorID_IMESelectedRawTextUnderline,
    eColorID_IMEConvertedTextBackground,
    eColorID_IMEConvertedTextForeground,
    eColorID_IMEConvertedTextUnderline,
    eColorID_IMESelectedConvertedTextBackground,
    eColorID_IMESelectedConvertedTextForeground,
    eColorID_IMESelectedConvertedTextUnderline,

    eColorID_SpellCheckerUnderline,


    eColorID_activeborder,
    eColorID_activecaption,
    eColorID_appworkspace,
    eColorID_background,
    eColorID_buttonface,
    eColorID_buttonhighlight,
    eColorID_buttonshadow,
    eColorID_buttontext,
    eColorID_captiontext,
    eColorID_graytext,
    eColorID_highlight,
    eColorID_highlighttext,
    eColorID_inactiveborder,
    eColorID_inactivecaption,
    eColorID_inactivecaptiontext,
    eColorID_infobackground,
    eColorID_infotext,
    eColorID_menu,
    eColorID_menutext,
    eColorID_scrollbar,
    eColorID_threeddarkshadow,
    eColorID_threedface,
    eColorID_threedhighlight,
    eColorID_threedlightshadow,
    eColorID_threedshadow,
    eColorID_window,
    eColorID_windowframe,
    eColorID_windowtext,

    eColorID__moz_buttondefault,

    eColorID__moz_field,
    eColorID__moz_fieldtext,
    eColorID__moz_dialog,
    eColorID__moz_dialogtext,

    eColorID__moz_dragtargetzone,


    eColorID__moz_cellhighlight,

    eColorID__moz_cellhighlighttext,

    eColorID__moz_html_cellhighlight,

    eColorID__moz_html_cellhighlighttext,

    eColorID__moz_buttonhoverface,

    eColorID__moz_buttonhovertext,

    eColorID__moz_menuhover,

    eColorID__moz_menuhovertext,

    eColorID__moz_menubartext,

    eColorID__moz_menubarhovertext,


    eColorID__moz_eventreerow,
    eColorID__moz_oddtreerow,




    eColorID__moz_mac_buttonactivetext,

    eColorID__moz_mac_chrome_active,

    eColorID__moz_mac_chrome_inactive,

    eColorID__moz_mac_defaultbuttontext,

    eColorID__moz_mac_focusring,

    eColorID__moz_mac_menuselect,

    eColorID__moz_mac_menushadow,

    eColorID__moz_mac_menutextdisable,

    eColorID__moz_mac_menutextselect,

    eColorID__moz_mac_disabledtoolbartext,

    eColorID__moz_mac_secondaryhighlight,




    eColorID__moz_win_mediatext,

    eColorID__moz_win_communicationstext,






    eColorID__moz_nativehyperlinktext,


    eColorID__moz_comboboxtext,
    eColorID__moz_combobox,


    eColorID__moz_gtk_info_bar_text,


    eColorID_LAST_COLOR
  };



  enum IntID {

    eIntID_CaretBlinkTime,

    eIntID_CaretWidth,

    eIntID_ShowCaretDuringSelection,

    eIntID_SelectTextfieldsOnKeyFocus,

    eIntID_SubmenuDelay,

    eIntID_MenusCanOverlapOSBar,

    eIntID_UseOverlayScrollbars,

    eIntID_AllowOverlayScrollbarsOverlap,

    eIntID_ShowHideScrollbars,

    eIntID_SkipNavigatingDisabledMenuItem,


    eIntID_DragThresholdX,
    eIntID_DragThresholdY,

    eIntID_UseAccessibilityTheme,


    eIntID_ScrollArrowStyle,

    eIntID_ScrollSliderStyle,


    eIntID_ScrollButtonLeftMouseButtonAction,

    eIntID_ScrollButtonMiddleMouseButtonAction,

    eIntID_ScrollButtonRightMouseButtonAction,


    eIntID_TreeOpenDelay,

    eIntID_TreeCloseDelay,

    eIntID_TreeLazyScrollDelay,

    eIntID_TreeScrollDelay,

    eIntID_TreeScrollLinesMax,

    eIntID_TabFocusModel,

    eIntID_ChosenMenuItemsShouldBlink,
# 248 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
    eIntID_WindowsDefaultTheme,







    eIntID_DWMCompositor,
# 265 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
    eIntID_WindowsClassic,
# 274 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
    eIntID_WindowsGlass,
# 283 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
    eIntID_TouchEnabled,
# 292 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
    eIntID_MacGraphiteTheme,
# 302 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
   eIntID_MacYosemiteTheme,
# 319 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
    eIntID_AlertNotificationOrigin,







    eIntID_ScrollToClick,





    eIntID_IMERawInputUnderlineStyle,
    eIntID_IMESelectedRawTextUnderlineStyle,
    eIntID_IMEConvertedTextUnderlineStyle,
    eIntID_IMESelectedConvertedTextUnderline,
    eIntID_SpellCheckerUnderlineStyle,




    eIntID_MenuBarDrag,



    eIntID_WindowsThemeIdentifier,



    eIntID_OperatingSystemVersionIdentifier,




    eIntID_ScrollbarButtonAutoRepeatBehavior,



    eIntID_TooltipDelay,




    eIntID_SwipeAnimationEnabled,
# 373 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
    eIntID_ColorPickerAvailable,






     eIntID_PhysicalHomeButton,





     eIntID_ScrollbarDisplayOnMouseMove,




     eIntID_ScrollbarFadeBeginDelay,
     eIntID_ScrollbarFadeDuration,





     eIntID_ContextMenuOffsetVertical,
     eIntID_ContextMenuOffsetHorizontal
  };




  enum WindowsTheme {
    eWindowsTheme_Generic = 0,
    eWindowsTheme_Classic,
    eWindowsTheme_Aero,
    eWindowsTheme_LunaBlue,
    eWindowsTheme_LunaOlive,
    eWindowsTheme_LunaSilver,
    eWindowsTheme_Royale,
    eWindowsTheme_Zune,
    eWindowsTheme_AeroLite
  };




  enum OperatingSystemVersion {
    eOperatingSystemVersion_Windows7 = 2,
    eOperatingSystemVersion_Windows8,
    eOperatingSystemVersion_Windows10,
    eOperatingSystemVersion_Unknown
  };

  enum {
    eScrollArrow_None = 0,
    eScrollArrow_StartBackward = 0x1000,
    eScrollArrow_StartForward = 0x0100,
    eScrollArrow_EndBackward = 0x0010,
    eScrollArrow_EndForward = 0x0001
  };

  enum {

    eScrollArrowStyle_Single =
      eScrollArrow_StartBackward | eScrollArrow_EndForward,

    eScrollArrowStyle_BothAtBottom =
      eScrollArrow_EndBackward | eScrollArrow_EndForward,

    eScrollArrowStyle_BothAtEachEnd =
      eScrollArrow_EndBackward | eScrollArrow_EndForward |
      eScrollArrow_StartBackward | eScrollArrow_StartForward,

    eScrollArrowStyle_BothAtTop =
      eScrollArrow_StartBackward | eScrollArrow_StartForward
  };

  enum {
    eScrollThumbStyle_Normal,
    eScrollThumbStyle_Proportional
  };



  enum FloatID {
    eFloatID_IMEUnderlineRelativeSize,
    eFloatID_SpellCheckerUnderlineRelativeSize,



    eFloatID_CaretAspectRatio
  };



  enum FontID {
    eFont_Caption = 1,
    eFont_Icon,
    eFont_Menu,
    eFont_MessageBox,
    eFont_SmallCaption,
    eFont_StatusBar,

    eFont_Window,
    eFont_Document,
    eFont_Workspace,
    eFont_Desktop,
    eFont_Info,
    eFont_Dialog,
    eFont_Button,
    eFont_PullDownMenu,
    eFont_List,
    eFont_Field,

    eFont_Tooltips,
    eFont_Widget
  };
# 507 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
  static nsresult GetColor(ColorID aID, nscolor* aResult);







  static nsresult GetColor(ColorID aID, bool aUseStandinsForNativeColors,
                           nscolor* aResult);
# 526 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
  static nsresult GetInt(IntID aID, int32_t* aResult);
  static nsresult GetFloat(FloatID aID, float* aResult);

  static nscolor GetColor(ColorID aID, nscolor aDefault = ((nscolor) ((255 << 24) | ((0)<<16) | ((0)<<8) | (0))))
  {
    nscolor result = ((nscolor) ((255 << 24) | ((0)<<16) | ((0)<<8) | (0)));
    if (((bool)(__builtin_expect(!!(NS_FAILED_impl(GetColor(aID, &result))), 0)))) {
      return aDefault;
    }
    return result;
  }

  static int32_t GetInt(IntID aID, int32_t aDefault = 0)
  {
    int32_t result;
    if (((bool)(__builtin_expect(!!(NS_FAILED_impl(GetInt(aID, &result))), 0)))) {
      return aDefault;
    }
    return result;
  }

  static float GetFloat(FloatID aID, float aDefault = 0.0f)
  {
    float result;
    if (((bool)(__builtin_expect(!!(NS_FAILED_impl(GetFloat(aID, &result))), 0)))) {
      return aDefault;
    }
    return result;
  }
# 566 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/LookAndFeel.h"
  static bool GetFont(FontID aID, nsString& aName, gfxFontStyle& aStyle,
                      float aDevPixPerCSSPixel);





  static char16_t GetPasswordCharacter();






  static bool GetEchoPassword();





  static uint32_t GetPasswordMaskDelay();





  static void Refresh();





  static nsTArray<LookAndFeelInt> GetIntCache();
  static void SetIntCache(const nsTArray<LookAndFeelInt>& aLookAndFeelIntCache);
};

}
# 15 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h" 1
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PseudoElementHashEntry.h" 1
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PseudoElementHashEntry.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AnimationTarget.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/AnimationTarget.h"
namespace mozilla {

namespace dom {
class Element;
}

struct OwningAnimationTarget
{
  OwningAnimationTarget(dom::Element* aElement, CSSPseudoElementType aType)
    : mElement(aElement), mPseudoType(aType) { }

  explicit OwningAnimationTarget(dom::Element* aElement)
    : mElement(aElement) { }

  bool operator==(const OwningAnimationTarget& aOther) const
  {
     return mElement == aOther.mElement &&
            mPseudoType == aOther.mPseudoType;
  }



  RefPtr<dom::Element> mElement;
  CSSPseudoElementType mPseudoType = CSSPseudoElementType::NotPseudo;
};

struct NonOwningAnimationTarget
{
  NonOwningAnimationTarget() = default;

  NonOwningAnimationTarget(dom::Element* aElement, CSSPseudoElementType aType)
    : mElement(aElement), mPseudoType(aType) { }

  explicit NonOwningAnimationTarget(const OwningAnimationTarget& aOther)
    : mElement(aOther.mElement), mPseudoType(aOther.mPseudoType) { }

  bool operator==(const NonOwningAnimationTarget& aOther) const
  {
    return mElement == aOther.mElement &&
           mPseudoType == aOther.mPseudoType;
  }



  dom::Element* mElement = nullptr;
  CSSPseudoElementType mPseudoType = CSSPseudoElementType::NotPseudo;
};



inline void
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                            Maybe<OwningAnimationTarget>& aTarget,
                            const char* aName,
                            uint32_t aFlags = 0)
{
  if (aTarget) {
    ImplCycleCollectionTraverse(aCallback, aTarget->mElement, aName, aFlags);
  }
}

inline void
ImplCycleCollectionUnlink(Maybe<OwningAnimationTarget>& aTarget)
{
  if (aTarget) {
    ImplCycleCollectionUnlink(aTarget->mElement);
  }
}

}
# 12 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/PseudoElementHashEntry.h" 2



namespace mozilla {


class PseudoElementHashEntry : public PLDHashEntryHdr
{
public:
  typedef NonOwningAnimationTarget KeyType;
  typedef const NonOwningAnimationTarget* KeyTypePointer;

  explicit PseudoElementHashEntry(KeyTypePointer aKey)
    : mElement(aKey->mElement)
    , mPseudoType(aKey->mPseudoType) { }
  explicit PseudoElementHashEntry(const PseudoElementHashEntry& aCopy)=default;

  ~PseudoElementHashEntry() = default;

  KeyType GetKey() const { return { mElement, mPseudoType }; }
  bool KeyEquals(KeyTypePointer aKey) const
  {
    return mElement == aKey->mElement &&
           mPseudoType == aKey->mPseudoType;
  }

  static KeyTypePointer KeyToPointer(KeyType& aKey) { return &aKey; }
  static PLDHashNumber HashKey(KeyTypePointer aKey)
  {
    if (!aKey)
      return 0;




    return mozilla::HashGeneric(aKey->mElement,
                                static_cast<uint8_t>(aKey->mPseudoType));
  }
  enum { ALLOW_MEMMOVE = true };

  RefPtr<dom::Element> mElement;
  CSSPseudoElementType mPseudoType;
};

}
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h" 2




# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStyleRuleProcessor.h" 1
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStyleRuleProcessor.h"
struct RuleProcessorData;
struct ElementRuleProcessorData;
struct PseudoElementRuleProcessorData;
struct AnonBoxRuleProcessorData;

struct XULTreeRuleProcessorData;

struct StateRuleProcessorData;
struct PseudoElementStateRuleProcessorData;
struct AttributeRuleProcessorData;
class nsPresContext;
# 46 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStyleRuleProcessor.h"
class nsIStyleRuleProcessor : public nsISupports {
public:
  template<typename T, typename U> struct COMTypeInfo;



  typedef bool (* EnumFunc)(nsIStyleRuleProcessor*, void*);







  virtual void RulesMatching(ElementRuleProcessorData* aData) = 0;





  virtual void RulesMatching(PseudoElementRuleProcessorData* aData) = 0;




  virtual void RulesMatching(AnonBoxRuleProcessorData* aData) = 0;






  virtual void RulesMatching(XULTreeRuleProcessorData* aData) = 0;







  virtual bool
    HasDocumentStateDependentStyle(StateRuleProcessorData* aData) = 0;
# 97 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStyleRuleProcessor.h"
  virtual nsRestyleHint
    HasStateDependentStyle(StateRuleProcessorData* aData) = 0;
  virtual nsRestyleHint
    HasStateDependentStyle(PseudoElementStateRuleProcessorData* aData) = 0;
# 118 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIStyleRuleProcessor.h"
  virtual nsRestyleHint HasAttributeDependentStyle(
      AttributeRuleProcessorData* aData,
      mozilla::RestyleHintData& aRestyleHintDataResult) = 0;






  virtual bool MediumFeaturesChanged(nsPresContext* aPresContext) = 0;





  virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const = 0;
  virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const = 0;
};

template<typename T> struct nsIStyleRuleProcessor::COMTypeInfo<nsIStyleRuleProcessor, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIStyleRuleProcessor::COMTypeInfo<nsIStyleRuleProcessor, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xc1d6001e, 0x4fcb, 0x4c40, {0xbc, 0xe1, 0x5e, 0xba, 0x80, 0xbf, 0xd8, 0xf3} };
# 19 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h" 2


class nsCSSPropertyIDSet;
class nsIAtom;
class nsIFrame;
class nsIStyleRule;
class nsPresContext;
class nsStyleContext;
struct RawServoAnimationValueMap;
typedef RawServoAnimationValueMap const* RawServoAnimationValueMapBorrowed;

namespace mozilla {

class EffectSet;
class RestyleTracker;
class StyleAnimationValue;
struct AnimationPerformanceWarning;
struct AnimationProperty;
struct NonOwningAnimationTarget;

namespace dom {
class Animation;
class Element;
}

class EffectCompositor
{
public:
  explicit EffectCompositor(nsPresContext* aPresContext)
    : mPresContext(aPresContext)
  {
    for (size_t i = 0; i < kCascadeLevelCount; i++) {
      CascadeLevel cascadeLevel = CascadeLevel(i);
      mRuleProcessors[cascadeLevel] =
        new AnimationStyleRuleProcessor(this, cascadeLevel);
    }
  }

  public: MozExternalRefCountType AddRef(void) { static_assert(!mozilla::IsDestructible<EffectCompositor>::value, "Reference-counted class " "EffectCompositor" " should not have a public destructor. " "Make this class's destructor non-public"); do { } while (0); ((void)0); nsrefcnt count = mRefCnt.incr(static_cast<void*>(this), EffectCompositor::cycleCollection::GetParticipant()); ; return count; } MozExternalRefCountType Release(void) { do { } while (0); ((void)0); nsrefcnt count = mRefCnt.decr(static_cast<void*>(this), EffectCompositor::cycleCollection::GetParticipant()); ; return count; } typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  void DeleteCycleCollectable(void) { delete this; } class cycleCollection : public nsCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsCycleCollectionParticipant(aSkip) {} private: public: virtual void Root(void *n) override; virtual void Unlink(void *n) override; virtual void Unroot(void *n) override; virtual nsresult TraverseNative(void *n, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "EffectCompositor"; }; virtual void DeleteCycleCollectable(void *n) override { DowncastCCParticipant<EffectCompositor>(n)->DeleteCycleCollectable(); } static EffectCompositor* Downcast(void* s) { return DowncastCCParticipant<EffectCompositor>(s); } static void* Upcast(EffectCompositor *p) { return static_cast<void*>(p); } static constexpr nsCycleCollectionParticipant* GetParticipant() { return &EffectCompositor::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

  void Disconnect() {
    mPresContext = nullptr;
  }


  enum class CascadeLevel : uint32_t {


    Animations = 0,

    Transitions = 1
  };


  static const size_t kCascadeLevelCount =
    static_cast<size_t>(CascadeLevel::Transitions) + 1;


  nsPresContext* PresContext() const { return mPresContext; }

  enum class RestyleType {



    Throttled,

    Standard,







    Layer
  };





  void RequestRestyle(dom::Element* aElement,
                      CSSPseudoElementType aPseudoType,
                      RestyleType aRestyleType,
                      CascadeLevel aCascadeLevel);





  void PostRestyleForAnimation(dom::Element* aElement,
                               CSSPseudoElementType aPseudoType,
                               CascadeLevel aCascadeLevel);




  void PostRestyleForThrottledAnimations();





  template<typename StyleType>
  void UpdateEffectProperties(StyleType&& aStyleType,
                              dom::Element* aElement,
                              CSSPseudoElementType aPseudoType);
# 139 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h"
  void MaybeUpdateAnimationRule(dom::Element* aElement,
                                CSSPseudoElementType aPseudoType,
                                CascadeLevel aCascadeLevel,
                                nsStyleContext *aStyleContext);
# 152 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h"
  nsIStyleRule* GetAnimationRule(dom::Element* aElement,
                                 CSSPseudoElementType aPseudoType,
                                 CascadeLevel aCascadeLevel,
                                 nsStyleContext* aStyleContext);






  bool GetServoAnimationRule(
    const dom::Element* aElement,
    CSSPseudoElementType aPseudoType,
    CascadeLevel aCascadeLevel,
    RawServoAnimationValueMapBorrowed aAnimationValues);

  bool HasPendingStyleUpdates() const;
  bool HasThrottledStyleUpdates() const;




  void AddStyleUpdatesTo(RestyleTracker& aTracker);

  nsIStyleRuleProcessor* RuleProcessor(CascadeLevel aCascadeLevel) const
  {
    return mRuleProcessors[aCascadeLevel];
  }

  static bool HasAnimationsForCompositor(const nsIFrame* aFrame,
                                         nsCSSPropertyID aProperty);

  static nsTArray<RefPtr<dom::Animation>>
  GetAnimationsForCompositor(const nsIFrame* aFrame,
                             nsCSSPropertyID aProperty);

  static void ClearIsRunningOnCompositor(const nsIFrame* aFrame,
                                         nsCSSPropertyID aProperty);
# 200 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h"
  static void
  MaybeUpdateCascadeResults(dom::Element* aElement,
                            CSSPseudoElementType aPseudoType,
                            nsStyleContext* aStyleContext);





  static void
  MaybeUpdateCascadeResults(dom::Element* aElement,
                            CSSPseudoElementType aPseudoType);







  static void
  UpdateCascadeResults(dom::Element* aElement,
                       CSSPseudoElementType aPseudoType,
                       nsStyleContext* aStyleContext);
# 233 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/EffectCompositor.h"
  static Maybe<NonOwningAnimationTarget>
  GetAnimationElementAndPseudoForFrame(const nsIFrame* aFrame);



  static void SetPerformanceWarning(
    const nsIFrame* aFrame,
    nsCSSPropertyID aProperty,
    const AnimationPerformanceWarning& aWarning);





  bool PreTraverse();


  bool PreTraverse(dom::Element* aElement, nsIAtom* aPseudoTagOrNull);



  bool PreTraverseInSubtree(dom::Element* aElement);

private:
  ~EffectCompositor() = default;



  static void ComposeAnimationRule(dom::Element* aElement,
                                   CSSPseudoElementType aPseudoType,
                                   CascadeLevel aCascadeLevel);

  static dom::Element* GetElementToRestyle(dom::Element* aElement,
                                           CSSPseudoElementType
                                             aPseudoType);




  static void
  GetOverriddenProperties(nsStyleContext* aStyleContext,
                          EffectSet& aEffectSet,
                          nsCSSPropertyIDSet& aPropertiesOverridden);

  static void
  UpdateCascadeResults(EffectSet& aEffectSet,
                       dom::Element* aElement,
                       CSSPseudoElementType aPseudoType,
                       nsStyleContext* aStyleContext);

  static nsPresContext* GetPresContext(dom::Element* aElement);

  nsPresContext* mPresContext;






  EnumeratedArray<CascadeLevel, CascadeLevel(kCascadeLevelCount),
                  nsDataHashtable<PseudoElementHashEntry, bool>>
                    mElementsToRestyle;

  class AnimationStyleRuleProcessor final : public nsIStyleRuleProcessor
  {
  public:
    AnimationStyleRuleProcessor(EffectCompositor* aCompositor,
                                CascadeLevel aCascadeLevel)
      : mCompositor(aCompositor)
      , mCascadeLevel(aCascadeLevel)
    {
      do { } while (0);
    }

    public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsAutoRefCnt mRefCnt; public:


    nsRestyleHint HasStateDependentStyle(
                        StateRuleProcessorData* aData) override;
    nsRestyleHint HasStateDependentStyle(
                        PseudoElementStateRuleProcessorData* aData) override;
    bool HasDocumentStateDependentStyle(StateRuleProcessorData* aData) override;
    nsRestyleHint HasAttributeDependentStyle(
                        AttributeRuleProcessorData* aData,
                        RestyleHintData& aRestyleHintDataResult) override;
    bool MediumFeaturesChanged(nsPresContext* aPresContext) override;
    void RulesMatching(ElementRuleProcessorData* aData) override;
    void RulesMatching(PseudoElementRuleProcessorData* aData) override;
    void RulesMatching(AnonBoxRuleProcessorData* aData) override;

    void RulesMatching(XULTreeRuleProcessorData* aData) override;

    size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf)
      const override;
    size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf)
      const override;

  private:
    ~AnimationStyleRuleProcessor() = default;

    EffectCompositor* mCompositor;
    CascadeLevel mCascadeLevel;
  };

  EnumeratedArray<CascadeLevel, CascadeLevel(kCascadeLevelCount),
                  OwningNonNull<AnimationStyleRuleProcessor>>
                    mRuleProcessors;
};

}
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 2
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h"
class nsIAtom;
class nsIPrincipal;
class nsIURI;
struct nsFont;
namespace mozilla {
  class ServoStyleSheet;
  class FontFamilyList;
  enum FontFamilyType : uint32_t;
  struct Keyframe;
  namespace css {
    struct URLValue;
  };
  enum class UpdateAnimationsTasks : uint8_t;
  struct LangGroupFontPrefs;
}
using mozilla::FontFamilyList;
using mozilla::FontFamilyType;
using mozilla::ServoElementSnapshot;
class nsCSSFontFaceRule;
struct nsMediaFeature;
struct nsStyleList;
struct nsStyleImage;
struct nsStyleGradientStop;
class nsStyleGradient;
class nsStyleCoord;
struct nsStyleDisplay;
# 84 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h"
struct nsTArrayBorrowed_uintptr_t { nsTArray<uintptr_t>* mArray; nsTArrayBorrowed_uintptr_t(nsTArray<uintptr_t>* aArray) : mArray(aArray) {} };


extern "C" {

class ServoBundledURI
{
public:
  already_AddRefed<mozilla::css::URLValue> IntoCssUrl();
  const uint8_t* mURLString;
  uint32_t mURLStringLength;
  mozilla::URLExtraData* mExtraData;
};

struct FontSizePrefs
{
  void CopyFrom(const mozilla::LangGroupFontPrefs&);
  nscoord mDefaultVariableSize;
  nscoord mDefaultFixedSize;
  nscoord mDefaultSerifSize;
  nscoord mDefaultSansSerifSize;
  nscoord mDefaultMonospaceSize;
  nscoord mDefaultCursiveSize;
  nscoord mDefaultFantasySize;
};


uint32_t Gecko_ChildrenCount(RawGeckoNodeBorrowed node);
bool Gecko_NodeIsElement(RawGeckoNodeBorrowed node);
bool Gecko_IsInDocument(RawGeckoNodeBorrowed node);
bool Gecko_FlattenedTreeParentIsParent(RawGeckoNodeBorrowed node);
bool Gecko_IsSignificantChild(RawGeckoNodeBorrowed node,
                              bool text_is_significant,
                              bool whitespace_is_significant);
RawGeckoNodeBorrowedOrNull Gecko_GetParentNode(RawGeckoNodeBorrowed node);
RawGeckoNodeBorrowedOrNull Gecko_GetFirstChild(RawGeckoNodeBorrowed node);
RawGeckoNodeBorrowedOrNull Gecko_GetLastChild(RawGeckoNodeBorrowed node);
RawGeckoNodeBorrowedOrNull Gecko_GetPrevSibling(RawGeckoNodeBorrowed node);
RawGeckoNodeBorrowedOrNull Gecko_GetNextSibling(RawGeckoNodeBorrowed node);
RawGeckoElementBorrowedOrNull Gecko_GetFirstChildElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetLastChildElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetPrevSiblingElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetNextSiblingElement(RawGeckoElementBorrowed element);
RawGeckoElementBorrowedOrNull Gecko_GetDocumentElement(RawGeckoDocumentBorrowed document);
void Gecko_LoadStyleSheet(mozilla::css::Loader* loader,
                          mozilla::ServoStyleSheet* parent,
                          RawServoStyleSheetBorrowed child_sheet,
                          RawGeckoURLExtraData* base_url_data,
                          const uint8_t* url_bytes,
                          uint32_t url_length,
                          RawServoMediaListStrong media_list);







StyleChildrenIteratorOwnedOrNull Gecko_MaybeCreateStyleChildrenIterator(RawGeckoNodeBorrowed node);
void Gecko_DropStyleChildrenIterator(StyleChildrenIteratorOwned it);
RawGeckoNodeBorrowedOrNull Gecko_GetNextStyleChild(StyleChildrenIteratorBorrowedMut it);


uint64_t Gecko_ElementState(RawGeckoElementBorrowed element);
bool Gecko_IsTextNode(RawGeckoNodeBorrowed node);
bool Gecko_IsRootElement(RawGeckoElementBorrowed element);
bool Gecko_MatchesElement(mozilla::CSSPseudoClassType type, RawGeckoElementBorrowed element);
nsIAtom* Gecko_LocalName(RawGeckoElementBorrowed element);
nsIAtom* Gecko_Namespace(RawGeckoElementBorrowed element);
nsIAtom* Gecko_GetElementId(RawGeckoElementBorrowed element);

nsIAtom* Gecko_GetXMLLangValue(RawGeckoElementBorrowed element);
# 176 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h"
nsIAtom* Gecko_AtomAttrValue(RawGeckoElementBorrowed element, nsIAtom* attribute); bool Gecko_HasAttr(RawGeckoElementBorrowed element, nsIAtom* ns, nsIAtom* name); bool Gecko_AttrEquals(RawGeckoElementBorrowed element, nsIAtom* ns, nsIAtom* name, nsIAtom* str, bool ignoreCase); bool Gecko_AttrDashEquals(RawGeckoElementBorrowed element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_AttrIncludes(RawGeckoElementBorrowed element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_AttrHasSubstring(RawGeckoElementBorrowed element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_AttrHasPrefix(RawGeckoElementBorrowed element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_AttrHasSuffix(RawGeckoElementBorrowed element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); uint32_t Gecko_ClassOrClassList(RawGeckoElementBorrowed element, nsIAtom** class_, nsIAtom*** classList);
nsIAtom* Gecko_SnapshotAtomAttrValue(const ServoElementSnapshot* element, nsIAtom* attribute); bool Gecko_SnapshotHasAttr(const ServoElementSnapshot* element, nsIAtom* ns, nsIAtom* name); bool Gecko_SnapshotAttrEquals(const ServoElementSnapshot* element, nsIAtom* ns, nsIAtom* name, nsIAtom* str, bool ignoreCase); bool Gecko_SnapshotAttrDashEquals(const ServoElementSnapshot* element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_SnapshotAttrIncludes(const ServoElementSnapshot* element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_SnapshotAttrHasSubstring(const ServoElementSnapshot* element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_SnapshotAttrHasPrefix(const ServoElementSnapshot* element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); bool Gecko_SnapshotAttrHasSuffix(const ServoElementSnapshot* element, nsIAtom* ns, nsIAtom* name, nsIAtom* str); uint32_t Gecko_SnapshotClassOrClassList(const ServoElementSnapshot* element, nsIAtom** class_, nsIAtom*** classList);





RawServoDeclarationBlockStrongBorrowedOrNull
Gecko_GetStyleAttrDeclarationBlock(RawGeckoElementBorrowed element);
RawServoDeclarationBlockStrongBorrowedOrNull
Gecko_GetHTMLPresentationAttrDeclarationBlock(RawGeckoElementBorrowed element);
RawServoDeclarationBlockStrongBorrowedOrNull
Gecko_GetExtraContentStyleDeclarations(RawGeckoElementBorrowed element);


bool
Gecko_GetAnimationRule(RawGeckoElementBorrowed aElement,
                       nsIAtom* aPseudoTag,
                       mozilla::EffectCompositor::CascadeLevel aCascadeLevel,
                       RawServoAnimationValueMapBorrowed aAnimationValues);
bool Gecko_StyleAnimationsEquals(RawGeckoStyleAnimationListBorrowed,
                                 RawGeckoStyleAnimationListBorrowed);
void Gecko_UpdateAnimations(RawGeckoElementBorrowed aElement,
                            nsIAtom* aPseudoTagOrNull,
                            ServoComputedValuesBorrowedOrNull aOldComputedValues,
                            ServoComputedValuesBorrowedOrNull aComputedValues,
                            ServoComputedValuesBorrowedOrNull aParentComputedValues,
                            mozilla::UpdateAnimationsTasks aTaskBits);
bool Gecko_ElementHasAnimations(RawGeckoElementBorrowed aElement,
                                nsIAtom* aPseudoTagOrNull);
bool Gecko_ElementHasCSSAnimations(RawGeckoElementBorrowed aElement,
                                   nsIAtom* aPseudoTagOrNull);
double Gecko_GetProgressFromComputedTiming(RawGeckoComputedTimingBorrowed aComputedTiming);
double Gecko_GetPositionInSegment(
  RawGeckoAnimationPropertySegmentBorrowed aSegment,
  double aProgress,
  mozilla::ComputedTimingFunction::BeforeFlag aBeforeFlag);




RawServoAnimationValueBorrowedOrNull Gecko_AnimationGetBaseStyle(
  void* aBaseStyles,
  nsCSSPropertyID aProperty);


nsIAtom* Gecko_Atomize(const char* aString, uint32_t aLength);
void Gecko_AddRefAtom(nsIAtom* aAtom);
void Gecko_ReleaseAtom(nsIAtom* aAtom);
const uint16_t* Gecko_GetAtomAsUTF16(nsIAtom* aAtom, uint32_t* aLength);
bool Gecko_AtomEqualsUTF8(nsIAtom* aAtom, const char* aString, uint32_t aLength);
bool Gecko_AtomEqualsUTF8IgnoreCase(nsIAtom* aAtom, const char* aString, uint32_t aLength);


void Gecko_FontFamilyList_Clear(FontFamilyList* aList);
void Gecko_FontFamilyList_AppendNamed(FontFamilyList* aList, nsIAtom* aName, bool aQuoted);
void Gecko_FontFamilyList_AppendGeneric(FontFamilyList* list, FontFamilyType familyType);
void Gecko_CopyFontFamilyFrom(nsFont* dst, const nsFont* src);


void Gecko_SetImageOrientation(nsStyleVisibility* aVisibility,
                               double aRadians,
                               bool aFlip);
void Gecko_SetImageOrientationAsFromImage(nsStyleVisibility* aVisibility);
void Gecko_CopyImageOrientationFrom(nsStyleVisibility* aDst,
                                    const nsStyleVisibility* aSrc);


void Gecko_SetListStyleType(nsStyleList* style_struct, uint32_t type);
void Gecko_CopyListStyleTypeFrom(nsStyleList* dst, const nsStyleList* src);


void Gecko_SetNullImageValue(nsStyleImage* image);
void Gecko_SetGradientImageValue(nsStyleImage* image, nsStyleGradient* gradient);
void Gecko_SetUrlImageValue(nsStyleImage* image,
                            ServoBundledURI uri);
void Gecko_SetImageElement(nsStyleImage* image, nsIAtom* atom);
void Gecko_CopyImageValueFrom(nsStyleImage* image, const nsStyleImage* other);
void Gecko_InitializeImageCropRect(nsStyleImage* image);

nsStyleGradient* Gecko_CreateGradient(uint8_t shape,
                                      uint8_t size,
                                      bool repeating,
                                      bool legacy_syntax,
                                      uint32_t stops);


void Gecko_SetListStyleImageNone(nsStyleList* style_struct);
void Gecko_SetListStyleImage(nsStyleList* style_struct,
                             ServoBundledURI uri);
void Gecko_CopyListStyleImageFrom(nsStyleList* dest, const nsStyleList* src);


void Gecko_SetCursorArrayLength(nsStyleUserInterface* ui, size_t len);
void Gecko_SetCursorImage(nsCursorImage* cursor,
                          ServoBundledURI uri);
void Gecko_CopyCursorArrayFrom(nsStyleUserInterface* dest,
                               const nsStyleUserInterface* src);

void Gecko_SetContentDataImage(nsStyleContentData* content_data, ServoBundledURI uri);
void Gecko_SetContentDataArray(nsStyleContentData* content_data, nsStyleContentType type, uint32_t len);


uint32_t Gecko_GetNodeFlags(RawGeckoNodeBorrowed node);
void Gecko_SetNodeFlags(RawGeckoNodeBorrowed node, uint32_t flags);
void Gecko_UnsetNodeFlags(RawGeckoNodeBorrowed node, uint32_t flags);
void Gecko_SetOwnerDocumentNeedsStyleFlush(RawGeckoElementBorrowed element);




nsStyleContext* Gecko_GetStyleContext(RawGeckoNodeBorrowed node,
                                      nsIAtom* aPseudoTagOrNull);
nsChangeHint Gecko_CalcStyleDifference(nsStyleContext* oldstyle,
                                       ServoComputedValuesBorrowed newstyle);
nsChangeHint Gecko_HintsHandledForDescendants(nsChangeHint aHint);


ServoElementSnapshotOwned Gecko_CreateElementSnapshot(RawGeckoElementBorrowed element);
void Gecko_DropElementSnapshot(ServoElementSnapshotOwned snapshot);




void Gecko_EnsureTArrayCapacity(void* array, size_t capacity, size_t elem_size);





void Gecko_ClearPODTArray(void* array, size_t elem_size, size_t elem_align);

void Gecko_CopyStyleGridTemplateValues(nsStyleGridTemplate* grid_template,
                                       const nsStyleGridTemplate* other);



void Gecko_ClearAndResizeStyleContents(nsStyleContent* content,
                                       uint32_t how_many);
void Gecko_ClearAndResizeCounterIncrements(nsStyleContent* content,
                                           uint32_t how_many);
void Gecko_ClearAndResizeCounterResets(nsStyleContent* content,
                                       uint32_t how_many);
void Gecko_CopyStyleContentsFrom(nsStyleContent* content, const nsStyleContent* other);
void Gecko_CopyCounterResetsFrom(nsStyleContent* content, const nsStyleContent* other);
void Gecko_CopyCounterIncrementsFrom(nsStyleContent* content, const nsStyleContent* other);

void Gecko_EnsureImageLayersLength(nsStyleImageLayers* layers, size_t len,
                                   nsStyleImageLayers::LayerType layer_type);

void Gecko_EnsureStyleAnimationArrayLength(void* array, size_t len);
void Gecko_EnsureStyleTransitionArrayLength(void* array, size_t len);

void Gecko_ClearWillChange(nsStyleDisplay* display, size_t length);
void Gecko_AppendWillChange(nsStyleDisplay* display, nsIAtom* atom);
void Gecko_CopyWillChangeFrom(nsStyleDisplay* dest, nsStyleDisplay* src);

mozilla::Keyframe* Gecko_AnimationAppendKeyframe(RawGeckoKeyframeListBorrowedMut keyframes,
                                                 float offset,
                                                 const nsTimingFunction* timingFunction);


void Gecko_ResetStyleCoord(nsStyleUnit* unit, nsStyleUnion* value);


void Gecko_SetStyleCoordCalcValue(nsStyleUnit* unit, nsStyleUnion* value, nsStyleCoord::CalcValue calc);

void Gecko_CopyShapeSourceFrom(mozilla::StyleShapeSource* dst, const mozilla::StyleShapeSource* src);

void Gecko_DestroyShapeSource(mozilla::StyleShapeSource* shape);
mozilla::StyleBasicShape* Gecko_NewBasicShape(mozilla::StyleBasicShapeType type);
void Gecko_StyleShapeSource_SetURLValue(mozilla::StyleShapeSource* shape, ServoBundledURI uri);

void Gecko_ResetFilters(nsStyleEffects* effects, size_t new_len);
void Gecko_CopyFiltersFrom(nsStyleEffects* aSrc, nsStyleEffects* aDest);
void Gecko_nsStyleFilter_SetURLValue(nsStyleFilter* effects, ServoBundledURI uri);

void Gecko_nsStyleSVGPaint_CopyFrom(nsStyleSVGPaint* dest, const nsStyleSVGPaint* src);
void Gecko_nsStyleSVGPaint_SetURLValue(nsStyleSVGPaint* paint, ServoBundledURI uri);
void Gecko_nsStyleSVGPaint_Reset(nsStyleSVGPaint* paint);

void Gecko_nsStyleSVG_SetDashArrayLength(nsStyleSVG* svg, uint32_t len);
void Gecko_nsStyleSVG_CopyDashArray(nsStyleSVG* dst, const nsStyleSVG* src);

mozilla::css::URLValue* Gecko_NewURLValue(ServoBundledURI uri);
void Gecko_AddRefCSSURLValueArbitraryThread(mozilla::css::URLValue* aPtr); void Gecko_ReleaseCSSURLValueArbitraryThread(mozilla::css::URLValue* aPtr);;
void Gecko_AddRefURLExtraDataArbitraryThread(RawGeckoURLExtraData* aPtr); void Gecko_ReleaseURLExtraDataArbitraryThread(RawGeckoURLExtraData* aPtr);;

void Gecko_FillAllBackgroundLists(nsStyleImageLayers* layers, uint32_t max_len);
void Gecko_FillAllMaskLists(nsStyleImageLayers* layers, uint32_t max_len);
void Gecko_AddRefCalcArbitraryThread(nsStyleCoord::Calc* aPtr); void Gecko_ReleaseCalcArbitraryThread(nsStyleCoord::Calc* aPtr);;

nsCSSShadowArray* Gecko_NewCSSShadowArray(uint32_t len);
void Gecko_AddRefCSSShadowArrayArbitraryThread(nsCSSShadowArray* aPtr); void Gecko_ReleaseCSSShadowArrayArbitraryThread(nsCSSShadowArray* aPtr);;

nsStyleQuoteValues* Gecko_NewStyleQuoteValues(uint32_t len);
void Gecko_AddRefQuoteValuesArbitraryThread(nsStyleQuoteValues* aPtr); void Gecko_ReleaseQuoteValuesArbitraryThread(nsStyleQuoteValues* aPtr);;

nsCSSValueSharedList* Gecko_NewCSSValueSharedList(uint32_t len);


nsCSSValueBorrowedMut Gecko_CSSValue_GetArrayItem(nsCSSValueBorrowedMut css_value, int32_t index);

nsCSSValueBorrowed Gecko_CSSValue_GetArrayItemConst(nsCSSValueBorrowed css_value, int32_t index);
nscoord Gecko_CSSValue_GetAbsoluteLength(nsCSSValueBorrowed css_value);
float Gecko_CSSValue_GetAngle(nsCSSValueBorrowed css_value);
nsCSSKeyword Gecko_CSSValue_GetKeyword(nsCSSValueBorrowed aCSSValue);
float Gecko_CSSValue_GetNumber(nsCSSValueBorrowed css_value);
float Gecko_CSSValue_GetPercentage(nsCSSValueBorrowed css_value);
nsStyleCoord::CalcValue Gecko_CSSValue_GetCalc(nsCSSValueBorrowed aCSSValue);

void Gecko_CSSValue_SetAbsoluteLength(nsCSSValueBorrowedMut css_value, nscoord len);
void Gecko_CSSValue_SetNormal(nsCSSValueBorrowedMut css_value);
void Gecko_CSSValue_SetNumber(nsCSSValueBorrowedMut css_value, float number);
void Gecko_CSSValue_SetKeyword(nsCSSValueBorrowedMut css_value, nsCSSKeyword keyword);
void Gecko_CSSValue_SetPercentage(nsCSSValueBorrowedMut css_value, float percent);
void Gecko_CSSValue_SetAngle(nsCSSValueBorrowedMut css_value, float radians);
void Gecko_CSSValue_SetCalc(nsCSSValueBorrowedMut css_value, nsStyleCoord::CalcValue calc);
void Gecko_CSSValue_SetFunction(nsCSSValueBorrowedMut css_value, int32_t len);
void Gecko_CSSValue_SetString(nsCSSValueBorrowedMut css_value,
                              const uint8_t* string, uint32_t len, nsCSSUnit unit);
void Gecko_CSSValue_SetStringFromAtom(nsCSSValueBorrowedMut css_value,
                                      nsIAtom* atom, nsCSSUnit unit);
void Gecko_CSSValue_SetArray(nsCSSValueBorrowedMut css_value, int32_t len);
void Gecko_CSSValue_SetURL(nsCSSValueBorrowedMut css_value, ServoBundledURI uri);
void Gecko_CSSValue_SetInt(nsCSSValueBorrowedMut css_value, int32_t integer, nsCSSUnit unit);
void Gecko_CSSValue_Drop(nsCSSValueBorrowedMut css_value);
void Gecko_AddRefCSSValueSharedListArbitraryThread(nsCSSValueSharedList* aPtr); void Gecko_ReleaseCSSValueSharedListArbitraryThread(nsCSSValueSharedList* aPtr);;
bool Gecko_PropertyId_IsPrefEnabled(nsCSSPropertyID id);

void Gecko_nsStyleFont_SetLang(nsStyleFont* font, nsIAtom* atom);
void Gecko_nsStyleFont_CopyLangFrom(nsStyleFont* aFont, const nsStyleFont* aSource);
FontSizePrefs Gecko_GetBaseSize(nsIAtom* lang);

struct GeckoFontMetrics
{
  nscoord mChSize;
  nscoord mXSize;
};

GeckoFontMetrics Gecko_GetFontMetrics(RawGeckoPresContextBorrowed pres_context,
                                      bool is_vertical,
                                      const nsStyleFont* font,
                                      nscoord font_size,
                                      bool use_user_font_set);
void InitializeServo();
void ShutdownServo();

const nsMediaFeature* Gecko_GetMediaFeatures();



nsCSSFontFaceRule* Gecko_CSSFontFaceRule_Create();
void Gecko_CSSFontFaceRule_GetCssText(const nsCSSFontFaceRule* rule, nsAString* result);
void Gecko_CSSFontFaceRule_AddRef(nsCSSFontFaceRule* aPtr); void Gecko_CSSFontFaceRule_Release(nsCSSFontFaceRule* aPtr);;

RawGeckoElementBorrowedOrNull Gecko_GetBody(RawGeckoPresContextBorrowed pres_context);



nscolor Gecko_GetLookAndFeelSystemColor(int32_t color_id,
                                        RawGeckoPresContextBorrowed pres_context);

bool Gecko_MatchStringArgPseudo(RawGeckoElementBorrowed element,
                                mozilla::CSSPseudoClassType type,
                                const char16_t* ident,
                                bool* set_slow_selector);
# 452 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h" 1
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h"
void Gecko_Construct_Default_nsStyleFont( nsStyleFont* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleFont(nsStyleFont* ptr, const nsStyleFont* other); void Gecko_Destroy_nsStyleFont(nsStyleFont* ptr);



void Gecko_Construct_Default_nsStyleColor( nsStyleColor* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleColor(nsStyleColor* ptr, const nsStyleColor* other); void Gecko_Destroy_nsStyleColor(nsStyleColor* ptr);


void Gecko_Construct_Default_nsStyleList( nsStyleList* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleList(nsStyleList* ptr, const nsStyleList* other); void Gecko_Destroy_nsStyleList(nsStyleList* ptr);




void Gecko_Construct_Default_nsStyleText( nsStyleText* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleText(nsStyleText* ptr, const nsStyleText* other); void Gecko_Destroy_nsStyleText(nsStyleText* ptr);





void Gecko_Construct_Default_nsStyleVisibility( nsStyleVisibility* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleVisibility(nsStyleVisibility* ptr, const nsStyleVisibility* other); void Gecko_Destroy_nsStyleVisibility(nsStyleVisibility* ptr);


void Gecko_Construct_Default_nsStyleUserInterface( nsStyleUserInterface* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleUserInterface(nsStyleUserInterface* ptr, const nsStyleUserInterface* other); void Gecko_Destroy_nsStyleUserInterface(nsStyleUserInterface* ptr);


void Gecko_Construct_Default_nsStyleTableBorder( nsStyleTableBorder* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleTableBorder(nsStyleTableBorder* ptr, const nsStyleTableBorder* other); void Gecko_Destroy_nsStyleTableBorder(nsStyleTableBorder* ptr);




void Gecko_Construct_Default_nsStyleSVG( nsStyleSVG* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleSVG(nsStyleSVG* ptr, const nsStyleSVG* other); void Gecko_Destroy_nsStyleSVG(nsStyleSVG* ptr);





void Gecko_Construct_Default_nsStyleVariables( nsStyleVariables* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleVariables(nsStyleVariables* ptr, const nsStyleVariables* other); void Gecko_Destroy_nsStyleVariables(nsStyleVariables* ptr);

void Gecko_Construct_Default_nsStyleBackground( nsStyleBackground* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleBackground(nsStyleBackground* ptr, const nsStyleBackground* other); void Gecko_Destroy_nsStyleBackground(nsStyleBackground* ptr);





void Gecko_Construct_Default_nsStylePosition( nsStylePosition* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStylePosition(nsStylePosition* ptr, const nsStylePosition* other); void Gecko_Destroy_nsStylePosition(nsStylePosition* ptr);




void Gecko_Construct_Default_nsStyleTextReset( nsStyleTextReset* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleTextReset(nsStyleTextReset* ptr, const nsStyleTextReset* other); void Gecko_Destroy_nsStyleTextReset(nsStyleTextReset* ptr);





void Gecko_Construct_Default_nsStyleDisplay( nsStyleDisplay* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleDisplay(nsStyleDisplay* ptr, const nsStyleDisplay* other); void Gecko_Destroy_nsStyleDisplay(nsStyleDisplay* ptr);




void Gecko_Construct_Default_nsStyleContent( nsStyleContent* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleContent(nsStyleContent* ptr, const nsStyleContent* other); void Gecko_Destroy_nsStyleContent(nsStyleContent* ptr);




void Gecko_Construct_Default_nsStyleUIReset( nsStyleUIReset* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleUIReset(nsStyleUIReset* ptr, const nsStyleUIReset* other); void Gecko_Destroy_nsStyleUIReset(nsStyleUIReset* ptr);


void Gecko_Construct_Default_nsStyleTable( nsStyleTable* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleTable(nsStyleTable* ptr, const nsStyleTable* other); void Gecko_Destroy_nsStyleTable(nsStyleTable* ptr);


void Gecko_Construct_Default_nsStyleMargin( nsStyleMargin* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleMargin(nsStyleMargin* ptr, const nsStyleMargin* other); void Gecko_Destroy_nsStyleMargin(nsStyleMargin* ptr);




void Gecko_Construct_Default_nsStylePadding( nsStylePadding* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStylePadding(nsStylePadding* ptr, const nsStylePadding* other); void Gecko_Destroy_nsStylePadding(nsStylePadding* ptr);




void Gecko_Construct_Default_nsStyleBorder( nsStyleBorder* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleBorder(nsStyleBorder* ptr, const nsStyleBorder* other); void Gecko_Destroy_nsStyleBorder(nsStyleBorder* ptr);





void Gecko_Construct_Default_nsStyleOutline( nsStyleOutline* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleOutline(nsStyleOutline* ptr, const nsStyleOutline* other); void Gecko_Destroy_nsStyleOutline(nsStyleOutline* ptr);





void Gecko_Construct_Default_nsStyleXUL( nsStyleXUL* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleXUL(nsStyleXUL* ptr, const nsStyleXUL* other); void Gecko_Destroy_nsStyleXUL(nsStyleXUL* ptr);


void Gecko_Construct_Default_nsStyleSVGReset( nsStyleSVGReset* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleSVGReset(nsStyleSVGReset* ptr, const nsStyleSVGReset* other); void Gecko_Destroy_nsStyleSVGReset(nsStyleSVGReset* ptr);





void Gecko_Construct_Default_nsStyleColumn( nsStyleColumn* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleColumn(nsStyleColumn* ptr, const nsStyleColumn* other); void Gecko_Destroy_nsStyleColumn(nsStyleColumn* ptr);





void Gecko_Construct_Default_nsStyleEffects( nsStyleEffects* ptr, RawGeckoPresContextBorrowed pres_context); void Gecko_CopyConstruct_nsStyleEffects(nsStyleEffects* ptr, const nsStyleEffects* other); void Gecko_Destroy_nsStyleEffects(nsStyleEffects* ptr);
# 453 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 2


void Gecko_Construct_nsStyleVariables(nsStyleVariables* ptr);

void Gecko_RegisterProfilerThread(const char* name);
void Gecko_UnregisterProfilerThread();



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingList.h" 1
# 22 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingList.h"
void Servo_Element_ClearData(RawGeckoElementBorrowed node);


RawServoStyleSheetStrong Servo_StyleSheet_Empty(mozilla::css::SheetParsingMode parsing_mode);

RawServoStyleSheetStrong Servo_StyleSheet_FromUTF8Bytes(mozilla::css::Loader* loader, mozilla::ServoStyleSheet* gecko_stylesheet, const nsACString* data, mozilla::css::SheetParsingMode parsing_mode, const RawServoMediaList* media_list, RawGeckoURLExtraData* extra_data);






RawServoStyleSheetStrong Servo_ImportRule_GetSheet(const RawServoImportRuleBorrowed import_rule);


void Servo_StyleSheet_ClearAndUpdate(RawServoStyleSheetBorrowed stylesheet, mozilla::css::Loader* loader, mozilla::ServoStyleSheet* gecko_stylesheet, const nsACString* data, RawGeckoURLExtraData* extra_data);






bool Servo_StyleSheet_HasRules(RawServoStyleSheetBorrowed sheet);

ServoCssRulesStrong Servo_StyleSheet_GetRules(RawServoStyleSheetBorrowed sheet);

RawServoStyleSetOwned Servo_StyleSet_Init(RawGeckoPresContextOwned pres_context);
void Servo_StyleSet_RebuildData(RawServoStyleSetBorrowed set);

void Servo_StyleSet_Drop(RawServoStyleSetOwned set);
void Servo_StyleSet_AppendStyleSheet(RawServoStyleSetBorrowed set, RawServoStyleSheetBorrowed sheet, bool flush);

void Servo_StyleSet_PrependStyleSheet(RawServoStyleSetBorrowed set, RawServoStyleSheetBorrowed sheet, bool flush);

void Servo_StyleSet_RemoveStyleSheet(RawServoStyleSetBorrowed set, RawServoStyleSheetBorrowed sheet, bool flush);

void Servo_StyleSet_InsertStyleSheetBefore(RawServoStyleSetBorrowed set, RawServoStyleSheetBorrowed sheet, RawServoStyleSheetBorrowed reference, bool flush);


void Servo_StyleSet_FlushStyleSheets(RawServoStyleSetBorrowed set);
void Servo_StyleSet_NoteStyleSheetsChanged(RawServoStyleSetBorrowed set);

bool Servo_StyleSet_FillKeyframesForName(RawServoStyleSetBorrowed set, const nsACString* property, nsTimingFunctionBorrowed timing_function, ServoComputedValuesBorrowed computed_values, RawGeckoKeyframeListBorrowedMut keyframe_list);





void Servo_StyleSet_GetFontFaceRules(RawServoStyleSetBorrowed set, RawGeckoFontFaceRuleListBorrowedMut list);




void Servo_CssRules_ListTypes(ServoCssRulesBorrowed rules, nsTArrayBorrowed_uintptr_t result);


nsresult Servo_CssRules_InsertRule(ServoCssRulesBorrowed rules, RawServoStyleSheetBorrowed sheet, const nsACString* rule, uint32_t index, bool nested, mozilla::css::Loader* loader, mozilla::ServoStyleSheet* gecko_stylesheet, uint16_t* rule_type);





nsresult Servo_CssRules_DeleteRule(ServoCssRulesBorrowed rules, uint32_t index);
# 96 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingList.h"
RawServoStyleRuleStrong Servo_CssRules_GetStyleRuleAt(ServoCssRulesBorrowed rules, uint32_t index); void Servo_StyleRule_Debug(RawServoStyleRuleBorrowed rule, nsACString* result); void Servo_StyleRule_GetCssText(RawServoStyleRuleBorrowed rule, nsAString* result);
RawServoMediaRuleStrong Servo_CssRules_GetMediaRuleAt(ServoCssRulesBorrowed rules, uint32_t index); void Servo_MediaRule_Debug(RawServoMediaRuleBorrowed rule, nsACString* result); void Servo_MediaRule_GetCssText(RawServoMediaRuleBorrowed rule, nsAString* result);
RawServoNamespaceRuleStrong Servo_CssRules_GetNamespaceRuleAt(ServoCssRulesBorrowed rules, uint32_t index); void Servo_NamespaceRule_Debug(RawServoNamespaceRuleBorrowed rule, nsACString* result); void Servo_NamespaceRule_GetCssText(RawServoNamespaceRuleBorrowed rule, nsAString* result);
RawServoPageRuleStrong Servo_CssRules_GetPageRuleAt(ServoCssRulesBorrowed rules, uint32_t index); void Servo_PageRule_Debug(RawServoPageRuleBorrowed rule, nsACString* result); void Servo_PageRule_GetCssText(RawServoPageRuleBorrowed rule, nsAString* result);

nsCSSFontFaceRule* Servo_CssRules_GetFontFaceRuleAt(ServoCssRulesBorrowed rules, uint32_t index);

RawServoDeclarationBlockStrong Servo_StyleRule_GetStyle(RawServoStyleRuleBorrowed rule);

void Servo_StyleRule_SetStyle(RawServoStyleRuleBorrowed rule, RawServoDeclarationBlockBorrowed declarations);


void Servo_StyleRule_GetSelectorText(RawServoStyleRuleBorrowed rule, nsAString* result);

RawServoMediaListStrong Servo_MediaRule_GetMedia(RawServoMediaRuleBorrowed rule);

ServoCssRulesStrong Servo_MediaRule_GetRules(RawServoMediaRuleBorrowed rule);

nsIAtom* Servo_NamespaceRule_GetPrefix(RawServoNamespaceRuleBorrowed rule);

nsIAtom* Servo_NamespaceRule_GetURI(RawServoNamespaceRuleBorrowed rule);

RawServoDeclarationBlockStrong Servo_PageRule_GetStyle(RawServoPageRuleBorrowed rule);

void Servo_PageRule_SetStyle(RawServoPageRuleBorrowed rule, RawServoDeclarationBlockBorrowed declarations);




RawServoDeclarationBlockStrong Servo_ParseProperty(const nsACString* property, const nsACString* value, RawGeckoURLExtraData* data);



bool Servo_ParseEasing(const nsAString* easing, RawGeckoURLExtraData* data, nsTimingFunctionBorrowedMut output);



void Servo_GetComputedKeyframeValues(RawGeckoKeyframeListBorrowed keyframes, ServoComputedValuesBorrowed style, ServoComputedValuesBorrowedOrNull parent_style, RawServoStyleSetBorrowed set, RawGeckoComputedKeyframeValuesListBorrowedMut result);





void Servo_AnimationValueMap_Push(RawServoAnimationValueMapBorrowed, nsCSSPropertyID property, RawServoAnimationValueBorrowed value);



RawServoAnimationValueStrong Servo_ComputedValues_ExtractAnimationValue(ServoComputedValuesBorrowed computed_values, nsCSSPropertyID property);



bool Servo_Property_IsAnimatable(nsCSSPropertyID property);

bool Servo_Property_IsDiscreteAnimatable(nsCSSPropertyID property);



RawServoAnimationValueStrong Servo_AnimationValues_Interpolate(RawServoAnimationValueBorrowed from, RawServoAnimationValueBorrowed to, double progress);




bool Servo_AnimationValues_IsInterpolable(RawServoAnimationValueBorrowed from, RawServoAnimationValueBorrowed to);


void Servo_AnimationValue_Serialize(RawServoAnimationValueBorrowed value, nsCSSPropertyID property, nsAString* buffer);



float Servo_AnimationValue_GetOpacity(RawServoAnimationValueBorrowed value);

void Servo_AnimationValue_GetTransform(RawServoAnimationValueBorrowed value, RefPtr<nsCSSValueSharedList>* list);


bool Servo_AnimationValue_DeepEqual(RawServoAnimationValueBorrowed, RawServoAnimationValueBorrowed);


RawServoDeclarationBlockStrong Servo_AnimationValue_Uncompute(RawServoAnimationValueBorrowed value);




RawServoDeclarationBlockStrong Servo_ParseStyleAttribute(const nsACString* data, RawGeckoURLExtraData* extra_data);


RawServoDeclarationBlockStrong Servo_DeclarationBlock_CreateEmpty();

RawServoDeclarationBlockStrong Servo_DeclarationBlock_Clone(RawServoDeclarationBlockBorrowed declarations);

bool Servo_DeclarationBlock_Equals(RawServoDeclarationBlockBorrowed a, RawServoDeclarationBlockBorrowed b);


void Servo_DeclarationBlock_GetCssText(RawServoDeclarationBlockBorrowed declarations, nsAString* result);


void Servo_DeclarationBlock_SerializeOneValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, nsAString* buffer);


uint32_t Servo_DeclarationBlock_Count(RawServoDeclarationBlockBorrowed declarations);

bool Servo_DeclarationBlock_GetNthProperty(RawServoDeclarationBlockBorrowed declarations, uint32_t index, nsAString* result);


void Servo_DeclarationBlock_GetPropertyValue(RawServoDeclarationBlockBorrowed declarations, const nsACString* property, nsAString* value);


void Servo_DeclarationBlock_GetPropertyValueById(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, nsAString* value);


bool Servo_DeclarationBlock_GetPropertyIsImportant(RawServoDeclarationBlockBorrowed declarations, const nsACString* property);


bool Servo_DeclarationBlock_SetProperty(RawServoDeclarationBlockBorrowed declarations, const nsACString* property, const nsACString* value, bool is_important, RawGeckoURLExtraData* data);




bool Servo_DeclarationBlock_SetPropertyById(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, const nsACString* value, bool is_important, RawGeckoURLExtraData* data);




void Servo_DeclarationBlock_RemoveProperty(RawServoDeclarationBlockBorrowed declarations, const nsACString* property);


void Servo_DeclarationBlock_RemovePropertyById(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property);





void Servo_AnimationCompose(RawServoAnimationValueMapBorrowed animation_values, void* base_values, nsCSSPropertyID property, RawGeckoAnimationPropertySegmentBorrowed animation_segment, RawGeckoComputedTimingBorrowed computed_timing);







bool Servo_DeclarationBlock_PropertyIsSet(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property);


void Servo_DeclarationBlock_SetIdentStringValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, nsIAtom* value);



void Servo_DeclarationBlock_SetKeywordValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, int32_t value);



void Servo_DeclarationBlock_SetIntValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, int32_t value);



void Servo_DeclarationBlock_SetPixelValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, float value);



void Servo_DeclarationBlock_SetLengthValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, float value, nsCSSUnit unit);




void Servo_DeclarationBlock_SetNumberValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, float value);



void Servo_DeclarationBlock_SetPercentValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, float value);



void Servo_DeclarationBlock_SetAutoValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property);


void Servo_DeclarationBlock_SetCurrentColor(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property);


void Servo_DeclarationBlock_SetColorValue(RawServoDeclarationBlockBorrowed declarations, nsCSSPropertyID property, nscolor value);



void Servo_DeclarationBlock_SetFontFamily(RawServoDeclarationBlockBorrowed declarations, const nsAString& value);


void Servo_DeclarationBlock_SetTextDecorationColorOverride(RawServoDeclarationBlockBorrowed declarations);

void Servo_DeclarationBlock_SetBackgroundImage(RawServoDeclarationBlockBorrowed declarations, const nsAString& value, RawGeckoURLExtraData* extra_data);





RawServoMediaListStrong Servo_MediaList_Create();
RawServoMediaListStrong Servo_MediaList_DeepClone(RawServoMediaListBorrowed list);

bool Servo_MediaList_Matches(RawServoMediaListBorrowed list, RawServoStyleSetBorrowed set);


void Servo_MediaList_GetText(RawServoMediaListBorrowed list, nsAString* result);

void Servo_MediaList_SetText(RawServoMediaListBorrowed list, const nsACString* text);

uint32_t Servo_MediaList_GetLength(RawServoMediaListBorrowed list);

bool Servo_MediaList_GetMediumAt(RawServoMediaListBorrowed list, uint32_t index, nsAString* result);


void Servo_MediaList_AppendMedium(RawServoMediaListBorrowed list, const nsACString* new_medium);

bool Servo_MediaList_DeleteMedium(RawServoMediaListBorrowed list, const nsACString* old_medium);



bool Servo_CSSSupports2(const nsACString* name, const nsACString* value);

bool Servo_CSSSupports(const nsACString* cond);



ServoComputedValuesStrong Servo_ComputedValues_GetForAnonymousBox(ServoComputedValuesBorrowedOrNull parent_style_or_null, nsIAtom* pseudoTag, bool skip_display_fixup, RawServoStyleSetBorrowed set);




ServoComputedValuesStrong Servo_ComputedValues_Inherit(RawServoStyleSetBorrowed set, ServoComputedValuesBorrowedOrNull parent_style);




void Servo_Initialize(RawGeckoURLExtraData* dummy_url_data);


void Servo_Shutdown();



ServoElementSnapshot* Servo_Element_GetSnapshot(RawGeckoElementBorrowed element);




void Servo_Element_GetStyleRuleList(RawGeckoElementBorrowed element, RawGeckoServoStyleRuleListBorrowedMut rules);




void Servo_NoteExplicitHints(RawGeckoElementBorrowed element, nsRestyleHint restyle_hint, nsChangeHint change_hint);

nsChangeHint Servo_TakeChangeHint(RawGeckoElementBorrowed element);
ServoComputedValuesStrong Servo_ResolveStyle(RawGeckoElementBorrowed element, RawServoStyleSetBorrowed set, bool allow_stale);



ServoComputedValuesStrong Servo_ResolvePseudoStyle(RawGeckoElementBorrowed element, nsIAtom* pseudo_tag, bool is_probe, RawServoStyleSetBorrowed set);
# 361 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingList.h"
ServoComputedValuesStrong Servo_ResolveStyleLazily(RawGeckoElementBorrowed element, nsIAtom* pseudo_tag, RawServoStyleSetBorrowed set);





bool Servo_TraverseSubtree(RawGeckoElementBorrowed root, RawServoStyleSetBorrowed set, mozilla::TraversalRootBehavior root_behavior, mozilla::TraversalRestyleBehavior restyle_behavior);





void Servo_AssertTreeIsClean(RawGeckoElementBorrowed root);


ServoComputedValuesStrong Servo_StyleSet_GetBaseComputedValuesForElement(RawServoStyleSetBorrowed set, RawGeckoElementBorrowed element, nsIAtom* pseudo_tag);
# 387 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingList.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h" 1
# 44 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsStyleStructList.h"
struct nsStyleFont; const nsStyleFont* Servo_GetStyleFont(ServoComputedValuesBorrowedOrNull computed_values);



struct nsStyleColor; const nsStyleColor* Servo_GetStyleColor(ServoComputedValuesBorrowedOrNull computed_values);


struct nsStyleList; const nsStyleList* Servo_GetStyleList(ServoComputedValuesBorrowedOrNull computed_values);




struct nsStyleText; const nsStyleText* Servo_GetStyleText(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStyleVisibility; const nsStyleVisibility* Servo_GetStyleVisibility(ServoComputedValuesBorrowedOrNull computed_values);


struct nsStyleUserInterface; const nsStyleUserInterface* Servo_GetStyleUserInterface(ServoComputedValuesBorrowedOrNull computed_values);


struct nsStyleTableBorder; const nsStyleTableBorder* Servo_GetStyleTableBorder(ServoComputedValuesBorrowedOrNull computed_values);




struct nsStyleSVG; const nsStyleSVG* Servo_GetStyleSVG(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStyleVariables; const nsStyleVariables* Servo_GetStyleVariables(ServoComputedValuesBorrowedOrNull computed_values);

struct nsStyleBackground; const nsStyleBackground* Servo_GetStyleBackground(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStylePosition; const nsStylePosition* Servo_GetStylePosition(ServoComputedValuesBorrowedOrNull computed_values);




struct nsStyleTextReset; const nsStyleTextReset* Servo_GetStyleTextReset(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStyleDisplay; const nsStyleDisplay* Servo_GetStyleDisplay(ServoComputedValuesBorrowedOrNull computed_values);




struct nsStyleContent; const nsStyleContent* Servo_GetStyleContent(ServoComputedValuesBorrowedOrNull computed_values);




struct nsStyleUIReset; const nsStyleUIReset* Servo_GetStyleUIReset(ServoComputedValuesBorrowedOrNull computed_values);


struct nsStyleTable; const nsStyleTable* Servo_GetStyleTable(ServoComputedValuesBorrowedOrNull computed_values);


struct nsStyleMargin; const nsStyleMargin* Servo_GetStyleMargin(ServoComputedValuesBorrowedOrNull computed_values);




struct nsStylePadding; const nsStylePadding* Servo_GetStylePadding(ServoComputedValuesBorrowedOrNull computed_values);




struct nsStyleBorder; const nsStyleBorder* Servo_GetStyleBorder(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStyleOutline; const nsStyleOutline* Servo_GetStyleOutline(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStyleXUL; const nsStyleXUL* Servo_GetStyleXUL(ServoComputedValuesBorrowedOrNull computed_values);


struct nsStyleSVGReset; const nsStyleSVGReset* Servo_GetStyleSVGReset(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStyleColumn; const nsStyleColumn* Servo_GetStyleColumn(ServoComputedValuesBorrowedOrNull computed_values);





struct nsStyleEffects; const nsStyleEffects* Servo_GetStyleEffects(ServoComputedValuesBorrowedOrNull computed_values);
# 388 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingList.h" 2






# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoArcTypeList.h" 1








void Servo_CssRules_AddRef(ServoCssRulesBorrowed); void Servo_CssRules_Release(ServoCssRulesBorrowed);
void Servo_StyleSheet_AddRef(RawServoStyleSheetBorrowed); void Servo_StyleSheet_Release(RawServoStyleSheetBorrowed);
void Servo_ComputedValues_AddRef(ServoComputedValuesBorrowed); void Servo_ComputedValues_Release(ServoComputedValuesBorrowed);
void Servo_DeclarationBlock_AddRef(RawServoDeclarationBlockBorrowed); void Servo_DeclarationBlock_Release(RawServoDeclarationBlockBorrowed);
void Servo_StyleRule_AddRef(RawServoStyleRuleBorrowed); void Servo_StyleRule_Release(RawServoStyleRuleBorrowed);
void Servo_ImportRule_AddRef(RawServoImportRuleBorrowed); void Servo_ImportRule_Release(RawServoImportRuleBorrowed);
void Servo_AnimationValue_AddRef(RawServoAnimationValueBorrowed); void Servo_AnimationValue_Release(RawServoAnimationValueBorrowed);
void Servo_AnimationValueMap_AddRef(RawServoAnimationValueMapBorrowed); void Servo_AnimationValueMap_Release(RawServoAnimationValueMapBorrowed);
void Servo_MediaList_AddRef(RawServoMediaListBorrowed); void Servo_MediaList_Release(RawServoMediaListBorrowed);
void Servo_MediaRule_AddRef(RawServoMediaRuleBorrowed); void Servo_MediaRule_Release(RawServoMediaRuleBorrowed);
void Servo_NamespaceRule_AddRef(RawServoNamespaceRuleBorrowed); void Servo_NamespaceRule_Release(RawServoNamespaceRuleBorrowed);
void Servo_PageRule_AddRef(RawServoPageRuleBorrowed); void Servo_PageRule_Release(RawServoPageRuleBorrowed);
# 395 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindingList.h" 2
# 462 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/ServoBindings.h" 2


}
# 16 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontFaceRule.h" 1
# 10 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontFaceRule.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/css/Rule.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/css/Rule.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSRule.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSRule.h"
namespace mozilla {
namespace css {
class Rule;
}
}
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSRule.h"
class nsIDOMCSSRule : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    UNKNOWN_RULE = 0U,
    STYLE_RULE = 1U,
    CHARSET_RULE = 2U,
    IMPORT_RULE = 3U,
    MEDIA_RULE = 4U,
    FONT_FACE_RULE = 5U,
    PAGE_RULE = 6U,
    KEYFRAMES_RULE = 7U,
    KEYFRAME_RULE = 8U,
    MOZ_KEYFRAMES_RULE = 7U,
    MOZ_KEYFRAME_RULE = 8U,
    NAMESPACE_RULE = 10U,
    COUNTER_STYLE_RULE = 11U,
    SUPPORTS_RULE = 12U,
    FONT_FEATURE_VALUES_RULE = 14U
  };


  virtual nsresult GetType(uint16_t *aType) = 0;


  virtual nsresult GetCssText(nsAString & aCssText) = 0;
  virtual nsresult SetCssText(const nsAString & aCssText) = 0;


  virtual nsresult GetParentStyleSheet(nsIDOMCSSStyleSheet * *aParentStyleSheet) = 0;


  virtual nsresult GetParentRule(nsIDOMCSSRule * *aParentRule) = 0;


  virtual mozilla::css::Rule * GetCSSRule(void) = 0;

};

  template<typename T> struct nsIDOMCSSRule::COMTypeInfo<nsIDOMCSSRule, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMCSSRule::COMTypeInfo<nsIDOMCSSRule, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x4d6b3bad, 0xf53c, 0x4585, { 0x82, 0xf6, 0x62, 0x98, 0x2e, 0x27, 0xed, 0xe8 }};
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/css/Rule.h" 2


class nsIDocument;
struct nsRuleData;
template<class T> struct already_AddRefed;
class nsHTMLCSSStyleSheet;

namespace mozilla {
namespace css {
class GroupRule;

class Rule : public nsIDOMCSSRule
           , public nsWrapperCache
{
protected:
  Rule(uint32_t aLineNumber, uint32_t aColumnNumber)
    : mSheet(nullptr),
      mParentRule(nullptr),
      mLineNumber(aLineNumber),
      mColumnNumber(aColumnNumber)
  {
  }

  Rule(const Rule& aCopy)
    : mSheet(aCopy.mSheet),
      mParentRule(aCopy.mParentRule),
      mLineNumber(aCopy.mLineNumber),
      mColumnNumber(aCopy.mColumnNumber)
  {
  }

  virtual ~Rule() {}

public:

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = true) : nsXPCOMCycleCollectionParticipant(true) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "Rule"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<Rule>(p)->DeleteCycleCollectable(); } static Rule* Downcast(nsISupports* s) { return static_cast<Rule*>(static_cast<Rule*>(s)); } static nsISupports* Upcast(Rule *p) { return static_cast<nsISupports*>(static_cast<Rule*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; virtual bool CanSkipReal(void *p, bool aRemovingAllowed) override; virtual bool CanSkipInCCReal(void *p) override; virtual bool CanSkipThisReal(void *p) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &Rule::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;


  virtual bool IsCCLeaf() const ;


  virtual nsresult GetType(uint16_t *aType) override; virtual nsresult GetCssText(nsAString & aCssText) override; virtual nsresult SetCssText(const nsAString & aCssText) override; virtual nsresult GetParentStyleSheet(nsIDOMCSSStyleSheet * *aParentStyleSheet) override; virtual nsresult GetParentRule(nsIDOMCSSRule * *aParentRule) override; virtual mozilla::css::Rule * GetCSSRule(void) override;
# 68 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/css/Rule.h"
  enum {
    UNKNOWN_RULE = 0,
    CHARSET_RULE,
    IMPORT_RULE,
    NAMESPACE_RULE,
    STYLE_RULE,
    MEDIA_RULE,
    FONT_FACE_RULE,
    PAGE_RULE,
    KEYFRAME_RULE,
    KEYFRAMES_RULE,
    DOCUMENT_RULE,
    SUPPORTS_RULE,
    FONT_FEATURE_VALUES_RULE,
    COUNTER_STYLE_RULE
  };

  virtual int32_t GetType() const = 0;

  StyleSheet* GetStyleSheet() const { return mSheet; }


  nsIDocument* GetDocument() const
  {
    StyleSheet* sheet = GetStyleSheet();
    return sheet ? sheet->GetAssociatedDocument() : nullptr;
  }

  virtual void SetStyleSheet(StyleSheet* aSheet);

  void SetParentRule(GroupRule* aRule) {



    mParentRule = aRule;
  }

  uint32_t GetLineNumber() const { return mLineNumber; }
  uint32_t GetColumnNumber() const { return mColumnNumber; }




  virtual already_AddRefed<Rule> Clone() const = 0;



  virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf)
    const = 0;


  virtual uint16_t Type() const = 0;
  virtual void GetCssTextImpl(nsAString& aCssText) const = 0;
  void GetCssText(nsAString& aCssText) const { GetCssTextImpl(aCssText); }

  Rule* GetParentRule() const;
  StyleSheet* GetParentStyleSheet() const { return GetStyleSheet(); }
  nsIDocument* GetParentObject() const { return GetDocument(); }

protected:

  bool IsKnownLive() const;


  StyleSheet* mSheet;


  GroupRule* mParentRule;


  uint32_t mLineNumber;
  uint32_t mColumnNumber;
};

}
}
# 11 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontFaceRule.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSDeclaration.h" 1
# 23 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSDeclaration.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSStyleDeclaration.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSStyleDeclaration.h"
class nsIDOMCSSStyleDeclaration : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetCssText(nsAString & aCssText) = 0;
  virtual nsresult SetCssText(const nsAString & aCssText) = 0;


  virtual nsresult GetPropertyValue(const nsAString & propertyName, nsAString & _retval) = 0;


  virtual nsresult GetPropertyCSSValue(const nsAString & propertyName, nsIDOMCSSValue * *_retval) = 0;


  virtual nsresult RemoveProperty(const nsAString & propertyName, nsAString & _retval) = 0;


  virtual nsresult GetPropertyPriority(const nsAString & propertyName, nsAString & _retval) = 0;


  virtual nsresult SetProperty(const nsAString & propertyName, const nsAString & value, const nsAString & priority) = 0;


  virtual nsresult GetLength(uint32_t *aLength) = 0;


  virtual nsresult Item(uint32_t index, nsAString & _retval) = 0;


  virtual nsresult GetParentRule(nsIDOMCSSRule * *aParentRule) = 0;

};

  template<typename T> struct nsIDOMCSSStyleDeclaration::COMTypeInfo<nsIDOMCSSStyleDeclaration, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMCSSStyleDeclaration::COMTypeInfo<nsIDOMCSSStyleDeclaration, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xa6cf90be, 0x15b3, 0x11d2, { 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 }};
# 24 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSDeclaration.h" 2

# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CSSValue.h" 1
# 15 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/CSSValue.h"
class nsROCSSPrimitiveValue;
namespace mozilla {
class ErrorResult;
}

namespace mozilla {
namespace dom {




class CSSValue : public nsISupports,
                 public nsWrapperCache
{
public:

  virtual void GetCssText(nsString& aText, mozilla::ErrorResult& aRv) = 0;
  virtual void SetCssText(const nsAString& aText, mozilla::ErrorResult& aRv) = 0;
  virtual uint16_t CssValueType() const = 0;







  nsROCSSPrimitiveValue *AsPrimitiveValue();
};

}
}
# 26 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSDeclaration.h" 2



# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSValue.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSValue.h"
class nsIDOMCSSValue : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;

  enum {
    CSS_INHERIT = 0U,
    CSS_PRIMITIVE_VALUE = 1U,
    CSS_VALUE_LIST = 2U,
    CSS_CUSTOM = 3U
  };


  virtual nsresult GetCssText(nsAString & aCssText) = 0;
  virtual nsresult SetCssText(const nsAString & aCssText) = 0;


  virtual nsresult GetCssValueType(uint16_t *aCssValueType) = 0;

};

  template<typename T> struct nsIDOMCSSValue::COMTypeInfo<nsIDOMCSSValue, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMCSSValue::COMTypeInfo<nsIDOMCSSValue, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x009f7ea5, 0x9e80, 0x41be, { 0xb0, 0x08, 0xdb, 0x62, 0xf1, 0x08, 0x23, 0xf2 }};
# 30 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsICSSDeclaration.h" 2



class nsINode;






class nsICSSDeclaration : public nsIDOMCSSStyleDeclaration,
                          public nsWrapperCache
{
public:
  template<typename T, typename U> struct COMTypeInfo;





  virtual nsresult GetPropertyValue(const nsCSSPropertyID aPropID,
                              nsAString& aValue) = 0;

  virtual nsresult GetAuthoredPropertyValue(const nsAString& aPropName,
                                      nsAString& aValue) = 0;






  virtual nsresult SetPropertyValue(const nsCSSPropertyID aPropID,
                              const nsAString& aValue) = 0;

  virtual nsINode *GetParentObject() = 0;



  virtual nsresult GetCssText(nsAString& aCssText) override = 0;
  virtual nsresult SetCssText(const nsAString& aCssText) override = 0;
  virtual nsresult GetPropertyValue(const nsAString& aPropName,
                              nsAString& aValue) override = 0;
  virtual already_AddRefed<mozilla::dom::CSSValue>
    GetPropertyCSSValue(const nsAString& aPropertyName,
                        mozilla::ErrorResult& aRv) = 0;
  virtual nsresult GetPropertyCSSValue(const nsAString& aProp, nsIDOMCSSValue** aVal) override
  {
    mozilla::ErrorResult error;
    RefPtr<mozilla::dom::CSSValue> val = GetPropertyCSSValue(aProp, error);
    if (error.Failed()) {
      return error.StealNSResult();
    }

    nsCOMPtr<nsIDOMCSSValue> xpVal = do_QueryInterface(val);
    xpVal.forget(aVal);
    return NS_OK;
  }
  virtual nsresult RemoveProperty(const nsAString& aPropertyName,
                            nsAString& aReturn) override = 0;
  virtual nsresult GetPropertyPriority(const nsAString& aPropertyName,
                                 nsAString& aReturn) override = 0;
  virtual nsresult SetProperty(const nsAString& aPropertyName,
                         const nsAString& aValue,
                         const nsAString& aPriority) override = 0;
  virtual nsresult GetLength(uint32_t* aLength) override = 0;
  virtual nsresult Item(uint32_t aIndex, nsAString& aReturn) override
  {
    bool found;
    IndexedGetter(aIndex, found, aReturn);
    if (!found) {
      aReturn.Truncate();
    }
    return NS_OK;
  }
  virtual nsresult GetParentRule(nsIDOMCSSRule * *aParentRule) override = 0;


  void SetCssText(const nsAString& aString, mozilla::ErrorResult& rv) {
    rv = SetCssText(aString);
  }
  void GetCssText(nsString& aString) {


    GetCssText(static_cast<nsAString&>(aString));
  }
  uint32_t Length() {
    uint32_t length;
    GetLength(&length);
    return length;
  }
  void Item(uint32_t aIndex, nsString& aPropName) {
    Item(aIndex, static_cast<nsAString&>(aPropName));
  }


  virtual void IndexedGetter(uint32_t aIndex, bool& aFound, nsAString& aPropName) = 0;

  void GetPropertyValue(const nsAString& aPropName, nsString& aValue,
                        mozilla::ErrorResult& rv) {
    rv = GetPropertyValue(aPropName, aValue);
  }
  void GetAuthoredPropertyValue(const nsAString& aPropName, nsString& aValue,
                                mozilla::ErrorResult& rv) {
    rv = GetAuthoredPropertyValue(aPropName, aValue);
  }
  void GetPropertyPriority(const nsAString& aPropName, nsString& aPriority) {
    GetPropertyPriority(aPropName, static_cast<nsAString&>(aPriority));
  }
  void SetProperty(const nsAString& aPropName, const nsAString& aValue,
                   const nsAString& aPriority, mozilla::ErrorResult& rv) {
    rv = SetProperty(aPropName, aValue, aPriority);
  }
  void RemoveProperty(const nsAString& aPropName, nsString& aRetval,
                      mozilla::ErrorResult& rv) {
    rv = RemoveProperty(aPropName, aRetval);
  }
  already_AddRefed<nsIDOMCSSRule> GetParentRule() {
    nsCOMPtr<nsIDOMCSSRule> rule;
    GetParentRule(getter_AddRefs(rule));
    return rule.forget();
  }
};

template<typename T> struct nsICSSDeclaration::COMTypeInfo<nsICSSDeclaration, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsICSSDeclaration::COMTypeInfo<nsICSSDeclaration, T>::kIID __attribute__ ((visibility ("hidden"))) = { 0xdbeabbfa, 0x6cb3, 0x4f5c, { 0xae, 0xc2, 0xdd, 0x55, 0x8d, 0x9d, 0x68, 0x1f } };
# 13 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontFaceRule.h" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSFontFaceRule.h" 1
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSFontFaceRule.h"
class nsIDOMCSSStyleDeclaration;
# 27 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMCSSFontFaceRule.h"
class nsIDOMCSSFontFaceRule : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetStyle(nsIDOMCSSStyleDeclaration * *aStyle) = 0;

};

  template<typename T> struct nsIDOMCSSFontFaceRule::COMTypeInfo<nsIDOMCSSFontFaceRule, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMCSSFontFaceRule::COMTypeInfo<nsIDOMCSSFontFaceRule, T>::kIID __attribute__ ((visibility ("hidden"))) = {0xdb971017, 0xfe0c, 0x4529, { 0x97, 0x2c, 0x82, 0x17, 0xf2, 0xfe, 0xe2, 0x17 }};
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontFaceRule.h" 2

namespace mozilla {

struct CSSFontFaceDescriptors
{


# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontDescList.h" 1





nsCSSValue mFamily;
nsCSSValue mStyle;
nsCSSValue mWeight;
nsCSSValue mStretch;
nsCSSValue mSrc;
nsCSSValue mUnicodeRange;
nsCSSValue mFontFeatureSettings;
nsCSSValue mFontLanguageOverride;
nsCSSValue mDisplay;
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsCSSFontFaceRule.h" 2


  const nsCSSValue& Get(nsCSSFontDesc aFontDescID) const;
  nsCSSValue& Get(nsCSSFontDesc aFontDescID);

private:
  static nsCSSValue CSSFontFaceDescriptors::* const Fields[];
};

}


class nsCSSFontFaceRule;
class nsCSSFontFaceStyleDecl final : public nsICSSDeclaration
{
public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override;
  virtual nsresult GetCssText(nsAString & aCssText) override; virtual nsresult SetCssText(const nsAString & aCssText) override; virtual nsresult GetPropertyValue(const nsAString & propertyName, nsAString & _retval) override; virtual nsresult RemoveProperty(const nsAString & propertyName, nsAString & _retval) override; virtual nsresult GetPropertyPriority(const nsAString & propertyName, nsAString & _retval) override; virtual nsresult SetProperty(const nsAString & propertyName, const nsAString & value, const nsAString & priority) override; virtual nsresult GetLength(uint32_t *aLength) override; virtual nsresult Item(uint32_t index, nsAString & _retval) override; virtual nsresult GetParentRule(nsIDOMCSSRule * *aParentRule) override;
  virtual nsresult GetPropertyValue(const nsCSSPropertyID aPropID, nsAString& aValue) override; virtual nsresult GetAuthoredPropertyValue(const nsAString& aPropName, nsAString& aValue) override; virtual nsresult SetPropertyValue(const nsCSSPropertyID aPropID, const nsAString& aValue) override;
  virtual already_AddRefed<mozilla::dom::CSSValue>
  GetPropertyCSSValue(const nsAString& aProp, mozilla::ErrorResult& aRv)
    override;
  using nsICSSDeclaration::GetPropertyCSSValue;

  virtual nsINode *GetParentObject() override;
  virtual void IndexedGetter(uint32_t aIndex, bool& aFound, nsAString& aPropName) override;

  nsresult GetPropertyValue(nsCSSFontDesc aFontDescID,
                            nsAString & aResult) const;

  virtual JSObject* WrapObject(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override;

protected:
  ~nsCSSFontFaceStyleDecl() {}

  friend class nsCSSFontFaceRule;

  inline nsCSSFontFaceRule* ContainingRule();
  inline const nsCSSFontFaceRule* ContainingRule() const;

  mozilla::CSSFontFaceDescriptors mDescriptors;


  void GetCssTextImpl(nsAString& aCssText) const;

private:



  void* operator new(size_t size) throw();
};

class nsCSSFontFaceRule final : public mozilla::css::Rule,
                                public nsIDOMCSSFontFaceRule
{
public:
  nsCSSFontFaceRule(uint32_t aLineNumber, uint32_t aColumnNumber)
    : mozilla::css::Rule(aLineNumber, aColumnNumber)
  {
  }

  nsCSSFontFaceRule(const nsCSSFontFaceRule& aCopy)

    : mozilla::css::Rule(aCopy), mDecl(aCopy.mDecl)
  {
  }

  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override;
  class cycleCollection : public mozilla::css::Rule::cycleCollection { public: constexpr explicit cycleCollection (bool aSkip = false) : mozilla::css::Rule::cycleCollection (aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "nsCSSFontFaceRule"; }; static nsCSSFontFaceRule* Downcast(nsISupports* s) { return static_cast<nsCSSFontFaceRule*>(static_cast<mozilla::css::Rule*>( mozilla::css::Rule::cycleCollection::Downcast(s))); } virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &nsCSSFontFaceRule::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;

  virtual bool IsCCLeaf() const override;




  virtual int32_t GetType() const override;
  using Rule::GetType;
  virtual already_AddRefed<mozilla::css::Rule> Clone() const override;


  virtual nsresult GetStyle(nsIDOMCSSStyleDeclaration * *aStyle) override;

  void SetDesc(nsCSSFontDesc aDescID, nsCSSValue const & aValue);
  void GetDesc(nsCSSFontDesc aDescID, nsCSSValue & aValue);


  uint16_t Type() const override;
  void GetCssTextImpl(nsAString& aCssText) const override;
  nsICSSDeclaration* Style();

  virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;

  virtual JSObject* WrapObject(JSContext* aCx,
                               JS::Handle<JSObject*> aGivenProto) override;

  void GetDescriptors(mozilla::CSSFontFaceDescriptors& aDescriptors) const
    { aDescriptors = mDecl.mDescriptors; }

protected:
  ~nsCSSFontFaceRule() {}

  friend class nsCSSFontFaceStyleDecl;
  nsCSSFontFaceStyleDecl mDecl;
};



struct nsFontFaceRuleContainer {
  RefPtr<nsCSSFontFaceRule> mRule;
  mozilla::SheetType mSheetType;
};

inline nsCSSFontFaceRule*
nsCSSFontFaceStyleDecl::ContainingRule()
{
  return reinterpret_cast<nsCSSFontFaceRule*>
    (reinterpret_cast<char*>(this) - __builtin_offsetof(nsCSSFontFaceRule, mDecl));
}

inline const nsCSSFontFaceRule*
nsCSSFontFaceStyleDecl::ContainingRule() const
{
  return reinterpret_cast<const nsCSSFontFaceRule*>
    (reinterpret_cast<const char*>(this) - __builtin_offsetof(nsCSSFontFaceRule, mDecl));
}
# 17 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMediaFeatures.h" 1
# 14 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMediaFeatures.h"
class nsIAtom;
class nsPresContext;
class nsCSSValue;

struct nsMediaFeature;
typedef void (*nsMediaFeatureValueGetter)(nsPresContext* aPresContext,
                                          const nsMediaFeature* aFeature,
                                          nsCSSValue& aResult);

struct nsMediaFeature
{
  nsIAtom **mName;

  enum RangeType { eMinMaxAllowed, eMinMaxNotAllowed };
  RangeType mRangeType;

  enum ValueType {


    eLength,
    eInteger,
    eFloat,
    eBoolInteger,
    eIntRatio,
    eResolution,


    eEnumerated,
    eIdent




  };
  ValueType mValueType;

  enum RequirementFlags : uint8_t {


    eNoRequirements = 0,
    eHasWebkitPrefix = 1 << 0,





    eWebkitDevicePixelRatioPrefEnabled = 1 << 1
  };
  uint8_t mReqFlags;

  union {



    const void* mInitializer_;


    const nsCSSProps::KTableEntry* mKeywordTable;


    nsIAtom * const * mMetric;
  } mData;




  nsMediaFeatureValueGetter mGetter;
};

class nsMediaFeatures
{
public:

  static const nsMediaFeature features[];
};
# 18 "<built-in>" 2
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMediaList.h" 1
# 20 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMediaList.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/MediaList.h" 1
# 16 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/MediaList.h"
# 1 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMMediaList.h" 1
# 25 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsIDOMMediaList.h"
class nsIDOMMediaList : public nsISupports {
 public:

  template<typename T, typename U> struct COMTypeInfo;


  virtual nsresult GetMediaText(nsAString & aMediaText) = 0;
  virtual nsresult SetMediaText(const nsAString & aMediaText) = 0;


  virtual nsresult GetLength(uint32_t *aLength) = 0;


  virtual nsresult Item(uint32_t index, nsAString & _retval) = 0;


  virtual nsresult DeleteMedium(const nsAString & oldMedium) = 0;


  virtual nsresult AppendMedium(const nsAString & newMedium) = 0;

};

  template<typename T> struct nsIDOMMediaList::COMTypeInfo<nsIDOMMediaList, T> { static const nsIID kIID __attribute__ ((visibility ("hidden"))); }; template<typename T> const nsIID nsIDOMMediaList::COMTypeInfo<nsIDOMMediaList, T>::kIID __attribute__ ((visibility ("hidden"))) = {0x9b0c2ed7, 0x111c, 0x4824, { 0xad, 0xf9, 0xef, 0x0d, 0xa6, 0xda, 0xd3, 0x71 }};
# 17 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/MediaList.h" 2


class nsIDocument;
class nsPresContext;
class nsMediaQueryResultCacheKey;

namespace mozilla {
class StyleSheet;

namespace dom {
# 36 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/mozilla/dom/MediaList.h"
class MediaList : public nsIDOMMediaList
                , public nsWrapperCache
{
public:
  public: virtual nsresult QueryInterface(const nsIID& aIID, void** aInstancePtr) override; virtual MozExternalRefCountType AddRef(void) override; virtual MozExternalRefCountType Release(void) override; virtual void DeleteCycleCollectable(void); typedef mozilla::FalseType HasThreadSafeRefCnt; protected: nsCycleCollectingAutoRefCnt mRefCnt; public:
  class cycleCollection : public nsXPCOMCycleCollectionParticipant { public: constexpr explicit cycleCollection (bool aSkip = false) : nsXPCOMCycleCollectionParticipant(aSkip) {} private: public: virtual nsresult TraverseNative(void *p, nsCycleCollectionTraversalCallback &cb) override; virtual const char* ClassName() override { return "MediaList"; }; virtual void DeleteCycleCollectable(void *p) override { DowncastCCParticipant<MediaList>(p)->DeleteCycleCollectable(); } static MediaList* Downcast(nsISupports* s) { return static_cast<MediaList*>(static_cast<MediaList*>(s)); } static nsISupports* Upcast(MediaList *p) { return static_cast<nsISupports*>(static_cast<MediaList*>(p)); } template<typename T> friend nsISupports* ToSupports(T* p, cycleCollection* dummy); virtual void Unlink(void *p) override; virtual void Trace(void *p, const TraceCallbacks &cb, void *closure) override; static constexpr nsXPCOMCycleCollectionParticipant* GetParticipant() { return &MediaList::_cycleCollectorGlobal; } }; static cycleCollection _cycleCollectorGlobal;




  static already_AddRefed<MediaList> Create(StyleBackendType,
                                            const nsAString& aMedia);

  virtual already_AddRefed<MediaList> Clone() = 0;

  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) final;
  nsISupports* GetParentObject() const { return nullptr; }

  virtual void GetText(nsAString& aMediaText) = 0;
  virtual void SetText(const nsAString& aMediaText) = 0;
  virtual bool Matches(nsPresContext& aPresContext,
                       nsMediaQueryResultCacheKey* = nullptr) const = 0;





  void SetStyleSheet(StyleSheet* aSheet);

  virtual nsresult GetMediaText(nsAString & aMediaText) override; virtual nsresult SetMediaText(const nsAString & aMediaText) override; virtual nsresult GetLength(uint32_t *aLength) override; virtual nsresult Item(uint32_t index, nsAString & _retval) override; virtual nsresult DeleteMedium(const nsAString & oldMedium) override; virtual nsresult AppendMedium(const nsAString & newMedium) override;



  virtual uint32_t Length() = 0;
  virtual void IndexedGetter(uint32_t aIndex, bool& aFound,
                             nsAString& aReturn) = 0;

  void DeleteMedium(const nsAString& aMedium, ErrorResult& aRv)
  {
    aRv = DeleteMedium(aMedium);
  }
  void AppendMedium(const nsAString& aMedium, ErrorResult& aRv)
  {
    aRv = AppendMedium(aMedium);
  }

protected:
  virtual nsresult Delete(const nsAString& aOldMedium) = 0;
  virtual nsresult Append(const nsAString& aNewMedium) = 0;

  virtual ~MediaList() {}




  StyleSheet* mStyleSheet = nullptr;

private:
  template<typename Func>
  inline nsresult DoMediaChange(Func aCallback);
};

}
}
# 21 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMediaList.h" 2

class nsPresContext;
class nsAString;
struct nsMediaFeature;

namespace mozilla {
namespace css {
class DocumentRule;
}
}

struct nsMediaExpression {
  enum Range { eMin, eMax, eEqual };

  const nsMediaFeature *mFeature;
  Range mRange;
  nsCSSValue mValue;


  bool Matches(nsPresContext* aPresContext,
               const nsCSSValue& aActualValue) const;

  bool operator==(const nsMediaExpression& aOther) const {
    return mFeature == aOther.mFeature &&
           mRange == aOther.mRange &&
           mValue == aOther.mValue;
  }
  bool operator!=(const nsMediaExpression& aOther) const {
    return !(*this == aOther);
  }
};
# 72 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMediaList.h"
class nsMediaQueryResultCacheKey {
public:
  explicit nsMediaQueryResultCacheKey(nsIAtom* aMedium)
    : mMedium(aMedium)
  {}






  void AddExpression(const nsMediaExpression* aExpression,
                     bool aExpressionMatches);
  bool Matches(nsPresContext* aPresContext) const;
  bool HasFeatureConditions() const {
    return !mFeatureCache.IsEmpty();
  }





  bool operator==(const nsMediaQueryResultCacheKey& aOther) const {
    return mMedium == aOther.mMedium &&
           mFeatureCache == aOther.mFeatureCache;
  }
  bool operator!=(const nsMediaQueryResultCacheKey& aOther) const {
    return !(*this == aOther);
  }
private:
  struct ExpressionEntry {



    nsMediaExpression mExpression;
    bool mExpressionMatches;

    bool operator==(const ExpressionEntry& aOther) const {
      return mExpression == aOther.mExpression &&
             mExpressionMatches == aOther.mExpressionMatches;
    }
    bool operator!=(const ExpressionEntry& aOther) const {
      return !(*this == aOther);
    }
  };
  struct FeatureEntry {
    const nsMediaFeature *mFeature;
    InfallibleTArray<ExpressionEntry> mExpressions;

    bool operator==(const FeatureEntry& aOther) const {
      return mFeature == aOther.mFeature &&
             mExpressions == aOther.mExpressions;
    }
    bool operator!=(const FeatureEntry& aOther) const {
      return !(*this == aOther);
    }
  };
  nsCOMPtr<nsIAtom> mMedium;
  nsTArray<FeatureEntry> mFeatureCache;
};
# 148 "/home/fitzgen/stylo/obj-x86_64-pc-linux-gnu/dist/include/nsMediaList.h"
class nsDocumentRuleResultCacheKey
{
public:





  bool AddMatchingRule(mozilla::css::DocumentRule* aRule);
  bool Matches(nsPresContext* aPresContext,
               const nsTArray<mozilla::css::DocumentRule*>& aRules) const;

  bool operator==(const nsDocumentRuleResultCacheKey& aOther) const {
    do { } while (0);
    do { } while (0);
    return mMatchingRules == aOther.mMatchingRules;
  }
  bool operator!=(const nsDocumentRuleResultCacheKey& aOther) const {
    return !(*this == aOther);
  }

  void Swap(nsDocumentRuleResultCacheKey& aOther) {
    mMatchingRules.SwapElements(aOther.mMatchingRules);



  }

  void Finalize();





  size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;

private:
  nsTArray<mozilla::css::DocumentRule*> mMatchingRules;



};

class nsMediaQuery {
public:
  nsMediaQuery()
    : mNegated(false)
    , mHasOnly(false)
    , mTypeOmitted(false)
    , mHadUnknownExpression(false)
  {
  }

private:

  nsMediaQuery(const nsMediaQuery& aOther)
    : mNegated(aOther.mNegated)
    , mHasOnly(aOther.mHasOnly)
    , mTypeOmitted(aOther.mTypeOmitted)
    , mHadUnknownExpression(aOther.mHadUnknownExpression)
    , mMediaType(aOther.mMediaType)
    , mExpressions(aOther.mExpressions)
  {
    do { } while (0);
  }

public:

  void SetNegated() { mNegated = true; }
  void SetHasOnly() { mHasOnly = true; }
  void SetTypeOmitted() { mTypeOmitted = true; }
  void SetHadUnknownExpression() { mHadUnknownExpression = true; }
  void SetType(nsIAtom* aMediaType) {
                                          do { } while(0);

                                          mMediaType = aMediaType;
                                        }





  nsMediaExpression* NewExpression() { return mExpressions.AppendElement(); }

  void AppendToString(nsAString& aString) const;

  nsMediaQuery* Clone() const;



  bool Matches(nsPresContext* aPresContext,
               nsMediaQueryResultCacheKey* aKey) const;

private:
  bool mNegated;
  bool mHasOnly;
  bool mTypeOmitted;
  bool mHadUnknownExpression;
  nsCOMPtr<nsIAtom> mMediaType;
  nsTArray<nsMediaExpression> mExpressions;
};

class nsMediaList final : public mozilla::dom::MediaList
{
public:
  nsMediaList();

  void GetText(nsAString& aMediaText) final;
  void SetText(const nsAString& aMediaText) final;



  bool Matches(nsPresContext& aPresContext,
               nsMediaQueryResultCacheKey* aKey) const final;





  void AppendQuery(nsAutoPtr<nsMediaQuery>& aQuery) {

    mArray.AppendElement(aQuery.forget());
  }

  already_AddRefed<mozilla::dom::MediaList> Clone() final;

  nsMediaQuery* MediumAt(int32_t aIndex) { return mArray[aIndex]; }
  void Clear() { mArray.Clear(); }


  uint32_t Length() final { return mArray.Length(); }
  void IndexedGetter(uint32_t aIndex, bool& aFound,
                     nsAString& aReturn) final;

protected:
  ~nsMediaList();

  nsresult Delete(const nsAString & aOldMedium) final;
  nsresult Append(const nsAString & aOldMedium) final;

  InfallibleTArray<nsAutoPtr<nsMediaQuery> > mArray;
};
# 19 "<built-in>" 2
# 1 "stylo-structs.cpp" 2