public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] libstdc++: use new built-in trait __is_reference
@ 2023-03-19  4:21 Ken Matsui
  2023-03-20  7:25 ` Xi Ruoyao
  0 siblings, 1 reply; 12+ messages in thread
From: Ken Matsui @ 2023-03-19  4:21 UTC (permalink / raw)
  To: gcc-patches; +Cc: Patrick Palka

libstdc++-v3/ChangeLog:

* include/std/type_traits (is_reference): Use __is_reference built-in trait.
---
diff --git a/libstdc++-v3/include/std/type_traits
b/libstdc++-v3/include/std/type_traits
index 2bd607a8b8f..18408d8ceb6 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // Composite type categories.

   /// is_reference
+#if __has_builtin(__is_reference)
+  template<typename _Tp>
+    struct is_reference
+    : public integral_constant<bool, __is_reference(_Tp)>
+    { };
+#else
   template<typename _Tp>
     struct is_reference
     : public false_type
@@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct is_reference<_Tp&&>
     : public true_type
     { };
+#endif

   /// is_arithmetic
   template<typename _Tp>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-19  4:21 [PATCH] libstdc++: use new built-in trait __is_reference Ken Matsui
@ 2023-03-20  7:25 ` Xi Ruoyao
  2023-03-20  7:30   ` Ken Matsui
  0 siblings, 1 reply; 12+ messages in thread
From: Xi Ruoyao @ 2023-03-20  7:25 UTC (permalink / raw)
  To: Ken Matsui, gcc-patches; +Cc: Patrick Palka, libstdc++

You need to CC libstdc++@gcc.gnu.org for any patches touching libstdc++.

On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote:
> libstdc++-v3/ChangeLog:
> 
> * include/std/type_traits (is_reference): Use __is_reference built-in
> trait.

Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
nothing) to indent the ChangeLog content.

Is there any benefit to use a builtin, instead of the existing
implementation?  I can see no but maybe I'm stupid.

> ---
> diff --git a/libstdc++-v3/include/std/type_traits
> b/libstdc++-v3/include/std/type_traits

The patch fails to apply.  It seems because your mail client inserted an
additional newline before "b/".  Try to use git-send-email or configure
the mail client properly.

> index 2bd607a8b8f..18408d8ceb6 100644
> --- a/libstdc++-v3/include/std/type_traits
> +++ b/libstdc++-v3/include/std/type_traits
> @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>    // Composite type categories.
> 
>    /// is_reference
> +#if __has_builtin(__is_reference)
> +  template<typename _Tp>
> +    struct is_reference
> +    : public integral_constant<bool, __is_reference(_Tp)>

If a patch depends on another patch not applied yet, sent them in a
series.  Or people are puzzled because when this patch is applied alone,
the code fails to build.

> +    { };
> +#else
>    template<typename _Tp>
>      struct is_reference
>      : public false_type
> @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      struct is_reference<_Tp&&>
>      : public true_type
>      { };
> +#endif
> 
>    /// is_arithmetic
>    template<typename _Tp>

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  7:25 ` Xi Ruoyao
@ 2023-03-20  7:30   ` Ken Matsui
  2023-03-20  7:51     ` Xi Ruoyao
  0 siblings, 1 reply; 12+ messages in thread
From: Ken Matsui @ 2023-03-20  7:30 UTC (permalink / raw)
  To: Xi Ruoyao; +Cc: gcc-patches, Patrick Palka, libstdc++

I see. Thank you!

On Mon, Mar 20, 2023 at 12:26 AM Xi Ruoyao <xry111@xry111.site> wrote:
>
> You need to CC libstdc++@gcc.gnu.org for any patches touching libstdc++.
>
> On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote:
> > libstdc++-v3/ChangeLog:
> >
> > * include/std/type_traits (is_reference): Use __is_reference built-in
> > trait.
>
> Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> nothing) to indent the ChangeLog content.
>
> Is there any benefit to use a builtin, instead of the existing
> implementation?  I can see no but maybe I'm stupid.
>
> > ---
> > diff --git a/libstdc++-v3/include/std/type_traits
> > b/libstdc++-v3/include/std/type_traits
>
> The patch fails to apply.  It seems because your mail client inserted an
> additional newline before "b/".  Try to use git-send-email or configure
> the mail client properly.
>
> > index 2bd607a8b8f..18408d8ceb6 100644
> > --- a/libstdc++-v3/include/std/type_traits
> > +++ b/libstdc++-v3/include/std/type_traits
> > @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >    // Composite type categories.
> >
> >    /// is_reference
> > +#if __has_builtin(__is_reference)
> > +  template<typename _Tp>
> > +    struct is_reference
> > +    : public integral_constant<bool, __is_reference(_Tp)>
>
> If a patch depends on another patch not applied yet, sent them in a
> series.  Or people are puzzled because when this patch is applied alone,
> the code fails to build.
>
> > +    { };
> > +#else
> >    template<typename _Tp>
> >      struct is_reference
> >      : public false_type
> > @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >      struct is_reference<_Tp&&>
> >      : public true_type
> >      { };
> > +#endif
> >
> >    /// is_arithmetic
> >    template<typename _Tp>
>
> --
> Xi Ruoyao <xry111@xry111.site>
> School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  7:30   ` Ken Matsui
@ 2023-03-20  7:51     ` Xi Ruoyao
  2023-03-20  8:03       ` Ken Matsui
  0 siblings, 1 reply; 12+ messages in thread
From: Xi Ruoyao @ 2023-03-20  7:51 UTC (permalink / raw)
  To: Ken Matsui; +Cc: gcc-patches, Patrick Palka, libstdc++

On Mon, 2023-03-20 at 00:30 -0700, Ken Matsui wrote:
> I see. Thank you!

Please continue to read.  I guess you missed some inline comments from
me...

> 
> On Mon, Mar 20, 2023 at 12:26 AM Xi Ruoyao <xry111@xry111.site> wrote:
> > 
> > You need to CC libstdc++@gcc.gnu.org for any patches touching
> > libstdc++.
> > 
> > On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote:
> > > libstdc++-v3/ChangeLog:
> > > 
> > > * include/std/type_traits (is_reference): Use __is_reference
> > > built-in
> > > trait.
> > 
> > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > nothing) to indent the ChangeLog content.
> > 
> > Is there any benefit to use a builtin, instead of the existing
> > implementation?  I can see no but maybe I'm stupid.
> > 
> > > ---
> > > diff --git a/libstdc++-v3/include/std/type_traits
> > > b/libstdc++-v3/include/std/type_traits
> > 
> > The patch fails to apply.  It seems because your mail client
> > inserted an
> > additional newline before "b/".  Try to use git-send-email or
> > configure
> > the mail client properly.
> > 
> > > index 2bd607a8b8f..18408d8ceb6 100644
> > > --- a/libstdc++-v3/include/std/type_traits
> > > +++ b/libstdc++-v3/include/std/type_traits
> > > @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> > >    // Composite type categories.
> > > 
> > >    /// is_reference
> > > +#if __has_builtin(__is_reference)
> > > +  template<typename _Tp>
> > > +    struct is_reference
> > > +    : public integral_constant<bool, __is_reference(_Tp)>
> > 
> > If a patch depends on another patch not applied yet, sent them in a
> > series.  Or people are puzzled because when this patch is applied
> > alone,
> > the code fails to build.
> > 
> > > +    { };
> > > +#else
> > >    template<typename _Tp>
> > >      struct is_reference
> > >      : public false_type
> > > @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> > >      struct is_reference<_Tp&&>
> > >      : public true_type
> > >      { };
> > > +#endif
> > > 
> > >    /// is_arithmetic
> > >    template<typename _Tp>
> > 
> > --
> > Xi Ruoyao <xry111@xry111.site>
> > School of Aerospace Science and Technology, Xidian University

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  7:51     ` Xi Ruoyao
@ 2023-03-20  8:03       ` Ken Matsui
  2023-03-20  8:07         ` Xi Ruoyao
  0 siblings, 1 reply; 12+ messages in thread
From: Ken Matsui @ 2023-03-20  8:03 UTC (permalink / raw)
  To: Xi Ruoyao; +Cc: gcc-patches, Patrick Palka, libstdc++

Oops, I assumed those were my email... Thank you for your heads up and
your comments!

> Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> nothing) to indent the ChangeLog content.

Do you mean like the following?

```
libstdc++-v3/ChangeLog:

[TAB]* include/std/type_traits (is_reference): Use __is_reference built-in
trait.
```

> Is there any benefit to use a builtin, instead of the existing
> implementation?  I can see no but maybe I'm stupid.

My patches are based on the GSoC project "C++: Implement compiler
built-in traits for the standard library traits". These built-in
traits basically make the compilation faster.

https://gcc.gnu.org/wiki/SummerOfCode

> The patch fails to apply.  It seems because your mail client inserted an
> additional newline before "b/".  Try to use git-send-email or configure
> the mail client properly.

Let me try to use git-send-email instead. I stupidly don't understand
how to use them, so I was making my patches manually...

> If a patch depends on another patch not applied yet, sent them in a
> series.  Or people are puzzled because when this patch is applied alone,
> the code fails to build.

Oooh, this one! [PATCH 3/7] - the third patch in a series of seven patches
I totally missed that. Thank you!

On Mon, Mar 20, 2023 at 12:51 AM Xi Ruoyao <xry111@xry111.site> wrote:
>
> On Mon, 2023-03-20 at 00:30 -0700, Ken Matsui wrote:
> > I see. Thank you!
>
> Please continue to read.  I guess you missed some inline comments from
> me...
>
> >
> > On Mon, Mar 20, 2023 at 12:26 AM Xi Ruoyao <xry111@xry111.site> wrote:
> > >
> > > You need to CC libstdc++@gcc.gnu.org for any patches touching
> > > libstdc++.
> > >
> > > On Sat, 2023-03-18 at 21:21 -0700, Ken Matsui via Gcc-patches wrote:
> > > > libstdc++-v3/ChangeLog:
> > > >
> > > > * include/std/type_traits (is_reference): Use __is_reference
> > > > built-in
> > > > trait.
> > >
> > > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > > nothing) to indent the ChangeLog content.
> > >
> > > Is there any benefit to use a builtin, instead of the existing
> > > implementation?  I can see no but maybe I'm stupid.
> > >
> > > > ---
> > > > diff --git a/libstdc++-v3/include/std/type_traits
> > > > b/libstdc++-v3/include/std/type_traits
> > >
> > > The patch fails to apply.  It seems because your mail client
> > > inserted an
> > > additional newline before "b/".  Try to use git-send-email or
> > > configure
> > > the mail client properly.
> > >
> > > > index 2bd607a8b8f..18408d8ceb6 100644
> > > > --- a/libstdc++-v3/include/std/type_traits
> > > > +++ b/libstdc++-v3/include/std/type_traits
> > > > @@ -639,6 +639,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> > > >    // Composite type categories.
> > > >
> > > >    /// is_reference
> > > > +#if __has_builtin(__is_reference)
> > > > +  template<typename _Tp>
> > > > +    struct is_reference
> > > > +    : public integral_constant<bool, __is_reference(_Tp)>
> > >
> > > If a patch depends on another patch not applied yet, sent them in a
> > > series.  Or people are puzzled because when this patch is applied
> > > alone,
> > > the code fails to build.
> > >
> > > > +    { };
> > > > +#else
> > > >    template<typename _Tp>
> > > >      struct is_reference
> > > >      : public false_type
> > > > @@ -653,6 +659,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> > > >      struct is_reference<_Tp&&>
> > > >      : public true_type
> > > >      { };
> > > > +#endif
> > > >
> > > >    /// is_arithmetic
> > > >    template<typename _Tp>
> > >
> > > --
> > > Xi Ruoyao <xry111@xry111.site>
> > > School of Aerospace Science and Technology, Xidian University
>
> --
> Xi Ruoyao <xry111@xry111.site>
> School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  8:03       ` Ken Matsui
@ 2023-03-20  8:07         ` Xi Ruoyao
  2023-03-20  8:32           ` Ken Matsui
  2023-03-20  9:14           ` Jonathan Wakely
  0 siblings, 2 replies; 12+ messages in thread
From: Xi Ruoyao @ 2023-03-20  8:07 UTC (permalink / raw)
  To: Ken Matsui; +Cc: gcc-patches, Patrick Palka, libstdc++

On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote:
> Oops, I assumed those were my email... Thank you for your heads up and
> your comments!
> 
> > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > nothing) to indent the ChangeLog content.
> 
> Do you mean like the following?
> 
> ```
> libstdc++-v3/ChangeLog:
> 
> [TAB]* include/std/type_traits (is_reference): Use __is_reference
> built-in
> trait.
> ```

Yep.

> > Is there any benefit to use a builtin, instead of the existing
> > implementation?  I can see no but maybe I'm stupid.
> 
> My patches are based on the GSoC project "C++: Implement compiler
> built-in traits for the standard library traits". These built-in
> traits basically make the compilation faster.
> 
> https://gcc.gnu.org/wiki/SummerOfCode

Ok, to me making compilation faster is a valid reason.

> > The patch fails to apply.  It seems because your mail client inserted an
> > additional newline before "b/".  Try to use git-send-email or configure
> > the mail client properly.
> 
> Let me try to use git-send-email instead. I stupidly don't understand
> how to use them, so I was making my patches manually...

Or adjust the mail client correctly.  You can send the patch to yourself
first and see if it's not "mangled" by the mail client when you debug
such an issue...

But when you finally end up sending 10 patches in a series you'll find
git send-email much easier :).

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  8:07         ` Xi Ruoyao
@ 2023-03-20  8:32           ` Ken Matsui
  2023-03-20  9:14           ` Jonathan Wakely
  1 sibling, 0 replies; 12+ messages in thread
From: Ken Matsui @ 2023-03-20  8:32 UTC (permalink / raw)
  To: Xi Ruoyao; +Cc: gcc-patches, Patrick Palka, libstdc++

Thank you!

On Mon, Mar 20, 2023 at 1:07 AM Xi Ruoyao <xry111@xry111.site> wrote:
>
> On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote:
> > Oops, I assumed those were my email... Thank you for your heads up and
> > your comments!
> >
> > > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > > nothing) to indent the ChangeLog content.
> >
> > Do you mean like the following?
> >
> > ```
> > libstdc++-v3/ChangeLog:
> >
> > [TAB]* include/std/type_traits (is_reference): Use __is_reference
> > built-in
> > trait.
> > ```
>
> Yep.
>
> > > Is there any benefit to use a builtin, instead of the existing
> > > implementation?  I can see no but maybe I'm stupid.
> >
> > My patches are based on the GSoC project "C++: Implement compiler
> > built-in traits for the standard library traits". These built-in
> > traits basically make the compilation faster.
> >
> > https://gcc.gnu.org/wiki/SummerOfCode
>
> Ok, to me making compilation faster is a valid reason.
>
> > > The patch fails to apply.  It seems because your mail client inserted an
> > > additional newline before "b/".  Try to use git-send-email or configure
> > > the mail client properly.
> >
> > Let me try to use git-send-email instead. I stupidly don't understand
> > how to use them, so I was making my patches manually...
>
> Or adjust the mail client correctly.  You can send the patch to yourself
> first and see if it's not "mangled" by the mail client when you debug
> such an issue...
>
> But when you finally end up sending 10 patches in a series you'll find
> git send-email much easier :).
>
> --
> Xi Ruoyao <xry111@xry111.site>
> School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  8:07         ` Xi Ruoyao
  2023-03-20  8:32           ` Ken Matsui
@ 2023-03-20  9:14           ` Jonathan Wakely
  2023-03-20  9:56             ` Ken Matsui
  1 sibling, 1 reply; 12+ messages in thread
From: Jonathan Wakely @ 2023-03-20  9:14 UTC (permalink / raw)
  To: Xi Ruoyao; +Cc: Ken Matsui, gcc-patches, Patrick Palka, libstdc++

On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote:
> > Oops, I assumed those were my email... Thank you for your heads up and
> > your comments!
> >
> > > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > > nothing) to indent the ChangeLog content.
> >
> > Do you mean like the following?
> >
> > ```
> > libstdc++-v3/ChangeLog:
> >
> > [TAB]* include/std/type_traits (is_reference): Use __is_reference
> > built-in
> > trait.
> > ```
>
> Yep.
>
> > > Is there any benefit to use a builtin, instead of the existing
> > > implementation?  I can see no but maybe I'm stupid.
> >
> > My patches are based on the GSoC project "C++: Implement compiler
> > built-in traits for the standard library traits". These built-in
> > traits basically make the compilation faster.
> >
> > https://gcc.gnu.org/wiki/SummerOfCode
>
> Ok, to me making compilation faster is a valid reason.

Does it actually make compilation faster though?

Has it been measured?

> > > The patch fails to apply.  It seems because your mail client inserted an
> > > additional newline before "b/".  Try to use git-send-email or configure
> > > the mail client properly.
> >
> > Let me try to use git-send-email instead. I stupidly don't understand
> > how to use them, so I was making my patches manually...
>
> Or adjust the mail client correctly.  You can send the patch to yourself
> first and see if it's not "mangled" by the mail client when you debug
> such an issue...
>
> But when you finally end up sending 10 patches in a series you'll find
> git send-email much easier :).

Figuring out how to generate proper patches is an important part of
contributing to GCC, so part of any GSoC project.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  9:14           ` Jonathan Wakely
@ 2023-03-20  9:56             ` Ken Matsui
  2023-03-20 13:22               ` Ken Matsui
  2023-03-20 15:23               ` Patrick Palka
  0 siblings, 2 replies; 12+ messages in thread
From: Ken Matsui @ 2023-03-20  9:56 UTC (permalink / raw)
  To: Jonathan Wakely; +Cc: Xi Ruoyao, gcc-patches, Patrick Palka, libstdc++

> Does it actually make compilation faster though?
>
> Has it been measured?

In my understanding, what I have implemented so far is so simple that
it does not affect the speed. These traits are what Partick kindly
recommended to get started. As explained on the GSoC page, some traits
might involve expensive instantiation of multiple class templates. So
IMHO, implementing built-in traits for those traits can make
compilation cheaper.

I have not measured it, but Patrick might have done?

On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote:
>
> On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++
> <libstdc++@gcc.gnu.org> wrote:
> >
> > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote:
> > > Oops, I assumed those were my email... Thank you for your heads up and
> > > your comments!
> > >
> > > > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > > > nothing) to indent the ChangeLog content.
> > >
> > > Do you mean like the following?
> > >
> > > ```
> > > libstdc++-v3/ChangeLog:
> > >
> > > [TAB]* include/std/type_traits (is_reference): Use __is_reference
> > > built-in
> > > trait.
> > > ```
> >
> > Yep.
> >
> > > > Is there any benefit to use a builtin, instead of the existing
> > > > implementation?  I can see no but maybe I'm stupid.
> > >
> > > My patches are based on the GSoC project "C++: Implement compiler
> > > built-in traits for the standard library traits". These built-in
> > > traits basically make the compilation faster.
> > >
> > > https://gcc.gnu.org/wiki/SummerOfCode
> >
> > Ok, to me making compilation faster is a valid reason.
>
> Does it actually make compilation faster though?
>
> Has it been measured?
>
> > > > The patch fails to apply.  It seems because your mail client inserted an
> > > > additional newline before "b/".  Try to use git-send-email or configure
> > > > the mail client properly.
> > >
> > > Let me try to use git-send-email instead. I stupidly don't understand
> > > how to use them, so I was making my patches manually...
> >
> > Or adjust the mail client correctly.  You can send the patch to yourself
> > first and see if it's not "mangled" by the mail client when you debug
> > such an issue...
> >
> > But when you finally end up sending 10 patches in a series you'll find
> > git send-email much easier :).
>
> Figuring out how to generate proper patches is an important part of
> contributing to GCC, so part of any GSoC project.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  9:56             ` Ken Matsui
@ 2023-03-20 13:22               ` Ken Matsui
  2023-03-20 15:23               ` Patrick Palka
  1 sibling, 0 replies; 12+ messages in thread
From: Ken Matsui @ 2023-03-20 13:22 UTC (permalink / raw)
  To: Jonathan Wakely; +Cc: Xi Ruoyao, gcc-patches, Patrick Palka, libstdc++

It looks like I was able to use git send-email. The new patches became
a series, so I couldn't figure out how to associate them with this
email and another email. Please disregard this email.

On Mon, Mar 20, 2023 at 2:56 AM Ken Matsui <kmatsui@cs.washington.edu> wrote:
>
> > Does it actually make compilation faster though?
> >
> > Has it been measured?
>
> In my understanding, what I have implemented so far is so simple that
> it does not affect the speed. These traits are what Partick kindly
> recommended to get started. As explained on the GSoC page, some traits
> might involve expensive instantiation of multiple class templates. So
> IMHO, implementing built-in traits for those traits can make
> compilation cheaper.
>
> I have not measured it, but Patrick might have done?
>
> On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote:
> >
> > On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++
> > <libstdc++@gcc.gnu.org> wrote:
> > >
> > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote:
> > > > Oops, I assumed those were my email... Thank you for your heads up and
> > > > your comments!
> > > >
> > > > > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > > > > nothing) to indent the ChangeLog content.
> > > >
> > > > Do you mean like the following?
> > > >
> > > > ```
> > > > libstdc++-v3/ChangeLog:
> > > >
> > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference
> > > > built-in
> > > > trait.
> > > > ```
> > >
> > > Yep.
> > >
> > > > > Is there any benefit to use a builtin, instead of the existing
> > > > > implementation?  I can see no but maybe I'm stupid.
> > > >
> > > > My patches are based on the GSoC project "C++: Implement compiler
> > > > built-in traits for the standard library traits". These built-in
> > > > traits basically make the compilation faster.
> > > >
> > > > https://gcc.gnu.org/wiki/SummerOfCode
> > >
> > > Ok, to me making compilation faster is a valid reason.
> >
> > Does it actually make compilation faster though?
> >
> > Has it been measured?
> >
> > > > > The patch fails to apply.  It seems because your mail client inserted an
> > > > > additional newline before "b/".  Try to use git-send-email or configure
> > > > > the mail client properly.
> > > >
> > > > Let me try to use git-send-email instead. I stupidly don't understand
> > > > how to use them, so I was making my patches manually...
> > >
> > > Or adjust the mail client correctly.  You can send the patch to yourself
> > > first and see if it's not "mangled" by the mail client when you debug
> > > such an issue...
> > >
> > > But when you finally end up sending 10 patches in a series you'll find
> > > git send-email much easier :).
> >
> > Figuring out how to generate proper patches is an important part of
> > contributing to GCC, so part of any GSoC project.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20  9:56             ` Ken Matsui
  2023-03-20 13:22               ` Ken Matsui
