
template
<
  char const* x1, typename Y1,
  char const* x2= null, typename Y2= Null,
  char const* x3= null, typename Y3= Null,
  char const* x4= null, typename Y4= Null,
  char const* x5= null, typename Y5= Null,
  char const* x6= null, typename Y6= Null,
  char const* x7= null, typename Y7= Null,
  char const* x8= null, typename Y8= Null,
  char const* x9= null, typename Y9= Null,
  char const* x10= null, typename Y10= Null,
  char const* x11= null, typename Y11= Null,
  char const* x12= null, typename Y12= Null,
  char const* x13= null, typename Y13= Null,
  char const* x14= null, typename Y14= Null,
  char const* x15= null, typename Y15= Null,
  char const* x16= null, typename Y16= Null,
  char const* x17= null, typename Y17= Null,
  char const* x18= null, typename Y18= Null,
  char const* x19= null, typename Y19= Null,
  char const* x20= null, typename Y20= Null,
  char const* x21= null, typename Y21= Null,
  char const* x22= null, typename Y22= Null,
  char const* x23= null, typename Y23= Null,
  char const* x24= null, typename Y24= Null,
  char const* x25= null, typename Y25= Null,
  char const* x26= null, typename Y26= Null,
  char const* x27= null, typename Y27= Null,
  char const* x28= null, typename Y28= Null,
  char const* x29= null, typename Y29= Null,
  char const* x30= null, typename Y30= Null,
  char const* x31= null, typename Y31= Null,
  char const* x32= null, typename Y32= Null,
  char const* x33= null, typename Y33= Null,
  char const* x34= null, typename Y34= Null,
  char const* x35= null, typename Y35= Null,
  char const* x36= null, typename Y36= Null,
  char const* x37= null, typename Y37= Null,
  char const* x38= null, typename Y38= Null,
  char const* x39= null, typename Y39= Null,
  char const* x40= null, typename Y40= Null,
  char const* x41= null, typename Y41= Null,
  char const* x42= null, typename Y42= Null,
  char const* x43= null, typename Y43= Null,
  char const* x44= null, typename Y44= Null,
  char const* x45= null, typename Y45= Null,
  char const* x46= null, typename Y46= Null,
  char const* x47= null, typename Y47= Null,
  char const* x48= null, typename Y48= Null,
  char const* x49= null, typename Y49= Null,
  char const* x50= null, typename Y50= Null,
  char const* x51= null, typename Y51= Null,
  char const* x52= null, typename Y52= Null,
  char const* x53= null, typename Y53= Null,
  char const* x54= null, typename Y54= Null,
  char const* x55= null, typename Y55= Null,
  char const* x56= null, typename Y56= Null,
  char const* x57= null, typename Y57= Null,
  char const* x58= null, typename Y58= Null,
  char const* x59= null, typename Y59= Null,
  char const* x60= null, typename Y60= Null,
  char const* x61= null, typename Y61= Null,
  char const* x62= null, typename Y62= Null,
  char const* x63= null, typename Y63= Null,
  char const* x64= null, typename Y64= Null,
  char const* x65= null, typename Y65= Null,
  char const* x66= null, typename Y66= Null,
  char const* x67= null, typename Y67= Null,
  char const* x68= null, typename Y68= Null,
  char const* x69= null, typename Y69= Null,
  char const* x70= null, typename Y70= Null,
  char const* x71= null, typename Y71= Null,
  char const* x72= null, typename Y72= Null,
  char const* x73= null, typename Y73= Null,
  char const* x74= null, typename Y74= Null,
  char const* x75= null, typename Y75= Null,
  char const* x76= null, typename Y76= Null,
  char const* x77= null, typename Y77= Null,
  char const* x78= null, typename Y78= Null,
  char const* x79= null, typename Y79= Null,
  char const* x80= null, typename Y80= Null,
  char const* x81= null, typename Y81= Null,
  char const* x82= null, typename Y82= Null,
  char const* x83= null, typename Y83= Null,
  char const* x84= null, typename Y84= Null,
  char const* x85= null, typename Y85= Null,
  char const* x86= null, typename Y86= Null,
  char const* x87= null, typename Y87= Null,
  char const* x88= null, typename Y88= Null,
  char const* x89= null, typename Y89= Null,
  char const* x90= null, typename Y90= Null,
  char const* x91= null, typename Y91= Null,
  char const* x92= null, typename Y92= Null,
  char const* x93= null, typename Y93= Null,
  char const* x94= null, typename Y94= Null,
  char const* x95= null, typename Y95= Null,
  char const* x96= null, typename Y96= Null,
  char const* x97= null, typename Y97= Null,
  char const* x98= null, typename Y98= Null,
  char const* x99= null, typename Y99= Null,
  char const* x100= null, typename Y100= Null,
  char const* x101= null, typename Y101= Null