@ 2023-03-20 15:23               ` Patrick Palka
  2023-03-20 20:24                 ` Ken Matsui
  1 sibling, 1 reply; 12+ messages in thread
From: Patrick Palka @ 2023-03-20 15:23 UTC (permalink / raw)
  To: Ken Matsui; +Cc: Jonathan Wakely, Xi Ruoyao, gcc-patches, libstdc++

[-- Attachment #1: Type: text/plain, Size: 3515 bytes --]

On Mon, Mar 20, 2023 at 5:56 AM Ken Matsui <kmatsui@cs.washington.edu> wrote:
>
> > Does it actually make compilation faster though?
> >
> > Has it been measured?
>
> In my understanding, what I have implemented so far is so simple that
> it does not affect the speed. These traits are what Partick kindly
> recommended to get started. As explained on the GSoC page, some traits
> might involve expensive instantiation of multiple class templates. So
> IMHO, implementing built-in traits for those traits can make
> compilation cheaper.
>
> I have not measured it, but Patrick might have done?

Although the native implementation of using two partial
specializations is very efficient, I'd suspect using a built-in would
be even better because it'd avoid the work of having to figure out
which of the two partial specializations to instantiate.

I contrived the attached benchmark to measure this, which instantiates
~160k specializations of is_reference_v (it was simpler to write a
benchmark for the variable template version). On my machine gcc trunk
(release build) as well as Clang 15 use between 10-15% less
time/memory with -DUSE_BUILTIN than without for this benchmark, so
this suggests the built-in improves compile time/memory usage for this
trait by at least 10-15%.  For more complicated traits the improvement
should be even better.

>
> On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote:
> >
> > On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++
> > <libstdc++@gcc.gnu.org> wrote:
> > >
> > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote:
> > > > Oops, I assumed those were my email... Thank you for your heads up and
> > > > your comments!
> > > >
> > > > > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces, nor
> > > > > nothing) to indent the ChangeLog content.
> > > >
> > > > Do you mean like the following?
> > > >
> > > > ```
> > > > libstdc++-v3/ChangeLog:
> > > >
> > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference
> > > > built-in
> > > > trait.
> > > > ```
> > >
> > > Yep.
> > >
> > > > > Is there any benefit to use a builtin, instead of the existing
> > > > > implementation?  I can see no but maybe I'm stupid.
> > > >
> > > > My patches are based on the GSoC project "C++: Implement compiler
> > > > built-in traits for the standard library traits". These built-in
> > > > traits basically make the compilation faster.
> > > >
> > > > https://gcc.gnu.org/wiki/SummerOfCode
> > >
> > > Ok, to me making compilation faster is a valid reason.
> >
> > Does it actually make compilation faster though?
> >
> > Has it been measured?
> >
> > > > > The patch fails to apply.  It seems because your mail client inserted an
> > > > > additional newline before "b/".  Try to use git-send-email or configure
> > > > > the mail client properly.
> > > >
> > > > Let me try to use git-send-email instead. I stupidly don't understand
> > > > how to use them, so I was making my patches manually...
> > >
> > > Or adjust the mail client correctly.  You can send the patch to yourself
> > > first and see if it's not "mangled" by the mail client when you debug
> > > such an issue...
> > >
> > > But when you finally end up sending 10 patches in a series you'll find
> > > git send-email much easier :).
> >
> > Figuring out how to generate proper patches is an important part of
> > contributing to GCC, so part of any GSoC project.
>

[-- Attachment #2: is_reference_benchmark.C --]
[-- Type: text/x-c++src, Size: 89639 bytes --]

#if USE_BUILTIN
template<class T> inline constexpr bool is_reference_v = __is_reference(T);
#else
template<class T> inline constexpr bool is_reference_v = false;
template<class T> inline constexpr bool is_reference_v<T&> = true;
template<class T> inline constexpr bool is_reference_v<T&&> = true;
#endif


template<int N> struct A;

#define Y(N)				\
  static_assert(!is_reference_v<A<N>>); \
  static_assert(!is_reference_v<A<N>*>);\
  static_assert(is_reference_v<A<N>&>); \
  static_assert(is_reference_v<A<N>&&>); \
  static_assert(is_reference_v<const A<N>&>); \
  static_assert(is_reference_v<const A<N>&&>); \
  static_assert(is_reference_v<A<N>*&>); \
  static_assert(is_reference_v<A<N>*&&>); \

#define X(N) Y(N) Y(-N)

int main() {
X(1);
X(2);
X(3);
X(4);
X(5);
X(6);
X(7);
X(8);
X(9);
X(10);
X(11);
X(12);
X(13);
X(14);
X(15);
X(16);
X(17);
X(18);
X(19);
X(20);
X(21);
X(22);
X(23);
X(24);
X(25);
X(26);
X(27);
X(28);
X(29);
X(30);
X(31);
X(32);
X(33);
X(34);
X(35);
X(36);
X(37);
X(38);
X(39);
X(40);
X(41);
X(42);
X(43);
X(44);
X(45);
X(46);
X(47);
X(48);
X(49);
X(50);
X(51);
X(52);
X(53);
X(54);
X(55);
X(56);
X(57);
X(58);
X(59);
X(60);
X(61);
X(62);
X(63);
X(64);
X(65);
X(66);
X(67);
X(68);
X(69);
X(70);
X(71);
X(72);
X(73);
X(74);
X(75);
X(76);
X(77);
X(78);
X(79);
X(80);
X(81);
X(82);
X(83);
X(84);
X(85);
X(86);
X(87);
X(88);
X(89);
X(90);
X(91);
X(92);
X(93);
X(94);
X(95);
X(96);
X(97);
X(98);
X(99);
X(100);
X(101);
X(102);
X(103);
X(104);
X(105);
X(106);
X(107);
X(108);
X(109);
X(110);
X(111);
X(112);
X(113);
X(114);
X(115);
X(116);
X(117);
X(118);
X(119);
X(120);
X(121);
X(122);
X(123);
X(124);
X(125);
X(126);
X(127);
X(128);
X(129);
X(130);
X(131);
X(132);
X(133);
X(134);
X(135);
X(136);
X(137);
X(138);
X(139);
X(140);
X(141);
X(142);
X(143);
X(144);
X(145);
X(146);
X(147);
X(148);
X(149);
X(150);
X(151);
X(152);
X(153);
X(154);
X(155);
X(156);
X(157);
X(158);
X(159);
X(160);
X(161);
X(162);
X(163);
X(164);
X(165);
X(166);
X(167);
X(168);
X(169);
X(170);
X(171);
X(172);
X(173);
X(174);
X(175);
X(176);
X(177);
X(178);
X(179);
X(180);
X(181);
X(182);
X(183);
X(184);
X(185);
X(186);
X(187);
X(188);
X(189);
X(190);
X(191);
X(192);
X(193);
X(194);
X(195);
X(196);
X(197);
X(198);
X(199);
X(200);
X(201);
X(202);
X(203);
X(204);
X(205);
X(206);
X(207);
X(208);
X(209);
X(210);
X(211);
X(212);
X(213);
X(214);
X(215);
X(216);
X(217);
X(218);
X(219);
X(220);
X(221);
X(222);
X(223);
X(224);
X(225);
X(226);
X(227);
X(228);
X(229);
X(230);
X(231);
X(232);
X(233);
X(234);
X(235);
X(236);
X(237);
X(238);
X(239);
X(240);
X(241);
X(242);
X(243);
X(244);
X(245);
X(246);
X(247);
X(248);
X(249);
X(250);
X(251);
X(252);
X(253);
X(254);
X(255);
X(256);
X(257);
X(258);
X(259);
X(260);
X(261);
X(262);
X(263);
X(264);
X(265);
X(266);
X(267);
X(268);
X(269);
X(270);
X(271);
X(272);
X(273);
X(274);
X(275);
X(276);
X(277);
X(278);
X(279);
X(280);
X(281);
X(282);
X(283);
X(284);
X(285);
X(286);
X(287);
X(288);
X(289);
X(290);
X(291);
X(292);
X(293);
X(294);
X(295);
X(296);
X(297);
X(298);
X(299);
X(300);
X(301);
X(302);
X(303);
X(304);
X(305);
X(306);
X(307);
X(308);
X(309);
X(310);
X(311);
X(312);
X(313);
X(314);
X(315);
X(316);
X(317);
X(318);
X(319);
X(320);
X(321);
X(322);
X(323);
X(324);
X(325);
X(326);
X(327);
X(328);
X(329);
X(330);
X(331);
X(332);
X(333);
X(334);
X(335);
X(336);
X(337);
X(338);
X(339);
X(340);
X(341);
X(342);
X(343);
X(344);
X(345);
X(346);
X(347);
X(348);
X(349);
X(350);
X(351);
X(352);
X(353);
X(354);
X(355);
X(356);
X(357);
X(358);
X(359);
X(360);
X(361);
X(362);
X(363);
X(364);
X(365);
X(366);
X(367);
X(368);
X(369);
X(370);
X(371);
X(372);
X(373);
X(374);
X(375);
X(376);
X(377);
X(378);
X(379);
X(380);
X(381);
X(382);
X(383);
X(384);
X(385);
X(386);
X(387);
X(388);
X(389);
X(390);
X(391);
X(392);
X(393);
X(394);
X(395);
X(396);
X(397);
X(398);
X(399);
X(400);
X(401);
X(402);
X(403);
X(404);
X(405);
X(406);
X(407);
X(408);
X(409);
X(410);
X(411);
X(412);
X(413);
X(414);
X(415);
X(416);
X(417);
X(418);
X(419);
X(420);
X(421);
X(422);
X(423);
X(424);
X(425);
X(426);
X(427);
X(428);
X(429);
X(430);
X(431);
X(432);
X(433);
X(434);
X(435);
X(436);
X(437);
X(438);
X(439);
X(440);
X(441);
X(442);
X(443);
X(444);
X(445);
X(446);
X(447);
X(448);
X(449);
X(450);
X(451);
X(452);
X(453);
X(454);
X(455);
X(456);
X(457);
X(458);
X(459);
X(460);
X(461);
X(462);
X(463);
X(464);
X(465);
X(466);
X(467);
X(468);
X(469);
X(470);
X(471);
X(472);
X(473);
X(474);
X(475);
X(476);
X(477);
X(478);
X(479);
X(480);
X(481);
X(482);
X(483);
X(484);
X(485);
X(486);
X(487);
X(488);
X(489);
X(490);
X(491);
X(492);
X(493);
X(494);
X(495);
X(496);
X(497);
X(498);
X(499);
X(500);
X(501);
X(502);
X(503);
X(504);
X(505);
X(506);
X(507);
X(508);
X(509);
X(510);
X(511);
X(512);
X(513);
X(514);
X(515);
X(516);
X(517);
X(518);
X(519);
X(520);
X(521);
X(522);
X(523);
X(524);
X(525);
X(526);
X(527);
X(528);
X(529);
X(530);
X(531);
X(532);
X(533);
X(534);
X(535);
X(536);
X(537);
X(538);
X(539);
X(540);
X(541);
X(542);
X(543);
X(544);
X(545);
X(546);
X(547);
X(548);
X(549);
X(550);
X(551);
X(552);
X(553);
X(554);
X(555);
X(556);
X(557);
X(558);
X(559);
X(560);
X(561);
X(562);
X(563);
X(564);
X(565);
X(566);
X(567);
X(568);
X(569);
X(570);
X(571);
X(572);
X(573);
X(574);
X(575);
X(576);
X(577);
X(578);
X(579);
X(580);
X(581);
X(582);
X(583);
X(584);
X(585);
X(586);
X(587);
X(588);
X(589);
X(590);
X(591);
X(592);
X(593);
X(594);
X(595);
X(596);
X(597);
X(598);
X(599);
X(600);
X(601);
X(602);
X(603);
X(604);
X(605);
X(606);
X(607);
X(608);
X(609);
X(610);
X(611);
X(612);
X(613);
X(614);
X(615);
X(616);
X(617);
X(618);
X(619);
X(620);
X(621);
X(622);
X(623);
X(624);
X(625);
X(626);
X(627);
X(628);
X(629);
X(630);
X(631);
X(632);
X(633);
X(634);
X(635);
X(636);
X(637);
X(638);
X(639);
X(640);
X(641);
X(642);
X(643);
X(644);
X(645);
X(646);
X(647);
X(648);
X(649);
X(650);
X(651);
X(652);
X(653);
X(654);
X(655);
X(656);
X(657);
X(658);
X(659);
X(660);
X(661);
X(662);
X(663);
X(664);
X(665);
X(666);
X(667);
X(668);
X(669);
X(670);
X(671);
X(672);
X(673);
X(674);
X(675);
X(676);
X(677);
X(678);
X(679);
X(680);
X(681);
X(682);
X(683);
X(684);
X(685);
X(686);
X(687);
X(688);
X(689);
X(690);
X(691);
X(692);
X(693);
X(694);
X(695);
X(696);
X(697);
X(698);
X(699);
X(700);
X(701);
X(702);
X(703);
X(704);
X(705);
X(706);
X(707);
X(708);
X(709);
X(710);
X(711);
X(712);
X(713);
X(714);
X(715);
X(716);
X(717);
X(718);
X(719);
X(720);
X(721);
X(722);
X(723);
X(724);
X(725);
X(726);
X(727);
X(728);
X(729);
X(730);
X(731);
X(732);
X(733);
X(734);
X(735);
X(736);
X(737);
X(738);
X(739);
X(740);
X(741);
X(742);
X(743);
X(744);
X(745);
X(746);
X(747);
X(748);
X(749);
X(750);
X(751);
X(752);
X(753);
X(754);
X(755);
X(756);
X(757);
X(758);
X(759);
X(760);
X(761);
X(762);
X(763);
X(764);
X(765);
X(766);
X(767);
X(768);
X(769);
X(770);
X(771);
X(772);
X(773);
X(774);
X(775);
X(776);
X(777);
X(778);
X(779);
X(780);
X(781);
X(782);
X(783);
X(784);
X(785);
X(786);
X(787);
X(788);
X(789);
X(790);
X(791);
X(792);
X(793);
X(794);
X(795);
X(796);
X(797);
X(798);
X(799);
X(800);
X(801);
X(802);
X(803);
X(804);
X(805);
X(806);
X(807);
X(808);
X(809);
X(810);
X(811);
X(812);
X(813);
X(814);
X(815);
X(816);
X(817);
X(818);
X(819);
X(820);
X(821);
X(822);
X(823);
X(824);
X(825);
X(826);
X(827);
X(828);
X(829);
X(830);
X(831);
X(832);
X(833);
X(834);
X(835);
X(836);
X(837);
X(838);
X(839);
X(840);
X(841);
X(842);
X(843);
X(844);
X(845);
X(846);
X(847);
X(848);
X(849);
X(850);
X(851);
X(852);
X(853);
X(854);
X(855);
X(856);
X(857);
X(858);
X(859);
X(860);
X(861);
X(862);
X(863);
X(864);
X(865);
X(866);
X(867);
X(868);
X(869);
X(870);
X(871);
X(872);
X(873);
X(874);
X(875);
X(876);
X(877);
X(878);
X(879);
X(880);
X(881);
X(882);
X(883);
X(884);
X(885);
X(886);
X(887);
X(888);
X(889);
X(890);
X(891);
X(892);
X(893);
X(894);
X(895);
X(896);
X(897);
X(898);
X(899);
X(900);
X(901);
X(902);
X(903);
X(904);
X(905);
X(906);
X(907);
X(908);
X(909);
X(910);
X(911);
X(912);
X(913);
X(914);
X(915);
X(916);
X(917);
X(918);
X(919);
X(920);
X(921);
X(922);
X(923);
X(924);
X(925);
X(926);
X(927);
X(928);
X(929);
X(930);
X(931);
X(932);
X(933);
X(934);
X(935);
X(936);
X(937);
X(938);
X(939);
X(940);
X(941);
X(942);
X(943);
X(944);
X(945);
X(946);
X(947);
X(948);
X(949);
X(950);
X(951);
X(952);
X(953);
X(954);
X(955);
X(956);
X(957);
X(958);
X(959);
X(960);
X(961);
X(962);
X(963);
X(964);
X(965);
X(966);
X(967);
X(968);
X(969);
X(970);
X(971);
X(972);
X(973);
X(974);
X(975);
X(976);
X(977);
X(978);
X(979);
X(980);
X(981);
X(982);
X(983);
X(984);
X(985);
X(986);
X(987);
X(988);
X(989);
X(990);
X(991);
X(992);
X(993);
X(994);
X(995);
X(996);
X(997);
X(998);
X(999);
X(1000);
X(1001);
X(1002);
X(1003);
X(1004);
X(1005);
X(1006);
X(1007);
X(1008);
X(1009);
X(1010);
X(1011);
X(1012);
X(1013);
X(1014);
X(1015);
X(1016);
X(1017);
X(1018);
X(1019);
X(1020);
X(1021);
X(1022);
X(1023);
X(1024);
X(1025);
X(1026);
X(1027);
X(1028);
X(1029);
X(1030);
X(1031);
X(1032);
X(1033);
X(1034);
X(1035);
X(1036);
X(1037);
X(1038);
X(1039);
X(1040);
X(1041);
X(1042);
X(1043);
X(1044);
X(1045);
X(1046);
X(1047);
X(1048);
X(1049);
X(1050);
X(1051);
X(1052);
X(1053);
X(1054);
X(1055);
X(1056);
X(1057);
X(1058);
X(1059);
X(1060);
X(1061);
X(1062);
X(1063);
X(1064);
X(1065);
X(1066);
X(1067);
X(1068);
X(1069);
X(1070);
X(1071);
X(1072);
X(1073);
X(1074);
X(1075);
X(1076);
X(1077);
X(1078);
X(1079);
X(1080);
X(1081);
X(1082);
X(1083);
X(1084);
X(1085);
X(1086);
X(1087);
X(1088);
X(1089);
X(1090);
X(1091);
X(1092);
X(1093);
X(1094);
X(1095);
X(1096);
X(1097);
X(1098);
X(1099);
X(1100);
X(1101);
X(1102);
X(1103);
X(1104);
X(1105);
X(1106);
X(1107);
X(1108);
X(1109);
X(1110);
X(1111);
X(1112);
X(1113);
X(1114);
X(1115);
X(1116);
X(1117);
X(1118);
X(1119);
X(1120);
X(1121);
X(1122);
X(1123);
X(1124);
X(1125);
X(1126);
X(1127);
X(1128);
X(1129);
X(1130);
X(1131);
X(1132);
X(1133);
X(1134);
X(1135);
X(1136);
X(1137);
X(1138);
X(1139);
X(1140);
X(1141);
X(1142);
X(1143);
X(1144);
X(1145);
X(1146);
X(1147);
X(1148);
X(1149);
X(1150);
X(1151);
X(1152);
X(1153);
X(1154);
X(1155);
X(1156);
X(1157);
X(1158);
X(1159);
X(1160);
X(1161);
X(1162);
X(1163);
X(1164);
X(1165);
X(1166);
X(1167);
X(1168);
X(1169);
X(1170);
X(1171);
X(1172);
X(1173);
X(1174);
X(1175);
X(1176);
X(1177);
X(1178);
X(1179);
X(1180);
X(1181);
X(1182);
X(1183);
X(1184);
X(1185);
X(1186);
X(1187);
X(1188);
X(1189);
X(1190);
X(1191);
X(1192);
X(1193);
X(1194);
X(1195);
X(1196);
X(1197);
X(1198);
X(1199);
X(1200);
X(1201);
X(1202);
X(1203);
X(1204);
X(1205);
X(1206);
X(1207);
X(1208);
X(1209);
X(1210);
X(1211);
X(1212);
X(1213);
X(1214);
X(1215);
X(1216);
X(1217);
X(1218);
X(1219);
X(1220);
X(1221);
X(1222);
X(1223);
X(1224);
X(1225);
X(1226);
X(1227);
X(1228);
X(1229);
X(1230);
X(1231);
X(1232);
X(1233);
X(1234);
X(1235);
X(1236);
X(1237);
X(1238);
X(1239);
X(1240);
X(1241);
X(1242);
X(1243);
X(1244);
X(1245);
X(1246);
X(1247);
X(1248);
X(1249);
X(1250);
X(1251);
X(1252);
X(1253);
X(1254);
X(1255);
X(1256);
X(1257);
X(1258);
X(1259);
X(1260);
X(1261);
X(1262);
X(1263);
X(1264);
X(1265);
X(1266);
X(1267);
X(1268);
X(1269);
X(1270);
X(1271);
X(1272);
X(1273);
X(1274);
X(1275);
X(1276);
X(1277);
X(1278);
X(1279);
X(1280);
X(1281);
X(1282);
X(1283);
X(1284);
X(1285);
X(1286);
X(1287);
X(1288);
X(1289);
X(1290);
X(1291);
X(1292);
X(1293);
X(1294);
X(1295);
X(1296);
X(1297);
X(1298);
X(1299);
X(1300);
X(1301);
X(1302);
X(1303);
X(1304);
X(1305);
X(1306);
X(1307);
X(1308);
X(1309);
X(1310);
X(1311);
X(1312);
X(1313);
X(1314);
X(1315);
X(1316);
X(1317);
X(1318);
X(1319);
X(1320);
X(1321);
X(1322);
X(1323);
X(1324);
X(1325);
X(1326);
X(1327);
X(1328);
X(1329);
X(1330);
X(1331);
X(1332);
X(1333);
X(1334);
X(1335);
X(1336);
X(1337);
X(1338);
X(1339);
X(1340);
X(1341);
X(1342);
X(1343);
X(1344);
X(1345);
X(1346);
X(1347);
X(1348);
X(1349);
X(1350);
X(1351);
X(1352);
X(1353);
X(1354);
X(1355);
X(1356);
X(1357);
X(1358);
X(1359);
X(1360);
X(1361);
X(1362);
X(1363);
X(1364);
X(1365);
X(1366);
X(1367);
X(1368);
X(1369);
X(1370);
X(1371);
X(1372);
X(1373);
X(1374);
X(1375);
X(1376);
X(1377);
X(1378);
X(1379);
X(1380);
X(1381);
X(1382);
X(1383);
X(1384);
X(1385);
X(1386);
X(1387);
X(1388);
X(1389);
X(1390);
X(1391);
X(1392);
X(1393);
X(1394);
X(1395);
X(1396);
X(1397);
X(1398);
X(1399);
X(1400);
X(1401);
X(1402);
X(1403);
X(1404);
X(1405);
X(1406);
X(1407);
X(1408);
X(1409);
X(1410);
X(1411);
X(1412);
X(1413);
X(1414);
X(1415);
X(1416);
X(1417);
X(1418);
X(1419);
X(1420);
X(1421);
X(1422);
X(1423);
X(1424);
X(1425);
X(1426);
X(1427);
X(1428);
X(1429);
X(1430);
X(1431);
X(1432);
X(1433);
X(1434);
X(1435);
X(1436);
X(1437);
X(1438);
X(1439);
X(1440);
X(1441);
X(1442);
X(1443);
X(1444);
X(1445);
X(1446);
X(1447);
X(1448);
X(1449);
X(1450);
X(1451);
X(1452);
X(1453);
X(1454);
X(1455);
X(1456);
X(1457);
X(1458);
X(1459);
X(1460);
X(1461);
X(1462);
X(1463);
X(1464);
X(1465);
X(1466);
X(1467);
X(1468);
X(1469);
X(1470);
X(1471);
X(1472);
X(1473);
X(1474);
X(1475);
X(1476);
X(1477);
X(1478);
X(1479);
X(1480);
X(1481);
X(1482);
X(1483);
X(1484);
X(1485);
X(1486);
X(1487);
X(1488);
X(1489);
X(1490);
X(1491);
X(1492);
X(1493);
X(1494);
X(1495);
X(1496);
X(1497);
X(1498);
X(1499);
X(1500);
X(1501);
X(1502);
X(1503);
X(1504);
X(1505);
X(1506);
X(1507);
X(1508);
X(1509);
X(1510);
X(1511);
X(1512);
X(1513);
X(1514);
X(1515);
X(1516);
X(1517);
X(1518);
X(1519);
X(1520);
X(1521);
X(1522);
X(1523);
X(1524);
X(1525);
X(1526);
X(1527);
X(1528);
X(1529);
X(1530);
X(1531);
X(1532);
X(1533);
X(1534);
X(1535);
X(1536);
X(1537);
X(1538);
X(1539);
X(1540);
X(1541);
X(1542);
X(1543);
X(1544);
X(1545);
X(1546);
X(1547);
X(1548);
X(1549);
X(1550);
X(1551);
X(1552);
X(1553);
X(1554);
X(1555);
X(1556);
X(1557);
X(1558);
X(1559);
X(1560);
X(1561);
X(1562);
X(1563);
X(1564);
X(1565);
X(1566);
X(1567);
X(1568);
X(1569);
X(1570);
X(1571);
X(1572);
X(1573);
X(1574);
X(1575);
X(1576);
X(1577);
X(1578);
X(1579);
X(1580);
X(1581);
X(1582);
X(1583);
X(1584);
X(1585);
X(1586);
X(1587);
X(1588);
X(1589);
X(1590);
X(1591);
X(1592);
X(1593);
X(1594);
X(1595);
X(1596);
X(1597);
X(1598);
X(1599);
X(1600);
X(1601);
X(1602);
X(1603);
X(1604);
X(1605);
X(1606);
X(1607);
X(1608);
X(1609);
X(1610);
X(1611);
X(1612);
X(1613);
X(1614);
X(1615);
X(1616);
X(1617);
X(1618);
X(1619);
X(1620);
X(1621);
X(1622);
X(1623);
X(1624);
X(1625);
X(1626);
X(1627);
X(1628);
X(1629);
X(1630);
X(1631);
X(1632);
X(1633);
X(1634);
X(1635);
X(1636);
X(1637);
X(1638);
X(1639);
X(1640);
X(1641);
X(1642);
X(1643);
X(1644);
X(1645);
X(1646);
X(1647);
X(1648);
X(1649);
X(1650);
X(1651);
X(1652);
X(1653);
X(1654);
X(1655);
X(1656);
X(1657);
X(1658);
X(1659);
X(1660);
X(1661);
X(1662);
X(1663);
X(1664);
X(1665);
X(1666);
X(1667);
X(1668);
X(1669);
X(1670);
X(1671);
X(1672);
X(1673);
X(1674);
X(1675);
X(1676);
X(1677);
X(1678);
X(1679);
X(1680);
X(1681);
X(1682);
X(1683);
X(1684);
X(1685);
X(1686);
X(1687);
X(1688);
X(1689);
X(1690);
X(1691);
X(1692);
X(1693);
X(1694);
X(1695);
X(1696);
X(1697);
X(1698);
X(1699);
X(1700);
X(1701);
X(1702);
X(1703);
X(1704);
X(1705);
X(1706);
X(1707);
X(1708);
X(1709);
X(1710);
X(1711);
X(1712);
X(1713);
X(1714);
X(1715);
X(1716);
X(1717);
X(1718);
X(1719);
X(1720);
X(1721);
X(1722);
X(1723);
X(1724);
X(1725);
X(1726);
X(1727);
X(1728);
X(1729);
X(1730);
X(1731);
X(1732);
X(1733);
X(1734);
X(1735);
X(1736);
X(1737);
X(1738);
X(1739);
X(1740);
X(1741);
X(1742);
X(1743);
X(1744);
X(1745);
X(1746);
X(1747);
X(1748);
X(1749);
X(1750);
X(1751);
X(1752);
X(1753);
X(1754);
X(1755);
X(1756);
X(1757);
X(1758);
X(1759);
X(1760);
X(1761);
X(1762);
X(1763);
X(1764);
X(1765);
X(1766);
X(1767);
X(1768);
X(1769);
X(1770);
X(1771);
X(1772);
X(1773);
X(1774);
X(1775);
X(1776);
X(1777);
X(1778);
X(1779);
X(1780);
X(1781);
X(1782);
X(1783);
X(1784);
X(1785);
X(1786);
X(1787);
X(1788);
X(1789);
X(1790);
X(1791);
X(1792);
X(1793);
X(1794);
X(1795);
X(1796);
X(1797);
X(1798);
X(1799);
X(1800);
X(1801);
X(1802);
X(1803);
X(1804);
X(1805);
X(1806);
X(1807);
X(1808);
X(1809);
X(1810);
X(1811);
X(1812);
X(1813);
X(1814);
X(1815);
X(1816);
X(1817);
X(1818);
X(1819);
X(1820);
X(1821);
X(1822);
X(1823);
X(1824);
X(1825);
X(1826);
X(1827);
X(1828);
X(1829);
X(1830);
X(1831);
X(1832);
X(1833);
X(1834);
X(1835);
X(1836);
X(1837);
X(1838);
X(1839);
X(1840);
X(1841);
X(1842);
X(1843);
X(1844);
X(1845);
X(1846);
X(1847);
X(1848);
X(1849);
X(1850);
X(1851);
X(1852);
X(1853);
X(1854);
X(1855);
X(1856);
X(1857);
X(1858);
X(1859);
X(1860);
X(1861);
X(1862);
X(1863);
X(1864);
X(1865);
X(1866);
X(1867);
X(1868);
X(1869);
X(1870);
X(1871);
X(1872);
X(1873);
X(1874);
X(1875);
X(1876);
X(1877);
X(1878);
X(1879);
X(1880);
X(1881);
X(1882);
X(1883);
X(1884);
X(1885);
X(1886);
X(1887);
X(1888);
X(1889);
X(1890);
X(1891);
X(1892);
X(1893);
X(1894);
X(1895);
X(1896);
X(1897);
X(1898);
X(1899);
X(1900);
X(1901);
X(1902);
X(1903);
X(1904);
X(1905);
X(1906);
X(1907);
X(1908);
X(1909);
X(1910);
X(1911);
X(1912);
X(1913);
X(1914);
X(1915);
X(1916);
X(1917);
X(1918);
X(1919);
X(1920);
X(1921);
X(1922);
X(1923);
X(1924);
X(1925);
X(1926);
X(1927);
X(1928);
X(1929);
X(1930);
X(1931);
X(1932);
X(1933);
X(1934);
X(1935);
X(1936);
X(1937);
X(1938);
X(1939);
X(1940);
X(1941);
X(1942);
X(1943);
X(1944);
X(1945);
X(1946);
X(1947);
X(1948);
X(1949);
X(1950);
X(1951);
X(1952);
X(1953);
X(1954);
X(1955);
X(1956);
X(1957);
X(1958);
X(1959);
X(1960);
X(1961);
X(1962);
X(1963);
X(1964);
X(1965);
X(1966);
X(1967);
X(1968);
X(1969);
X(1970);
X(1971);
X(1972);
X(1973);
X(1974);
X(1975);
X(1976);
X(1977);
X(1978);
X(1979);
X(1980);
X(1981);
X(1982);
X(1983);
X(1984);
X(1985);
X(1986);
X(1987);
X(1988);
X(1989);
X(1990);
X(1991);
X(1992);
X(1993);
X(1994);
X(1995);
X(1996);
X(1997);
X(1998);
X(1999);
X(2000);
X(2001);
X(2002);
X(2003);
X(2004);
X(2005);
X(2006);
X(2007);
X(2008);
X(2009);
X(2010);
X(2011);
X(2012);
X(2013);
X(2014);
X(2015);
X(2016);
X(2017);
X(2018);
X(2019);
X(2020);
X(2021);
X(2022);
X(2023);
X(2024);
X(2025);
X(2026);
X(2027);
X(2028);
X(2029);
X(2030);
X(2031);
X(2032);
X(2033);
X(2034);
X(2035);
X(2036);
X(2037);
X(2038);
X(2039);
X(2040);
X(2041);
X(2042);
X(2043);
X(2044);
X(2045);
X(2046);
X(2047);
X(2048);
X(2049);
X(2050);
X(2051);
X(2052);
X(2053);
X(2054);
X(2055);
X(2056);
X(2057);
X(2058);
X(2059);
X(2060);
X(2061);
X(2062);
X(2063);
X(2064);
X(2065);
X(2066);
X(2067);
X(2068);
X(2069);
X(2070);
X(2071);
X(2072);
X(2073);
X(2074);
X(2075);
X(2076);
X(2077);
X(2078);
X(2079);
X(2080);
X(2081);
X(2082);
X(2083);
X(2084);
X(2085);
X(2086);
X(2087);
X(2088);
X(2089);
X(2090);
X(2091);
X(2092);
X(2093);
X(2094);
X(2095);
X(2096);
X(2097);
X(2098);
X(2099);
X(2100);
X(2101);
X(2102);
X(2103);
X(2104);
X(2105);
X(2106);
X(2107);
X(2108);
X(2109);
X(2110);
X(2111);
X(2112);
X(2113);
X(2114);
X(2115);
X(2116);
X(2117);
X(2118);
X(2119);
X(2120);
X(2121);
X(2122);
X(2123);
X(2124);
X(2125);
X(2126);
X(2127);
X(2128);
X(2129);
X(2130);
X(2131);
X(2132);
X(2133);
X(2134);
X(2135);
X(2136);
X(2137);
X(2138);
X(2139);
X(2140);
X(2141);
X(2142);
X(2143);
X(2144);
X(2145);
X(2146);
X(2147);
X(2148);
X(2149);
X(2150);
X(2151);
X(2152);
X(2153);
X(2154);
X(2155);
X(2156);
X(2157);
X(2158);
X(2159);
X(2160);
X(2161);
X(2162);
X(2163);
X(2164);
X(2165);
X(2166);
X(2167);
X(2168);
X(2169);
X(2170);
X(2171);
X(2172);
X(2173);
X(2174);
X(2175);
X(2176);
X(2177);
X(2178);
X(2179);
X(2180);
X(2181);
X(2182);
X(2183);
X(2184);
X(2185);
X(2186);
X(2187);
X(2188);
X(2189);
X(2190);
X(2191);
X(2192);
X(2193);
X(2194);
X(2195);
X(2196);
X(2197);
X(2198);
X(2199);
X(2200);
X(2201);
X(2202);
X(2203);
X(2204);
X(2205);
X(2206);
X(2207);
X(2208);
X(2209);
X(2210);
X(2211);
X(2212);
X(2213);
X(2214);
X(2215);
X(2216);
X(2217);
X(2218);
X(2219);
X(2220);
X(2221);
X(2222);
X(2223);
X(2224);
X(2225);
X(2226);
X(2227);
X(2228);
X(2229);
X(2230);
X(2231);
X(2232);
X(2233);
X(2234);
X(2235);
X(2236);
X(2237);
X(2238);
X(2239);
X(2240);
X(2241);
X(2242);
X(2243);
X(2244);
X(2245);
X(2246);
X(2247);
X(2248);
X(2249);
X(2250);
X(2251);
X(2252);
X(2253);
X(2254);
X(2255);
X(2256);
X(2257);
X(2258);
X(2259);
X(2260);
X(2261);
X(2262);
X(2263);
X(2264);
X(2265);
X(2266);
X(2267);
X(2268);
X(2269);
X(2270);
X(2271);
X(2272);
X(2273);
X(2274);
X(2275);
X(2276);
X(2277);
X(2278);
X(2279);
X(2280);
X(2281);
X(2282);
X(2283);
X(2284);
X(2285);
X(2286);
X(2287);
X(2288);
X(2289);
X(2290);
X(2291);
X(2292);
X(2293);
X(2294);
X(2295);
X(2296);
X(2297);
X(2298);
X(2299);
X(2300);
X(2301);
X(2302);
X(2303);
X(2304);
X(2305);
X(2306);
X(2307);
X(2308);
X(2309);
X(2310);
X(2311);
X(2312);
X(2313);
X(2314);
X(2315);
X(2316);
X(2317);
X(2318);
X(2319);
X(2320);
X(2321);
X(2322);
X(2323);
X(2324);
X(2325);
X(2326);
X(2327);
X(2328);
X(2329);
X(2330);
X(2331);
X(2332);
X(2333);
X(2334);
X(2335);
X(2336);
X(2337);
X(2338);
X(2339);
X(2340);
X(2341);
X(2342);
X(2343);
X(2344);
X(2345);
X(2346);
X(2347);
X(2348);
X(2349);
X(2350);
X(2351);
X(2352);
X(2353);
X(2354);
X(2355);
X(2356);
X(2357);
X(2358);
X(2359);
X(2360);
X(2361);
X(2362);
X(2363);
X(2364);
X(2365);
X(2366);
X(2367);
X(2368);
X(2369);
X(2370);
X(2371);
X(2372);
X(2373);
X(2374);
X(2375);
X(2376);
X(2377);
X(2378);
X(2379);
X(2380);
X(2381);
X(2382);
X(2383);
X(2384);
X(2385);
X(2386);
X(2387);
X(2388);
X(2389);
X(2390);
X(2391);
X(2392);
X(2393);
X(2394);
X(2395);
X(2396);
X(2397);
X(2398);
X(2399);
X(2400);
X(2401);
X(2402);
X(2403);
X(2404);
X(2405);
X(2406);
X(2407);
X(2408);
X(2409);
X(2410);
X(2411);
X(2412);
X(2413);
X(2414);
X(2415);
X(2416);
X(2417);
X(2418);
X(2419);
X(2420);
X(2421);
X(2422);
X(2423);
X(2424);
X(2425);
X(2426);
X(2427);
X(2428);
X(2429);
X(2430);
X(2431);
X(2432);
X(2433);
X(2434);
X(2435);
X(2436);
X(2437);
X(2438);
X(2439);
X(2440);
X(2441);
X(2442);
X(2443);
X(2444);
X(2445);
X(2446);
X(2447);
X(2448);
X(2449);
X(2450);
X(2451);
X(2452);
X(2453);
X(2454);
X(2455);
X(2456);
X(2457);
X(2458);
X(2459);
X(2460);
X(2461);
X(2462);
X(2463);
X(2464);
X(2465);
X(2466);
X(2467);
X(2468);
X(2469);
X(2470);
X(2471);
X(2472);
X(2473);
X(2474);
X(2475);
X(2476);
X(2477);
X(2478);
X(2479);
X(2480);
X(2481);
X(2482);
X(2483);
X(2484);
X(2485);
X(2486);
X(2487);
X(2488);
X(2489);
X(2490);
X(2491);
X(2492);
X(2493);
X(2494);
X(2495);
X(2496);
X(2497);
X(2498);
X(2499);
X(2500);
X(2501);
X(2502);
X(2503);
X(2504);
X(2505);
X(2506);
X(2507);
X(2508);
X(2509);
X(2510);
X(2511);
X(2512);
X(2513);
X(2514);
X(2515);
X(2516);
X(2517);
X(2518);
X(2519);
X(2520);
X(2521);
X(2522);
X(2523);
X(2524);
X(2525);
X(2526);
X(2527);
X(2528);
X(2529);
X(2530);
X(2531);
X(2532);
X(2533);
X(2534);
X(2535);
X(2536);
X(2537);
X(2538);
X(2539);
X(2540);
X(2541);
X(2542);
X(2543);
X(2544);
X(2545);
X(2546);
X(2547);
X(2548);
X(2549);
X(2550);
X(2551);
X(2552);
X(2553);
X(2554);
X(2555);
X(2556);
X(2557);
X(2558);
X(2559);
X(2560);
X(2561);
X(2562);
X(2563);
X(2564);
X(2565);
X(2566);
X(2567);
X(2568);
X(2569);
X(2570);
X(2571);
X(2572);
X(2573);
X(2574);
X(2575);
X(2576);
X(2577);
X(2578);
X(2579);
X(2580);
X(2581);
X(2582);
X(2583);
X(2584);
X(2585);
X(2586);
X(2587);
X(2588);
X(2589);
X(2590);
X(2591);
X(2592);
X(2593);
X(2594);
X(2595);
X(2596);
X(2597);
X(2598);
X(2599);
X(2600);
X(2601);
X(2602);
X(2603);
X(2604);
X(2605);
X(2606);
X(2607);
X(2608);
X(2609);
X(2610);
X(2611);
X(2612);
X(2613);
X(2614);
X(2615);
X(2616);
X(2617);
X(2618);
X(2619);
X(2620);
X(2621);
X(2622);
X(2623);
X(2624);
X(2625);
X(2626);
X(2627);
X(2628);
X(2629);
X(2630);
X(2631);
X(2632);
X(2633);
X(2634);
X(2635);
X(2636);
X(2637);
X(2638);
X(2639);
X(2640);
X(2641);
X(2642);
X(2643);
X(2644);
X(2645);
X(2646);
X(2647);
X(2648);
X(2649);
X(2650);
X(2651);
X(2652);
X(2653);
X(2654);
X(2655);
X(2656);
X(2657);
X(2658);
X(2659);
X(2660);
X(2661);
X(2662);
X(2663);
X(2664);
X(2665);
X(2666);
X(2667);
X(2668);
X(2669);
X(2670);
X(2671);
X(2672);
X(2673);
X(2674);
X(2675);
X(2676);
X(2677);
X(2678);
X(2679);
X(2680);
X(2681);
X(2682);
X(2683);
X(2684);
X(2685);
X(2686);
X(2687);
X(2688);
X(2689);
X(2690);
X(2691);
X(2692);
X(2693);
X(2694);
X(2695);
X(2696);
X(2697);
X(2698);
X(2699);
X(2700);
X(2701);
X(2702);
X(2703);
X(2704);
X(2705);
X(2706);
X(2707);
X(2708);
X(2709);
X(2710);
X(2711);
X(2712);
X(2713);
X(2714);
X(2715);
X(2716);
X(2717);
X(2718);
X(2719);
X(2720);
X(2721);
X(2722);
X(2723);
X(2724);
X(2725);
X(2726);
X(2727);
X(2728);
X(2729);
X(2730);
X(2731);
X(2732);
X(2733);
X(2734);
X(2735);
X(2736);
X(2737);
X(2738);
X(2739);
X(2740);
X(2741);
X(2742);
X(2743);
X(2744);
X(2745);
X(2746);
X(2747);
X(2748);
X(2749);
X(2750);
X(2751);
X(2752);
X(2753);
X(2754);
X(2755);
X(2756);
X(2757);
X(2758);
X(2759);
X(2760);
X(2761);
X(2762);
X(2763);
X(2764);
X(2765);
X(2766);
X(2767);
X(2768);
X(2769);
X(2770);
X(2771);
X(2772);
X(2773);
X(2774);
X(2775);
X(2776);
X(2777);
X(2778);
X(2779);
X(2780);
X(2781);
X(2782);
X(2783);
X(2784);
X(2785);
X(2786);
X(2787);
X(2788);
X(2789);
X(2790);
X(2791);
X(2792);
X(2793);
X(2794);
X(2795);
X(2796);
X(2797);
X(2798);
X(2799);
X(2800);
X(2801);
X(2802);
X(2803);
X(2804);
X(2805);
X(2806);
X(2807);
X(2808);
X(2809);
X(2810);
X(2811);
X(2812);
X(2813);
X(2814);
X(2815);
X(2816);
X(2817);
X(2818);
X(2819);
X(2820);
X(2821);
X(2822);
X(2823);
X(2824);
X(2825);
X(2826);
X(2827);
X(2828);
X(2829);
X(2830);
X(2831);
X(2832);
X(2833);
X(2834);
X(2835);
X(2836);
X(2837);
X(2838);
X(2839);
X(2840);
X(2841);
X(2842);
X(2843);
X(2844);
X(2845);
X(2846);
X(2847);
X(2848);
X(2849);
X(2850);
X(2851);
X(2852);
X(2853);
X(2854);
X(2855);
X(2856);
X(2857);
X(2858);
X(2859);
X(2860);
X(2861);
X(2862);
X(2863);
X(2864);
X(2865);
X(2866);
X(2867);
X(2868);
X(2869);
X(2870);
X(2871);
X(2872);
X(2873);
X(2874);
X(2875);
X(2876);
X(2877);
X(2878);
X(2879);
X(2880);
X(2881);
X(2882);
X(2883);
X(2884);
X(2885);
X(2886);
X(2887);
X(2888);
X(2889);
X(2890);
X(2891);
X(2892);
X(2893);
X(2894);
X(2895);
X(2896);
X(2897);
X(2898);
X(2899);
X(2900);
X(2901);
X(2902);
X(2903);
X(2904);
X(2905);
X(2906);
X(2907);
X(2908);
X(2909);
X(2910);
X(2911);
X(2912);
X(2913);
X(2914);
X(2915);
X(2916);
X(2917);
X(2918);
X(2919);
X(2920);
X(2921);
X(2922);
X(2923);
X(2924);
X(2925);
X(2926);
X(2927);
X(2928);
X(2929);
X(2930);
X(2931);
X(2932);
X(2933);
X(2934);
X(2935);
X(2936);
X(2937);
X(2938);
X(2939);
X(2940);
X(2941);
X(2942);
X(2943);
X(2944);
X(2945);
X(2946);
X(2947);
X(2948);
X(2949);
X(2950);
X(2951);
X(2952);
X(2953);
X(2954);
X(2955);
X(2956);
X(2957);
X(2958);
X(2959);
X(2960);
X(2961);
X(2962);
X(2963);
X(2964);
X(2965);
X(2966);
X(2967);
X(2968);
X(2969);
X(2970);
X(2971);
X(2972);
X(2973);
X(2974);
X(2975);
X(2976);
X(2977);
X(2978);
X(2979);
X(2980);
X(2981);
X(2982);
X(2983);
X(2984);
X(2985);
X(2986);
X(2987);
X(2988);
X(2989);
X(2990);
X(2991);
X(2992);
X(2993);
X(2994);
X(2995);
X(2996);
X(2997);
X(2998);
X(2999);
X(3000);
X(3001);
X(3002);
X(3003);
X(3004);
X(3005);
X(3006);
X(3007);
X(3008);
X(3009);
X(3010);
X(3011);
X(3012);
X(3013);
X(3014);
X(3015);
X(3016);
X(3017);
X(3018);
X(3019);
X(3020);
X(3021);
X(3022);
X(3023);
X(3024);
X(3025);
X(3026);
X(3027);
X(3028);
X(3029);
X(3030);
X(3031);
X(3032);
X(3033);
X(3034);
X(3035);
X(3036);
X(3037);
X(3038);
X(3039);
X(3040);
X(3041);
X(3042);
X(3043);
X(3044);
X(3045);
X(3046);
X(3047);
X(3048);
X(3049);
X(3050);
X(3051);
X(3052);
X(3053);
X(3054);
X(3055);
X(3056);
X(3057);
X(3058);
X(3059);
X(3060);
X(3061);
X(3062);
X(3063);
X(3064);
X(3065);
X(3066);
X(3067);
X(3068);
X(3069);
X(3070);
X(3071);
X(3072);
X(3073);
X(3074);
X(3075);
X(3076);
X(3077);
X(3078);
X(3079);
X(3080);
X(3081);
X(3082);
X(3083);
X(3084);
X(3085);
X(3086);
X(3087);
X(3088);
X(3089);
X(3090);
X(3091);
X(3092);
X(3093);
X(3094);
X(3095);
X(3096);
X(3097);
X(3098);
X(3099);
X(3100);
X(3101);
X(3102);
X(3103);
X(3104);
X(3105);
X(3106);
X(3107);
X(3108);
X(3109);
X(3110);
X(3111);
X(3112);
X(3113);
X(3114);
X(3115);
X(3116);
X(3117);
X(3118);
X(3119);
X(3120);
X(3121);
X(3122);
X(3123);
X(3124);
X(3125);
X(3126);
X(3127);
X(3128);
X(3129);
X(3130);
X(3131);
X(3132);
X(3133);
X(3134);
X(3135);
X(3136);
X(3137);
X(3138);
X(3139);
X(3140);
X(3141);
X(3142);
X(3143);
X(3144);
X(3145);
X(3146);
X(3147);
X(3148);
X(3149);
X(3150);
X(3151);
X(3152);
X(3153);
X(3154);
X(3155);
X(3156);
X(3157);
X(3158);
X(3159);
X(3160);
X(3161);
X(3162);
X(3163);
X(3164);
X(3165);
X(3166);
X(3167);
X(3168);
X(3169);
X(3170);
X(3171);
X(3172);
X(3173);
X(3174);
X(3175);
X(3176);
X(3177);
X(3178);
X(3179);
X(3180);
X(3181);
X(3182);
X(3183);
X(3184);
X(3185);
X(3186);
X(3187);
X(3188);
X(3189);
X(3190);
X(3191);
X(3192);
X(3193);
X(3194);
X(3195);
X(3196);
X(3197);
X(3198);
X(3199);
X(3200);
X(3201);
X(3202);
X(3203);
X(3204);
X(3205);
X(3206);
X(3207);
X(3208);
X(3209);
X(3210);
X(3211);
X(3212);
X(3213);
X(3214);
X(3215);
X(3216);
X(3217);
X(3218);
X(3219);
X(3220);
X(3221);
X(3222);
X(3223);
X(3224);
X(3225);
X(3226);
X(3227);
X(3228);
X(3229);
X(3230);
X(3231);
X(3232);
X(3233);
X(3234);
X(3235);
X(3236);
X(3237);
X(3238);
X(3239);
X(3240);
X(3241);
X(3242);
X(3243);
X(3244);
X(3245);
X(3246);
X(3247);
X(3248);
X(3249);
X(3250);
X(3251);
X(3252);
X(3253);
X(3254);
X(3255);
X(3256);
X(3257);
X(3258);
X(3259);
X(3260);
X(3261);
X(3262);
X(3263);
X(3264);
X(3265);
X(3266);
X(3267);
X(3268);
X(3269);
X(3270);
X(3271);
X(3272);
X(3273);
X(3274);
X(3275);
X(3276);
X(3277);
X(3278);
X(3279);
X(3280);
X(3281);
X(3282);
X(3283);
X(3284);
X(3285);
X(3286);
X(3287);
X(3288);
X(3289);
X(3290);
X(3291);
X(3292);
X(3293);
X(3294);
X(3295);
X(3296);
X(3297);
X(3298);
X(3299);
X(3300);
X(3301);
X(3302);
X(3303);
X(3304);
X(3305);
X(3306);
X(3307);
X(3308);
X(3309);
X(3310);
X(3311);
X(3312);
X(3313);
X(3314);
X(3315);
X(3316);
X(3317);
X(3318);
X(3319);
X(3320);
X(3321);
X(3322);
X(3323);
X(3324);
X(3325);
X(3326);
X(3327);
X(3328);
X(3329);
X(3330);
X(3331);
X(3332);
X(3333);
X(3334);
X(3335);
X(3336);
X(3337);
X(3338);
X(3339);
X(3340);
X(3341);
X(3342);
X(3343);
X(3344);
X(3345);
X(3346);
X(3347);
X(3348);
X(3349);
X(3350);
X(3351);
X(3352);
X(3353);
X(3354);
X(3355);
X(3356);
X(3357);
X(3358);
X(3359);
X(3360);
X(3361);
X(3362);
X(3363);
X(3364);
X(3365);
X(3366);
X(3367);
X(3368);
X(3369);
X(3370);
X(3371);
X(3372);
X(3373);
X(3374);
X(3375);
X(3376);
X(3377);
X(3378);
X(3379);
X(3380);
X(3381);
X(3382);
X(3383);
X(3384);
X(3385);
X(3386);
X(3387);
X(3388);
X(3389);
X(3390);
X(3391);
X(3392);
X(3393);
X(3394);
X(3395);
X(3396);
X(3397);
X(3398);
X(3399);
X(3400);
X(3401);
X(3402);
X(3403);
X(3404);
X(3405);
X(3406);
X(3407);
X(3408);
X(3409);
X(3410);
X(3411);
X(3412);
X(3413);
X(3414);
X(3415);
X(3416);
X(3417);
X(3418);
X(3419);
X(3420);
X(3421);
X(3422);
X(3423);
X(3424);
X(3425);
X(3426);
X(3427);
X(3428);
X(3429);
X(3430);
X(3431);
X(3432);
X(3433);
X(3434);
X(3435);
X(3436);
X(3437);
X(3438);
X(3439);
X(3440);
X(3441);
X(3442);
X(3443);
X(3444);
X(3445);
X(3446);
X(3447);
X(3448);
X(3449);
X(3450);
X(3451);
X(3452);
X(3453);
X(3454);
X(3455);
X(3456);
X(3457);
X(3458);
X(3459);
X(3460);
X(3461);
X(3462);
X(3463);
X(3464);
X(3465);
X(3466);
X(3467);
X(3468);
X(3469);
X(3470);
X(3471);
X(3472);
X(3473);
X(3474);
X(3475);
X(3476);
X(3477);
X(3478);
X(3479);
X(3480);
X(3481);
X(3482);
X(3483);
X(3484);
X(3485);
X(3486);
X(3487);
X(3488);
X(3489);
X(3490);
X(3491);
X(3492);
X(3493);
X(3494);
X(3495);
X(3496);
X(3497);
X(3498);
X(3499);
X(3500);
X(3501);
X(3502);
X(3503);
X(3504);
X(3505);
X(3506);
X(3507);
X(3508);
X(3509);
X(3510);
X(3511);
X(3512);
X(3513);
X(3514);
X(3515);
X(3516);
X(3517);
X(3518);
X(3519);
X(3520);
X(3521);
X(3522);
X(3523);
X(3524);
X(3525);
X(3526);
X(3527);
X(3528);
X(3529);
X(3530);
X(3531);
X(3532);
X(3533);
X(3534);
X(3535);
X(3536);
X(3537);
X(3538);
X(3539);
X(3540);
X(3541);
X(3542);
X(3543);
X(3544);
X(3545);
X(3546);
X(3547);
X(3548);
X(3549);
X(3550);
X(3551);
X(3552);
X(3553);
X(3554);
X(3555);
X(3556);
X(3557);
X(3558);
X(3559);
X(3560);
X(3561);
X(3562);
X(3563);
X(3564);
X(3565);
X(3566);
X(3567);
X(3568);
X(3569);
X(3570);
X(3571);
X(3572);
X(3573);
X(3574);
X(3575);
X(3576);
X(3577);
X(3578);
X(3579);
X(3580);
X(3581);
X(3582);
X(3583);
X(3584);
X(3585);
X(3586);
X(3587);
X(3588);
X(3589);
X(3590);
X(3591);
X(3592);
X(3593);
X(3594);
X(3595);
X(3596);
X(3597);
X(3598);
X(3599);
X(3600);
X(3601);
X(3602);
X(3603);
X(3604);
X(3605);
X(3606);
X(3607);
X(3608);
X(3609);
X(3610);
X(3611);
X(3612);
X(3613);
X(3614);
X(3615);
X(3616);
X(3617);
X(3618);
X(3619);
X(3620);
X(3621);
X(3622);
X(3623);
X(3624);
X(3625);
X(3626);
X(3627);
X(3628);
X(3629);
X(3630);
X(3631);
X(3632);
X(3633);
X(3634);
X(3635);
X(3636);
X(3637);
X(3638);
X(3639);
X(3640);
X(3641);
X(3642);
X(3643);
X(3644);
X(3645);
X(3646);
X(3647);
X(3648);
X(3649);
X(3650);
X(3651);
X(3652);
X(3653);
X(3654);
X(3655);
X(3656);
X(3657);
X(3658);
X(3659);
X(3660);
X(3661);
X(3662);
X(3663);
X(3664);
X(3665);
X(3666);
X(3667);
X(3668);
X(3669);
X(3670);
X(3671);
X(3672);
X(3673);
X(3674);
X(3675);
X(3676);
X(3677);
X(3678);
X(3679);
X(3680);
X(3681);
X(3682);
X(3683);
X(3684);
X(3685);
X(3686);
X(3687);
X(3688);
X(3689);
X(3690);
X(3691);
X(3692);
X(3693);
X(3694);
X(3695);
X(3696);
X(3697);
X(3698);
X(3699);
X(3700);
X(3701);
X(3702);
X(3703);
X(3704);
X(3705);
X(3706);
X(3707);
X(3708);
X(3709);
X(3710);
X(3711);
X(3712);
X(3713);
X(3714);
X(3715);
X(3716);
X(3717);
X(3718);
X(3719);
X(3720);
X(3721);
X(3722);
X(3723);
X(3724);
X(3725);
X(3726);
X(3727);
X(3728);
X(3729);
X(3730);
X(3731);
X(3732);
X(3733);
X(3734);
X(3735);
X(3736);
X(3737);
X(3738);
X(3739);
X(3740);
X(3741);
X(3742);
X(3743);
X(3744);
X(3745);
X(3746);
X(3747);
X(3748);
X(3749);
X(3750);
X(3751);
X(3752);
X(3753);
X(3754);
X(3755);
X(3756);
X(3757);
X(3758);
X(3759);
X(3760);
X(3761);
X(3762);
X(3763);
X(3764);
X(3765);
X(3766);
X(3767);
X(3768);
X(3769);
X(3770);
X(3771);
X(3772);
X(3773);
X(3774);
X(3775);
X(3776);
X(3777);
X(3778);
X(3779);
X(3780);
X(3781);
X(3782);
X(3783);
X(3784);
X(3785);
X(3786);
X(3787);
X(3788);
X(3789);
X(3790);
X(3791);
X(3792);
X(3793);
X(3794);
X(3795);
X(3796);
X(3797);
X(3798);
X(3799);
X(3800);
X(3801);
X(3802);
X(3803);
X(3804);
X(3805);
X(3806);
X(3807);
X(3808);
X(3809);
X(3810);
X(3811);
X(3812);
X(3813);
X(3814);
X(3815);
X(3816);
X(3817);
X(3818);
X(3819);
X(3820);
X(3821);
X(3822);
X(3823);
X(3824);
X(3825);
X(3826);
X(3827);
X(3828);
X(3829);
X(3830);
X(3831);
X(3832);
X(3833);
X(3834);
X(3835);
X(3836);
X(3837);
X(3838);
X(3839);
X(3840);
X(3841);
X(3842);
X(3843);
X(3844);
X(3845);
X(3846);
X(3847);
X(3848);
X(3849);
X(3850);
X(3851);
X(3852);
X(3853);
X(3854);
X(3855);
X(3856);
X(3857);
X(3858);
X(3859);
X(3860);
X(3861);
X(3862);
X(3863);
X(3864);
X(3865);
X(3866);
X(3867);
X(3868);
X(3869);
X(3870);
X(3871);
X(3872);
X(3873);
X(3874);
X(3875);
X(3876);
X(3877);
X(3878);
X(3879);
X(3880);
X(3881);
X(3882);
X(3883);
X(3884);
X(3885);
X(3886);
X(3887);
X(3888);
X(3889);
X(3890);
X(3891);
X(3892);
X(3893);
X(3894);
X(3895);
X(3896);
X(3897);
X(3898);
X(3899);
X(3900);
X(3901);
X(3902);
X(3903);
X(3904);
X(3905);
X(3906);
X(3907);
X(3908);
X(3909);
X(3910);
X(3911);
X(3912);
X(3913);
X(3914);
X(3915);
X(3916);
X(3917);
X(3918);
X(3919);
X(3920);
X(3921);
X(3922);
X(3923);
X(3924);
X(3925);
X(3926);
X(3927);
X(3928);
X(3929);
X(3930);
X(3931);
X(3932);
X(3933);
X(3934);
X(3935);
X(3936);
X(3937);
X(3938);
X(3939);
X(3940);
X(3941);
X(3942);
X(3943);
X(3944);
X(3945);
X(3946);
X(3947);
X(3948);
X(3949);
X(3950);
X(3951);
X(3952);
X(3953);
X(3954);
X(3955);
X(3956);
X(3957);
X(3958);
X(3959);
X(3960);
X(3961);
X(3962);
X(3963);
X(3964);
X(3965);
X(3966);
X(3967);
X(3968);
X(3969);
X(3970);
X(3971);
X(3972);
X(3973);
X(3974);
X(3975);
X(3976);
X(3977);
X(3978);
X(3979);
X(3980);
X(3981);
X(3982);
X(3983);
X(3984);
X(3985);
X(3986);
X(3987);
X(3988);
X(3989);
X(3990);
X(3991);
X(3992);
X(3993);
X(3994);
X(3995);
X(3996);
X(3997);
X(3998);
X(3999);
X(4000);
X(4001);
X(4002);
X(4003);
X(4004);
X(4005);
X(4006);
X(4007);
X(4008);
X(4009);
X(4010);
X(4011);
X(4012);
X(4013);
X(4014);
X(4015);
X(4016);
X(4017);
X(4018);
X(4019);
X(4020);
X(4021);
X(4022);
X(4023);
X(4024);
X(4025);
X(4026);
X(4027);
X(4028);
X(4029);
X(4030);
X(4031);
X(4032);
X(4033);
X(4034);
X(4035);
X(4036);
X(4037);
X(4038);
X(4039);
X(4040);
X(4041);
X(4042);
X(4043);
X(4044);
X(4045);
X(4046);
X(4047);
X(4048);
X(4049);
X(4050);
X(4051);
X(4052);
X(4053);
X(4054);
X(4055);
X(4056);
X(4057);
X(4058);
X(4059);
X(4060);
X(4061);
X(4062);
X(4063);
X(4064);
X(4065);
X(4066);
X(4067);
X(4068);
X(4069);
X(4070);
X(4071);
X(4072);
X(4073);
X(4074);
X(4075);
X(4076);
X(4077);
X(4078);
X(4079);
X(4080);
X(4081);
X(4082);
X(4083);
X(4084);
X(4085);
X(4086);
X(4087);
X(4088);
X(4089);
X(4090);
X(4091);
X(4092);
X(4093);
X(4094);
X(4095);
X(4096);
X(4097);
X(4098);
X(4099);
X(4100);
X(4101);
X(4102);
X(4103);
X(4104);
X(4105);
X(4106);
X(4107);
X(4108);
X(4109);
X(4110);
X(4111);
X(4112);
X(4113);
X(4114);
X(4115);
X(4116);
X(4117);
X(4118);
X(4119);
X(4120);
X(4121);
X(4122);
X(4123);
X(4124);
X(4125);
X(4126);
X(4127);
X(4128);
X(4129);
X(4130);
X(4131);
X(4132);
X(4133);
X(4134);
X(4135);
X(4136);
X(4137);
X(4138);
X(4139);
X(4140);
X(4141);
X(4142);
X(4143);
X(4144);
X(4145);
X(4146);
X(4147);
X(4148);
X(4149);
X(4150);
X(4151);
X(4152);
X(4153);
X(4154);
X(4155);
X(4156);
X(4157);
X(4158);
X(4159);
X(4160);
X(4161);
X(4162);
X(4163);
X(4164);
X(4165);
X(4166);
X(4167);
X(4168);
X(4169);
X(4170);
X(4171);
X(4172);
X(4173);
X(4174);
X(4175);
X(4176);
X(4177);
X(4178);
X(4179);
X(4180);
X(4181);
X(4182);
X(4183);
X(4184);
X(4185);
X(4186);
X(4187);
X(4188);
X(4189);
X(4190);
X(4191);
X(4192);
X(4193);
X(4194);
X(4195);
X(4196);
X(4197);
X(4198);
X(4199);
X(4200);
X(4201);
X(4202);
X(4203);
X(4204);
X(4205);
X(4206);
X(4207);
X(4208);
X(4209);
X(4210);
X(4211);
X(4212);
X(4213);
X(4214);
X(4215);
X(4216);
X(4217);
X(4218);
X(4219);
X(4220);
X(4221);
X(4222);
X(4223);
X(4224);
X(4225);
X(4226);
X(4227);
X(4228);
X(4229);
X(4230);
X(4231);
X(4232);
X(4233);
X(4234);
X(4235);
X(4236);
X(4237);
X(4238);
X(4239);
X(4240);
X(4241);
X(4242);
X(4243);
X(4244);
X(4245);
X(4246);
X(4247);
X(4248);
X(4249);
X(4250);
X(4251);
X(4252);
X(4253);
X(4254);
X(4255);
X(4256);
X(4257);
X(4258);
X(4259);
X(4260);
X(4261);
X(4262);
X(4263);
X(4264);
X(4265);
X(4266);
X(4267);
X(4268);
X(4269);
X(4270);
X(4271);
X(4272);
X(4273);
X(4274);
X(4275);
X(4276);
X(4277);
X(4278);
X(4279);
X(4280);
X(4281);
X(4282);
X(4283);
X(4284);
X(4285);
X(4286);
X(4287);
X(4288);
X(4289);
X(4290);
X(4291);
X(4292);
X(4293);
X(4294);
X(4295);
X(4296);
X(4297);
X(4298);
X(4299);
X(4300);
X(4301);
X(4302);
X(4303);
X(4304);
X(4305);
X(4306);
X(4307);
X(4308);
X(4309);
X(4310);
X(4311);
X(4312);
X(4313);
X(4314);
X(4315);
X(4316);
X(4317);
X(4318);
X(4319);
X(4320);
X(4321);
X(4322);
X(4323);
X(4324);
X(4325);
X(4326);
X(4327);
X(4328);
X(4329);
X(4330);
X(4331);
X(4332);
X(4333);
X(4334);
X(4335);
X(4336);
X(4337);
X(4338);
X(4339);
X(4340);
X(4341);
X(4342);
X(4343);
X(4344);
X(4345);
X(4346);
X(4347);
X(4348);
X(4349);
X(4350);
X(4351);
X(4352);
X(4353);
X(4354);
X(4355);
X(4356);
X(4357);
X(4358);
X(4359);
X(4360);
X(4361);
X(4362);
X(4363);
X(4364);
X(4365);
X(4366);
X(4367);
X(4368);
X(4369);
X(4370);
X(4371);
X(4372);
X(4373);
X(4374);
X(4375);
X(4376);
X(4377);
X(4378);
X(4379);
X(4380);
X(4381);
X(4382);
X(4383);
X(4384);
X(4385);
X(4386);
X(4387);
X(4388);
X(4389);
X(4390);
X(4391);
X(4392);
X(4393);
X(4394);
X(4395);
X(4396);
X(4397);
X(4398);
X(4399);
X(4400);
X(4401);
X(4402);
X(4403);
X(4404);
X(4405);
X(4406);
X(4407);
X(4408);
X(4409);
X(4410);
X(4411);
X(4412);
X(4413);
X(4414);
X(4415);
X(4416);
X(4417);
X(4418);
X(4419);
X(4420);
X(4421);
X(4422);
X(4423);
X(4424);
X(4425);
X(4426);
X(4427);
X(4428);
X(4429);
X(4430);
X(4431);
X(4432);
X(4433);
X(4434);
X(4435);
X(4436);
X(4437);
X(4438);
X(4439);
X(4440);
X(4441);
X(4442);
X(4443);
X(4444);
X(4445);
X(4446);
X(4447);
X(4448);
X(4449);
X(4450);
X(4451);
X(4452);
X(4453);
X(4454);
X(4455);
X(4456);
X(4457);
X(4458);
X(4459);
X(4460);
X(4461);
X(4462);
X(4463);
X(4464);
X(4465);
X(4466);
X(4467);
X(4468);
X(4469);
X(4470);
X(4471);
X(4472);
X(4473);
X(4474);
X(4475);
X(4476);
X(4477);
X(4478);
X(4479);
X(4480);
X(4481);
X(4482);
X(4483);
X(4484);
X(4485);
X(4486);
X(4487);
X(4488);
X(4489);
X(4490);
X(4491);
X(4492);
X(4493);
X(4494);
X(4495);
X(4496);
X(4497);
X(4498);
X(4499);
X(4500);
X(4501);
X(4502);
X(4503);
X(4504);
X(4505);
X(4506);
X(4507);
X(4508);
X(4509);
X(4510);
X(4511);
X(4512);
X(4513);
X(4514);
X(4515);
X(4516);
X(4517);
X(4518);
X(4519);
X(4520);
X(4521);
X(4522);
X(4523);
X(4524);
X(4525);
X(4526);
X(4527);
X(4528);
X(4529);
X(4530);
X(4531);
X(4532);
X(4533);
X(4534);
X(4535);
X(4536);
X(4537);
X(4538);
X(4539);
X(4540);
X(4541);
X(4542);
X(4543);
X(4544);
X(4545);
X(4546);
X(4547);
X(4548);
X(4549);
X(4550);
X(4551);
X(4552);
X(4553);
X(4554);
X(4555);
X(4556);
X(4557);
X(4558);
X(4559);
X(4560);
X(4561);
X(4562);
X(4563);
X(4564);
X(4565);
X(4566);
X(4567);
X(4568);
X(4569);
X(4570);
X(4571);
X(4572);
X(4573);
X(4574);
X(4575);
X(4576);
X(4577);
X(4578);
X(4579);
X(4580);
X(4581);
X(4582);
X(4583);
X(4584);
X(4585);
X(4586);
X(4587);
X(4588);
X(4589);
X(4590);
X(4591);
X(4592);
X(4593);
X(4594);
X(4595);
X(4596);
X(4597);
X(4598);
X(4599);
X(4600);
X(4601);
X(4602);
X(4603);
X(4604);
X(4605);
X(4606);
X(4607);
X(4608);
X(4609);
X(4610);
X(4611);
X(4612);
X(4613);
X(4614);
X(4615);
X(4616);
X(4617);
X(4618);
X(4619);
X(4620);
X(4621);
X(4622);
X(4623);
X(4624);
X(4625);
X(4626);
X(4627);
X(4628);
X(4629);
X(4630);
X(4631);
X(4632);
X(4633);
X(4634);
X(4635);
X(4636);
X(4637);
X(4638);
X(4639);
X(4640);
X(4641);
X(4642);
X(4643);
X(4644);
X(4645);
X(4646);
X(4647);
X(4648);
X(4649);
X(4650);
X(4651);
X(4652);
X(4653);
X(4654);
X(4655);
X(4656);
X(4657);
X(4658);
X(4659);
X(4660);
X(4661);
X(4662);
X(4663);
X(4664);
X(4665);
X(4666);
X(4667);
X(4668);
X(4669);
X(4670);
X(4671);
X(4672);
X(4673);
X(4674);
X(4675);
X(4676);
X(4677);
X(4678);
X(4679);
X(4680);
X(4681);
X(4682);
X(4683);
X(4684);
X(4685);
X(4686);
X(4687);
X(4688);
X(4689);
X(4690);
X(4691);
X(4692);
X(4693);
X(4694);
X(4695);
X(4696);
X(4697);
X(4698);
X(4699);
X(4700);
X(4701);
X(4702);
X(4703);
X(4704);
X(4705);
X(4706);
X(4707);
X(4708);
X(4709);
X(4710);
X(4711);
X(4712);
X(4713);
X(4714);
X(4715);
X(4716);
X(4717);
X(4718);
X(4719);
X(4720);
X(4721);
X(4722);
X(4723);
X(4724);
X(4725);
X(4726);
X(4727);
X(4728);
X(4729);
X(4730);
X(4731);
X(4732);
X(4733);
X(4734);
X(4735);
X(4736);
X(4737);
X(4738);
X(4739);
X(4740);
X(4741);
X(4742);
X(4743);
X(4744);
X(4745);
X(4746);
X(4747);
X(4748);
X(4749);
X(4750);
X(4751);
X(4752);
X(4753);
X(4754);
X(4755);
X(4756);
X(4757);
X(4758);
X(4759);
X(4760);
X(4761);
X(4762);
X(4763);
X(4764);
X(4765);
X(4766);
X(4767);
X(4768);
X(4769);
X(4770);
X(4771);
X(4772);
X(4773);
X(4774);
X(4775);
X(4776);
X(4777);
X(4778);
X(4779);
X(4780);
X(4781);
X(4782);
X(4783);
X(4784);
X(4785);
X(4786);
X(4787);
X(4788);
X(4789);
X(4790);
X(4791);
X(4792);
X(4793);
X(4794);
X(4795);
X(4796);
X(4797);
X(4798);
X(4799);
X(4800);
X(4801);
X(4802);
X(4803);
X(4804);
X(4805);
X(4806);
X(4807);
X(4808);
X(4809);
X(4810);
X(4811);
X(4812);
X(4813);
X(4814);
X(4815);
X(4816);
X(4817);
X(4818);
X(4819);
X(4820);
X(4821);
X(4822);
X(4823);
X(4824);
X(4825);
X(4826);
X(4827);
X(4828);
X(4829);
X(4830);
X(4831);
X(4832);
X(4833);
X(4834);
X(4835);
X(4836);
X(4837);
X(4838);
X(4839);
X(4840);
X(4841);
X(4842);
X(4843);
X(4844);
X(4845);
X(4846);
X(4847);
X(4848);
X(4849);
X(4850);
X(4851);
X(4852);
X(4853);
X(4854);
X(4855);
X(4856);
X(4857);
X(4858);
X(4859);
X(4860);
X(4861);
X(4862);
X(4863);
X(4864);
X(4865);
X(4866);
X(4867);
X(4868);
X(4869);
X(4870);
X(4871);
X(4872);
X(4873);
X(4874);
X(4875);
X(4876);
X(4877);
X(4878);
X(4879);
X(4880);
X(4881);
X(4882);
X(4883);
X(4884);
X(4885);
X(4886);
X(4887);
X(4888);
X(4889);
X(4890);
X(4891);
X(4892);
X(4893);
X(4894);
X(4895);
X(4896);
X(4897);
X(4898);
X(4899);
X(4900);
X(4901);
X(4902);
X(4903);
X(4904);
X(4905);
X(4906);
X(4907);
X(4908);
X(4909);
X(4910);
X(4911);
X(4912);
X(4913);
X(4914);
X(4915);
X(4916);
X(4917);
X(4918);
X(4919);
X(4920);
X(4921);
X(4922);
X(4923);
X(4924);
X(4925);
X(4926);
X(4927);
X(4928);
X(4929);
X(4930);
X(4931);
X(4932);
X(4933);
X(4934);
X(4935);
X(4936);
X(4937);
X(4938);
X(4939);
X(4940);
X(4941);
X(4942);
X(4943);
X(4944);
X(4945);
X(4946);
X(4947);
X(4948);
X(4949);
X(4950);
X(4951);
X(4952);
X(4953);
X(4954);
X(4955);
X(4956);
X(4957);
X(4958);
X(4959);
X(4960);
X(4961);
X(4962);
X(4963);
X(4964);
X(4965);
X(4966);
X(4967);
X(4968);
X(4969);
X(4970);
X(4971);
X(4972);
X(4973);
X(4974);
X(4975);
X(4976);
X(4977);
X(4978);
X(4979);
X(4980);
X(4981);
X(4982);
X(4983);
X(4984);
X(4985);
X(4986);
X(4987);
X(4988);
X(4989);
X(4990);
X(4991);
X(4992);
X(4993);
X(4994);
X(4995);
X(4996);
X(4997);
X(4998);
X(4999);
X(5000);
X(5001);
X(5002);
X(5003);
X(5004);
X(5005);
X(5006);
X(5007);
X(5008);
X(5009);
X(5010);
X(5011);
X(5012);
X(5013);
X(5014);
X(5015);
X(5016);
X(5017);
X(5018);
X(5019);
X(5020);
X(5021);
X(5022);
X(5023);
X(5024);
X(5025);
X(5026);
X(5027);
X(5028);
X(5029);
X(5030);
X(5031);
X(5032);
X(5033);
X(5034);
X(5035);
X(5036);
X(5037);
X(5038);
X(5039);
X(5040);
X(5041);
X(5042);
X(5043);
X(5044);
X(5045);
X(5046);
X(5047);
X(5048);
X(5049);
X(5050);
X(5051);
X(5052);
X(5053);
X(5054);
X(5055);
X(5056);
X(5057);
X(5058);
X(5059);
X(5060);
X(5061);
X(5062);
X(5063);
X(5064);
X(5065);
X(5066);
X(5067);
X(5068);
X(5069);
X(5070);
X(5071);
X(5072);
X(5073);
X(5074);
X(5075);
X(5076);
X(5077);
X(5078);
X(5079);
X(5080);
X(5081);
X(5082);
X(5083);
X(5084);
X(5085);
X(5086);
X(5087);
X(5088);
X(5089);
X(5090);
X(5091);
X(5092);
X(5093);
X(5094);
X(5095);
X(5096);
X(5097);
X(5098);
X(5099);
X(5100);
X(5101);
X(5102);
X(5103);
X(5104);
X(5105);
X(5106);
X(5107);
X(5108);
X(5109);
X(5110);
X(5111);
X(5112);
X(5113);
X(5114);
X(5115);
X(5116);
X(5117);
X(5118);
X(5119);
X(5120);
X(5121);
X(5122);
X(5123);
X(5124);
X(5125);
X(5126);
X(5127);
X(5128);
X(5129);
X(5130);
X(5131);
X(5132);
X(5133);
X(5134);
X(5135);
X(5136);
X(5137);
X(5138);
X(5139);
X(5140);
X(5141);
X(5142);
X(5143);
X(5144);
X(5145);
X(5146);
X(5147);
X(5148);
X(5149);
X(5150);
X(5151);
X(5152);
X(5153);
X(5154);
X(5155);
X(5156);
X(5157);
X(5158);
X(5159);
X(5160);
X(5161);
X(5162);
X(5163);
X(5164);
X(5165);
X(5166);
X(5167);
X(5168);
X(5169);
X(5170);
X(5171);
X(5172);
X(5173);
X(5174);
X(5175);
X(5176);
X(5177);
X(5178);
X(5179);
X(5180);
X(5181);
X(5182);
X(5183);
X(5184);
X(5185);
X(5186);
X(5187);
X(5188);
X(5189);
X(5190);
X(5191);
X(5192);
X(5193);
X(5194);
X(5195);
X(5196);
X(5197);
X(5198);
X(5199);
X(5200);
X(5201);
X(5202);
X(5203);
X(5204);
X(5205);
X(5206);
X(5207);
X(5208);
X(5209);
X(5210);
X(5211);
X(5212);
X(5213);
X(5214);
X(5215);
X(5216);
X(5217);
X(5218);
X(5219);
X(5220);
X(5221);
X(5222);
X(5223);
X(5224);
X(5225);
X(5226);
X(5227);
X(5228);
X(5229);
X(5230);
X(5231);
X(5232);
X(5233);
X(5234);
X(5235);
X(5236);
X(5237);
X(5238);
X(5239);
X(5240);
X(5241);
X(5242);
X(5243);
X(5244);
X(5245);
X(5246);
X(5247);
X(5248);
X(5249);
X(5250);
X(5251);
X(5252);
X(5253);
X(5254);
X(5255);
X(5256);
X(5257);
X(5258);
X(5259);
X(5260);
X(5261);
X(5262);
X(5263);
X(5264);
X(5265);
X(5266);
X(5267);
X(5268);
X(5269);
X(5270);
X(5271);
X(5272);
X(5273);
X(5274);
X(5275);
X(5276);
X(5277);
X(5278);
X(5279);
X(5280);
X(5281);
X(5282);
X(5283);
X(5284);
X(5285);
X(5286);
X(5287);
X(5288);
X(5289);
X(5290);
X(5291);
X(5292);
X(5293);
X(5294);
X(5295);
X(5296);
X(5297);
X(5298);
X(5299);
X(5300);
X(5301);
X(5302);
X(5303);
X(5304);
X(5305);
X(5306);
X(5307);
X(5308);
X(5309);
X(5310);
X(5311);
X(5312);
X(5313);
X(5314);
X(5315);
X(5316);
X(5317);
X(5318);
X(5319);
X(5320);
X(5321);
X(5322);
X(5323);
X(5324);
X(5325);
X(5326);
X(5327);
X(5328);
X(5329);
X(5330);
X(5331);
X(5332);
X(5333);
X(5334);
X(5335);
X(5336);
X(5337);
X(5338);
X(5339);
X(5340);
X(5341);
X(5342);
X(5343);
X(5344);
X(5345);
X(5346);
X(5347);
X(5348);
X(5349);
X(5350);
X(5351);
X(5352);
X(5353);
X(5354);
X(5355);
X(5356);
X(5357);
X(5358);
X(5359);
X(5360);
X(5361);
X(5362);
X(5363);
X(5364);
X(5365);
X(5366);
X(5367);
X(5368);
X(5369);
X(5370);
X(5371);
X(5372);
X(5373);
X(5374);
X(5375);
X(5376);
X(5377);
X(5378);
X(5379);
X(5380);
X(5381);
X(5382);
X(5383);
X(5384);
X(5385);
X(5386);
X(5387);
X(5388);
X(5389);
X(5390);
X(5391);
X(5392);
X(5393);
X(5394);
X(5395);
X(5396);
X(5397);
X(5398);
X(5399);
X(5400);
X(5401);
X(5402);
X(5403);
X(5404);
X(5405);
X(5406);
X(5407);
X(5408);
X(5409);
X(5410);
X(5411);
X(5412);
X(5413);
X(5414);
X(5415);
X(5416);
X(5417);
X(5418);
X(5419);
X(5420);
X(5421);
X(5422);
X(5423);
X(5424);
X(5425);
X(5426);
X(5427);
X(5428);
X(5429);
X(5430);
X(5431);
X(5432);
X(5433);
X(5434);
X(5435);
X(5436);
X(5437);
X(5438);
X(5439);
X(5440);
X(5441);
X(5442);
X(5443);
X(5444);
X(5445);
X(5446);
X(5447);
X(5448);
X(5449);
X(5450);
X(5451);
X(5452);
X(5453);
X(5454);
X(5455);
X(5456);
X(5457);
X(5458);
X(5459);
X(5460);
X(5461);
X(5462);
X(5463);
X(5464);
X(5465);
X(5466);
X(5467);
X(5468);
X(5469);
X(5470);
X(5471);
X(5472);
X(5473);
X(5474);
X(5475);
X(5476);
X(5477);
X(5478);
X(5479);
X(5480);
X(5481);
X(5482);
X(5483);
X(5484);
X(5485);
X(5486);
X(5487);
X(5488);
X(5489);
X(5490);
X(5491);
X(5492);
X(5493);
X(5494);
X(5495);
X(5496);
X(5497);
X(5498);
X(5499);
X(5500);
X(5501);
X(5502);
X(5503);
X(5504);
X(5505);
X(5506);
X(5507);
X(5508);
X(5509);
X(5510);
X(5511);
X(5512);
X(5513);
X(5514);
X(5515);
X(5516);
X(5517);
X(5518);
X(5519);
X(5520);
X(5521);
X(5522);
X(5523);
X(5524);
X(5525);
X(5526);
X(5527);
X(5528);
X(5529);
X(5530);
X(5531);
X(5532);
X(5533);
X(5534);
X(5535);
X(5536);
X(5537);
X(5538);
X(5539);
X(5540);
X(5541);
X(5542);
X(5543);
X(5544);
X(5545);
X(5546);
X(5547);
X(5548);
X(5549);
X(5550);
X(5551);
X(5552);
X(5553);
X(5554);
X(5555);
X(5556);
X(5557);
X(5558);
X(5559);
X(5560);
X(5561);
X(5562);
X(5563);
X(5564);
X(5565);
X(5566);
X(5567);
X(5568);
X(5569);
X(5570);
X(5571);
X(5572);
X(5573);
X(5574);
X(5575);
X(5576);
X(5577);
X(5578);
X(5579);
X(5580);
X(5581);
X(5582);
X(5583);
X(5584);
X(5585);
X(5586);
X(5587);
X(5588);
X(5589);
X(5590);
X(5591);
X(5592);
X(5593);
X(5594);
X(5595);
X(5596);
X(5597);
X(5598);
X(5599);
X(5600);
X(5601);
X(5602);
X(5603);
X(5604);
X(5605);
X(5606);
X(5607);
X(5608);
X(5609);
X(5610);
X(5611);
X(5612);
X(5613);
X(5614);
X(5615);
X(5616);
X(5617);
X(5618);
X(5619);
X(5620);
X(5621);
X(5622);
X(5623);
X(5624);
X(5625);
X(5626);
X(5627);
X(5628);
X(5629);
X(5630);
X(5631);
X(5632);
X(5633);
X(5634);
X(5635);
X(5636);
X(5637);
X(5638);
X(5639);
X(5640);
X(5641);
X(5642);
X(5643);
X(5644);
X(5645);
X(5646);
X(5647);
X(5648);
X(5649);
X(5650);
X(5651);
X(5652);
X(5653);
X(5654);
X(5655);
X(5656);
X(5657);
X(5658);
X(5659);
X(5660);
X(5661);
X(5662);
X(5663);
X(5664);
X(5665);
X(5666);
X(5667);
X(5668);
X(5669);
X(5670);
X(5671);
X(5672);
X(5673);
X(5674);
X(5675);
X(5676);
X(5677);
X(5678);
X(5679);
X(5680);
X(5681);
X(5682);
X(5683);
X(5684);
X(5685);
X(5686);
X(5687);
X(5688);
X(5689);
X(5690);
X(5691);
X(5692);
X(5693);
X(5694);
X(5695);
X(5696);
X(5697);
X(5698);
X(5699);
X(5700);
X(5701);
X(5702);
X(5703);
X(5704);
X(5705);
X(5706);
X(5707);
X(5708);
X(5709);
X(5710);
X(5711);
X(5712);
X(5713);
X(5714);
X(5715);
X(5716);
X(5717);
X(5718);
X(5719);
X(5720);
X(5721);
X(5722);
X(5723);
X(5724);
X(5725);
X(5726);
X(5727);
X(5728);
X(5729);
X(5730);
X(5731);
X(5732);
X(5733);
X(5734);
X(5735);
X(5736);
X(5737);
X(5738);
X(5739);
X(5740);
X(5741);
X(5742);
X(5743);
X(5744);
X(5745);
X(5746);
X(5747);
X(5748);
X(5749);
X(5750);
X(5751);
X(5752);
X(5753);
X(5754);
X(5755);
X(5756);
X(5757);
X(5758);
X(5759);
X(5760);
X(5761);
X(5762);
X(5763);
X(5764);
X(5765);
X(5766);
X(5767);
X(5768);
X(5769);
X(5770);
X(5771);
X(5772);
X(5773);
X(5774);
X(5775);
X(5776);
X(5777);
X(5778);
X(5779);
X(5780);
X(5781);
X(5782);
X(5783);
X(5784);
X(5785);
X(5786);
X(5787);
X(5788);
X(5789);
X(5790);
X(5791);
X(5792);
X(5793);
X(5794);
X(5795);
X(5796);
X(5797);
X(5798);
X(5799);
X(5800);
X(5801);
X(5802);
X(5803);
X(5804);
X(5805);
X(5806);
X(5807);
X(5808);
X(5809);
X(5810);
X(5811);
X(5812);
X(5813);
X(5814);
X(5815);
X(5816);
X(5817);
X(5818);
X(5819);
X(5820);
X(5821);
X(5822);
X(5823);
X(5824);
X(5825);
X(5826);
X(5827);
X(5828);
X(5829);
X(5830);
X(5831);
X(5832);
X(5833);
X(5834);
X(5835);
X(5836);
X(5837);
X(5838);
X(5839);
X(5840);
X(5841);
X(5842);
X(5843);
X(5844);
X(5845);
X(5846);
X(5847);
X(5848);
X(5849);
X(5850);
X(5851);
X(5852);
X(5853);
X(5854);
X(5855);
X(5856);
X(5857);
X(5858);
X(5859);
X(5860);
X(5861);
X(5862);
X(5863);
X(5864);
X(5865);
X(5866);
X(5867);
X(5868);
X(5869);
X(5870);
X(5871);
X(5872);
X(5873);
X(5874);
X(5875);
X(5876);
X(5877);
X(5878);
X(5879);
X(5880);
X(5881);
X(5882);
X(5883);
X(5884);
X(5885);
X(5886);
X(5887);
X(5888);
X(5889);
X(5890);
X(5891);
X(5892);
X(5893);
X(5894);
X(5895);
X(5896);
X(5897);
X(5898);
X(5899);
X(5900);
X(5901);
X(5902);
X(5903);
X(5904);
X(5905);
X(5906);
X(5907);
X(5908);
X(5909);
X(5910);
X(5911);
X(5912);
X(5913);
X(5914);
X(5915);
X(5916);
X(5917);
X(5918);
X(5919);
X(5920);
X(5921);
X(5922);
X(5923);
X(5924);
X(5925);
X(5926);
X(5927);
X(5928);
X(5929);
X(5930);
X(5931);
X(5932);
X(5933);
X(5934);
X(5935);
X(5936);
X(5937);
X(5938);
X(5939);
X(5940);
X(5941);
X(5942);
X(5943);
X(5944);
X(5945);
X(5946);
X(5947);
X(5948);
X(5949);
X(5950);
X(5951);
X(5952);
X(5953);
X(5954);
X(5955);
X(5956);
X(5957);
X(5958);
X(5959);
X(5960);
X(5961);
X(5962);
X(5963);
X(5964);
X(5965);
X(5966);
X(5967);
X(5968);
X(5969);
X(5970);
X(5971);
X(5972);
X(5973);
X(5974);
X(5975);
X(5976);
X(5977);
X(5978);
X(5979);
X(5980);
X(5981);
X(5982);
X(5983);
X(5984);
X(5985);
X(5986);
X(5987);
X(5988);
X(5989);
X(5990);
X(5991);
X(5992);
X(5993);
X(5994);
X(5995);
X(5996);
X(5997);
X(5998);
X(5999);
X(6000);
X(6001);
X(6002);
X(6003);
X(6004);
X(6005);
X(6006);
X(6007);
X(6008);
X(6009);
X(6010);
X(6011);
X(6012);
X(6013);
X(6014);
X(6015);
X(6016);
X(6017);
X(6018);
X(6019);
X(6020);
X(6021);
X(6022);
X(6023);
X(6024);
X(6025);
X(6026);
X(6027);
X(6028);
X(6029);
X(6030);
X(6031);
X(6032);
X(6033);
X(6034);
X(6035);
X(6036);
X(6037);
X(6038);
X(6039);
X(6040);
X(6041);
X(6042);
X(6043);
X(6044);
X(6045);
X(6046);
X(6047);
X(6048);
X(6049);
X(6050);
X(6051);
X(6052);
X(6053);
X(6054);
X(6055);
X(6056);
X(6057);
X(6058);
X(6059);
X(6060);
X(6061);
X(6062);
X(6063);
X(6064);
X(6065);
X(6066);
X(6067);
X(6068);
X(6069);
X(6070);
X(6071);
X(6072);
X(6073);
X(6074);
X(6075);
X(6076);
X(6077);
X(6078);
X(6079);
X(6080);
X(6081);
X(6082);
X(6083);
X(6084);
X(6085);
X(6086);
X(6087);
X(6088);
X(6089);
X(6090);
X(6091);
X(6092);
X(6093);
X(6094);
X(6095);
X(6096);
X(6097);
X(6098);
X(6099);
X(6100);
X(6101);
X(6102);
X(6103);
X(6104);
X(6105);
X(6106);
X(6107);
X(6108);
X(6109);
X(6110);
X(6111);
X(6112);
X(6113);
X(6114);
X(6115);
X(6116);
X(6117);
X(6118);
X(6119);
X(6120);
X(6121);
X(6122);
X(6123);
X(6124);
X(6125);
X(6126);
X(6127);
X(6128);
X(6129);
X(6130);
X(6131);
X(6132);
X(6133);
X(6134);
X(6135);
X(6136);
X(6137);
X(6138);
X(6139);
X(6140);
X(6141);
X(6142);
X(6143);
X(6144);
X(6145);
X(6146);
X(6147);
X(6148);
X(6149);
X(6150);
X(6151);
X(6152);
X(6153);
X(6154);
X(6155);
X(6156);
X(6157);
X(6158);
X(6159);
X(6160);
X(6161);
X(6162);
X(6163);
X(6164);
X(6165);
X(6166);
X(6167);
X(6168);
X(6169);
X(6170);
X(6171);
X(6172);
X(6173);
X(6174);
X(6175);
X(6176);
X(6177);
X(6178);
X(6179);
X(6180);
X(6181);
X(6182);
X(6183);
X(6184);
X(6185);
X(6186);
X(6187);
X(6188);
X(6189);
X(6190);
X(6191);
X(6192);
X(6193);
X(6194);
X(6195);
X(6196);
X(6197);
X(6198);
X(6199);
X(6200);
X(6201);
X(6202);
X(6203);
X(6204);
X(6205);
X(6206);
X(6207);
X(6208);
X(6209);
X(6210);
X(6211);
X(6212);
X(6213);
X(6214);
X(6215);
X(6216);
X(6217);
X(6218);
X(6219);
X(6220);
X(6221);
X(6222);
X(6223);
X(6224);
X(6225);
X(6226);
X(6227);
X(6228);
X(6229);
X(6230);
X(6231);
X(6232);
X(6233);
X(6234);
X(6235);
X(6236);
X(6237);
X(6238);
X(6239);
X(6240);
X(6241);
X(6242);
X(6243);
X(6244);
X(6245);
X(6246);
X(6247);
X(6248);
X(6249);
X(6250);
X(6251);
X(6252);
X(6253);
X(6254);
X(6255);
X(6256);
X(6257);
X(6258);
X(6259);
X(6260);
X(6261);
X(6262);
X(6263);
X(6264);
X(6265);
X(6266);
X(6267);
X(6268);
X(6269);
X(6270);
X(6271);
X(6272);
X(6273);
X(6274);
X(6275);
X(6276);
X(6277);
X(6278);
X(6279);
X(6280);
X(6281);
X(6282);
X(6283);
X(6284);
X(6285);
X(6286);
X(6287);
X(6288);
X(6289);
X(6290);
X(6291);
X(6292);
X(6293);
X(6294);
X(6295);
X(6296);
X(6297);
X(6298);
X(6299);
X(6300);
X(6301);
X(6302);
X(6303);
X(6304);
X(6305);
X(6306);
X(6307);
X(6308);
X(6309);
X(6310);
X(6311);
X(6312);
X(6313);
X(6314);
X(6315);
X(6316);
X(6317);
X(6318);
X(6319);
X(6320);
X(6321);
X(6322);
X(6323);
X(6324);
X(6325);
X(6326);
X(6327);
X(6328);
X(6329);
X(6330);
X(6331);
X(6332);
X(6333);
X(6334);
X(6335);
X(6336);
X(6337);
X(6338);
X(6339);
X(6340);
X(6341);
X(6342);
X(6343);
X(6344);
X(6345);
X(6346);
X(6347);
X(6348);
X(6349);
X(6350);
X(6351);
X(6352);
X(6353);
X(6354);
X(6355);
X(6356);
X(6357);
X(6358);
X(6359);
X(6360);
X(6361);
X(6362);
X(6363);
X(6364);
X(6365);
X(6366);
X(6367);
X(6368);
X(6369);
X(6370);
X(6371);
X(6372);
X(6373);
X(6374);
X(6375);
X(6376);
X(6377);
X(6378);
X(6379);
X(6380);
X(6381);
X(6382);
X(6383);
X(6384);
X(6385);
X(6386);
X(6387);
X(6388);
X(6389);
X(6390);
X(6391);
X(6392);
X(6393);
X(6394);
X(6395);
X(6396);
X(6397);
X(6398);
X(6399);
X(6400);
X(6401);
X(6402);
X(6403);
X(6404);
X(6405);
X(6406);
X(6407);
X(6408);
X(6409);
X(6410);
X(6411);
X(6412);
X(6413);
X(6414);
X(6415);
X(6416);
X(6417);
X(6418);
X(6419);
X(6420);
X(6421);
X(6422);
X(6423);
X(6424);
X(6425);
X(6426);
X(6427);
X(6428);
X(6429);
X(6430);
X(6431);
X(6432);
X(6433);
X(6434);
X(6435);
X(6436);
X(6437);
X(6438);
X(6439);
X(6440);
X(6441);
X(6442);
X(6443);
X(6444);
X(6445);
X(6446);
X(6447);
X(6448);
X(6449);
X(6450);
X(6451);
X(6452);
X(6453);
X(6454);
X(6455);
X(6456);
X(6457);
X(6458);
X(6459);
X(6460);
X(6461);
X(6462);
X(6463);
X(6464);
X(6465);
X(6466);
X(6467);
X(6468);
X(6469);
X(6470);
X(6471);
X(6472);
X(6473);
X(6474);
X(6475);
X(6476);
X(6477);
X(6478);
X(6479);
X(6480);
X(6481);
X(6482);
X(6483);
X(6484);
X(6485);
X(6486);
X(6487);
X(6488);
X(6489);
X(6490);
X(6491);
X(6492);
X(6493);
X(6494);
X(6495);
X(6496);
X(6497);
X(6498);
X(6499);
X(6500);
X(6501);
X(6502);
X(6503);
X(6504);
X(6505);
X(6506);
X(6507);
X(6508);
X(6509);
X(6510);
X(6511);
X(6512);
X(6513);
X(6514);
X(6515);
X(6516);
X(6517);
X(6518);
X(6519);
X(6520);
X(6521);
X(6522);
X(6523);
X(6524);
X(6525);
X(6526);
X(6527);
X(6528);
X(6529);
X(6530);
X(6531);
X(6532);
X(6533);
X(6534);
X(6535);
X(6536);
X(6537);
X(6538);
X(6539);
X(6540);
X(6541);
X(6542);
X(6543);
X(6544);
X(6545);
X(6546);
X(6547);
X(6548);
X(6549);
X(6550);
X(6551);
X(6552);
X(6553);
X(6554);
X(6555);
X(6556);
X(6557);
X(6558);
X(6559);
X(6560);
X(6561);
X(6562);
X(6563);
X(6564);
X(6565);
X(6566);
X(6567);
X(6568);
X(6569);
X(6570);
X(6571);
X(6572);
X(6573);
X(6574);
X(6575);
X(6576);
X(6577);
X(6578);
X(6579);
X(6580);
X(6581);
X(6582);
X(6583);
X(6584);
X(6585);
X(6586);
X(6587);
X(6588);
X(6589);
X(6590);
X(6591);
X(6592);
X(6593);
X(6594);
X(6595);
X(6596);
X(6597);
X(6598);
X(6599);
X(6600);
X(6601);
X(6602);
X(6603);
X(6604);
X(6605);
X(6606);
X(6607);
X(6608);
X(6609);
X(6610);
X(6611);
X(6612);
X(6613);
X(6614);
X(6615);
X(6616);
X(6617);
X(6618);
X(6619);
X(6620);
X(6621);
X(6622);
X(6623);
X(6624);
X(6625);
X(6626);
X(6627);
X(6628);
X(6629);
X(6630);
X(6631);
X(6632);
X(6633);
X(6634);
X(6635);
X(6636);
X(6637);
X(6638);
X(6639);
X(6640);
X(6641);
X(6642);
X(6643);
X(6644);
X(6645);
X(6646);
X(6647);
X(6648);
X(6649);
X(6650);
X(6651);
X(6652);
X(6653);
X(6654);
X(6655);
X(6656);
X(6657);
X(6658);
X(6659);
X(6660);
X(6661);
X(6662);
X(6663);
X(6664);
X(6665);
X(6666);
X(6667);
X(6668);
X(6669);
X(6670);
X(6671);
X(6672);
X(6673);
X(6674);
X(6675);
X(6676);
X(6677);
X(6678);
X(6679);
X(6680);
X(6681);
X(6682);
X(6683);
X(6684);
X(6685);
X(6686);
X(6687);
X(6688);
X(6689);
X(6690);
X(6691);
X(6692);
X(6693);
X(6694);
X(6695);
X(6696);
X(6697);
X(6698);
X(6699);
X(6700);
X(6701);
X(6702);
X(6703);
X(6704);
X(6705);
X(6706);
X(6707);
X(6708);
X(6709);
X(6710);
X(6711);
X(6712);
X(6713);
X(6714);
X(6715);
X(6716);
X(6717);
X(6718);
X(6719);
X(6720);
X(6721);
X(6722);
X(6723);
X(6724);
X(6725);
X(6726);
X(6727);
X(6728);
X(6729);
X(6730);
X(6731);
X(6732);
X(6733);
X(6734);
X(6735);
X(6736);
X(6737);
X(6738);
X(6739);
X(6740);
X(6741);
X(6742);
X(6743);
X(6744);
X(6745);
X(6746);
X(6747);
X(6748);
X(6749);
X(6750);
X(6751);
X(6752);
X(6753);
X(6754);
X(6755);
X(6756);
X(6757);
X(6758);
X(6759);
X(6760);
X(6761);
X(6762);
X(6763);
X(6764);
X(6765);
X(6766);
X(6767);
X(6768);
X(6769);
X(6770);
X(6771);
X(6772);
X(6773);
X(6774);
X(6775);
X(6776);
X(6777);
X(6778);
X(6779);
X(6780);
X(6781);
X(6782);
X(6783);
X(6784);
X(6785);
X(6786);
X(6787);
X(6788);
X(6789);
X(6790);
X(6791);
X(6792);
X(6793);
X(6794);
X(6795);
X(6796);
X(6797);
X(6798);
X(6799);
X(6800);
X(6801);
X(6802);
X(6803);
X(6804);
X(6805);
X(6806);
X(6807);
X(6808);
X(6809);
X(6810);
X(6811);
X(6812);
X(6813);
X(6814);
X(6815);
X(6816);
X(6817);
X(6818);
X(6819);
X(6820);
X(6821);
X(6822);
X(6823);
X(6824);
X(6825);
X(6826);
X(6827);
X(6828);
X(6829);
X(6830);
X(6831);
X(6832);
X(6833);
X(6834);
X(6835);
X(6836);
X(6837);
X(6838);
X(6839);
X(6840);
X(6841);
X(6842);
X(6843);
X(6844);
X(6845);
X(6846);
X(6847);
X(6848);
X(6849);
X(6850);
X(6851);
X(6852);
X(6853);
X(6854);
X(6855);
X(6856);
X(6857);
X(6858);
X(6859);
X(6860);
X(6861);
X(6862);
X(6863);
X(6864);
X(6865);
X(6866);
X(6867);
X(6868);
X(6869);
X(6870);
X(6871);
X(6872);
X(6873);
X(6874);
X(6875);
X(6876);
X(6877);
X(6878);
X(6879);
X(6880);
X(6881);
X(6882);
X(6883);
X(6884);
X(6885);
X(6886);
X(6887);
X(6888);
X(6889);
X(6890);
X(6891);
X(6892);
X(6893);
X(6894);
X(6895);
X(6896);
X(6897);
X(6898);
X(6899);
X(6900);
X(6901);
X(6902);
X(6903);
X(6904);
X(6905);
X(6906);
X(6907);
X(6908);
X(6909);
X(6910);
X(6911);
X(6912);
X(6913);
X(6914);
X(6915);
X(6916);
X(6917);
X(6918);
X(6919);
X(6920);
X(6921);
X(6922);
X(6923);
X(6924);
X(6925);
X(6926);
X(6927);
X(6928);
X(6929);
X(6930);
X(6931);
X(6932);
X(6933);
X(6934);
X(6935);
X(6936);
X(6937);
X(6938);
X(6939);
X(6940);
X(6941);
X(6942);
X(6943);
X(6944);
X(6945);
X(6946);
X(6947);
X(6948);
X(6949);
X(6950);
X(6951);
X(6952);
X(6953);
X(6954);
X(6955);
X(6956);
X(6957);
X(6958);
X(6959);
X(6960);
X(6961);
X(6962);
X(6963);
X(6964);
X(6965);
X(6966);
X(6967);
X(6968);
X(6969);
X(6970);
X(6971);
X(6972);
X(6973);
X(6974);
X(6975);
X(6976);
X(6977);
X(6978);
X(6979);
X(6980);
X(6981);
X(6982);
X(6983);
X(6984);
X(6985);
X(6986);
X(6987);
X(6988);
X(6989);
X(6990);
X(6991);
X(6992);
X(6993);
X(6994);
X(6995);
X(6996);
X(6997);
X(6998);
X(6999);
X(7000);
X(7001);
X(7002);
X(7003);
X(7004);
X(7005);
X(7006);
X(7007);
X(7008);
X(7009);
X(7010);
X(7011);
X(7012);
X(7013);
X(7014);
X(7015);
X(7016);
X(7017);
X(7018);
X(7019);
X(7020);
X(7021);
X(7022);
X(7023);
X(7024);
X(7025);
X(7026);
X(7027);
X(7028);
X(7029);
X(7030);
X(7031);
X(7032);
X(7033);
X(7034);
X(7035);
X(7036);
X(7037);
X(7038);
X(7039);
X(7040);
X(7041);
X(7042);
X(7043);
X(7044);
X(7045);
X(7046);
X(7047);
X(7048);
X(7049);
X(7050);
X(7051);
X(7052);
X(7053);
X(7054);
X(7055);
X(7056);
X(7057);
X(7058);
X(7059);
X(7060);
X(7061);
X(7062);
X(7063);
X(7064);
X(7065);
X(7066);
X(7067);
X(7068);
X(7069);
X(7070);
X(7071);
X(7072);
X(7073);
X(7074);
X(7075);
X(7076);
X(7077);
X(7078);
X(7079);
X(7080);
X(7081);
X(7082);
X(7083);
X(7084);
X(7085);
X(7086);
X(7087);
X(7088);
X(7089);
X(7090);
X(7091);
X(7092);
X(7093);
X(7094);
X(7095);
X(7096);
X(7097);
X(7098);
X(7099);
X(7100);
X(7101);
X(7102);
X(7103);
X(7104);
X(7105);
X(7106);
X(7107);
X(7108);
X(7109);
X(7110);
X(7111);
X(7112);
X(7113);
X(7114);
X(7115);
X(7116);
X(7117);
X(7118);
X(7119);
X(7120);
X(7121);
X(7122);
X(7123);
X(7124);
X(7125);
X(7126);
X(7127);
X(7128);
X(7129);
X(7130);
X(7131);
X(7132);
X(7133);
X(7134);
X(7135);
X(7136);
X(7137);
X(7138);
X(7139);
X(7140);
X(7141);
X(7142);
X(7143);
X(7144);
X(7145);
X(7146);
X(7147);
X(7148);
X(7149);
X(7150);
X(7151);
X(7152);
X(7153);
X(7154);
X(7155);
X(7156);
X(7157);
X(7158);
X(7159);
X(7160);
X(7161);
X(7162);
X(7163);
X(7164);
X(7165);
X(7166);
X(7167);
X(7168);
X(7169);
X(7170);
X(7171);
X(7172);
X(7173);
X(7174);
X(7175);
X(7176);
X(7177);
X(7178);
X(7179);
X(7180);
X(7181);
X(7182);
X(7183);
X(7184);
X(7185);
X(7186);
X(7187);
X(7188);
X(7189);
X(7190);
X(7191);
X(7192);
X(7193);
X(7194);
X(7195);
X(7196);
X(7197);
X(7198);
X(7199);
X(7200);
X(7201);
X(7202);
X(7203);
X(7204);
X(7205);
X(7206);
X(7207);
X(7208);
X(7209);
X(7210);
X(7211);
X(7212);
X(7213);
X(7214);
X(7215);
X(7216);
X(7217);
X(7218);
X(7219);
X(7220);
X(7221);
X(7222);
X(7223);
X(7224);
X(7225);
X(7226);
X(7227);
X(7228);
X(7229);
X(7230);
X(7231);
X(7232);
X(7233);
X(7234);
X(7235);
X(7236);
X(7237);
X(7238);
X(7239);
X(7240);
X(7241);
X(7242);
X(7243);
X(7244);
X(7245);
X(7246);
X(7247);
X(7248);
X(7249);
X(7250);
X(7251);
X(7252);
X(7253);
X(7254);
X(7255);
X(7256);
X(7257);
X(7258);
X(7259);
X(7260);
X(7261);
X(7262);
X(7263);
X(7264);
X(7265);
X(7266);
X(7267);
X(7268);
X(7269);
X(7270);
X(7271);
X(7272);
X(7273);
X(7274);
X(7275);
X(7276);
X(7277);
X(7278);
X(7279);
X(7280);
X(7281);
X(7282);
X(7283);
X(7284);
X(7285);
X(7286);
X(7287);
X(7288);
X(7289);
X(7290);
X(7291);
X(7292);
X(7293);
X(7294);
X(7295);
X(7296);
X(7297);
X(7298);
X(7299);
X(7300);
X(7301);
X(7302);
X(7303);
X(7304);
X(7305);
X(7306);
X(7307);
X(7308);
X(7309);
X(7310);
X(7311);
X(7312);
X(7313);
X(7314);
X(7315);
X(7316);
X(7317);
X(7318);
X(7319);
X(7320);
X(7321);
X(7322);
X(7323);
X(7324);
X(7325);
X(7326);
X(7327);
X(7328);
X(7329);
X(7330);
X(7331);
X(7332);
X(7333);
X(7334);
X(7335);
X(7336);
X(7337);
X(7338);
X(7339);
X(7340);
X(7341);
X(7342);
X(7343);
X(7344);
X(7345);
X(7346);
X(7347);
X(7348);
X(7349);
X(7350);
X(7351);
X(7352);
X(7353);
X(7354);
X(7355);
X(7356);
X(7357);
X(7358);
X(7359);
X(7360);
X(7361);
X(7362);
X(7363);
X(7364);
X(7365);
X(7366);
X(7367);
X(7368);
X(7369);
X(7370);
X(7371);
X(7372);
X(7373);
X(7374);
X(7375);
X(7376);
X(7377);
X(7378);
X(7379);
X(7380);
X(7381);
X(7382);
X(7383);
X(7384);
X(7385);
X(7386);
X(7387);
X(7388);
X(7389);
X(7390);
X(7391);
X(7392);
X(7393);
X(7394);
X(7395);
X(7396);
X(7397);
X(7398);
X(7399);
X(7400);
X(7401);
X(7402);
X(7403);
X(7404);
X(7405);
X(7406);
X(7407);
X(7408);
X(7409);
X(7410);
X(7411);
X(7412);
X(7413);
X(7414);
X(7415);
X(7416);
X(7417);
X(7418);
X(7419);
X(7420);
X(7421);
X(7422);
X(7423);
X(7424);
X(7425);
X(7426);
X(7427);
X(7428);
X(7429);
X(7430);
X(7431);
X(7432);
X(7433);
X(7434);
X(7435);
X(7436);
X(7437);
X(7438);
X(7439);
X(7440);
X(7441);
X(7442);
X(7443);
X(7444);
X(7445);
X(7446);
X(7447);
X(7448);
X(7449);
X(7450);
X(7451);
X(7452);
X(7453);
X(7454);
X(7455);
X(7456);
X(7457);
X(7458);
X(7459);
X(7460);
X(7461);
X(7462);
X(7463);
X(7464);
X(7465);
X(7466);
X(7467);
X(7468);
X(7469);
X(7470);
X(7471);
X(7472);
X(7473);
X(7474);
X(7475);
X(7476);
X(7477);
X(7478);
X(7479);
X(7480);
X(7481);
X(7482);
X(7483);
X(7484);
X(7485);
X(7486);
X(7487);
X(7488);
X(7489);
X(7490);
X(7491);
X(7492);
X(7493);
X(7494);
X(7495);
X(7496);
X(7497);
X(7498);
X(7499);
X(7500);
X(7501);
X(7502);
X(7503);
X(7504);
X(7505);
X(7506);
X(7507);
X(7508);
X(7509);
X(7510);
X(7511);
X(7512);
X(7513);
X(7514);
X(7515);
X(7516);
X(7517);
X(7518);
X(7519);
X(7520);
X(7521);
X(7522);
X(7523);
X(7524);
X(7525);
X(7526);
X(7527);
X(7528);
X(7529);
X(7530);
X(7531);
X(7532);
X(7533);
X(7534);
X(7535);
X(7536);
X(7537);
X(7538);
X(7539);
X(7540);
X(7541);
X(7542);
X(7543);
X(7544);
X(7545);
X(7546);
X(7547);
X(7548);
X(7549);
X(7550);
X(7551);
X(7552);
X(7553);
X(7554);
X(7555);
X(7556);
X(7557);
X(7558);
X(7559);
X(7560);
X(7561);
X(7562);
X(7563);
X(7564);
X(7565);
X(7566);
X(7567);
X(7568);
X(7569);
X(7570);
X(7571);
X(7572);
X(7573);
X(7574);
X(7575);
X(7576);
X(7577);
X(7578);
X(7579);
X(7580);
X(7581);
X(7582);
X(7583);
X(7584);
X(7585);
X(7586);
X(7587);
X(7588);
X(7589);
X(7590);
X(7591);
X(7592);
X(7593);
X(7594);
X(7595);
X(7596);
X(7597);
X(7598);
X(7599);
X(7600);
X(7601);
X(7602);
X(7603);
X(7604);
X(7605);
X(7606);
X(7607);
X(7608);
X(7609);
X(7610);
X(7611);
X(7612);
X(7613);
X(7614);
X(7615);
X(7616);
X(7617);
X(7618);
X(7619);
X(7620);
X(7621);
X(7622);
X(7623);
X(7624);
X(7625);
X(7626);
X(7627);
X(7628);
X(7629);
X(7630);
X(7631);
X(7632);
X(7633);
X(7634);
X(7635);
X(7636);
X(7637);
X(7638);
X(7639);
X(7640);
X(7641);
X(7642);
X(7643);
X(7644);
X(7645);
X(7646);
X(7647);
X(7648);
X(7649);
X(7650);
X(7651);
X(7652);
X(7653);
X(7654);
X(7655);
X(7656);
X(7657);
X(7658);
X(7659);
X(7660);
X(7661);
X(7662);
X(7663);
X(7664);
X(7665);
X(7666);
X(7667);
X(7668);
X(7669);
X(7670);
X(7671);
X(7672);
X(7673);
X(7674);
X(7675);
X(7676);
X(7677);
X(7678);
X(7679);
X(7680);
X(7681);
X(7682);
X(7683);
X(7684);
X(7685);
X(7686);
X(7687);
X(7688);
X(7689);
X(7690);
X(7691);
X(7692);
X(7693);
X(7694);
X(7695);
X(7696);
X(7697);
X(7698);
X(7699);
X(7700);
X(7701);
X(7702);
X(7703);
X(7704);
X(7705);
X(7706);
X(7707);
X(7708);
X(7709);
X(7710);
X(7711);
X(7712);
X(7713);
X(7714);
X(7715);
X(7716);
X(7717);
X(7718);
X(7719);
X(7720);
X(7721);
X(7722);
X(7723);
X(7724);
X(7725);
X(7726);
X(7727);
X(7728);
X(7729);
X(7730);
X(7731);
X(7732);
X(7733);
X(7734);
X(7735);
X(7736);
X(7737);
X(7738);
X(7739);
X(7740);
X(7741);
X(7742);
X(7743);
X(7744);
X(7745);
X(7746);
X(7747);
X(7748);
X(7749);
X(7750);
X(7751);
X(7752);
X(7753);
X(7754);
X(7755);
X(7756);
X(7757);
X(7758);
X(7759);
X(7760);
X(7761);
X(7762);
X(7763);
X(7764);
X(7765);
X(7766);
X(7767);
X(7768);
X(7769);
X(7770);
X(7771);
X(7772);
X(7773);
X(7774);
X(7775);
X(7776);
X(7777);
X(7778);
X(7779);
X(7780);
X(7781);
X(7782);
X(7783);
X(7784);
X(7785);
X(7786);
X(7787);
X(7788);
X(7789);
X(7790);
X(7791);
X(7792);
X(7793);
X(7794);
X(7795);
X(7796);
X(7797);
X(7798);
X(7799);
X(7800);
X(7801);
X(7802);
X(7803);
X(7804);
X(7805);
X(7806);
X(7807);
X(7808);
X(7809);
X(7810);
X(7811);
X(7812);
X(7813);
X(7814);
X(7815);
X(7816);
X(7817);
X(7818);
X(7819);
X(7820);
X(7821);
X(7822);
X(7823);
X(7824);
X(7825);
X(7826);
X(7827);
X(7828);
X(7829);
X(7830);
X(7831);
X(7832);
X(7833);
X(7834);
X(7835);
X(7836);
X(7837);
X(7838);
X(7839);
X(7840);
X(7841);
X(7842);
X(7843);
X(7844);
X(7845);
X(7846);
X(7847);
X(7848);
X(7849);
X(7850);
X(7851);
X(7852);
X(7853);
X(7854);
X(7855);
X(7856);
X(7857);
X(7858);
X(7859);
X(7860);
X(7861);
X(7862);
X(7863);
X(7864);
X(7865);
X(7866);
X(7867);
X(7868);
X(7869);
X(7870);
X(7871);
X(7872);
X(7873);
X(7874);
X(7875);
X(7876);
X(7877);
X(7878);
X(7879);
X(7880);
X(7881);
X(7882);
X(7883);
X(7884);
X(7885);
X(7886);
X(7887);
X(7888);
X(7889);
X(7890);
X(7891);
X(7892);
X(7893);
X(7894);
X(7895);
X(7896);
X(7897);
X(7898);
X(7899);
X(7900);
X(7901);
X(7902);
X(7903);
X(7904);
X(7905);
X(7906);
X(7907);
X(7908);
X(7909);
X(7910);
X(7911);
X(7912);
X(7913);
X(7914);
X(7915);
X(7916);
X(7917);
X(7918);
X(7919);
X(7920);
X(7921);
X(7922);
X(7923);
X(7924);
X(7925);
X(7926);
X(7927);
X(7928);
X(7929);
X(7930);
X(7931);
X(7932);
X(7933);
X(7934);
X(7935);
X(7936);
X(7937);
X(7938);
X(7939);
X(7940);
X(7941);
X(7942);
X(7943);
X(7944);
X(7945);
X(7946);
X(7947);
X(7948);
X(7949);
X(7950);
X(7951);
X(7952);
X(7953);
X(7954);
X(7955);
X(7956);
X(7957);
X(7958);
X(7959);
X(7960);
X(7961);
X(7962);
X(7963);
X(7964);
X(7965);
X(7966);
X(7967);
X(7968);
X(7969);
X(7970);
X(7971);
X(7972);
X(7973);
X(7974);
X(7975);
X(7976);
X(7977);
X(7978);
X(7979);
X(7980);
X(7981);
X(7982);
X(7983);
X(7984);
X(7985);
X(7986);
X(7987);
X(7988);
X(7989);
X(7990);
X(7991);
X(7992);
X(7993);
X(7994);
X(7995);
X(7996);
X(7997);
X(7998);
X(7999);
X(8000);
X(8001);
X(8002);
X(8003);
X(8004);
X(8005);
X(8006);
X(8007);
X(8008);
X(8009);
X(8010);
X(8011);
X(8012);
X(8013);
X(8014);
X(8015);
X(8016);
X(8017);
X(8018);
X(8019);
X(8020);
X(8021);
X(8022);
X(8023);
X(8024);
X(8025);
X(8026);
X(8027);
X(8028);
X(8029);
X(8030);
X(8031);
X(8032);
X(8033);
X(8034);
X(8035);
X(8036);
X(8037);
X(8038);
X(8039);
X(8040);
X(8041);
X(8042);
X(8043);
X(8044);
X(8045);
X(8046);
X(8047);
X(8048);
X(8049);
X(8050);
X(8051);
X(8052);
X(8053);
X(8054);
X(8055);
X(8056);
X(8057);
X(8058);
X(8059);
X(8060);
X(8061);
X(8062);
X(8063);
X(8064);
X(8065);
X(8066);
X(8067);
X(8068);
X(8069);
X(8070);
X(8071);
X(8072);
X(8073);
X(8074);
X(8075);
X(8076);
X(8077);
X(8078);
X(8079);
X(8080);
X(8081);
X(8082);
X(8083);
X(8084);
X(8085);
X(8086);
X(8087);
X(8088);
X(8089);
X(8090);
X(8091);
X(8092);
X(8093);
X(8094);
X(8095);
X(8096);
X(8097);
X(8098);
X(8099);
X(8100);
X(8101);
X(8102);
X(8103);
X(8104);
X(8105);
X(8106);
X(8107);
X(8108);
X(8109);
X(8110);
X(8111);
X(8112);
X(8113);
X(8114);
X(8115);
X(8116);
X(8117);
X(8118);
X(8119);
X(8120);
X(8121);
X(8122);
X(8123);
X(8124);
X(8125);
X(8126);
X(8127);
X(8128);
X(8129);
X(8130);
X(8131);
X(8132);
X(8133);
X(8134);
X(8135);
X(8136);
X(8137);
X(8138);
X(8139);
X(8140);
X(8141);
X(8142);
X(8143);
X(8144);
X(8145);
X(8146);
X(8147);
X(8148);
X(8149);
X(8150);
X(8151);
X(8152);
X(8153);
X(8154);
X(8155);
X(8156);
X(8157);
X(8158);
X(8159);
X(8160);
X(8161);
X(8162);
X(8163);
X(8164);
X(8165);
X(8166);
X(8167);
X(8168);
X(8169);
X(8170);
X(8171);
X(8172);
X(8173);
X(8174);
X(8175);
X(8176);
X(8177);
X(8178);
X(8179);
X(8180);
X(8181);
X(8182);
X(8183);
X(8184);
X(8185);
X(8186);
X(8187);
X(8188);
X(8189);
X(8190);
X(8191);
X(8192);
X(8193);
X(8194);
X(8195);
X(8196);
X(8197);
X(8198);
X(8199);
X(8200);
X(8201);
X(8202);
X(8203);
X(8204);
X(8205);
X(8206);
X(8207);
X(8208);
X(8209);
X(8210);
X(8211);
X(8212);
X(8213);
X(8214);
X(8215);
X(8216);
X(8217);
X(8218);
X(8219);
X(8220);
X(8221);
X(8222);
X(8223);
X(8224);
X(8225);
X(8226);
X(8227);
X(8228);
X(8229);
X(8230);
X(8231);
X(8232);
X(8233);
X(8234);
X(8235);
X(8236);
X(8237);
X(8238);
X(8239);
X(8240);
X(8241);
X(8242);
X(8243);
X(8244);
X(8245);
X(8246);
X(8247);
X(8248);
X(8249);
X(8250);
X(8251);
X(8252);
X(8253);
X(8254);
X(8255);
X(8256);
X(8257);
X(8258);
X(8259);
X(8260);
X(8261);
X(8262);
X(8263);
X(8264);
X(8265);
X(8266);
X(8267);
X(8268);
X(8269);
X(8270);
X(8271);
X(8272);
X(8273);
X(8274);
X(8275);
X(8276);
X(8277);
X(8278);
X(8279);
X(8280);
X(8281);
X(8282);
X(8283);
X(8284);
X(8285);
X(8286);
X(8287);
X(8288);
X(8289);
X(8290);
X(8291);
X(8292);
X(8293);
X(8294);
X(8295);
X(8296);
X(8297);
X(8298);
X(8299);
X(8300);
X(8301);
X(8302);
X(8303);
X(8304);
X(8305);
X(8306);
X(8307);
X(8308);
X(8309);
X(8310);
X(8311);
X(8312);
X(8313);
X(8314);
X(8315);
X(8316);
X(8317);
X(8318);
X(8319);
X(8320);
X(8321);
X(8322);
X(8323);
X(8324);
X(8325);
X(8326);
X(8327);
X(8328);
X(8329);
X(8330);
X(8331);
X(8332);
X(8333);
X(8334);
X(8335);
X(8336);
X(8337);
X(8338);
X(8339);
X(8340);
X(8341);
X(8342);
X(8343);
X(8344);
X(8345);
X(8346);
X(8347);
X(8348);
X(8349);
X(8350);
X(8351);
X(8352);
X(8353);
X(8354);
X(8355);
X(8356);
X(8357);
X(8358);
X(8359);
X(8360);
X(8361);
X(8362);
X(8363);
X(8364);
X(8365);
X(8366);
X(8367);
X(8368);
X(8369);
X(8370);
X(8371);
X(8372);
X(8373);
X(8374);
X(8375);
X(8376);
X(8377);
X(8378);
X(8379);
X(8380);
X(8381);
X(8382);
X(8383);
X(8384);
X(8385);
X(8386);
X(8387);
X(8388);
X(8389);
X(8390);
X(8391);
X(8392);
X(8393);
X(8394);
X(8395);
X(8396);
X(8397);
X(8398);
X(8399);
X(8400);
X(8401);
X(8402);
X(8403);
X(8404);
X(8405);
X(8406);
X(8407);
X(8408);
X(8409);
X(8410);
X(8411);
X(8412);
X(8413);
X(8414);
X(8415);
X(8416);
X(8417);
X(8418);
X(8419);
X(8420);
X(8421);
X(8422);
X(8423);
X(8424);
X(8425);
X(8426);
X(8427);
X(8428);
X(8429);
X(8430);
X(8431);
X(8432);
X(8433);
X(8434);
X(8435);
X(8436);
X(8437);
X(8438);
X(8439);
X(8440);
X(8441);
X(8442);
X(8443);
X(8444);
X(8445);
X(8446);
X(8447);
X(8448);
X(8449);
X(8450);
X(8451);
X(8452);
X(8453);
X(8454);
X(8455);
X(8456);
X(8457);
X(8458);
X(8459);
X(8460);
X(8461);
X(8462);
X(8463);
X(8464);
X(8465);
X(8466);
X(8467);
X(8468);
X(8469);
X(8470);
X(8471);
X(8472);
X(8473);
X(8474);
X(8475);
X(8476);
X(8477);
X(8478);
X(8479);
X(8480);
X(8481);
X(8482);
X(8483);
X(8484);
X(8485);
X(8486);
X(8487);
X(8488);
X(8489);
X(8490);
X(8491);
X(8492);
X(8493);
X(8494);
X(8495);
X(8496);
X(8497);
X(8498);
X(8499);
X(8500);
X(8501);
X(8502);
X(8503);
X(8504);
X(8505);
X(8506);
X(8507);
X(8508);
X(8509);
X(8510);
X(8511);
X(8512);
X(8513);
X(8514);
X(8515);
X(8516);
X(8517);
X(8518);
X(8519);
X(8520);
X(8521);
X(8522);
X(8523);
X(8524);
X(8525);
X(8526);
X(8527);
X(8528);
X(8529);
X(8530);
X(8531);
X(8532);
X(8533);
X(8534);
X(8535);
X(8536);
X(8537);
X(8538);
X(8539);
X(8540);
X(8541);
X(8542);
X(8543);
X(8544);
X(8545);
X(8546);
X(8547);
X(8548);
X(8549);
X(8550);
X(8551);
X(8552);
X(8553);
X(8554);
X(8555);
X(8556);
X(8557);
X(8558);
X(8559);
X(8560);
X(8561);
X(8562);
X(8563);
X(8564);
X(8565);
X(8566);
X(8567);
X(8568);
X(8569);
X(8570);
X(8571);
X(8572);
X(8573);
X(8574);
X(8575);
X(8576);
X(8577);
X(8578);
X(8579);
X(8580);
X(8581);
X(8582);
X(8583);
X(8584);
X(8585);
X(8586);
X(8587);
X(8588);
X(8589);
X(8590);
X(8591);
X(8592);
X(8593);
X(8594);
X(8595);
X(8596);
X(8597);
X(8598);
X(8599);
X(8600);
X(8601);
X(8602);
X(8603);
X(8604);
X(8605);
X(8606);
X(8607);
X(8608);
X(8609);
X(8610);
X(8611);
X(8612);
X(8613);
X(8614);
X(8615);
X(8616);
X(8617);
X(8618);
X(8619);
X(8620);
X(8621);
X(8622);
X(8623);
X(8624);
X(8625);
X(8626);
X(8627);
X(8628);
X(8629);
X(8630);
X(8631);
X(8632);
X(8633);
X(8634);
X(8635);
X(8636);
X(8637);
X(8638);
X(8639);
X(8640);
X(8641);
X(8642);
X(8643);
X(8644);
X(8645);
X(8646);
X(8647);
X(8648);
X(8649);
X(8650);
X(8651);
X(8652);
X(8653);
X(8654);
X(8655);
X(8656);
X(8657);
X(8658);
X(8659);
X(8660);
X(8661);
X(8662);
X(8663);
X(8664);
X(8665);
X(8666);
X(8667);
X(8668);
X(8669);
X(8670);
X(8671);
X(8672);
X(8673);
X(8674);
X(8675);
X(8676);
X(8677);
X(8678);
X(8679);
X(8680);
X(8681);
X(8682);
X(8683);
X(8684);
X(8685);
X(8686);
X(8687);
X(8688);
X(8689);
X(8690);
X(8691);
X(8692);
X(8693);
X(8694);
X(8695);
X(8696);
X(8697);
X(8698);
X(8699);
X(8700);
X(8701);
X(8702);
X(8703);
X(8704);
X(8705);
X(8706);
X(8707);
X(8708);
X(8709);
X(8710);
X(8711);
X(8712);
X(8713);
X(8714);
X(8715);
X(8716);
X(8717);
X(8718);
X(8719);
X(8720);
X(8721);
X(8722);
X(8723);
X(8724);
X(8725);
X(8726);
X(8727);
X(8728);
X(8729);
X(8730);
X(8731);
X(8732);
X(8733);
X(8734);
X(8735);
X(8736);
X(8737);
X(8738);
X(8739);
X(8740);
X(8741);
X(8742);
X(8743);
X(8744);
X(8745);
X(8746);
X(8747);
X(8748);
X(8749);
X(8750);
X(8751);
X(8752);
X(8753);
X(8754);
X(8755);
X(8756);
X(8757);
X(8758);
X(8759);
X(8760);
X(8761);
X(8762);
X(8763);
X(8764);
X(8765);
X(8766);
X(8767);
X(8768);
X(8769);
X(8770);
X(8771);
X(8772);
X(8773);
X(8774);
X(8775);
X(8776);
X(8777);
X(8778);
X(8779);
X(8780);
X(8781);
X(8782);
X(8783);
X(8784);
X(8785);
X(8786);
X(8787);
X(8788);
X(8789);
X(8790);
X(8791);
X(8792);
X(8793);
X(8794);
X(8795);
X(8796);
X(8797);
X(8798);
X(8799);
X(8800);
X(8801);
X(8802);
X(8803);
X(8804);
X(8805);
X(8806);
X(8807);
X(8808);
X(8809);
X(8810);
X(8811);
X(8812);
X(8813);
X(8814);
X(8815);
X(8816);
X(8817);
X(8818);
X(8819);
X(8820);
X(8821);
X(8822);
X(8823);
X(8824);
X(8825);
X(8826);
X(8827);
X(8828);
X(8829);
X(8830);
X(8831);
X(8832);
X(8833);
X(8834);
X(8835);
X(8836);
X(8837);
X(8838);
X(8839);
X(8840);
X(8841);
X(8842);
X(8843);
X(8844);
X(8845);
X(8846);
X(8847);
X(8848);
X(8849);
X(8850);
X(8851);
X(8852);
X(8853);
X(8854);
X(8855);
X(8856);
X(8857);
X(8858);
X(8859);
X(8860);
X(8861);
X(8862);
X(8863);
X(8864);
X(8865);
X(8866);
X(8867);
X(8868);
X(8869);
X(8870);
X(8871);
X(8872);
X(8873);
X(8874);
X(8875);
X(8876);
X(8877);
X(8878);
X(8879);
X(8880);
X(8881);
X(8882);
X(8883);
X(8884);
X(8885);
X(8886);
X(8887);
X(8888);
X(8889);
X(8890);
X(8891);
X(8892);
X(8893);
X(8894);
X(8895);
X(8896);
X(8897);
X(8898);
X(8899);
X(8900);
X(8901);
X(8902);
X(8903);
X(8904);
X(8905);
X(8906);
X(8907);
X(8908);
X(8909);
X(8910);
X(8911);
X(8912);
X(8913);
X(8914);
X(8915);
X(8916);
X(8917);
X(8918);
X(8919);
X(8920);
X(8921);
X(8922);
X(8923);
X(8924);
X(8925);
X(8926);
X(8927);
X(8928);
X(8929);
X(8930);
X(8931);
X(8932);
X(8933);
X(8934);
X(8935);
X(8936);
X(8937);
X(8938);
X(8939);
X(8940);
X(8941);
X(8942);
X(8943);
X(8944);
X(8945);
X(8946);
X(8947);
X(8948);
X(8949);
X(8950);
X(8951);
X(8952);
X(8953);
X(8954);
X(8955);
X(8956);
X(8957);
X(8958);
X(8959);
X(8960);
X(8961);
X(8962);
X(8963);
X(8964);
X(8965);
X(8966);
X(8967);
X(8968);
X(8969);
X(8970);
X(8971);
X(8972);
X(8973);
X(8974);
X(8975);
X(8976);
X(8977);
X(8978);
X(8979);
X(8980);
X(8981);
X(8982);
X(8983);
X(8984);
X(8985);
X(8986);
X(8987);
X(8988);
X(8989);
X(8990);
X(8991);
X(8992);
X(8993);
X(8994);
X(8995);
X(8996);
X(8997);
X(8998);
X(8999);
X(9000);
X(9001);
X(9002);
X(9003);
X(9004);
X(9005);
X(9006);
X(9007);
X(9008);
X(9009);
X(9010);
X(9011);
X(9012);
X(9013);
X(9014);
X(9015);
X(9016);
X(9017);
X(9018);
X(9019);
X(9020);
X(9021);
X(9022);
X(9023);
X(9024);
X(9025);
X(9026);
X(9027);
X(9028);
X(9029);
X(9030);
X(9031);
X(9032);
X(9033);
X(9034);
X(9035);
X(9036);
X(9037);
X(9038);
X(9039);
X(9040);
X(9041);
X(9042);
X(9043);
X(9044);
X(9045);
X(9046);
X(9047);
X(9048);
X(9049);
X(9050);
X(9051);
X(9052);
X(9053);
X(9054);
X(9055);
X(9056);
X(9057);
X(9058);
X(9059);
X(9060);
X(9061);
X(9062);
X(9063);
X(9064);
X(9065);
X(9066);
X(9067);
X(9068);
X(9069);
X(9070);
X(9071);
X(9072);
X(9073);
X(9074);
X(9075);
X(9076);
X(9077);
X(9078);
X(9079);
X(9080);
X(9081);
X(9082);
X(9083);
X(9084);
X(9085);
X(9086);
X(9087);
X(9088);
X(9089);
X(9090);
X(9091);
X(9092);
X(9093);
X(9094);
X(9095);
X(9096);
X(9097);
X(9098);
X(9099);
X(9100);
X(9101);
X(9102);
X(9103);
X(9104);
X(9105);
X(9106);
X(9107);
X(9108);
X(9109);
X(9110);
X(9111);
X(9112);
X(9113);
X(9114);
X(9115);
X(9116);
X(9117);
X(9118);
X(9119);
X(9120);
X(9121);
X(9122);
X(9123);
X(9124);
X(9125);
X(9126);
X(9127);
X(9128);
X(9129);
X(9130);
X(9131);
X(9132);
X(9133);
X(9134);
X(9135);
X(9136);
X(9137);
X(9138);
X(9139);
X(9140);
X(9141);
X(9142);
X(9143);
X(9144);
X(9145);
X(9146);
X(9147);
X(9148);
X(9149);
X(9150);
X(9151);
X(9152);
X(9153);
X(9154);
X(9155);
X(9156);
X(9157);
X(9158);
X(9159);
X(9160);
X(9161);
X(9162);
X(9163);
X(9164);
X(9165);
X(9166);
X(9167);
X(9168);
X(9169);
X(9170);
X(9171);
X(9172);
X(9173);
X(9174);
X(9175);
X(9176);
X(9177);
X(9178);
X(9179);
X(9180);
X(9181);
X(9182);
X(9183);
X(9184);
X(9185);
X(9186);
X(9187);
X(9188);
X(9189);
X(9190);
X(9191);
X(9192);
X(9193);
X(9194);
X(9195);
X(9196);
X(9197);
X(9198);
X(9199);
X(9200);
X(9201);
X(9202);
X(9203);
X(9204);
X(9205);
X(9206);
X(9207);
X(9208);
X(9209);
X(9210);
X(9211);
X(9212);
X(9213);
X(9214);
X(9215);
X(9216);
X(9217);
X(9218);
X(9219);
X(9220);
X(9221);
X(9222);
X(9223);
X(9224);
X(9225);
X(9226);
X(9227);
X(9228);
X(9229);
X(9230);
X(9231);
X(9232);
X(9233);
X(9234);
X(9235);
X(9236);
X(9237);
X(9238);
X(9239);
X(9240);
X(9241);
X(9242);
X(9243);
X(9244);
X(9245);
X(9246);
X(9247);
X(9248);
X(9249);
X(9250);
X(9251);
X(9252);
X(9253);
X(9254);
X(9255);
X(9256);
X(9257);
X(9258);
X(9259);
X(9260);
X(9261);
X(9262);
X(9263);
X(9264);
X(9265);
X(9266);
X(9267);
X(9268);
X(9269);
X(9270);
X(9271);
X(9272);
X(9273);
X(9274);
X(9275);
X(9276);
X(9277);
X(9278);
X(9279);
X(9280);
X(9281);
X(9282);
X(9283);
X(9284);
X(9285);
X(9286);
X(9287);
X(9288);
X(9289);
X(9290);
X(9291);
X(9292);
X(9293);
X(9294);
X(9295);
X(9296);
X(9297);
X(9298);
X(9299);
X(9300);
X(9301);
X(9302);
X(9303);
X(9304);
X(9305);
X(9306);
X(9307);
X(9308);
X(9309);
X(9310);
X(9311);
X(9312);
X(9313);
X(9314);
X(9315);
X(9316);
X(9317);
X(9318);
X(9319);
X(9320);
X(9321);
X(9322);
X(9323);
X(9324);
X(9325);
X(9326);
X(9327);
X(9328);
X(9329);
X(9330);
X(9331);
X(9332);
X(9333);
X(9334);
X(9335);
X(9336);
X(9337);
X(9338);
X(9339);
X(9340);
X(9341);
X(9342);
X(9343);
X(9344);
X(9345);
X(9346);
X(9347);
X(9348);
X(9349);
X(9350);
X(9351);
X(9352);
X(9353);
X(9354);
X(9355);
X(9356);
X(9357);
X(9358);
X(9359);
X(9360);
X(9361);
X(9362);
X(9363);
X(9364);
X(9365);
X(9366);
X(9367);
X(9368);
X(9369);
X(9370);
X(9371);
X(9372);
X(9373);
X(9374);
X(9375);
X(9376);
X(9377);
X(9378);
X(9379);
X(9380);
X(9381);
X(9382);
X(9383);
X(9384);
X(9385);
X(9386);
X(9387);
X(9388);
X(9389);
X(9390);
X(9391);
X(9392);
X(9393);
X(9394);
X(9395);
X(9396);
X(9397);
X(9398);
X(9399);
X(9400);
X(9401);
X(9402);
X(9403);
X(9404);
X(9405);
X(9406);
X(9407);
X(9408);
X(9409);
X(9410);
X(9411);
X(9412);
X(9413);
X(9414);
X(9415);
X(9416);
X(9417);
X(9418);
X(9419);
X(9420);
X(9421);
X(9422);
X(9423);
X(9424);
X(9425);
X(9426);
X(9427);
X(9428);
X(9429);
X(9430);
X(9431);
X(9432);
X(9433);
X(9434);
X(9435);
X(9436);
X(9437);
X(9438);
X(9439);
X(9440);
X(9441);
X(9442);
X(9443);
X(9444);
X(9445);
X(9446);
X(9447);
X(9448);
X(9449);
X(9450);
X(9451);
X(9452);
X(9453);
X(9454);
X(9455);
X(9456);
X(9457);
X(9458);
X(9459);
X(9460);
X(9461);
X(9462);
X(9463);
X(9464);
X(9465);
X(9466);
X(9467);
X(9468);
X(9469);
X(9470);
X(9471);
X(9472);
X(9473);
X(9474);
X(9475);
X(9476);
X(9477);
X(9478);
X(9479);
X(9480);
X(9481);
X(9482);
X(9483);
X(9484);
X(9485);
X(9486);
X(9487);
X(9488);
X(9489);
X(9490);
X(9491);
X(9492);
X(9493);
X(9494);
X(9495);
X(9496);
X(9497);
X(9498);
X(9499);
X(9500);
X(9501);
X(9502);
X(9503);
X(9504);
X(9505);
X(9506);
X(9507);
X(9508);
X(9509);
X(9510);
X(9511);
X(9512);
X(9513);
X(9514);
X(9515);
X(9516);
X(9517);
X(9518);
X(9519);
X(9520);
X(9521);
X(9522);
X(9523);
X(9524);
X(9525);
X(9526);
X(9527);
X(9528);
X(9529);
X(9530);
X(9531);
X(9532);
X(9533);
X(9534);
X(9535);
X(9536);
X(9537);
X(9538);
X(9539);
X(9540);
X(9541);
X(9542);
X(9543);
X(9544);
X(9545);
X(9546);
X(9547);
X(9548);
X(9549);
X(9550);
X(9551);
X(9552);
X(9553);
X(9554);
X(9555);
X(9556);
X(9557);
X(9558);
X(9559);
X(9560);
X(9561);
X(9562);
X(9563);
X(9564);
X(9565);
X(9566);
X(9567);
X(9568);
X(9569);
X(9570);
X(9571);
X(9572);
X(9573);
X(9574);
X(9575);
X(9576);
X(9577);
X(9578);
X(9579);
X(9580);
X(9581);
X(9582);
X(9583);
X(9584);
X(9585);
X(9586);
X(9587);
X(9588);
X(9589);
X(9590);
X(9591);
X(9592);
X(9593);
X(9594);
X(9595);
X(9596);
X(9597);
X(9598);
X(9599);
X(9600);
X(9601);
X(9602);
X(9603);
X(9604);
X(9605);
X(9606);
X(9607);
X(9608);
X(9609);
X(9610);
X(9611);
X(9612);
X(9613);
X(9614);
X(9615);
X(9616);
X(9617);
X(9618);
X(9619);
X(9620);
X(9621);
X(9622);
X(9623);
X(9624);
X(9625);
X(9626);
X(9627);
X(9628);
X(9629);
X(9630);
X(9631);
X(9632);
X(9633);
X(9634);
X(9635);
X(9636);
X(9637);
X(9638);
X(9639);
X(9640);
X(9641);
X(9642);
X(9643);
X(9644);
X(9645);
X(9646);
X(9647);
X(9648);
X(9649);
X(9650);
X(9651);
X(9652);
X(9653);
X(9654);
X(9655);
X(9656);
X(9657);
X(9658);
X(9659);
X(9660);
X(9661);
X(9662);
X(9663);
X(9664);
X(9665);
X(9666);
X(9667);
X(9668);
X(9669);
X(9670);
X(9671);
X(9672);
X(9673);
X(9674);
X(9675);
X(9676);
X(9677);
X(9678);
X(9679);
X(9680);
X(9681);
X(9682);
X(9683);
X(9684);
X(9685);
X(9686);
X(9687);
X(9688);
X(9689);
X(9690);
X(9691);
X(9692);
X(9693);
X(9694);
X(9695);
X(9696);
X(9697);
X(9698);
X(9699);
X(9700);
X(9701);
X(9702);
X(9703);
X(9704);
X(9705);
X(9706);
X(9707);
X(9708);
X(9709);
X(9710);
X(9711);
X(9712);
X(9713);
X(9714);
X(9715);
X(9716);
X(9717);
X(9718);
X(9719);
X(9720);
X(9721);
X(9722);
X(9723);
X(9724);
X(9725);
X(9726);
X(9727);
X(9728);
X(9729);
X(9730);
X(9731);
X(9732);
X(9733);
X(9734);
X(9735);
X(9736);
X(9737);
X(9738);
X(9739);
X(9740);
X(9741);
X(9742);
X(9743);
X(9744);
X(9745);
X(9746);
X(9747);
X(9748);
X(9749);
X(9750);
X(9751);
X(9752);
X(9753);
X(9754);
X(9755);
X(9756);
X(9757);
X(9758);
X(9759);
X(9760);
X(9761);
X(9762);
X(9763);
X(9764);
X(9765);
X(9766);
X(9767);
X(9768);
X(9769);
X(9770);
X(9771);
X(9772);
X(9773);
X(9774);
X(9775);
X(9776);
X(9777);
X(9778);
X(9779);
X(9780);
X(9781);
X(9782);
X(9783);
X(9784);
X(9785);
X(9786);
X(9787);
X(9788);
X(9789);
X(9790);
X(9791);
X(9792);
X(9793);
X(9794);
X(9795);
X(9796);
X(9797);
X(9798);
X(9799);
X(9800);
X(9801);
X(9802);
X(9803);
X(9804);
X(9805);
X(9806);
X(9807);
X(9808);
X(9809);
X(9810);
X(9811);
X(9812);
X(9813);
X(9814);
X(9815);
X(9816);
X(9817);
X(9818);
X(9819);
X(9820);
X(9821);
X(9822);
X(9823);
X(9824);
X(9825);
X(9826);
X(9827);
X(9828);
X(9829);
X(9830);
X(9831);
X(9832);
X(9833);
X(9834);
X(9835);
X(9836);
X(9837);
X(9838);
X(9839);
X(9840);
X(9841);
X(9842);
X(9843);
X(9844);
X(9845);
X(9846);
X(9847);
X(9848);
X(9849);
X(9850);
X(9851);
X(9852);
X(9853);
X(9854);
X(9855);
X(9856);
X(9857);
X(9858);
X(9859);
X(9860);
X(9861);
X(9862);
X(9863);
X(9864);
X(9865);
X(9866);
X(9867);
X(9868);
X(9869);
X(9870);
X(9871);
X(9872);
X(9873);
X(9874);
X(9875);
X(9876);
X(9877);
X(9878);
X(9879);
X(9880);
X(9881);
X(9882);
X(9883);
X(9884);
X(9885);
X(9886);
X(9887);
X(9888);
X(9889);
X(9890);
X(9891);
X(9892);
X(9893);
X(9894);
X(9895);
X(9896);
X(9897);
X(9898);
X(9899);
X(9900);
X(9901);
X(9902);
X(9903);
X(9904);
X(9905);
X(9906);
X(9907);
X(9908);
X(9909);
X(9910);
X(9911);
X(9912);
X(9913);
X(9914);
X(9915);
X(9916);
X(9917);
X(9918);
X(9919);
X(9920);
X(9921);
X(9922);
X(9923);
X(9924);
X(9925);
X(9926);
X(9927);
X(9928);
X(9929);
X(9930);
X(9931);
X(9932);
X(9933);
X(9934);
X(9935);
X(9936);
X(9937);
X(9938);
X(9939);
X(9940);
X(9941);
X(9942);
X(9943);
X(9944);
X(9945);
X(9946);
X(9947);
X(9948);
X(9949);
X(9950);
X(9951);
X(9952);
X(9953);
X(9954);
X(9955);
X(9956);
X(9957);
X(9958);
X(9959);
X(9960);
X(9961);
X(9962);
X(9963);
X(9964);
X(9965);
X(9966);
X(9967);
X(9968);
X(9969);
X(9970);
X(9971);
X(9972);
X(9973);
X(9974);
X(9975);
X(9976);
X(9977);
X(9978);
X(9979);
X(9980);
X(9981);
X(9982);
X(9983);
X(9984);
X(9985);
X(9986);
X(9987);
X(9988);
X(9989);
X(9990);
X(9991);
X(9992);
X(9993);
X(9994);
X(9995);
X(9996);
X(9997);
X(9998);
X(9999);
X(10000);
}

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] libstdc++: use new built-in trait __is_reference
  2023-03-20 15:23               ` Patrick Palka
@ 2023-03-20 20:24                 ` Ken Matsui
  0 siblings, 0 replies; 12+ messages in thread