>
struct Mapper;


template
<
  char const* x1, typename Y1
>
struct Mapper
<
  x1, Y1,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1, Void>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93,
  char const* x94, typename Y94
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  x94, Y94,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);
  static Y94 f (Tag<x94>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93,
      x94, Y94
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93,
  char const* x94, typename Y94,
  char const* x95, typename Y95
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  x94, Y94,
  x95, Y95,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);
  static Y94 f (Tag<x94>*);
  static Y95 f (Tag<x95>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93,
      x94, Y94,
      x95, Y95
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93,
  char const* x94, typename Y94,
  char const* x95, typename Y95,
  char const* x96, typename Y96
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  x94, Y94,
  x95, Y95,
  x96, Y96,
  null, Null,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);
  static Y94 f (Tag<x94>*);
  static Y95 f (Tag<x95>*);
  static Y96 f (Tag<x96>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93,
      x94, Y94,
      x95, Y95,
      x96, Y96
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93,
  char const* x94, typename Y94,
  char const* x95, typename Y95,
  char const* x96, typename Y96,
  char const* x97, typename Y97
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  x94, Y94,
  x95, Y95,
  x96, Y96,
  x97, Y97,
  null, Null,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);
  static Y94 f (Tag<x94>*);
  static Y95 f (Tag<x95>*);
  static Y96 f (Tag<x96>*);
  static Y97 f (Tag<x97>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93,
      x94, Y94,
      x95, Y95,
      x96, Y96,
      x97, Y97
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93,
  char const* x94, typename Y94,
  char const* x95, typename Y95,
  char const* x96, typename Y96,
  char const* x97, typename Y97,
  char const* x98, typename Y98
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  x94, Y94,
  x95, Y95,
  x96, Y96,
  x97, Y97,
  x98, Y98,
  null, Null,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);
  static Y94 f (Tag<x94>*);
  static Y95 f (Tag<x95>*);
  static Y96 f (Tag<x96>*);
  static Y97 f (Tag<x97>*);
  static Y98 f (Tag<x98>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93,
      x94, Y94,
      x95, Y95,
      x96, Y96,
      x97, Y97,
      x98, Y98
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93,
  char const* x94, typename Y94,
  char const* x95, typename Y95,
  char const* x96, typename Y96,
  char const* x97, typename Y97,
  char const* x98, typename Y98,
  char const* x99, typename Y99
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  x94, Y94,
  x95, Y95,
  x96, Y96,
  x97, Y97,
  x98, Y98,
  x99, Y99,
  null, Null,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);
  static Y94 f (Tag<x94>*);
  static Y95 f (Tag<x95>*);
  static Y96 f (Tag<x96>*);
  static Y97 f (Tag<x97>*);
  static Y98 f (Tag<x98>*);
  static Y99 f (Tag<x99>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93,
      x94, Y94,
      x95, Y95,
      x96, Y96,
      x97, Y97,
      x98, Y98,
      x99, Y99
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

template
<
  char const* x1, typename Y1,
  char const* x2, typename Y2,
  char const* x3, typename Y3,
  char const* x4, typename Y4,
  char const* x5, typename Y5,
  char const* x6, typename Y6,
  char const* x7, typename Y7,
  char const* x8, typename Y8,
  char const* x9, typename Y9,
  char const* x10, typename Y10,
  char const* x11, typename Y11,
  char const* x12, typename Y12,
  char const* x13, typename Y13,
  char const* x14, typename Y14,
  char const* x15, typename Y15,
  char const* x16, typename Y16,
  char const* x17, typename Y17,
  char const* x18, typename Y18,
  char const* x19, typename Y19,
  char const* x20, typename Y20,
  char const* x21, typename Y21,
  char const* x22, typename Y22,
  char const* x23, typename Y23,
  char const* x24, typename Y24,
  char const* x25, typename Y25,
  char const* x26, typename Y26,
  char const* x27, typename Y27,
  char const* x28, typename Y28,
  char const* x29, typename Y29,
  char const* x30, typename Y30,
  char const* x31, typename Y31,
  char const* x32, typename Y32,
  char const* x33, typename Y33,
  char const* x34, typename Y34,
  char const* x35, typename Y35,
  char const* x36, typename Y36,
  char const* x37, typename Y37,
  char const* x38, typename Y38,
  char const* x39, typename Y39,
  char const* x40, typename Y40,
  char const* x41, typename Y41,
  char const* x42, typename Y42,
  char const* x43, typename Y43,
  char const* x44, typename Y44,
  char const* x45, typename Y45,
  char const* x46, typename Y46,
  char const* x47, typename Y47,
  char const* x48, typename Y48,
  char const* x49, typename Y49,
  char const* x50, typename Y50,
  char const* x51, typename Y51,
  char const* x52, typename Y52,
  char const* x53, typename Y53,
  char const* x54, typename Y54,
  char const* x55, typename Y55,
  char const* x56, typename Y56,
  char const* x57, typename Y57,
  char const* x58, typename Y58,
  char const* x59, typename Y59,
  char const* x60, typename Y60,
  char const* x61, typename Y61,
  char const* x62, typename Y62,
  char const* x63, typename Y63,
  char const* x64, typename Y64,
  char const* x65, typename Y65,
  char const* x66, typename Y66,
  char const* x67, typename Y67,
  char const* x68, typename Y68,
  char const* x69, typename Y69,
  char const* x70, typename Y70,
  char const* x71, typename Y71,
  char const* x72, typename Y72,
  char const* x73, typename Y73,
  char const* x74, typename Y74,
  char const* x75, typename Y75,
  char const* x76, typename Y76,
  char const* x77, typename Y77,
  char const* x78, typename Y78,
  char const* x79, typename Y79,
  char const* x80, typename Y80,
  char const* x81, typename Y81,
  char const* x82, typename Y82,
  char const* x83, typename Y83,
  char const* x84, typename Y84,
  char const* x85, typename Y85,
  char const* x86, typename Y86,
  char const* x87, typename Y87,
  char const* x88, typename Y88,
  char const* x89, typename Y89,
  char const* x90, typename Y90,
  char const* x91, typename Y91,
  char const* x92, typename Y92,
  char const* x93, typename Y93,
  char const* x94, typename Y94,
  char const* x95, typename Y95,
  char const* x96, typename Y96,
  char const* x97, typename Y97,
  char const* x98, typename Y98,
  char const* x99, typename Y99,
  char const* x100, typename Y100
>
struct Mapper
<
  x1, Y1,
  x2, Y2,
  x3, Y3,
  x4, Y4,
  x5, Y5,
  x6, Y6,
  x7, Y7,
  x8, Y8,
  x9, Y9,
  x10, Y10,
  x11, Y11,
  x12, Y12,
  x13, Y13,
  x14, Y14,
  x15, Y15,
  x16, Y16,
  x17, Y17,
  x18, Y18,
  x19, Y19,
  x20, Y20,
  x21, Y21,
  x22, Y22,
  x23, Y23,
  x24, Y24,
  x25, Y25,
  x26, Y26,
  x27, Y27,
  x28, Y28,
  x29, Y29,
  x30, Y30,
  x31, Y31,
  x32, Y32,
  x33, Y33,
  x34, Y34,
  x35, Y35,
  x36, Y36,
  x37, Y37,
  x38, Y38,
  x39, Y39,
  x40, Y40,
  x41, Y41,
  x42, Y42,
  x43, Y43,
  x44, Y44,
  x45, Y45,
  x46, Y46,
  x47, Y47,
  x48, Y48,
  x49, Y49,
  x50, Y50,
  x51, Y51,
  x52, Y52,
  x53, Y53,
  x54, Y54,
  x55, Y55,
  x56, Y56,
  x57, Y57,
  x58, Y58,
  x59, Y59,
  x60, Y60,
  x61, Y61,
  x62, Y62,
  x63, Y63,
  x64, Y64,
  x65, Y65,
  x66, Y66,
  x67, Y67,
  x68, Y68,
  x69, Y69,
  x70, Y70,
  x71, Y71,
  x72, Y72,
  x73, Y73,
  x74, Y74,
  x75, Y75,
  x76, Y76,
  x77, Y77,
  x78, Y78,
  x79, Y79,
  x80, Y80,
  x81, Y81,
  x82, Y82,
  x83, Y83,
  x84, Y84,
  x85, Y85,
  x86, Y86,
  x87, Y87,
  x88, Y88,
  x89, Y89,
  x90, Y90,
  x91, Y91,
  x92, Y92,
  x93, Y93,
  x94, Y94,
  x95, Y95,
  x96, Y96,
  x97, Y97,
  x98, Y98,
  x99, Y99,
  x100, Y100,
  null, Null
>
{
#ifdef __GNUC__
  static Y1 f (Tag<x1>*);
  static Y2 f (Tag<x2>*);
  static Y3 f (Tag<x3>*);
  static Y4 f (Tag<x4>*);
  static Y5 f (Tag<x5>*);
  static Y6 f (Tag<x6>*);
  static Y7 f (Tag<x7>*);
  static Y8 f (Tag<x8>*);
  static Y9 f (Tag<x9>*);
  static Y10 f (Tag<x10>*);
  static Y11 f (Tag<x11>*);
  static Y12 f (Tag<x12>*);
  static Y13 f (Tag<x13>*);
  static Y14 f (Tag<x14>*);
  static Y15 f (Tag<x15>*);
  static Y16 f (Tag<x16>*);
  static Y17 f (Tag<x17>*);
  static Y18 f (Tag<x18>*);
  static Y19 f (Tag<x19>*);
  static Y20 f (Tag<x20>*);
  static Y21 f (Tag<x21>*);
  static Y22 f (Tag<x22>*);
  static Y23 f (Tag<x23>*);
  static Y24 f (Tag<x24>*);
  static Y25 f (Tag<x25>*);
  static Y26 f (Tag<x26>*);
  static Y27 f (Tag<x27>*);
  static Y28 f (Tag<x28>*);
  static Y29 f (Tag<x29>*);
  static Y30 f (Tag<x30>*);
  static Y31 f (Tag<x31>*);
  static Y32 f (Tag<x32>*);
  static Y33 f (Tag<x33>*);
  static Y34 f (Tag<x34>*);
  static Y35 f (Tag<x35>*);
  static Y36 f (Tag<x36>*);
  static Y37 f (Tag<x37>*);
  static Y38 f (Tag<x38>*);
  static Y39 f (Tag<x39>*);
  static Y40 f (Tag<x40>*);
  static Y41 f (Tag<x41>*);
  static Y42 f (Tag<x42>*);
  static Y43 f (Tag<x43>*);
  static Y44 f (Tag<x44>*);
  static Y45 f (Tag<x45>*);
  static Y46 f (Tag<x46>*);
  static Y47 f (Tag<x47>*);
  static Y48 f (Tag<x48>*);
  static Y49 f (Tag<x49>*);
  static Y50 f (Tag<x50>*);
  static Y51 f (Tag<x51>*);
  static Y52 f (Tag<x52>*);
  static Y53 f (Tag<x53>*);
  static Y54 f (Tag<x54>*);
  static Y55 f (Tag<x55>*);
  static Y56 f (Tag<x56>*);
  static Y57 f (Tag<x57>*);
  static Y58 f (Tag<x58>*);
  static Y59 f (Tag<x59>*);
  static Y60 f (Tag<x60>*);
  static Y61 f (Tag<x61>*);
  static Y62 f (Tag<x62>*);
  static Y63 f (Tag<x63>*);
  static Y64 f (Tag<x64>*);
  static Y65 f (Tag<x65>*);
  static Y66 f (Tag<x66>*);
  static Y67 f (Tag<x67>*);
  static Y68 f (Tag<x68>*);
  static Y69 f (Tag<x69>*);
  static Y70 f (Tag<x70>*);
  static Y71 f (Tag<x71>*);
  static Y72 f (Tag<x72>*);
  static Y73 f (Tag<x73>*);
  static Y74 f (Tag<x74>*);
  static Y75 f (Tag<x75>*);
  static Y76 f (Tag<x76>*);
  static Y77 f (Tag<x77>*);
  static Y78 f (Tag<x78>*);
  static Y79 f (Tag<x79>*);
  static Y80 f (Tag<x80>*);
  static Y81 f (Tag<x81>*);
  static Y82 f (Tag<x82>*);
  static Y83 f (Tag<x83>*);
  static Y84 f (Tag<x84>*);
  static Y85 f (Tag<x85>*);
  static Y86 f (Tag<x86>*);
  static Y87 f (Tag<x87>*);
  static Y88 f (Tag<x88>*);
  static Y89 f (Tag<x89>*);
  static Y90 f (Tag<x90>*);
  static Y91 f (Tag<x91>*);
  static Y92 f (Tag<x92>*);
  static Y93 f (Tag<x93>*);
  static Y94 f (Tag<x94>*);
  static Y95 f (Tag<x95>*);
  static Y96 f (Tag<x96>*);
  static Y97 f (Tag<x97>*);
  static Y98 f (Tag<x98>*);
  static Y99 f (Tag<x99>*);
  static Y100 f (Tag<x100>*);

  template <char const* x>
  struct Selector
  {
    typedef typeof (Mapper::f ((Tag<x>*) (0))) Type;
  };
#else
  template <char const* x>
  struct Selector
  {
    typedef typename if_<same<x, x1>::r, Y1,
    typename Mapper
    <
      x2, Y2,
      x3, Y3,
      x4, Y4,
      x5, Y5,
      x6, Y6,
      x7, Y7,
      x8, Y8,
      x9, Y9,
      x10, Y10,
      x11, Y11,
      x12, Y12,
      x13, Y13,
      x14, Y14,
      x15, Y15,
      x16, Y16,
      x17, Y17,
      x18, Y18,
      x19, Y19,
      x20, Y20,
      x21, Y21,
      x22, Y22,
      x23, Y23,
      x24, Y24,
      x25, Y25,
      x26, Y26,
      x27, Y27,
      x28, Y28,
      x29, Y29,
      x30, Y30,
      x31, Y31,
      x32, Y32,
      x33, Y33,
      x34, Y34,
      x35, Y35,
      x36, Y36,
      x37, Y37,
      x38, Y38,
      x39, Y39,
      x40, Y40,
      x41, Y41,
      x42, Y42,
      x43, Y43,
      x44, Y44,
      x45, Y45,
      x46, Y46,
      x47, Y47,
      x48, Y48,
      x49, Y49,
      x50, Y50,
      x51, Y51,
      x52, Y52,
      x53, Y53,
      x54, Y54,
      x55, Y55,
      x56, Y56,
      x57, Y57,
      x58, Y58,
      x59, Y59,
      x60, Y60,
      x61, Y61,
      x62, Y62,
      x63, Y63,
      x64, Y64,
      x65, Y65,
      x66, Y66,
      x67, Y67,
      x68, Y68,
      x69, Y69,
      x70, Y70,
      x71, Y71,
      x72, Y72,
      x73, Y73,
      x74, Y74,
      x75, Y75,
      x76, Y76,
      x77, Y77,
      x78, Y78,
      x79, Y79,
      x80, Y80,
      x81, Y81,
      x82, Y82,
      x83, Y83,
      x84, Y84,
      x85, Y85,
      x86, Y86,
      x87, Y87,
      x88, Y88,
      x89, Y89,
      x90, Y90,
      x91, Y91,
      x92, Y92,
      x93, Y93,
      x94, Y94,
      x95, Y95,
      x96, Y96,
      x97, Y97,
      x98, Y98,
      x99, Y99,
      x100, Y100
    >::template Selector<x>::Type>::Type Type;
  };
#endif
};