From: Ken Matsui @ 2023-03-20 20:24 UTC (permalink / raw)
  To: Patrick Palka; +Cc: Jonathan Wakely, Xi Ruoyao, gcc-patches, libstdc++

[-- Attachment #1: Type: text/plain, Size: 3980 bytes --]

Thank you so much for taking the benchmark! This is a great improvement
than I thought.

In GCC contributions, do I need to benchmark (and report) every built-in
trait I implement?

On Mon, Mar 20, 2023 at 8:24 AM Patrick Palka <ppalka@redhat.com> wrote:

> On Mon, Mar 20, 2023 at 5:56 AM Ken Matsui <kmatsui@cs.washington.edu>
> wrote:
> >
> > > Does it actually make compilation faster though?
> > >
> > > Has it been measured?
> >
> > In my understanding, what I have implemented so far is so simple that
> > it does not affect the speed. These traits are what Partick kindly
> > recommended to get started. As explained on the GSoC page, some traits
> > might involve expensive instantiation of multiple class templates. So
> > IMHO, implementing built-in traits for those traits can make
> > compilation cheaper.
> >
> > I have not measured it, but Patrick might have done?
>
> Although the native implementation of using two partial
> specializations is very efficient, I'd suspect using a built-in would
> be even better because it'd avoid the work of having to figure out
> which of the two partial specializations to instantiate.
>
> I contrived the attached benchmark to measure this, which instantiates
> ~160k specializations of is_reference_v (it was simpler to write a
> benchmark for the variable template version). On my machine gcc trunk
> (release build) as well as Clang 15 use between 10-15% less
> time/memory with -DUSE_BUILTIN than without for this benchmark, so
> this suggests the built-in improves compile time/memory usage for this
> trait by at least 10-15%.  For more complicated traits the improvement
> should be even better.
>
> >
> > On Mon, Mar 20, 2023 at 2:14 AM Jonathan Wakely <jwakely.gcc@gmail.com>
> wrote:
> > >
> > > On Mon, 20 Mar 2023 at 08:08, Xi Ruoyao via Libstdc++
> > > <libstdc++@gcc.gnu.org> wrote:
> > > >
> > > > On Mon, 2023-03-20 at 01:03 -0700, Ken Matsui wrote:
> > > > > Oops, I assumed those were my email... Thank you for your heads up
> and
> > > > > your comments!
> > > > >
> > > > > > Bad ChangeLog format.  You should have a tab (not 4 or 8 spaces,
> nor
> > > > > > nothing) to indent the ChangeLog content.
> > > > >
> > > > > Do you mean like the following?
> > > > >
> > > > > ```
> > > > > libstdc++-v3/ChangeLog:
> > > > >
> > > > > [TAB]* include/std/type_traits (is_reference): Use __is_reference
> > > > > built-in
> > > > > trait.
> > > > > ```
> > > >
> > > > Yep.
> > > >
> > > > > > Is there any benefit to use a builtin, instead of the existing
> > > > > > implementation?  I can see no but maybe I'm stupid.
> > > > >
> > > > > My patches are based on the GSoC project "C++: Implement compiler
> > > > > built-in traits for the standard library traits". These built-in
> > > > > traits basically make the compilation faster.
> > > > >
> > > > > https://gcc.gnu.org/wiki/SummerOfCode
> > > >
> > > > Ok, to me making compilation faster is a valid reason.
> > >
> > > Does it actually make compilation faster though?
> > >
> > > Has it been measured?
> > >
> > > > > > The patch fails to apply.  It seems because your mail client
> inserted an
> > > > > > additional newline before "b/".  Try to use git-send-email or
> configure
> > > > > > the mail client properly.
> > > > >
> > > > > Let me try to use git-send-email instead. I stupidly don't
> understand
> > > > > how to use them, so I was making my patches manually...
> > > >
> > > > Or adjust the mail client correctly.  You can send the patch to
> yourself
> > > > first and see if it's not "mangled" by the mail client when you debug
> > > > such an issue...
> > > >
> > > > But when you finally end up sending 10 patches in a series you'll
> find
> > > > git send-email much easier :).
> > >
> > > Figuring out how to generate proper patches is an important part of
> > > contributing to GCC, so part of any GSoC project.
> >
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-03-20 20:24 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-19  4:21 [PATCH] libstdc++: use new built-in trait __is_reference Ken Matsui
2023-03-20  7:25 ` Xi Ruoyao
2023-03-20  7:30   ` Ken Matsui
2023-03-20  7:51     ` Xi Ruoyao
2023-03-20  8:03       ` Ken Matsui
2023-03-20  8:07         ` Xi Ruoyao
2023-03-20  8:32           ` Ken Matsui
2023-03-20  9:14           ` Jonathan Wakely
2023-03-20  9:56             ` Ken Matsui
2023-03-20 13:22               ` Ken Matsui
2023-03-20 15:23               ` Patrick Palka
2023-03-20 20:24                 ` Ken Matsui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).