www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - From a C++/JS benchmark

reply bearophile <bearophileHUGS lycos.com> writes:
The benchmark info:
http://chadaustin.me/2011/01/digging-into-javascript-performance/

The code, in C++, JS, Java, C#:
https://github.com/chadaustin/Web-Benchmarks/
The C++/JS/Java code runs on a single core.

D2 version translated from the C# version (the C++ version uses struct
inheritance!):
http://ideone.com/kf1tz

Bye,
bearophile
Aug 03 2011
next sibling parent reply Denis Shelomovskij <verylonglogin.reg gmail.com> writes:
03.08.2011 18:20, bearophile:
 The benchmark info:
 http://chadaustin.me/2011/01/digging-into-javascript-performance/

 The code, in C++, JS, Java, C#:
 https://github.com/chadaustin/Web-Benchmarks/
 The C++/JS/Java code runs on a single core.

 D2 version translated from the C# version (the C++ version uses struct
inheritance!):
 http://ideone.com/kf1tz

 Bye,
 bearophile

Compilers: C++: cl /O2 /Oi /Ot /Oy /GT /GL and link /STACK:10240000 Java: Oracle Java 1.6 with hm... Oracle default settings C#: Csc /optimize+ D2: dmd -O -noboundscheck -inline -release Type column: working scalar type Other columns: vertices per second (inaccuracy is about 1%) by language (tests from bearophile's message, C++ test is "skinning_test_no_simd.cpp"). System: Windows XP, Core 2 Duo E6850 ----------------------------------------------------------- Type | C++ | Java | C# | D2 ----------------------------------------------------------- float | 31_400_000 | 17_000_000 | 14_700_000 | 168_000 double | 32_300_000 | 16_000_000 | 14_100_000 | 166_000 real | 32_300_000 | no real | no real | 203_000 int | 29_100_000 | 14_600_000 | 14_100_000 | 16_500_000 long | 29_100_000 | 6_600_000 | 4_400_000 | 5_800_000 ----------------------------------------------------------- JavaScript vs C++ speed is at the first link of original bearophile's post and JS is about 10-20 temes slower than C++. Looks like a spiteful joke... In other words: WTF?! JavaScript is about 10 times faster than D in floating point calculations!? Please, tell me that I'm mistaken.
Aug 03 2011
next sibling parent reply Ziad Hatahet <hatahet gmail.com> writes:
--20cf307abe773cff5f04a99eb2c1
Content-Type: text/plain; charset=ISO-8859-1

I believe that "long" in this case is 32 bits in C++, and 64-bits in the
remaining languages, hence the same result for int and long in C++. Try with
"long long" maybe? :)


--
Ziad


2011/8/3 Denis Shelomovskij <verylonglogin.reg gmail.com>

 03.08.2011 18:20, bearophile:

  The benchmark info:
 http://chadaustin.me/2011/01/**digging-into-javascript-**performance/<http://chadaustin.me/2011/01/digging-into-javascript-performance/>

 The code, in C++, JS, Java, C#:
 https://github.com/chadaustin/**Web-Benchmarks/<https://github.com/chadaustin/Web-Benchmarks/>
 The C++/JS/Java code runs on a single core.

 D2 version translated from the C# version (the C++ version uses struct
 inheritance!):
 http://ideone.com/kf1tz

 Bye,
 bearophile

Compilers: C++: cl /O2 /Oi /Ot /Oy /GT /GL and link /STACK:10240000 Java: Oracle Java 1.6 with hm... Oracle default settings C#: Csc /optimize+ D2: dmd -O -noboundscheck -inline -release Type column: working scalar type Other columns: vertices per second (inaccuracy is about 1%) by language (tests from bearophile's message, C++ test is "skinning_test_no_simd.cpp"). System: Windows XP, Core 2 Duo E6850 ------------------------------**----------------------------- Type | C++ | Java | C# | D2 ------------------------------**----------------------------- float | 31_400_000 | 17_000_000 | 14_700_000 | 168_000 double | 32_300_000 | 16_000_000 | 14_100_000 | 166_000 real | 32_300_000 | no real | no real | 203_000 int | 29_100_000 | 14_600_000 | 14_100_000 | 16_500_000 long | 29_100_000 | 6_600_000 | 4_400_000 | 5_800_000 ------------------------------**----------------------------- JavaScript vs C++ speed is at the first link of original bearophile's post and JS is about 10-20 temes slower than C++. Looks like a spiteful joke... In other words: WTF?! JavaScript is about 10 times faster than D in floating point calculations!? Please, tell me that I'm mistaken.

--20cf307abe773cff5f04a99eb2c1 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable I believe that &quot;long&quot; in this case is 32 bits in C++, and 64-bits= in the remaining languages, hence the same result for int and long in C++.= Try with &quot;long long&quot; maybe? :)<div><br></div><div><br clear=3D"a= ll"> --<br>Ziad<br> <br><br><div class=3D"gmail_quote">2011/8/3 Denis Shelomovskij <span dir=3D= "ltr">&lt;<a href=3D"mailto:verylonglogin.reg gmail.com">verylonglogin.reg = gmail.com</a>&gt;</span><br><blockquote class=3D"gmail_quote" style=3D"marg= in:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"> 03.08.2011 18:20, bearophile:<div><div></div><div class=3D"h5"><br> <blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p= x #ccc solid;padding-left:1ex"> The benchmark info:<br> <a href=3D"http://chadaustin.me/2011/01/digging-into-javascript-performance= /" target=3D"_blank">http://chadaustin.me/2011/01/<u></u>digging-into-javas= cript-<u></u>performance/</a><br> <br> The code, in C++, JS, Java, C#:<br> <a href=3D"https://github.com/chadaustin/Web-Benchmarks/" target=3D"_blank"=
https://github.com/chadaustin/<u></u>Web-Benchmarks/</a><br>

<br> D2 version translated from the C# version (the C++ version uses struct inhe= ritance!):<br> <a href=3D"http://ideone.com/kf1tz" target=3D"_blank">http://ideone.com/kf1= tz</a><br> <br> Bye,<br> bearophile<br> </blockquote> <br></div></div> Compilers:<br> C++: =A0cl /O2 /Oi /Ot /Oy /GT /GL and link /STACK:10240000<br> Java: Oracle Java 1.6 with hm... Oracle default settings<br> C#: =A0 Csc /optimize+<br> D2: =A0 dmd -O -noboundscheck -inline -release<br> <br> Type column: working scalar type<br> Other columns: vertices per second (inaccuracy is about 1%) by language (te= sts from bearophile&#39;s message, C++ test is &quot;skinning_test_no_simd.= cpp&quot;).<br> <br> System: Windows XP, Core 2 Duo E6850<br> <br> ------------------------------<u></u>-----------------------------<br> =A0Type =A0| =A0 =A0C++ =A0 =A0 | =A0 =A0Java =A0 =A0| =A0 =A0 C# =A0 =A0 = | =A0 =A0 D2<br> ------------------------------<u></u>-----------------------------<br> float =A0 | 31_400_000 | 17_000_000 | 14_700_000 | =A0 =A0168_000<br> double =A0| 32_300_000 | 16_000_000 | 14_100_000 | =A0 =A0166_000<br> real =A0 =A0| 32_300_000 | =A0 no real =A0| =A0 no real =A0| =A0 =A0203_000= <br> int =A0 =A0 | 29_100_000 | 14_600_000 | 14_100_000 | 16_500_000<br> long =A0 =A0| 29_100_000 | =A06_600_000 | =A04_400_000 | =A05_800_000<br> ------------------------------<u></u>-----------------------------<br> <br> JavaScript vs C++ speed is at the first link of original bearophile&#39;s p= ost and JS is about 10-20 temes slower than C++.<br> Looks like a spiteful joke... In other words: WTF?! JavaScript is about 10 = times faster than D in floating point calculations!? Please, tell me that I= &#39;m mistaken.<br> </blockquote></div><br></div> --20cf307abe773cff5f04a99eb2c1--
Aug 03 2011
parent reply Denis Shelomovskij <verylonglogin.reg gmail.com> writes:
03.08.2011 22:15, Ziad Hatahet:
 I believe that "long" in this case is 32 bits in C++, and 64-bits in the
 remaining languages, hence the same result for int and long in C++. Try
 with "long long" maybe? :)


 --
 Ziad


 2011/8/3 Denis Shelomovskij <verylonglogin.reg gmail.com
 <mailto:verylonglogin.reg gmail.com>>

     03.08.2011 18:20, bearophile:

         The benchmark info:
         http://chadaustin.me/2011/01/__digging-into-javascript-__performance/
         <http://chadaustin.me/2011/01/digging-into-javascript-performance/>

         The code, in C++, JS, Java, C#:
         https://github.com/chadaustin/__Web-Benchmarks/
         <https://github.com/chadaustin/Web-Benchmarks/>
         The C++/JS/Java code runs on a single core.

         D2 version translated from the C# version (the C++ version uses
         struct inheritance!):
         http://ideone.com/kf1tz

         Bye,
         bearophile


     Compilers:
     C++:  cl /O2 /Oi /Ot /Oy /GT /GL and link /STACK:10240000
     Java: Oracle Java 1.6 with hm... Oracle default settings
     C#:   Csc /optimize+
     D2:   dmd -O -noboundscheck -inline -release

     Type column: working scalar type
     Other columns: vertices per second (inaccuracy is about 1%) by
     language (tests from bearophile's message, C++ test is
     "skinning_test_no_simd.cpp").

     System: Windows XP, Core 2 Duo E6850

     ------------------------------__-----------------------------
       Type  |    C++     |    Java    |     C#     |     D2
     ------------------------------__-----------------------------
     float   | 31_400_000 | 17_000_000 | 14_700_000 |    168_000
     double  | 32_300_000 | 16_000_000 | 14_100_000 |    166_000
     real    | 32_300_000 |   no real  |   no real  |    203_000
     int     | 29_100_000 | 14_600_000 | 14_100_000 | 16_500_000
     long    | 29_100_000 |  6_600_000 |  4_400_000 |  5_800_000
     ------------------------------__-----------------------------

     JavaScript vs C++ speed is at the first link of original
     bearophile's post and JS is about 10-20 temes slower than C++.
     Looks like a spiteful joke... In other words: WTF?! JavaScript is
     about 10 times faster than D in floating point calculations!?
     Please, tell me that I'm mistaken.

Good! This is my first blunder (it's so easy to complitely forget illogical (for me) language design). So, corrected last row: Type | C++ | Java | C# | D2 ------------------------------------------------------------- long | 5_500_000 | 6_600_000 | 4_400_000 | 5_800_000 Java is the fastest "long" language :)
Aug 03 2011
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
 System: Windows XP, Core 2 Duo E6850

Is this Windows XP 32 bit or 64 bit? That will probably make a difference on the longs I'd expect.
Aug 03 2011
next sibling parent reply David Nadlinger <see klickverbot.at> writes:
On 8/3/11 9:48 PM, Adam D. Ruppe wrote:
 System: Windows XP, Core 2 Duo E6850

Is this Windows XP 32 bit or 64 bit? That will probably make a difference on the longs I'd expect.

It doesn't, long is 32-bit wide on Windows x86_64 too (LLP64). David
Aug 03 2011
parent Adam Ruppe <destructionator gmail.com> writes:
Marco Leise wrote:
 I thought he was referring to the processor being able to handle
 64-bit ints more efficiently in 64-bit operation mode on a 64-bit OS
 with 64-bit executables.

I was thinking a little of both but this is the main thing. My suspicion was that Java might have been using a 64 bit JVM and everything else was compiled in 32 bit, causing it to win in that place. But with a 32 bit OS that means 32 bit programs all around.
Aug 04 2011
prev sibling parent Denis Shelomovskij <verylonglogin.reg gmail.com> writes:
03.08.2011 22:48, Adam D. Ruppe пишет:
 System: Windows XP, Core 2 Duo E6850

Is this Windows XP 32 bit or 64 bit? That will probably make a difference on the longs I'd expect.

I meant Windows XP 32 bit (5.1 (Build 2600: Service Pack 3)) (according to what is "Windows XP" in wikipedia)
Aug 03 2011
prev sibling next sibling parent bearophile <bearophileHUGS lycos.com> writes:
Denis Shelomovskij:

 (tests from bearophile's message, C++ test is "skinning_test_no_simd.cpp").

For a more realistic test I suggest you to time the C++ version that uses the intrinsics too (only for float).
 Looks like a spiteful joke... In other words: WTF?! JavaScript is about 
 10 times faster than D in floating point calculations!? Please, tell me 
 that I'm mistaken.

Languages aren't slow or fast, their implementations produce assembly that's more or less efficient. A D1 version fit for LDC V1 with Tango: http://codepad.org/ewDy31UH Vertices (millions), Linux 32 bit: C++ no simd: 29.5 D: 27.6 LDC based on DMD v1.057 and llvm 2.6, ldc -O3 -release -inline G++ V4.3.3, -s -O3 -mfpmath=sse -ffast-math -msse3 It's a bit slower than the C++ version, but for most people that's an acceptable difference (and maybe porting the C++ code to D instead of the C# one and using a more modern LLVM you reduce that loss a bit). Bye, bearophile
Aug 03 2011
prev sibling next sibling parent reply Trass3r <un known.com> writes:
 Looks like a spiteful joke... In other words: WTF?! JavaScript is about  
 10 times faster than D in floating point calculations!? Please, tell me  
 that I'm mistaken.

I'm afraid not. dmd's backend isn't good at floating point calculations.
Aug 03 2011
parent bearophile <bearophileHUGS lycos.com> writes:
Trass3r:

 I'm afraid not. dmd's backend isn't good at floating point calculations.

Studying a bit the asm it's not hard to find the cause, because this benchmark is quite pure (synthetic, despite I think it comes from real-world code). This is what G++ generates from the C++ code without intrinsics (the version that uses SIMD intrinsics has a similar look but it's shorter): movl (%eax), %edx movss 4(%eax), %xmm0 movl 8(%eax), %ecx leal (%edx,%edx,2), %edx sall $4, %edx addl %ebx, %edx testl %ecx, %ecx movss 12(%edx), %xmm1 movss 20(%edx), %xmm7 movss (%edx), %xmm5 mulss %xmm0, %xmm1 mulss %xmm0, %xmm7 movss 4(%edx), %xmm6 movss 8(%edx), %xmm4 movss %xmm1, (%esp) mulss %xmm0, %xmm5 movss 28(%edx), %xmm1 movss %xmm7, 4(%esp) mulss %xmm0, %xmm6 movss 32(%edx), %xmm7 mulss %xmm0, %xmm1 movss 16(%edx), %xmm3 mulss %xmm0, %xmm7 movss 24(%edx), %xmm2 movss %xmm1, 16(%esp) mulss %xmm0, %xmm4 movss 36(%edx), %xmm1 movss %xmm7, 8(%esp) mulss %xmm0, %xmm3 movss 40(%edx), %xmm7 mulss %xmm0, %xmm2 mulss %xmm0, %xmm1 mulss %xmm0, %xmm7 mulss 44(%edx), %xmm0 leal 12(%eax), %edx movss %xmm7, 12(%esp) movss %xmm0, 20(%esp) This is what DMD generates for the same (or quite similar) piece of code: movsd mov EAX,068h[ESP] imul EDX,EAX,030h add EDX,018h[ESP] fld float ptr [EDX] fmul float ptr 06Ch[ESP] fstp float ptr 038h[ESP] fld float ptr 4[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 03Ch[ESP] fld float ptr 8[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 040h[ESP] fld float ptr 0Ch[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 044h[ESP] fld float ptr 010h[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 048h[ESP] fld float ptr 014h[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 04Ch[ESP] fld float ptr 018h[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 050h[ESP] fld float ptr 01Ch[EDX] mov CL,070h[ESP] xor CL,1 fmul float ptr 06Ch[ESP] fstp float ptr 054h[ESP] fld float ptr 020h[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 058h[ESP] fld float ptr 024h[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 05Ch[ESP] fld float ptr 028h[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 060h[ESP] fld float ptr 02Ch[EDX] fmul float ptr 06Ch[ESP] fstp float ptr 064h[ESP] I think DMD back-end already contains logic to use xmm registers as true registers (not as a floating point stack or temporary holes where to push and pull FP values), so I suspect it doesn't take too much work to modify it to emit FP asm with a single optimization: just keep the values inside registers. In my uninformed opinion all other FP optimizations are almost insignificant compared to this one :-) Bye, bearophile
Aug 03 2011
prev sibling parent "Marco Leise" <Marco.Leise gmx.de> writes:
Am 03.08.2011, 21:52 Uhr, schrieb David Nadlinger <see klickverbot.at>:

 On 8/3/11 9:48 PM, Adam D. Ruppe wrote:
 System: Windows XP, Core 2 Duo E6850

Is this Windows XP 32 bit or 64 bit? That will probably make a difference on the longs I'd expect.

It doesn't, long is 32-bit wide on Windows x86_64 too (LLP64). David

I thought he was referring to the processor being able to handle 64-bit ints more efficiently in 64-bit operation mode on a 64-bit OS with 64-bit executables.
Aug 03 2011
prev sibling parent reply Trass3r <un known.com> writes:
C++:
Skinned vertices per second: 48660000

C++ no SIMD:
Skinned vertices per second: 42420000


D dmd:
Skinned vertices per second: 159046

D gdc:
Skinned vertices per second: 23450000



Compilers:

gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
g++ -s -O3 -mfpmath=sse -ffast-math -march=native

DMD64 D Compiler v2.054
dmd -O -noboundscheck -inline -release dver.d

gcc version 4.6.1 20110627 (gdc 0.30, using dmd 2.054) (GCC)
gdc -s -O3 -mfpmath=sse -ffast-math -march=native dver.d


Ubuntu 11.04 x64
Core2 Duo E6300
Aug 03 2011
next sibling parent Trass3r <un known.com> writes:
 C++:
 Skinned vertices per second: 48660000

 C++ no SIMD:
 Skinned vertices per second: 42420000


 D dmd:
 Skinned vertices per second: 159046

 D gdc:
 Skinned vertices per second: 23450000

D ldc: Skinned vertices per second: 37910000 ldc2 -O3 -release -enable-inlining dver.d
Aug 03 2011
prev sibling next sibling parent reply bearophile <bearophileHUGS lycos.com> writes:
Trass3r:

 C++ no SIMD:
 Skinned vertices per second: 42420000
 

 D gdc:
 Skinned vertices per second: 23450000

Are you able and willing to show me the asm produced by gdc? There's a problem there. Bye, bearophile
Aug 03 2011
parent reply Iain Buclaw <ibuclaw ubuntu.com> writes:
== Quote from bearophile (bearophileHUGS lycos.com)'s article
 Trass3r:
 C++ no SIMD:
 Skinned vertices per second: 42420000

 D gdc:
 Skinned vertices per second: 23450000


 Bye,
 bearophile

Notes from me: - Options -fno-bounds-check and -frelease can be just as important in GDC as they are in DMD under certain instances. - You can output asm in intel dialect using -masm=intel if at&t is that difficult for you to read. 8-) I will look into this later from my workstation.
Aug 06 2011
parent reply bearophile <bearophileHUGS lycos.com> writes:
Iain Buclaw:

 I will look into this later from my workstation.

The remaining thing to look at is just the small performance difference between the D-GDC version and the C++-G++ version. Bye, bearophile
Aug 06 2011
parent reply Iain Buclaw <ibuclaw ubuntu.com> writes:
== Quote from bearophile (bearophileHUGS lycos.com)'s article
 Iain Buclaw:
 I will look into this later from my workstation.


 Bye,
 bearophile

Three things that helped improve performance in a minor way for me: 1) using pointers over dynamic arrays. (5% speedup) 2) removing the calls to CalVector4's constructor (5.7% speedup) 3) using core.stdc.time over std.datetime. (1.6% speedup) Point one is pretty well known issue in D as far as I'm aware. Point two is not an issue with inlining (all methods are marked 'inline'), but it did help remove quite a few movss instructions being emitted. Point three is interesting, it seems that "sw.peek().msecs" slows down the number of iterations in the while loop. With those changes, D implementation is still 21% slower than C++ implementation without SIMD. http://ideone.com/4PP2D
Aug 06 2011
next sibling parent reply bearophile <bearophileHUGS lycos.com> writes:
Iain Buclaw:

Are you using GDC2-64 bit on Linux?

 Three things that helped improve performance in a minor way for me:
 1) using pointers over dynamic arrays. (5% speedup)
 2) removing the calls to CalVector4's constructor (5.7% speedup)
 3) using core.stdc.time over std.datetime. (1.6% speedup)
 
 Point one is pretty well known issue in D as far as I'm aware.

Really? I don't remember discussions about it. What is its cause?
 Point two is not an issue with inlining (all methods are marked 'inline'), but
it
 did help remove quite a few movss instructions being emitted.

This too is something worth fixing. Is this issue in Bugzilla already?
 Point three is interesting, it seems that "sw.peek().msecs" slows down the
number
 of iterations in the while loop.

This needs to be fixed.
 With those changes, D implementation is still 21% slower than C++
implementation
 without SIMD.
 http://ideone.com/4PP2D

This is a lot still. Thank you for your work. I think all three issues are worth fixing, eventually. Bye, bearophile
Aug 06 2011
parent Iain Buclaw <ibuclaw ubuntu.com> writes:
== Quote from bearophile (bearophileHUGS lycos.com)'s article
 Iain Buclaw:
 Are you using GDC2-64 bit on Linux?

GDC2-32 bit on Linux.
 Three things that helped improve performance in a minor way for me:
 1) using pointers over dynamic arrays. (5% speedup)
 2) removing the calls to CalVector4's constructor (5.7% speedup)
 3) using core.stdc.time over std.datetime. (1.6% speedup)

 Point one is pretty well known issue in D as far as I'm aware.


I can't remember the exact discussion, but it was something about a benchmark of passing by value vs passing by ref vs passing by pointer.
 Point two is not an issue with inlining (all methods are marked 'inline'), but
it
 did help remove quite a few movss instructions being emitted.


I don't think its an issue really. But of course, there is a difference between what you say and what you mean with regards to the code here (that being, with the first version, lots of temp vars get created and moved around the place). Regards Iain
Aug 06 2011
prev sibling parent reply bearophile <bearophileHUGS lycos.com> writes:
Iain Buclaw:

 1) using pointers over dynamic arrays. (5% speedup)
 2) removing the calls to CalVector4's constructor (5.7% speedup)

With DMD I have seen 180k -> 190k vertices/sec replacing this: struct CalVector4 { float X, Y, Z, W; this(float x, float y, float z, float w = 0.0f) { X = x; Y = y; Z = z; W = w; } } With: struct CalVector4 { float X, Y, Z, W=0.0f; } I'd like the D compiler to optimize better there.
 http://ideone.com/4PP2D

This line of code is not good: auto vertices = cast(Vertex *) new Vertex[N]; This is much better, it's less bug-prone, simpler and shorter: auto vertices = (new Vertex[N]).ptr; But in practice in this program it is enough to allocate dynamic arrays normally, and then perform the call like this (with DMD it gives the same performance): calculateVerticesAndNormals(boneTransforms.ptr, N, vertices.ptr, influences.ptr, output.ptr); I don't know why passing pointers gives some more performance here, compared to passing dynamic arrays (but I have seen the same behaviour in other D programs of mine). Bye, bearophile
Aug 06 2011
next sibling parent reply Walter Bright <newshound2 digitalmars.com> writes:
On 8/6/2011 3:19 PM, bearophile wrote:
 I don't know why passing pointers gives some more performance here, compared
 to passing dynamic arrays (but I have seen the same behaviour in other D
 programs of mine).

A dynamic array is two values being passed, a pointer is one.
Aug 06 2011
parent bearophile <bearophileHUGS lycos.com> writes:
Walter:

 A dynamic array is two values being passed, a pointer is one.

I know, but I think there are many optimization opportunities. An example: private void foo(int[] a2) {} void main() { int[100] a1; foo(a1); } In code like that I think a D compiler is free to compile like this, because foo is private, so it's free to perform optimizations based on just the code inside the module: private void foo(ref int[100] a2) {} void main() { int[100] a1; foo(a1); } I think there are several cases where a D compiler is free to replace the two values with just a pointer. Another example, to optimize code like this: private void foo(int[] a1, int[] a2) {} void main() { int n = 100; // run-time value auto a3 = new int[n]; auto a4 = new int[n]; foo(a3, a4); } Into something like this: private void foo(int* a1, int* a2, size_t a1a2len) {} void main() { int n = 100; auto a3 = new int[n]; auto a4 = new int[n]; foo(a3.ptr, a4.ptr, n); } Bye, bearophile
Aug 06 2011
prev sibling parent reply Iain Buclaw <ibuclaw ubuntu.com> writes:
== Quote from bearophile (bearophileHUGS lycos.com)'s article
 Iain Buclaw:
 1) using pointers over dynamic arrays. (5% speedup)
 2) removing the calls to CalVector4's constructor (5.7% speedup)

struct CalVector4 { float X, Y, Z, W; this(float x, float y, float z, float w = 0.0f) { X = x; Y = y; Z = z; W = w; } } With: struct CalVector4 { float X, Y, Z, W=0.0f; } I'd like the D compiler to optimize better there.
 http://ideone.com/4PP2D

auto vertices = cast(Vertex *) new Vertex[N]; This is much better, it's less bug-prone, simpler and shorter: auto vertices = (new Vertex[N]).ptr; But in practice in this program it is enough to allocate dynamic arrays

performance):
 calculateVerticesAndNormals(boneTransforms.ptr, N, vertices.ptr,
influences.ptr,

I was playing about with heap vs stack. Must've forgot to remove that, sorry. :) Anyways, I've tweaked the GDC codegen, and program speed meets that of C++ now (on my system). Implementation: http://ideone.com/0j0L1 Command-line: gdc -O3 -mfpmath=sse -ffast-math -march=native -frelease g++ bench.cc -O3 -mfpmath=sse -ffast-math -march=native Best times: G++-32bit: 11400000 vps GDC-32bit: 11350000 vps Regards Iain
Aug 06 2011
parent reply bearophile <bearophileHUGS lycos.com> writes:
Iain Buclaw:

 Anyways, I've tweaked the GDC codegen, and program speed meets that of C++ now
(on
 my system).

Are you willing to explain your changes (and maybe give a link to the changes)? Maybe Walter is interested for DMD too.
 Command-line:
 gdc -O3 -mfpmath=sse -ffast-math -march=native -frelease
 g++ bench.cc -O3 -mfpmath=sse -ffast-math -march=native

In newer versions of GCC -Ofast means -ffast-math too. Walter is not a lover of that -ffast-math switch. But I now think that the combination of D strongly pure functions with unsafe FP optimizations offers optimization opportunities that maybe not even GCC is able to use now when it compiles C/C++ code (do you see why?). Not using this opportunity is a waste, in my opinion. Bye, bearophile
Aug 06 2011
parent reply Walter Bright <newshound2 digitalmars.com> writes:
On 8/6/2011 4:46 PM, bearophile wrote:
 Walter is not a lover of that -ffast-math switch.

No, I am not. Few understand the subtleties of IEEE arithmetic, and breaking IEEE conformance is something very, very few should even consider.
Aug 06 2011
parent reply bearophile <bearophileHUGS lycos.com> writes:
Walter:

 On 8/6/2011 4:46 PM, bearophile wrote:
 Walter is not a lover of that -ffast-math switch.

No, I am not. Few understand the subtleties of IEEE arithmetic, and breaking IEEE conformance is something very, very few should even consider.

I have read several papers about FP arithmetic, but I am not an expert yet on them. Both GDC and LDC have compilation switches to perform those unsafe FP optimizations, so even if you don't like them, most D compilers today have them optional, and I don't think those switches will be removed. If you want to simulate a flock of boids (http://en.wikipedia.org/wiki/Boids ) on the screen using D, and you use floating point values to represent their speed vector, introducing unsafe FP optimizations will not harm so much. Video games are a significant purpose for D language, and in them FP errors are often benign (maybe some parts of the game are able to tolerate them and some other part of the game needs to be compiled with strict FP semantics). Bye, bearophile
Aug 06 2011
parent reply "Eric Poggel (JoeCoder)" <dnewsgroup2 yage3d.net> writes:
On 8/6/2011 8:34 PM, bearophile wrote:
 Walter:

 On 8/6/2011 4:46 PM, bearophile wrote:
 Walter is not a lover of that -ffast-math switch.

No, I am not. Few understand the subtleties of IEEE arithmetic, and breaking IEEE conformance is something very, very few should even consider.

I have read several papers about FP arithmetic, but I am not an expert yet on them. Both GDC and LDC have compilation switches to perform those unsafe FP optimizations, so even if you don't like them, most D compilers today have them optional, and I don't think those switches will be removed. If you want to simulate a flock of boids (http://en.wikipedia.org/wiki/Boids ) on the screen using D, and you use floating point values to represent their speed vector, introducing unsafe FP optimizations will not harm so much. Video games are a significant purpose for D language, and in them FP errors are often benign (maybe some parts of the game are able to tolerate them and some other part of the game needs to be compiled with strict FP semantics). Bye, bearophile

Floating point determinism can be very important when it comes to reducing network traffic. If you can achieve it, then you can make sure all players have the same game state and then only send user input commands over the network. Glenn Fiedler has an interesting writeup on it, but I haven't had a chance to read all of it yet: http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/
Aug 07 2011
parent reply bearophile <bearophileHUGS lycos.com> writes:
Eric Poggel (JoeCoder):

 determinism can be very important when it comes to 
 reducing network traffic.  If you can achieve it, then you can make sure 
 all players have the same game state and then only send user input 
 commands over the network.

It seems a hard thing to obtain, but I agree that it gets useful. For me having some FP determinism is useful for debugging: to avoid results from changing randomly if I perform a tiny change in the source code that triggers a change in what optimizations the compiler does. But there are several situations (if I am writing a ray tracer?) where FP determinism is not required in my release build. I was not arguing about removing FP rules from the D compiler, just that there are situations where relaxing those FP rules, on request, doesn't seem to harm. I am not expert about the risks Walter was talking about, so maybe I'm just walking on thin ice (but no one will get hurt if my little raytrcer produces some errors in its images). You don't come often in this newsgroup, thank you for the link :-) Bye, bearophile
Aug 08 2011
parent "Eric Poggel (JoeCoder)" <dnewsgroup2 yage3d.net> writes:
On 8/8/2011 3:02 PM, bearophile wrote:
 Eric Poggel (JoeCoder):

 determinism can be very important when it comes to
 reducing network traffic.  If you can achieve it, then you can make sure
 all players have the same game state and then only send user input
 commands over the network.

It seems a hard thing to obtain, but I agree that it gets useful. For me having some FP determinism is useful for debugging: to avoid results from changing randomly if I perform a tiny change in the source code that triggers a change in what optimizations the compiler does. But there are several situations (if I am writing a ray tracer?) where FP determinism is not required in my release build. I was not arguing about removing FP rules from the D compiler, just that there are situations where relaxing those FP rules, on request, doesn't seem to harm. I am not expert about the risks Walter was talking about, so maybe I'm just walking on thin ice (but no one will get hurt if my little raytrcer produces some errors in its images). You don't come often in this newsgroup, thank you for the link :-) Bye, bearophile

You'd be surprised how much I lurk here. I agree there are some interesting areas where fast floating point may indeed be worth it, but I also don't know enough. I've also wondered about creating a Fixed!(long, 8) struct that would let me work with longs and 8 bits of precision after the decimal point as a way of having equal precision anywhere in a large universe and achieving determinism at the same time. But I don't know how performance would compare vs floats or doubles.
Aug 08 2011
prev sibling next sibling parent reply Trass3r <un known.com> writes:
------------Ic5JB9wJ6xukHxf3C7JHKM
Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes
Content-Transfer-Encoding: 7bit

e you able and willing to show me the asm produced by gdc? There's a
 problem there.

Content-Disposition: attachment; filename=bla.rar Content-Type: application/x-rar-compressed; name=bla.rar Content-Transfer-Encoding: Base64 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 EYhO3OYglwJyU5C9qR/yxbkuwJ0+U/2mapGXzOmRL8JLZbcs6ZGeVI1K5YkiPWJ0 4aROy3P0tzJcd7BJJuB9g1OWWrCUSSwbOkU1ZRY6rAlSqnw6st8YzaokOO0tnf2Y P3L5f964K68Nm2bHJJypqs68SV3ZXQjYJpZsg2dn/W3ZWZTs1U88gHNqOJJvLk1q 2Fftpi/1m1t047o8XAh58jA4KrA+JH8sMzofEve8jZBWzUPyhHPxH9bUVomXQ/Y9 IVwVrw/8sxyW7e8GA/PFm6vTGnoZNdSMT4tS/7Rz5uKDM9PtiYIzOdyy7hlbfdMs 6mY8RoSPCWVESWUw9WPCMrNqmxeb0hy4eMk15RsQAmIHuY0h/RW1kxyrNrrbnV9w /vM4z4dHmWapmNkA+nadMEYz3zIh49hKdMZkixpHMscEybBmIOWZcTCadJhuaEHp E05qv2DoztOqSJwXHu9UHmSqMQwKKmSujNJGPyTMQiH4Aoi32UVGVXNo0eHoL2RQ O8ETFu5+4koxyizaOJSEVw0oPE4Zwz9ZeS4i6Vlv0uSVW3ol13NLjJ8bSUZY6PvA iTa/KjNzGfS6CI3EoBiEMwzFvxnPJYMygalAiWCsuQxoZisadVe++EbXdU+Yva5/ HLJPJXU2kiar33+XMhD751TLqS23llzbGFKUPsXnuGVnFOApOf/ya0k3ozg+lzbN 0lDNzLSbmjuy0dDOzFAvnNFo9DMNF9EN9npyeue/eX4soIx1yGgo5+fXtJ2eohN1 +ioWnX5+amevnqCZn6Oam+vmsf18RjonHQ/X0TSa6+Y0ejmO9x00SpLRy1oblVyX P3ONE5bm2kzOjBybtzo9FQOZNFOLxz8JFO9XlkxHme0Oho2kxnp+bhrldwmMINF6 zEf9PaIU3nEI0bHGpK423WjHTD+pfOPqvCEX4t7pGhujZElKobGW6mKJoWn2boJo 1MXjT5edATLlPSDoQPuxwRDHXJWhxJ0ad7dGLxv+jGIh3VkDaLzjLriOc49XdAkj 9dU8z0kw5VuHlzuyG5nJ/RaW6Dujxgebz90lPmi9FPcyOoyB7HOnblE0TcRnu9uW 82UiSlBKT81mJLLbuG6+OnLqui5jBWzb2Ynp8gG7G7qgqCbc8zc0XuuqWd0NOoCU u8aIQzN07MzZu/N3aGicCPSjjkqam6SQoJp24zLRzo0K6JXfF7KEZg88Ui5HOlnp poWWTE1NXEURZuzmfkcpMMpuQorcz+imCUnO6zHdYSnLp4GTWeoEjTyEzg6HqNyC cR+dWm8W5CzOguBu2rpIlX9PXXrmC4rRr7v4dVc0M5iB/Nd4V5/yUW5tkUOg0zTM bTPM2vYDSjNGCyjysb/TJlR3mWy3g1CiqxaV9+KkvYt8bN7Jns6gYLqD3Vzaz1kq wi0kxbPapx9zJbhuNIJy5iuInDC0fdFDRZvNeO6Dbf2XlPiLDLEANR6ZejslaDSd RHlyYJBHYs6h1Pbu4DGta3OIiSbIW5cpBohgYO6a6FaUY8oI1FX4OOLQ+HQRd6KV y/Fn+lHV+ed3M5MtzULbjff9NQWPtMDIwkZWtPichjpJVCiHLSyNdXb1MBKmN/pg 2Wy8xWnL07uesWnLWTsYpNa+i0xfRj4W/NM2stGAPdX2TZ02w1wCvRbZ9ZSZstLp C5LJ+4HqMzd9ez4PWn0SxrwnSlRLBEueNSvT4AyrCm5fhaSZu4nPca14KMk1FWJt vJNfbRqpKVmPNXcafxIHo70WHq7DCI5HAjxcs2zJb6GmwBlJ3WXLlDOMr6PfWHhu 1EKYVW06Ok7LZbl4JZtMHf4nwrf0dHBRUrF4yHmmHujI6DHSdfnKauUOsmCRafqr qn+3Q9UHpeAu+ZmEmQoa/W0YxtPwKPD0szB2pC7MSF9hiqr2ly0GoenowoxgfdsN W+UzxrqlSt/NVlG1DXWB914C4u/LAikEdaH4asPOND4AqC72gEVgjrg/DWB5xwfA FQXfjgRYCOvD8NcHliHwBUF34QEXAiHD4d0PdCtdKPDJ7aG2qLv6hvTu+1KMrXTE TlNAZ3h/jqH09jrSfg4qvCIYifQcckwYqX+ODyS8QxNfvvYdX7rMG9VK/kjXV20O n4c8JP8o6jss+A6WAKD6dQrLgI8yggbA5INqZSeFVAvwfH+peulLMbTp1MSPcNx2 /su8RxJNawwvPUCIaq/WRrXxhWXuscl6IhOpUuvhL6Xxat2+PGdJSzpwd9V16DcB bT/pLS3JQ/skvOShhk12w8b1pbkMZ1tFdD90oP2mLeGBViwK5XrpPGb8l/1KM1Q8 XS160hwoyQjlhDiY0HljWEvwKvN8OibXSumAnZdw8LNG0j052MWHmPPugetbQrq/ OEIGsRIfVoRdcD7a8GaEI7pgfT2JMh5prTB6XuCAEaVWu6fapStmQxyNPH2+Qw1p Zk80rMMu//LYa8v75rDYH7Fhsj9mwqygjbED5G0H01JKGQgOy9OESG9D8Br70k12 5K+J1ltPX3dsEEWXhEi9l7BwkXYdCkRNy7d6j4I7VR+LOaNLnjXdU23UMuP9DJrX tfa9SwVaxX46irxnqaxkxu3OHJ24Z03IhNHu6r94wVtGCRSrnhLGsmwWSZVYQc1U LA0/KRMpMDjDmlnUEiKgHLO1Hq5KM/xo+lklHrklcaQpbNt79qnaWdg8TWnmFOVo RJBE79USGdGqEm4Wa7D9b0emmsXTJAREcJoGGyMtlUhLT2hLDbTUKyPe1tr2y22j W7qM7cz8UsxrznS6MsKUurtr2HcfjIL1OwqUWf9a+KWuNVgyv0+QnHcIk0lnTPOq jdjNJ5jXhZUQhjgXtZ3XwTyeBWU7+eWWXOkn+15jBJcgsa52fc2JXBM9q16fBlaf bEI9zg3fctksdHNO2b8uv6j8Dq31T1a3UeSiyuofgcw4Fh94p0NPy/77vdwng9Hz Pdg9yKxB8nrMRDU3Jilv4fjG41k/+8c6fHzKdrCgBM+qGhVeAj85BMTPeslKy5/g 9J+vL6jfLfF9Wms+uaXRtn1tHRU/stNEMFlizyBmmvNgQERW8AND099a16LXYRso GBdiCKPbMvSGgJbts2m0VEYitPMcNx61lTctutj68geZy34snbTqE6GPUPeolG2g dIXyZPFcEmxF9R4Qqe+TYl+XBr7XHZVh+/OjvVwcUedKd9sI5G5g+m32ljNPy9b4 3jdHpMJzPxgejk6azyOlyhjskO5dHjIcNP5jMno8K+G/VwYRNxepkLCreMRlcz1F 5GSM0jLkat9DjRlq7v1cy19osvkmMFIZlpJRD1ec2rqxAzFndBVyRxM45hbHP1SS u05Tx9Iv2mHT0Jw4eXk7xHWmE/yBHhjg/SYAP3171lE17bWNdvGVjSETnHWte86y 1K+WbysCNjueKznq1Qf9mXbQ/sj1AccpctHUA49PmbjKQZV/Wd3OCJF9zlFY1Cbw nJ+UXIlkyjpoRoSiGo8BzrGe6t1P4FBHEhDM9ZEDOzhaZsvpeR0ekzlvsqNj/fdI omUNyT2cAQmitcy1UgMjg1T8QlNCjluPfB1vh8AddxmqlHI2M+G4Ij8Pu0+217zm CiKDDkj+zdh65RNxnuk1D2cjqIsn7rAwauhFxVJZkXLKDEFGrnNYUxbcG0U06MZ1 QSUZkZaTCZ62ULgSqGqYO1PLS5FHteES88g8CXURRbbLTDD0HqQEUsX95bT/PgzS RzngSM3UYZGAJE/vw+oMtBGk+ly6is1SlI3bxXJpcDc9yqd3ZX0jjjKly8GpKBkQ bTeqoKL1t3Y4ST1mjG59STjOORcvrkN1yt1JBcydL2DHrLovtSDAlW9EsB2vujfo zrgb9g3JhYkIaSyWaXkCi5bTeArIWzsFyShPTyKtEj4cay44uRaXjPUW+H8I7Rck qGYK19Yqx4z60Z5xKoohU6pKjw50QuQVkBS4tBiDWuJaOol/SaLRgxkutzUMQBlk aJ8Tlo08UAbQmhFgGlAchHqRGbv9iM+bJjo+YhrEKinkjYG43G7CXPslrB1UU1eo krq4f76p+aMtvSVfC52oY1Tj1qEMVBaPkbFChI0F0bO3Y9RGoh95wPDifwDmBKfC 6Pk2JZdjVviooh3RF15aGtqnlEHPdqJCHH+bEpSLDpU+dpsKXsIXFuW/+Cq7e3up ozl1SMBcsqSGjkPvOXf/m5uA4w7qxu6TrDoJrU+fPCTfDOT3w5xk4YYI0fl1XmPO adkQ6blFO71SQOHBurYFBBBeEB1bqO7Gq+yWskB1c5WGZxlnRUg2xMM3r7uMBv5v M7Fh1tNsyPpGzjbw9XcnxkMO9eslG5bYpujXKuA2htEYRWBpQumk1WwfaFlOvtyj cNJUU14cEjwdGER11GXGJEgNktThRwypuEMxfbkH+beGlo5Oxgcw2AV2QcFISrYG nQYUtD2aLen24zu+At/CzLZz3AzHIzQL1vhqiOmvBk2vCHXwpZqqIaT3hAxsWeHX 5unQdaxy5FGs1zMLuI1ZDIuKiWXuSbByRlFRDLPpk8ZYFTCtZYqXLbvx6H93MgcO mvhPZy3K5DdvVYpU+UqR1E86oDEYY1yJtxBy8W34MNq3g+KNb5xLbxyTJiAOvCsM peijsUMVCORfFzbJDr8qv7KX8AKAqm0afOgK24xJbuw43JdOqJS6zDZsvHarL2st VI4Mf9BP05TaD03V1Kp7DEumoidDglVuSnV63U4YaL6/JeoQEPwCOaR9lhat/HJO OS/7bxNR5rXkhZakCZ3deFuTR3AsMS7IW6j9xKw03qo399KoqYg0s3fI3HuGDXoK TJZS3HRLklwxO0bqGW+H6ipGrMKVLu6UaSXLI7k+c1NR3T5rmkfFtXesHePWluTN YZXuVih1T4NR+ukv7WdmiX8S6jTLzJhtNhDjWno0x2tAVgbM6go3hxV3T0rTPinZ JK2aJ2CUGbV/GGV+9J8Mssk1vazDgtbMsD+Dyn9LxxqmIf4E3gWrijaRJIeiHmuT TrXhx3A5RubQD1gVrQ2bfhJJNu/jOlwVhXyyPJl8dcHZO6whvcI8ndJJGLJMBk+n smLwOMtpTjlRGK3VO0cyzUM15EX2MbLfD+BSZZFa7ooeyeMr06kO+YMiAKPaSjzK BjD/WmRWvCQ6KkM24HFTW+SNF0k25cjWz0qp2ssjPfN6pgnWrabcKEls46sQ1qk1 Lm4jYJuXsdKN9SAJMwUJQJFGpI+GXxnBcx9qNQE3CNoemz4wXDt46l02RRUY0gCh A8WGF46GVSp8QzVyaqiveTjw7AG37hQc+SjYBVPq4R1ZeIoCyLOFup5No/gPVhV5 8EUufxpgdcOXCdtvPFHKUv429rnFU+sTCSMM7NibO7vqtowgM6F/nYYmS8Peo3yF LtbLg/Zjm69gdHX6zjIsp5ElHgwPLNv0kqeLn+I5yFVj8T9EjOSZuH9U49xyjrK8 hkW7u46cRKNtcRaJKLSfCzDw6sE27Ua7cqrJ8QqUqYtmqe7leLbTJJR84eZcKzob NtiMTiJ0uIL2x4PTcRJ79LhlYlz/13z/32URjA6Rgdn3SeYoLUUH3Czlr9TvNVeY WpPOe3/H69s1yy7Z2xnWv15nWSFqNjSkvg01nilv4fxE8E14E4t0lXbfhDoEvVee xPjdJgZKm5dx+l/rGoPYMGTXestZIsWS30PcZU24ihtWFuuy3GX1DfJjyllctp/I LXfV8P7NNYKGfH+umtPwOe9zc09weDa0m1qvGwjxlDhsP4wA1hrSmBktZ3I7o58N 1VhwdnkumJBW8RORgBQTAwGeNLyaivLloCWypdHCCafbVpzzrgYeX1RrUYNwAQPS 4/pxrpnzqPpZ4zgkvRNga8M2TvB/NzbXuO9JdU5sIx4obJNLmw1I5hVfkfKXksr9 h/gfMry269ulh4tXqQG01ksudlncTlHWIT+QXl+ZeakTrU7kcg2lyzYbLo+O+DDX AHzFfzb1rVKxTAsuSR36a5MdGGDy8RLvzD0hh4aJ1r246m+P8bL0iZoHcIk5btbM fbpwj0lAnZcffjd+GEMtmTNKBuaYIH+04R6n0qh92oCNYr/+A+pKCPaUVY+/8IRj NzuEahySZqfH6zSsUH8Qz3UG/dWEWEEZuwGwYjxomo+CR1SLE7adq1rRiaOYjmA8 172uyGUJzkqiYubGozVKweV3cJo/7VVrCPdVK8MwydJCw/SikBTcvCaWi/qQFuQ7 A+0wi2m8YtIYkk8dcz1nil7B474ZtXJ9FZmlnRxiLX7HYHqQrtb0hqks61Sh5MXx lgVO+YPxsLDFrw8+M0NUpfDgRrBO3i3USatUbQvRRJBUHmXDM6Gm0IOPoCbGLJqV 2N1WmYdemSXWvqkzsXr9Up2ShOkWJIkZXMAOfueMPFjbvlH1Za5cAGw9FaLz3fgj VSWMqw2sPdvzMc1HtfXHlM3tEyYgrF6JiZneioybBdzpo2DX474aNkdgURnrR16h DVJAgdNhSUgZTu1ilrwknqpdaPcRyhy8Abrw41ydvtVhsK1WuskKpzXBJpZsrzDa ECrVhkYfVyYK1gbVodK8OK5ON9XgLJxo10zZH2YuixQG5ygAt9AGs0wxXKD4VQH1 wzyFl6gVTlYYWK0KMQ2iw6Mw4jRbLkKygbSwdJ0OJcW0KAXoVoQ2pA6aoOKUW0Mh WpDbWh014ca4WzEBFoV2AbbIOm6DirFtGoaMbNWKAxWi6V4cVyGzMBKBWyDazcdF ikNzlIqyyFVyk+FUh9cMHC9SKsuAnQqxQ2iw6Mw4jRbUIVlENpYOk6HEuLakAUoV oUNqQOmqDilFtqgrUoba0OmvDjXC2qQGteza9gpDGycdN0HFWhtrgrWBtWuOleHF cLbXgNghWyDazDosVBucqCuyAVYVXKj4VUH1wwcLw23QCsCrENosOjMOI0Nq0BXB WUDaWDpOhxLhtXgLIK0IbUgGNq/YTaoOKUKO9X/SKmc53L2rh09ii06UczdI1a0b mfYsJZHaKiNR2jYRup0W1062kIR2FjUU5rK6Ld+kd1IBcfSHm2jtpRA40POiFeIU IgbaUiWEK0+XPri2CkULiSkNUIoh3WLO1FOZFMjslZ6CLSGao5i0SGhgGvM7Yn7A 0fl4Y1yAXH1KAhT9agFgY1SAsyk7HitSODlLtuzrfQRuHpVjaoRuSUcbeqKc1zKP AVEjFaGJYI3QBmEVgCUCKsMRoRsADEI2RnEWKNeGIYI1oCFFGuAL6hG+8LhSqinR 2q+l2TJ1RosjpY9p9sQ0TanO9MB09iWrsfirsQqNluyO1ME7eaSafEIHKWWywQcy dQiAJNp9BG8RdTNp+t/38Ek3TqMPRYNO3TZMx4knUIiBw2WWJNzeDDmozKs2ztJA ej6iDkzH31z2OXp8tQk3/kEHKWTRhA5SbR7Chyk2ZVgcpZuVhL57AapNyMEHMma0 /DHMMPCjy20JFB+PNu8g8ORlEma11JpV+blGx9OTMTpIO7A4KWZqoapQ7ZeYMOSs btKZzkRPktaZSikvBJ8ZRJmQIHHpPBUMza5GlEoWyNPVSQBMgokzHv0mISEPV69c yW/mq48yCBHhYGdkAVhnXAFIRTVyiPNbUZEj1G18Jif2FI4k2EN6ODJ2Fzdb30+n lIVYgF4sK2GEfNRFafbEsbJaji5j7pVAPC0v/PVSd8oDpGFyyfIDbw8PJ552nIBo MxLPq8GBm2M5T0zfj/8QTG1GWXDYFPLI3oaj+3g9GXxA0niCBsGkmoJ0WSh+QBX+ 8PJMP1ugfdwEd6Dk1VlNqJYjPdZNd473TZlqbkKCN1+a+6VuyFZRCVfbRFgRj2v0 EzLt3jrmo+CS3O2GH5u06yPcwV5fKLq4ew2SbcQjN6NmfWncOvKK2UZt6PfkyFgb +lri2lOT5o1+UpTPfc1fOzN5WrqKtpCkk42fNnJLGWI5WlLzmcr+iI2cTQCIC68w Pi3G5tj2mbpif3BNLyMdprNTJrY+aYLyBdODY9ODzuxKMBY2H9Dr18yTpV2o4wf1 zrwLOnsSL9C30O2WfUPZu5C0vJ0a2nkivXs+iofLWy9NZWeNHo1FWt1W4Gg8pe/W UTkH3QmOg9wjgbMXr1C3UbYYPho8bMkp9InSqIElme5hux/lyzEBHW69S0W5M0us R+HHmtjr1bt6XgFwU6kMR+s0KrLxm/W+H1aDybVt6ao2qXsnrEY1J4z5NoSdMuor irM6kApdoNVQGKY8cyKyZOs6XLyNJnWH+5PVU+NJM24R/Bm7z4zjNZ+ZFV6ryHxH k/g65atczjKyj4lRHKxtnQos+mSLVEGy2RDz5w3C+oe0FcL2I9Xv0etkKvZKEhAQ tFONy6su9iSXdJjqru1b3m02uTJGdenoWPW+24tr6XWJvazZmwtPmp8Tai+JXFO6 S1fTtdesGXj+J/XMtmQlnpE6VRJueiKFuoiBjiSa7xr67bHj7eNlINYtp+hKp8NG HUPAaI89OHnpj8Sf0p/SH9GfChu26Ijcvdw+E+wHTjrbXjzw+3Ecsz7ZePs2iUTS g/3QGqDYrAsKV7uSaKylPRtdnm2RJlOj4KH+PfSXwINib4FLfSxealmyi1TUbYpl hEWLwxCkWHniWgM7NfJZJKXxFa4lR0WX9tVXuWf3Kxt82mwFcTv4izCFglmJY9wd 2a9GM4unU7LAnbVSD/kVa5UhGBFjoo2pV/Lc1rSA5+LAf0VOH4AhhevG9954G9c9 cRR4LtOmUHZRgiJjkuPYUZiVH8hk2K1unS2eoZHA7DShLgdC+RVj7VxrD3TJN4Sm 20pnNqV290keviOcRTJdkdAbU+kIRyo78eRiUUMl4vVmyvmZBtR7NyH2yi7oIZG+ d6VFRijsNx6q3U+gaGHeu0o76GLo99lxoeVEnGfTcXxgfLteFk7iOxPcrdMXOmfl W03+Bv9VoHvQ68D1h8zMNJteNbWxS19k5Q86WujEZfJD1YJDlgfpKi1IqnyyTxn0 yaq6gGNtvrtNyJbq5JlSbTe0S90Dw5uIgncxy837DHI5uwaKukRTh2ta8Zz/Ro6U fO27VPmuZh/bXNvN5OiRohbq2n+YiLaM3mk6qqmnyXpQMyz0RX5waaYRrsgZVLbG zQXdAyGeH8aOfYk8ZwCKWiq7T5lcTbccjSz+pCTNulIiHn3qd7w1nfZJyEt1PjWr +lED1l4Oo82mUHh/gba8f4y2WcgS829bXWv/fO1tkx6Qdm3wkZfqk+FHTDvwwh9i aEM0gah+A221q3buyvnmy/J/QaYQPSm9BwNI6hu0XU3CUEejL2kadzSFibdmQryy 5L08RC6z50u9u2mIhS0JmFGzLZeIiSPwB8bxcdFFeH1LpWJhE9omz1z0VhsqfhRJ Na301ibKr4qnaJksmaKjoRxTJtV4WO9VlJS6sdTMXRB9D8Bl6RFIxHMr5F7Zoshl 13y4VnTeGpZpMm5UmcUhl4OxKxSyVpTZh8RP4IlUlEmPybxhtYRxsADrwu+H6QUp uWotxVFYl6aYSjLTjw7jfwrgSHv0hqN8t1W0UIwUqGukDMeDkztTtx+D490nkc7c jvN8w3UZ63gdnqPZo8unGurPqwloEfGkN9ug2rA3MEVcZt1uTr23JtU23+aW7x7c ap1kiJGUfCP6Hb1Rt9PNUkYfLlDxq8dLVD8UoEySchrKby8Oo4DLZlEbUTw6HeeF HjJvvBrurYivdJYwy4+9o8bVd8oe0R8xTMD5Fp2A9RvYMh13UcN6ayXHxm/ZLcnY 6ir5iz245hKtu6ISFSiEzIeYD4A/C7LdVtTGaSpD1UjHuo+caN4jK2vCTypEXg6a lFf+0CjFJ35AfEI+8QcWqvxqL6+BMvUbZbNOxXeqAxS+0smwzijj1raHbu+8jA1S MePaT7ejDj364rDrbkYfCH7ST0klr/dHTs4xsRSBIk3Lo5K2n+QyD6NGngpldUqs 473KsKigVXe7FPrm+Mi4Mr3aE9oXW61WjuS+Nq1hO0mXVjwsAbYqeoL4e9TrJ87S KLA2TLK93pxHtZuG07Yls4jz1MBKlFJ5i3pQ1SUF8GBm39y3s17rWUdSd1/owRmC ZZG1KI2ebsOv/pgS4vDFbDYBGh78x3yq0cX/DHK3GD+xq4eMFXhFlJ6zy7lQ4eSH dSVe8UD0teRNTuShncxqxH8Vl29Hq4Qko+WH9kTVhN7gKK8kapfwFjw6NLExsajv YJzJcGMQfCox7iURQr7QnkF9zOnZ6fkrurHFDnU13Jtw5JUUfjFY4haUsvSmkib+ mvzBnwvl6CZfYSnA/1cEk9RUjwjwrhw0KD17xH6NALxQlebmlDM+GNFrL0AqNt1P Lo4cYIlyXCwHBQ/wO8d56Bp5sO+Iygozb6JKVSQ/NBdmUbKojsi2OM5XYlG7bzy2 EsSe9PtV3VmRCDdF70smZKLY4CXDXmsJ0r2rYJRqFfRKI4pTUZpXRF+x+gbA/lv4 s2ZFs8R14cVJpeqf6GfNp0yR/n1M1vWbUgvKEH6YzxugikByx4t7fAI/vdeoWWMq bgEZSpD86fbEO4h6vOJmkgxZdzgHdg4Xu2r7YbYw+PyERkYmKi4zGrzu5Ozj83aA ovR2KCKqaI7nn8x72M1/JFRekOsBI91jyO7LsiX8zNDNzP3YZ53Xe4xNCHc1fOpF zC/ZFEj3VoaUWOj5u7BoM/dpXbo92HEGSdnKjv9f8gxcrzhfMVv9+LvIc7W22k3S XlI4UOYQ77IFMlQTk/RzdBMzYvo6AOWIv/rJ6Kgm5XRzFBREsXRIWhyuOD/5jpif 7WbmWl05EBV93cjG/jjTspHR33l8NlMxmsYvJvMhfj2MPDsYnHxVwmfmplexx2QY 41fR0Q933k1oZq43HMcjEYw47EGDCjvu0tukXKOlhMEsqVCNIYkAkl/Lk1SeiTPc e9RBAtLCGRCI/Cr6HCrCv9CCdUBYVH2fWKIw9nTKpK4rUqc/cZiEfZyxxFw6jJo1 TMXDrkfZpaQgJ8hklDRH2Tg5lhVzkS5hCuTsphZRTsIK3I3m2lmTgyxvEGRL9oIl gGsoDEt1xoh0QRdPq2epGMsbq1KnY3KVkcjFpoBgg8fsBxzszPSzV+/6JakyaDfj U5M/8SrmC/WKz4bV4Bzkx1OBE0XTYK6H12AVayEt0N6tqGHFRx8OSuGWI023hgW0 RIi610QmJWXYmf+/ORoimUyI4Shwq6OuPJTEIa8s+BDTmqhu+4ItI3ZfgI9l1gQs 0WpebCWAPJme4VGkMBlNSrzGFpVGsU6tVRDpdZwZqlmhojoURSu7Mxg2rfj+QUeW IaIVWOXRE3KwanKl7DCNWH6t0ZGN1Knuhz6yg+0QeRCCBazA0oGMoDZcNmCoPZJq gsUge3XBZ3Ye3ihZXqw9C4kEaIhEyBHcGe8EKtCIQosRuZNbhqjP/oBAz7ihT/DC rDSbyz8UGJTuQcllGzcDjFFvVqSG2alVTK1OdcPloMsrrgESaY94JyIxrMQbnI2Y 3PbvOFuecwX3P3P1KfpnIa9kW3YOyiQgyWM40yOTPC37YJJSMngA4IM0uZ7gjW+0 Gl3NTmdSSwplINGoNOaLfyCMpTYKXwtYo/Gp/Eq1ivV4DU4FTnEiwJQOwNG8KLDG SNYm3Rn/rnSLZkGHJSrpFBaAjyFUkxPxQGaUI071hENerFGpVjQqDtdDSl7dzrDR xSCooX10CRAdhhxeOSeo+DRuJo/AogPWJiIX50pGSi3NYEPYSpFSaN1QjsVOngii IjUzIwZZztgGNTHhFBAuSpG+QEEmRV2ZnuQTjt2sEUd2cH2hZYQNrzVmRSeInyxl xMbgnm77JSMrgg9hD8Upo32Ce7T3aJofINBqk1lbYPUxLTOCgZyGYoND73CpXLce GpAPFdgFPjQQGyhU+GKx9Pmj1gdCHYnVj7dLEf6UB1J/dGuC9aIJ0ECUL2CA7NS+ 3kEKRwRlcLUqVLYDx8GKOUsfbJbiMRgwxhwGYPxp6eJlidyA60wrfiCNYfqyWQ6k UU2BymFq1CqWUQRRMZBVlB9q+vmTMTGuwb/GbZYNMfsJo3PgKw/oD8uZ/rwSdBAQ hdoUQjzBPdwTsVoh+SYt3kQ7TBvCpj/v2HwJsC4UAAKMI6XgM0gwHYTpBeEuzbp9 SCtrKJ0C65wtkimJx+7gAyuFrMEqjcGkqdI1rUho3JEJsNLoqVMlOFWI2m/FNB5B WLLkKlwCqIVI3UpVEBIjZgPJT3Tc0VP3mBPlQzvkAYgpVoazM95V5SDR4RHhgdwP Pg0NHpkg7nqaRecoGZCDIkYZiaPFRSyRSVOnqRRWUT8HfdVTrYMOEl4tR30pJlXr uCKgYVJL0Y0xFhQPwRhWdAE7eVwtlgFXVKURuOqNMkirTpgN3iWCbMMJdT2gYHHs oN+qTREoqdzXeC1sOsRSqyQz/IuOfLRkgldt6syh52IsL6QHJTHlmf8yflh1uSUH 3xVBJCV7aEfUkK2EDiNJLxlvPfXiRI1HtUq7YXiRDLHCXzN2lsIHGNB9sac94oPd 2JnI1koU8NNgXCp8mA3UHxZwnM97tTAhzWcLpFXoKXm+9KVNiaV9Icm+Y6i73QjZ Dwf600YYnUu3Rzc/MY4bBkaG7pqYuGE2eoqIbvRIuHUVx2dj8gNjLZEnpxiHiM7n ZXIk9OayrLvZjNo90iEaV9k0YJpmboWk9cih2MWOVQ+Pm3IlBopCgHjmLiJWe7Uc hMZCKzuPnImcimMVED/YqJiInIHxkTNg0TMxWRG7yJ8RcJzHIXIZtBh/0Og0Vc3u JiEv0cTOXDoN2s9cU5qzbzNUjmJyekyDLPPyjJPU6kRIz0/Nw8VJ6KZ0A8aTKjhu 20c9cl0bkcY8ZCho0aWE7MuWlekfgKGwbc/NxEWlJMze4ddBeRy18I7AZxedBGIZ 0ph/tK/QPEotFSHjCVTsXbQ+yo52Tu4kvqL7l6SRzee53BEjnudBLH6lUF8BCRfc ikfU9XOgmOgTzsR6P1UcF8AoI52EtnzyM+IShjmkCXHkZtqDZiZpCWSszfmWPE/I gfrLUsliXKEloaGfJbIJ/ZszsqCRB32lqMvQ4PjwYsleHA/29JXj8iDxZH1PPRZY hogFvQTkUDxCEOpaVzeUup057IA8VNmTj54MRYfbibYt3j4maibpuIRTkuQ8jm4q bdJs56TZUkwQ04+3TzIBBPW3RKsI9tzGYzGezE1c3LXZnoFdmkIdizeuTwpdOZHL QBLo7KMnME0Dqv+0F9a/Iw3foC1/bylLEZ2ZWMJ3SF1voi3HSV57Eh9scYtububG vO4fIxWbdzTI3kQ4QVcjQzGjoh35RaBRcIkxPXkaciHg0R5rhHROiz3djbj6MlZ2 6C0pMrUzeevyRnQB+0aAPOgCxoQ20IG0LxYNh2M5R0EyQAmJ/IkEeHyGenrd6PvZ G4YhyCkZuHiRqichNWzzG7cK9Q4Ol2Y/N3dJD0XUdFRz41DWVmM2bvkdK/rJMY5r z91FPNJ3QxEOVKPcG5xaUXbDeX5MS1JmM2njEiEQOuSJTWaJ2VpHdmcfdOwCTpWW Z0c1OBSI2Zbwk7+NPTofgsYyHD/lOh5nTrzJfTwczwdZ4DT3//7gqLckiPzeonp6 fn81Q5eRdFwjg/nOIJfblrHu7pd+XS143SsSHDzdPH8ZYnvATiUoSwzT+wyETLYt 7UxkymLfdTOMQyZTEvZR+p510Lqfmh0F/lTbQmvPt5y890olNIGpTSBflNIWdZTS CtTwanr+qDc8Ez1+Ztd1kTAryNYt+qzk6hqdC9OhM6FrPBrPBezwTeUpYxD+XX6U 0hfyeTdUYCdFXPB9b1/PK9a5fH0nnAmAedAZ4Cp/t4ULjIl4X5v9BQUoc/0A/19U wkW00WZJ7p8y8i/wVejEahwzSJMdqkvFjoigtUl+GOy/54iS+7Wiqx9FE90M9lOE IcS7x3JhMG+0sgnjmQjpiim8zN0FE5XntJN5uf5vIsyDLIPjsgsv+eDGPcjFhEOi 47UfvFy+U5miE/niUyIemay1+mBdIPOfmZnOoqk2dJp4MCoVEsQjIBjKTdA5tnpm /FDzzKr40MlKTSX/ofc22k5EsUitKSfuaoZXRZibpEYi+A1Zt+SGXkb4yq8Fhoid yMz820zDSdkqBpm3fdIv5bglKYkN5WaeJVb2efi8TkQ3T3/t7rw73f9QMXsSXC/I hFxcdNFIcvkZkac5dcPcu3xK/EQ6oNzg2h0kLN4oWIkLV+EK97Nz0iFGRKbgt3PN EXvpXRW/tNXhIll5E7WfoEZZm0nUi+k2Li/6joTPRGkh1kuL8ME9EUU9n6Cknn9L t6Mp2Jus8/dOUXe5SHYzDqRHcjw+Oh0hhzRhFYfH3TfeZmbGM1v7hE18tzQC4sYP MpxpN86AmMB8nNjjk2iAc1Ye7cfPUE80zZhJMDmRiLk9xkkPFIzuZ5sBrwJhdZ/C oP0WbWdI6uXXe/xIiIoOb7gkpT55BuPiw0yzMQPVULrl1qqp/icyEO+SbIJ9W+P+ U4/HhpGURJdZ/IBHciHMYlrHMAFhi9SS+YrxT3KH/T+Rq6maIdw4ncxdvJnRaHQ3 So81YoNFdmY7KZjNdcO3XMpM/ibnc7OXQNyAahNc1o6E7nn88fphNhgLGgDa9h1K g46wd6yQrvSRZgXgBZlALwwsywF4oWZcC/WFmdAvICzQgXkhZpALaBZpQLygs6oC 8sLNSBbULOtArcLOuApygLGvAqgLOwAqkLOyAqoLNWBVYWd0BcAFmsAuBCzWgVYF muAuDCzXgWDCzZAWECzZgXChZOUATDBZWAXoAsrgL0IWYUCwoWV4F6MLMMBekCyx AvShZiwLiQsxoF6YLLMC9OFmUAvUBZlgKvCzLgX7oWZ0C4oLNCBepCzSAVgFmlAQ gVxYWdW/Jz1YrPigWGCz5AFxgWfLAvWBZ80C40LOxAvXBZ2YF68LO2ArELO7AsOF neAXHhZ3oFyAWd8BYgLNiBYkLPFAsUFnlAWLCyrUgSMCzCAX7wWcQBckFnEgXsAs sAL2IWcaBfvhZiAL+ALPYAWNCzHgWQCzJgWRCzKgXKBZ7gC5gLM0BZQLM+BezCy0 AvaBZ0wFzIWacCyoWdWBc0FnxQL24WfIAubCz5YFzgWfNAvchZ2IF0IWdmBVoWds BaALO7AuiCzvALQhZ3oFlgs74C94FmxAtEFnigVoFnlAXPBZVqgJLhZhAL34WcQB fACziQL3oWWAFpD15mJewIuWIDzvuHXjshDpX/sfXGxCKuJr8G7nPdJhCbZ0PWoB 62bWroV5b4EFdUCa/sQwLIolwLDmexeF/RnODvc1xJhypgEjLq7y2dBHCGBegJS9 MLDS9KZ++CWP3wxUhWaAulgE5O6cMd+HXRgmrAUgVnAL0igSRD4A6/cUAiL/AGF6 gKToFmQTL9RfLZyHdCTLRqh4mAo7sC/ACaEBCqA6e4CaEBWhWfAq9SCKkx1WivSm elUoIZsn2vNAIs4CTvuu9jki+mYBNWBaE/zXChAXb/kSYvJgTRgX6hKxQezgCTsA K0Pi1QkiAu2QVCRDRwE0gF8IEndSL2d8JOuAtIfuBKEBdvUEmFjwJ3wFhFYksA9m CViRUgXTH9oCakALtlxJWSAE8EC60SsWHs/KJNKBaU/3hKEIQOuWwD/kdcAwQddS CdgAhQ66cHQNZgE9zmnEX1XCawB6AdfSBK6RfVHOpEVZgXCeqDGKF1VYEEa4A421 Qi5ME1YDPB17EE7IAnWc+IIvtglj1d8zM4bBP+RjQEFeihmEE4jHZR9VM6wCycAn MpDBj+QdcoCV7NQ8Z+AUfjAtMCV3WBjCnB08EE1wBOZn8gi1QJXgOuvSmfPEmzAS iYufyiLmFgk9aGM0LrJLAQzyr7Xn8wi04J2GNDHWIdfCEmdywifnEX2ATXABdt2J NKAFt4wizeDBC7HO9r4i+mXwYIrJN9Pz44i+OCawBjQ6/8Ampy7gn6BF+YEndeGI IOstBQAmTSMgHXMg4ja/LvqXOuAv8nCZcBFB1/eCbIC+Uf9AJ1wDAB1+UExeYfas +WIuJgwRsAF62M9FBiRKABbftEXYAmuR3WU7BDr5iCdd2QYYirrxF+QEr4cMKg69 DCOEMYcPZhoQEVnZATzALlhJjQF6qWZESa8ALb94F+YSdgA3uFDp8QJYmM6i4IVP OAsNhAwpDmpM0Oqw68t7cdThEETubDFCpCn8QL3YB8QZZBi9VbPlwCRoQAu3kwAc 1vcCJsRF+EE0uTDF6tHNbAJzZ9yInoCKtwokxxpBDrBYUEarun23nZCKzBLEBeuF /44SdkAFtVCL4YJlAHZqQ6eACawBZpq/ZgWqEnYSF81z88Sd1LiJ6Yi/WCasBhw6 2QJrgLVn45aCK6+lPGLQRZiL6p86CbIB1rjrMiSumAxOirthF8kEr2aHs/+iTSZ4 RNwIvuAliAvVa/YEmpAJ7fuhFwi4ES4DoA6rFwIq3BfWEWPBNKHt/ACa0C7s/vwT rg9ukBNkBf8H/yBNWAjw6/vBKyZfVLrBFbAldJIezfCTKABbeyIq/DAhiA7TBh06 XDIJENbggpvALYgmp7QMSV6If6BJO0DgnuCL5nQAiulQxkFYdP29ACIUBr1QUrQL xQSv7cMeSh14Qk1dAAQr74i5LDgirAYMOsThwRO6JAm9EX+IJrAGVvRZ/NEmlALB V+IRVmIgBfOBi9c31WIBGqoQJXIF7IEndwL2ZUSdf3iBPlEXbglcApb0P6sSasAv VhTfAXS/cf2gupl3/k+oDn8X3BIOmAx3gdWqDiNXUb7k39AFy3QgilQEoqDpI9CC JbSBhimQbYReUCayaDHYi68cSdV3r7TNgIuQ6IELkfUTeZF1x3RAg7vn3DZ4AFnR JoQF6sTPjwCRpQAu3/EAHNSAFtZCL67hNSA769LOd0JOvAVaYzP1CLLwoIXd2GL1 uc5yFBE74IE4oi/sBOwAC7a4SV3hCJxhF6PowRVgO8F1xHRiRDAE7RzZiL24JjZ8 MdQLrKiTSUoickRfFDLjmXEPpvRVz+MSdeAjVLx5nkXj/kA92oSmif7Mi9u/KcJr /Dfa82oi/wAPbOzLCD2G3t3XwCR7gBBXpdZhukDD17DDOIDBAlL97AQVPVYlCIPm Ii9O4pB38lzTPpMqlB+qgE5pQ9tMCYUC4A//IJqQ9vrAliBcEf0HSv+vOuEGJ15a lz2ppFUHNcA/qHXswcRmZhzLhWCAvkgqhvm0c70SatwPNF190E68AnRZwgi9PiTT l6A8/3l87WesxLhFD3l86ZxeJgDDygVcf3UAnNSHt7cErKcCdABfzAmrAeLelWak SYsA42xAi7UEy6P/lHX5xdfTBNKBehP4oJOR9tVeOLrwgTugLCn9Z0wI1wDWh1xf TAhdqAJ0gFlgD2yYRrR/mxXPX7OQCRlAEBvsoZokA9pISwhFXpd50wg9/PxtDgO9 xv8iAfMTkWXptCPdA6uAFzLAK134DleIuGfin2KKnwwx5XTXt7lg/P/QFqQ3vlxg b8gDFzg4BOaTCIzd2/VX69woTxCs7hv3lIWqJ4Mdfr/LgnPB5WFph2AJYaHcuALJ vaodsgGL1EohL57mn6JQhg3g+ciA0pn+lDn3QFWHMUpDCROowQ/SebYiE48CGaDy hicBM6HmTVIhMobKxOhFv3YJnw8/rMAMQPQAmhcJ0Z7Q/SHwP3M2s8vzv2Hc4fLS w6RA/u8nrzhflf33vF2nzV/E9bdfVtvO/h+PjWXu76d9zzkNctu/kNCHvtDsA4ti +NaCw3T9P/Y8tEuP7bluMqOdKulCi1EdU7mVx+HxEJc9qST/KTuD0HB6A5x/a6m1 B27e2+sQbeW4tXGW7vq3tRKTwx3kZ4YA3K8N0nwfYrE3TN/9R87ktCfKO7rynD91 dCzX/2cOcfLgJ5xQcL9PUnVew5xkWOuYnC/USldWLtdXWVKLngNzsQcL7NqpOD9T deKCWQYE5D/fPPPPAQVXFc5K+fnglxwv1Fip6D+GSXd1/0dq2mo784P6ZuoHUr9f PzhD+Q/3zzz/+3YAjSvksAAowA/n+vG22sUmaiDafBocG/uGNdJAH/wigDtqRNp4 Ni4lChtlIdVBP8AiXCcyfngfFJmqk2nAfoQlChtgk1qEoUSicPBoQhRDOYQlCiGf EQlCiGdwhPfC8qIQUaYXnsBT4IvOlFNKLz/IU+GGkrtfp8IKKYNYJIcimnDSWx4R TqQ0bYDNUJ36WHrFidUGjefx5DifEDSWRHNThX+AeYg+KO1b4MN6KdYGjeKhhFrh GMQfFE85uvHnWc0g/6ib+HHjRKNZAADzQn8gaSysmtK//lDRvJUzC5wjRIJ/KfvA fFE82uvHm+W7hOOwxIl3m9BvNo0JX/xnwYcgUu82YN5mlh0CEfoDRvBsTgp8k57J isFI/Lnjx5fDqMOhHlBpLMcyQp8sNJNzmiFP7XwYcoU68NG8pB1eIFH7g0llvfZi nzHwJ78U/vfDgLPuCh3kEhvI4ZNB36WEwWJ/m+HJqXE7EXn0xS62N9SQnN+hOyDR vHE4foX/OOlQfFHVT5ahlRTsw0bxmGlgAB+QJ9N8PD6jiasNG8WjwhT6r5E9P0Qo 2waN4mnKincIedIKd0+Go8oTv0YbFxPrBpJs2Vzid2HmEhQj/AeYsJH4R8ePCgTS E+y+RNSKd4GjeDY7PoxR7gaN4KHAdIKK0NG8DhHCn3w0lY++EKd6GsGA+kJ+ING1 9GJ6V/kTmkEtD+/P1IPijq58v0+qKflDSV9HrsSKN8Gja7R7wnQNwRJtD1fTAiDB OSPyoPiia5uiwbXWeVAIntOnCEs/sda5jZlf7ANG1wBh1Ao4AazKX6KeEGkkSO/F NkLz5Qp+oNG1lDrF7/GGTQT2QP+onpB6LCTbM1InxR3FfDgVYp4wvOM+6KLMNG1d juhOgb/osTyQ0bVsPeEnluH6AmqzgsG3WSrxRBz0AahUqAcO/QD75YlcHnPglqgn zj/bPw/UgiWBPgH+ID4Z3oaCUW/U4T6ThO9B/1Jsl6Szt3CsAb9pNU3XkJzBX/AB 5ahOCDztwcTQSh79Shxb/ELBw/6joR8qRKinCPgBUifoTvqbvW6YdaKVr5RHlQCc ekE9I+BO/cTCh5Hyi5wx0ydXKnjTAerQf9R2IfInKgDlbyuomhT0IefEAL1bzaD/ 04Eoe6oWj/+hrzjwnCP158ms/Pki0xP3JcjFo+4WOe/t40fsZcfsI7MTM7ntFNd7 cfEMXMmWn8tpc3PHc3+3nXkfrlTIC4v977Pnoh6MIFHzgT7z2CYuMD8yKDp/o63u PDn//vtbV7Moi7xIvzbZGeiE4/IxgPzqe/PhW4h4C/NBkmRclW/0GXkc8+GVxMUD sqTnxY8iOfgUi2MBq6L7MRcs0Oimh+yoDl44rjO6ObnMdERYmOx0nHczJ1yMQ9CG HRn8TgkqMsY6fmKKizdyO53QTelmSOLwiUuFr0hg0dAYwYCZCjumoq5bJ3Wt1WXg YGc0ub0o4SHd+0SZhL2beGJwnAtuZciyqVJXn2csbhewP/DA9m3z2dw6lDx7Pzka JylPzYzSn77QdckaQs/rve4ppndDRZ+AAiMmJqazJAVNXkDr+lcPENEu6UH/+8h2 DiYfX49QMKZENIx9f8PMfFDoZM0c/MNJvtUf/3/zKgmswg9w1FIv72u/Twgj7Wyy evayWT/nRIrrquXO57RUbmuiOvrxJsSNUaTkTNOV9FbcjmBz/TGW0LqD+13En18F ERIFjSTtNZ7vSPU9ngf3QZuOvOJIWDQiC3nNPLc9c20NDP97MzUOdOE91yHfZPEv 3m7iXrOD7dLM52joJ8cTNzScz+aaLNSsjFg+VykRMXK2UwWOC8808TJub+JjXN/E w3m/iYLzhxLxzhxLs5v4l3Ob+JbPN/Esvm/iWJ9kcSv1/OJW9/eJV3m/iU/JJ+5i huqaCalTr98SpvtTxKaexMis9MT0/2VG0HFRiTPUjJMi/r7cSsX84lWJkbBMFWS8 XmCAyY0Ob0B1+OJX9zZwBMzseOTaObidDdncy73H5SOtzMT40pI+F08ppDr8cTD3 2l4l5TLRFA8nT5COJH0BvvX7Fn1ctfsYOvvxNgns5hyAg3+BsHQNHfNzw4k1DOde Jxf2l4nCX34m8c7cTb32NxNn598TXt9uJp9fbiaN9peJnV9+Jlt9uJkL7cTHPtTx Mec3MGV1c0UUzPT0VPUUeROF1jnc8dfviW1friWbfPiWLfriVjOzE1H0dDKnX74l b354lXU5N4ydm6QpOKLvR4D2/nErq/XEq2/fEqW/HEpF+OJRl+OJRxK9EMyyJWhO vxxKKvxxJ9vxxJ1vxxJhfjiS5/53iS8/8hxJJ5y4kd84cSNPsfiRRz4yLV7T7Msz HSUkBSwz61tBr79Mzujdsg3H84t+U77H4kr/+I4knbkOfmpnO270dERZvnIfe53S MXeCM0VD3p1FQUI63Wk4P/D4lzpQXyqHHbeTRcEcJNzNUGlGZxne0Gs/2hmzv/Hc Snb400HXPM0KTcUvePzoMfbziXVfjiW7fviWrfTiWZfPiWc+0maDPWU06QNh5XUW yzK38r8dgbm3iYD7F4l+c08S/j8oifDwNCXfARTr+cTPieJHdgmtFd1vc0ji2hmJ 6gOvxxCAmrtnpU6+vEPhETYuaHljjSe0M3GZm42h7a3kzO3vHmRHj364IbXEHmB9 eEYLjuxdoi6qm9Bl6QUZkrNvRBIeHx8rPTOgj6O7TMyP6AwWPiUbTpcU9yOdiZqK yETkYnIcxlZ8lq+y9Ia/nzc/eAiia3LoYDzmWjn5smc0JZiSTETZcr6Qq7zYfP+D dTO/4a/HFQ3nTilrzfxSp5w4pPud+KKg0brviZS00dHMtBwekaZ6fCL9cUHecOKL 3OtJ+7aoJov6U9UgvXdHGRLPSYWr5cTd778T1c7Hv3iipe/FHbOx8A4ouXy4pCv/ PmnyGftEu9f5gkf8yFhZ7UBBvO1/ecEB6oJ+FB+UjsWLPpn/4j9RAAn/g/xz/NPy XCtOF7fs7/j2lpX8FRxm3BtK0nRZxuEDYoIydfafia2mr8K00nG8K3WStr6fitPj 860/gD/kuGE3i8b4hN/au/g243tXLPmsbT2t/xNx8nGGDN9b76LC01FnXYqy4Nut 9Iciv+KzjuBci4dlafPaDefV93/O0+Ow4w+35iTCCJ0zaHt0rmH5fitr8NnWWnWb 5znuLgfnI/bjyfErrT0bp/9HD9y4D3OCP5xLT5K/hYjZWVjveL9Hy8X07uvHQTxB dD83+eK2+e4b82F+Ph43mXWcB4heisOqrnMNTXcTi1/t/59q63pv56P/HC/nst5a fHvrTNfHaenbXlePbmrE3vH/NX2nG9i2/l+cTW8qv5cX9e0CforxRY3BfF81p+vz PU97+XwleK1BxN7YmG6+EvX368sB59nAfnkJqVV5Sq9raQeluY7/if03+9JN3gk+ 8gdRsdaYDDjIZw/k9iwI9fG4bpuNcqOO+rh1+R9rjfLvyE73tcg3sn/AXr74XRbc v7l1w5M3nuOGL8+W7ZrXOHy1Hv8HhWjmIdFrLjFf7o4g4l/oyu8sv8/J9NvLr/3u Ph05hvvuGmNvaUlk2Qb4OJ/zwUfljbzgW1X2bYzvjIRYWed9vjcCzyjUG3vo/J/a 53vXDfL7yJavjIaGxKQ62uQjPfWfSk6Ra35Pj8jkWPF4u5rKf1/W+bj8Tf7/zhi+ 5G8FH+OR8lsuG4fJtv2rPoDDT7fp/BabTicau4ybZf0v63bvW1SLVHaptu72j4bp tqtW7t7e+37h16/G/PjZmdGelDy8qH73vrp9B5Q9BDd5Ig58/E3e/CGN07iAd2F5 y2e8FKl8e1N4SeB9l7wI/3BKX9X47dGcq7xK/O3t/zh6dK7woQKr7uN/N4DJm7+3 cJ/33bZX/fvh5555555555555554fx3Gb4NBrNuoWWazmQ2WHBvfRul9eXLw/HHP b6sM8j/whfFjzjuYSxg53Jjjn/Py9+g5UsL9MAmCvHNPpg0P4QShUgEEi/P+FG+c dEKloIP8eKQOf7h7jKT6/n54lkDbOjdNSovRIghv12CUR5eX1YWfOOWT8+/vHeBo UN3X47G8ck4T1HRm7JzDTDUlUYmjLy7e3CUVfDpyvTutxY8SFvnmbEZewZjlEJ4+ Dd8qzf9++Hnnnnnnnh89hvOtbt/dOhm+A5l7hHe9e+nUfId0/yk+lc9P8ovA37hF 3GaSdibGkBhHXhN1OeJHlnvukw3Bb8E5c34Z33N+R5H//UOdZP6fl7dK5vi/eU20 otTrXl4B2JPtt1hXG9wfFwcNWkEH1t4rdYvft1C/41HIwKhUdw+rsHmCHAfVhhv1 uP84jmXI6N4hfc5Nr0jmH/GKhTvoteT9074rVdZLsR9PQnchQlT3f8tMQ9/foku3 bDjK58Je3nHU9K/H5H7/bo3E+dAqqsdgE9RIns4Tz1GKE2zOzHnt2BIBCNn1Vt+l at4bmMF5/SYNKrvZdp5ijqff69Vy/8xGL973OzITveZlCnsdqEf5lgp6+bD6k/3d 5CAjpu4hIbzodeDa1XLH6inmvhO9PJnHJjDfJ7E7dRZ20bt466t8vk4RARVvMKM5 PB/igJlCPLb2qy0Ob5NVcZxjtfHlpJxv89M9nT/pb94SO4gnTybVztheGODwbdQo kzvp3dq3yh3UfntZNCFNqpH2XMqqRHJpBEafJ5c7Y+jybTCx53Pb43UO+xvANJ68 9vVBSP140t6k4dzuSMKG6WI5ILTd5giwhxewgMfZUclAowxyh5o/KH6Q4jLX4PD+ fnuWX3ihaFmIUmjBqfzw+t0R/Nzuf/2/A6O9OSPUKiVhu8+wz5Q86UJUPrhRAZsb venP43x1XBu4ooMIqav+TmG/798PPPPPD/qrE3DOg1fK5n7nIwXIh3vod1hvry5e H4e+79aY07eOH+g7o/WOiRgxF1yritdDHVs0dKj/xbF83mR1wKuV7/Ud+XjbSXtx v6+5/Xfvogw5kRmY7bHdgT7XwtfK3AuZ/IQcYa/B6UZyuNyPrsOUm1lpyjlZYKuz Qbovx3unYwsLuaAKkoKrkx+i4asvos85pH2I0bJPqP49uHDbOPFpM+naanTvD8lj CiO/cPxD9sJSh6ai/dXaT/lLfs7/g1Kht79H6ZmdsqchBCUss1Zf1H6V5OJ15Sd9 LQ38HqR+zJ28+/sZa8T67Y4om4nD4/1cY6jL3+v1VvPvmqj3dyBTzN3XsYutidXH RB27ttGB8k6YKW5jXfoospfdVpk1YnjaB4hEepexH9RnUz1ypz9JuhTInWdsD32d 2Z0eN0lJ3QLxtYx3hjlCvWa8wpyUlf46XcvnR19Of60Ic7XCEHJ7pUUlBiLy6V9h xixOxBzuTGWGlF/+jtai6mA11tS3NPo4raoz9UvC0jlnKiwVqoDdF+f8KQPlFgPw skvQk9DoO8YPL8cEjL+Xqn6/PEstFaJ5fLVEoeUJsFFKPh4k1Vy7uLmBCCEpYSWI 0wRyan8Wgjt9bqChbllk/Pv6j4gqnwDCPerNVG1EylPXscYUncBOYaOx8Kig94lR vy1aZ28OEsLQ3TnCHOiqIx0vR4wyESBSk7oFu8H2i9lqJbnc/bCTfRIJ0F+KnxOX VUr1jAwCCRfn/CtzBh3GCnsf6awmBeHKPNRJxycgj4wtHmoUzBeN1HP6w4T7eA6H OqKPVhKVCnrsUIFenYrTro+MLCHpbqA/3zzzzzzzzzzzzzz/+zVloPAAKMAP3T1q +04Nn21pgYv6+N7G+3vD3/Ep+JYfRbXG+Kz4/wcjlcjf2dyRZX2Vczr4WyXWzbmG cZWWNsV5++r7Hebze73Y19dvLGtt9vK1L/rGxHB72v3ddY73eXDbC44fbW21vN9c RXbGxPtjYj/vLrxRcouGrbmOr3nyWHH2/H+Tj+fXoNY25uB4/vF0Ou/dnOjbNl3r 8eZB6BDe94s8xt+bRkf798PPD+W+tLxk198Yvce8PFgnOPwSCQkJ0nWzWHOP98P7 yzOYa1vwlXx4luTMnTkG8Dw7bUt86dUL+KdOHa7koNx1HR9L/e15Y4fBW6WfWogu RaQnJ5HgPAJ4tzS1b4Y7gPHFhH3Qb4H5xYjawDiyVhPqIJKnlk78FZg0F9adbHOd eP3HajfQGwd/0Onnzf/RBj/efkt35tEmj6Wdmb3k/dod/ATK90r7is5drgKTVW7J /F6uvtlXWVWP5U11cbi2VWV0odztxem3/S+91YQPW1z9fcu8Iaiv6J9FbN714t6E 2/UNxaW4B2H59cXb4446AClJe8+0HxD/fPPF9OxR8HrIhAm5Jm2T0/m/xfB/+cQ9 ewBABwA= ------------Ic5JB9wJ6xukHxf3C7JHKM--
Aug 04 2011
parent reply bearophile <bearophileHUGS lycos.com> writes:
 Trass3r:
 are you able and willing to show me the asm produced by gdc? There's a
 problem there.


In the bla.rar attach there's the unstripped Linux binary, so to read the asm I have used the objdump disassembler. But are you willing and able to show me the asm before it gets assembled? (with gcc you do it with the -S switch). (I also suggest to use only the C standard library, with time() and printf() to produce a smaller asm output: http://codepad.org/12EUo16J ). Using objdump I see it uses 16 xmm registers, this is the main routine. But what's the purpose of those callq? They seem to call the successive asm instruction. The x86 asm of this routine contains jumps only and no "call". The asm of this routine is also very long, I don't know why yet. I see too many instructions like "movss 0x80(%rsp), %xmm7" this looks like a problem. _calculateVerticesAndNormals: push %r15 push %r14 push %r13 push %r12 push %rbp push %rbx sub $0x268, %rsp mov 0x2a0(%rsp), %rax mov %rdi, 0xe8(%rsp) mov %rsi, 0xe0(%rsp) mov %rcx, 0x128(%rsp) mov %r8, 0x138(%rsp) mov %rax, 0xf0(%rsp) mov 0x2a8(%rsp), %rax mov %rdi, 0x180(%rsp) mov %rsi, 0x188(%rsp) mov %rcx, 0x170(%rsp) mov %rax, 0xf8(%rsp) mov 0x2b0(%rsp), %rax mov %r8, 0x178(%rsp) mov %rax, 0x130(%rsp) mov 0x2b8(%rsp), %rax mov %rax, 0x140(%rsp) mov %rcx, %rax add %rax, %rax cmp 0x130(%rsp), %rax je 74d <_calculateVerticesAndNormals+0xcd> mov $0x57, %edx mov $0x6, %edi mov $0x0, %esi movq $0x6, 0x190(%rsp) movq $0x0, 0x198(%rsp) callq 74d <_calculateVerticesAndNormals+0xcd> cmpq $0x0, 0x128(%rsp) je 1317 <_calculateVerticesAndNormals+0xc97> movq $0x1, 0x120(%rsp) xor %r15d, %r15d movq $0x0, 0x100(%rsp) movslq %r15d, %r12 cmp %r12, 0xf0(%rsp) movq $0x0, 0x108(%rsp) jbe f1d <_calculateVerticesAndNormals+0x89d> nopl 0x0(%rax) lea (%r12, %r12, 2), %rax shl $0x2, %rax mov %rax, 0x148(%rsp) mov 0xf8(%rsp), %rax add 0x148(%rsp), %rax movss 0x4(%rax), %xmm9 movzbl 0x8(%rax), %r13d movslq (%rax), %rax cmp 0xe8(%rsp), %rax jae f50 <_calculateVerticesAndNormals+0x8d0> lea (%rax, %rax, 2), %rax shl $0x4, %rax mov %rax, 0x110(%rsp) mov 0xe0(%rsp), %rbx add 0x110(%rsp), %rbx je 12af <_calculateVerticesAndNormals+0xc2f> movss (%rbx), %xmm7 test %r13b, %r13b movss 0x4(%rbx), %xmm8 movss 0x8(%rbx), %xmm6 mulss %xmm9, %xmm7 movss 0xc(%rbx), %xmm11 mulss %xmm9, %xmm8 movss 0x10(%rbx), %xmm4 mulss %xmm9, %xmm6 movss 0x14(%rbx), %xmm5 mulss %xmm9, %xmm11 movss 0x18(%rbx), %xmm3 mulss %xmm9, %xmm4 movss 0x1c(%rbx), %xmm10 mulss %xmm9, %xmm5 movss 0x20(%rbx), %xmm1 mulss %xmm9, %xmm3 movss 0x24(%rbx), %xmm2 mulss %xmm9, %xmm10 movss 0x28(%rbx), %xmm0 mulss %xmm9, %xmm1 mulss %xmm9, %xmm2 mulss %xmm9, %xmm0 mulss 0x2c(%rbx), %xmm9 jne cdb <_calculateVerticesAndNormals+0x65b> add $0x1, %r12 mov %r14, %rax lea (%r12, %r12, 2), %r13 shl $0x2, %r13 jmpq 99e <_calculateVerticesAndNormals+0x31e> nopl (%rax) mov %r13, %rax mov 0xf8(%rsp), %rdx add %rax, %rdx movss 0x4(%rdx), %xmm12 movzbl 0x8(%rdx), %r14d movslq (%rdx), %rdx cmp %rdx, 0xe8(%rsp) jbe aa0 <_calculateVerticesAndNormals+0x420> mov 0xe0(%rsp), %rbx lea (%rdx, %rdx, 2), %rbp shl $0x4, %rbp add %rbp, %rbx je baf <_calculateVerticesAndNormals+0x52f> movss (%rbx), %xmm13 add $0x1, %r12 add $0xc, %r13 test %r14b, %r14b mulss %xmm12, %xmm13 addss %xmm13, %xmm7 movss 0x4(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm8 movss 0x8(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm6 movss 0xc(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm11 movss 0x10(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm4 movss 0x14(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm5 movss 0x18(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm3 movss 0x1c(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm10 movss 0x20(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm1 movss 0x24(%rbx), %xmm13 mulss %xmm12, %xmm13 addss %xmm13, %xmm2 movss 0x28(%rbx), %xmm13 mulss %xmm12, %xmm13 mulss 0x2c(%rbx), %xmm12 addss %xmm13, %xmm0 addss %xmm12, %xmm9 jne cd8 <_calculateVerticesAndNormals+0x658> add $0x1, %r15d cmp %r12, 0xf0(%rsp) ja 890 <_calculateVerticesAndNormals+0x210> mov $0x63, %edx mov $0x6, %edi mov $0x0, %esi mov %rax, 0xc8(%rsp) movss %xmm0, (%rsp) movss %xmm1, 0x20(%rsp) movss %xmm2, 0x10(%rsp) movss %xmm3, 0x30(%rsp) movss %xmm4, 0x50(%rsp) movss %xmm5, 0x40(%rsp) movss %xmm6, 0x60(%rsp) movss %xmm7, 0x80(%rsp) movss %xmm8, 0x70(%rsp) movss %xmm9, 0x90(%rsp) movss %xmm10, 0xa0(%rsp) movss %xmm11, 0xb0(%rsp) movq $0x6, 0x1c0(%rsp) movq $0x0, 0x1c8(%rsp) callq a3b <_calculateVerticesAndNormals+0x3bb> mov 0xc8(%rsp), %rax movss (%rsp), %xmm0 movss 0x20(%rsp), %xmm1 movss 0x10(%rsp), %xmm2 movss 0x30(%rsp), %xmm3 movss 0x50(%rsp), %xmm4 movss 0x40(%rsp), %xmm5 movss 0x60(%rsp), %xmm6 movss 0x80(%rsp), %xmm7 movss 0x70(%rsp), %xmm8 movss 0x90(%rsp), %xmm9 movss 0xa0(%rsp), %xmm10 movss 0xb0(%rsp), %xmm11 jmpq 893 <_calculateVerticesAndNormals+0x213> nop mov $0x65, %edx mov $0x6, %edi mov $0x0, %esi mov %rax, 0xc8(%rsp) movss %xmm0, (%rsp) movss %xmm1, 0x20(%rsp) movss %xmm2, 0x10(%rsp) movss %xmm3, 0x30(%rsp) movss %xmm4, 0x50(%rsp) movss %xmm5, 0x40(%rsp) movss %xmm6, 0x60(%rsp) movss %xmm7, 0x80(%rsp) movss %xmm8, 0x70(%rsp) movss %xmm9, 0x90(%rsp) movss %xmm10, 0xa0(%rsp) movss %xmm11, 0xb0(%rsp) movss %xmm12, 0xd0(%rsp) movq $0x6, 0x1d0(%rsp) movq $0x0, 0x1d8(%rsp) callq b35 <_calculateVerticesAndNormals+0x4b5> mov 0xe0(%rsp), %rbx movss 0xd0(%rsp), %xmm12 movss 0xb0(%rsp), %xmm11 movss 0xa0(%rsp), %xmm10 add %rbp, %rbx movss 0x70(%rsp), %xmm8 movss 0x90(%rsp), %xmm9 movss 0x80(%rsp), %xmm7 movss 0x60(%rsp), %xmm6 movss 0x40(%rsp), %xmm5 movss 0x50(%rsp), %xmm4 movss 0x30(%rsp), %xmm3 movss 0x10(%rsp), %xmm2 movss 0x20(%rsp), %xmm1 movss (%rsp), %xmm0 mov 0xc8(%rsp), %rax jne 8d3 <_calculateVerticesAndNormals+0x253> mov $0x23, %r8d mov $0x6, %edx mov $0x0, %ecx mov $0x9, %edi mov $0x0, %esi movss %xmm0, (%rsp) mov %rax, 0xc8(%rsp) movss %xmm1, 0x20(%rsp) movss %xmm2, 0x10(%rsp) movss %xmm3, 0x30(%rsp) movss %xmm4, 0x50(%rsp) movss %xmm5, 0x40(%rsp) movss %xmm6, 0x60(%rsp) movss %xmm7, 0x80(%rsp) movss %xmm8, 0x70(%rsp) movss %xmm9, 0x90(%rsp) movss %xmm10, 0xa0(%rsp) movss %xmm11, 0xb0(%rsp) movss %xmm12, 0xd0(%rsp) movq $0x6, 0x240(%rsp) movq $0x0, 0x248(%rsp) movq $0x9, 0x250(%rsp) movq $0x0, 0x258(%rsp) callq c67 <_calculateVerticesAndNormals+0x5e7> movss 0x70(%rsp), %xmm8 movss 0xd0(%rsp), %xmm12 movss 0xb0(%rsp), %xmm11 movss 0xa0(%rsp), %xmm10 movss 0x90(%rsp), %xmm9 movss 0x80(%rsp), %xmm7 movss 0x60(%rsp), %xmm6 movss 0x40(%rsp), %xmm5 movss 0x50(%rsp), %xmm4 movss 0x30(%rsp), %xmm3 movss 0x10(%rsp), %xmm2 movss 0x20(%rsp), %xmm1 movss (%rsp), %xmm0 mov 0xc8(%rsp), %rax jmpq 8d3 <_calculateVerticesAndNormals+0x253> nopl (%rax) mov %rax, %r14 mov 0x108(%rsp), %rax cmp %rax, 0x128(%rsp) jbe 11d0 <_calculateVerticesAndNormals+0xb50> shl $0x5, %rax mov %rax, 0x150(%rsp) mov 0x100(%rsp), %rax mov 0x138(%rsp), %rbx add %rax, %rax add 0x150(%rsp), %rbx cmp %rax, 0x130(%rsp) jbe 10e8 <_calculateVerticesAndNormals+0xa68> mov 0x100(%rsp), %rax shl $0x5, %rax mov %rax, 0x158(%rsp) movss 0x8(%rbx), %xmm12 movaps %xmm8, %xmm15 movss (%rbx), %xmm14 movss %xmm12, 0x11c(%rsp) movss 0x4(%rbx), %xmm13 movaps %xmm7, %xmm12 mulss %xmm14, %xmm12 mov 0x140(%rsp), %rax mulss %xmm13, %xmm15 add 0x158(%rsp), %rax addss %xmm15, %xmm12 addss %xmm11, %xmm12 movl $0x0, 0xc(%rax) movss 0x11c(%rsp), %xmm11 mulss %xmm6, %xmm11 addss %xmm11, %xmm12 movaps %xmm4, %xmm11 mulss %xmm14, %xmm11 mulss %xmm1, %xmm14 movss %xmm12, (%rax) movaps %xmm5, %xmm12 mulss %xmm13, %xmm12 mulss %xmm2, %xmm13 addss %xmm12, %xmm11 addss %xmm13, %xmm14 addss %xmm10, %xmm11 movss 0x11c(%rsp), %xmm10 addss %xmm9, %xmm14 movss 0x11c(%rsp), %xmm9 mulss %xmm3, %xmm10 mulss %xmm0, %xmm9 addss %xmm10, %xmm11 addss %xmm9, %xmm14 movss %xmm11, 0x4(%rax) movss %xmm14, 0x8(%rax) mov 0x108(%rsp), %rax cmp %rax, 0x128(%rsp) jbe 1040 <_calculateVerticesAndNormals+0x9c0> shl $0x5, %rax mov %rax, 0x160(%rsp) mov 0x138(%rsp), %rbx mov 0x120(%rsp), %rax add 0x160(%rsp), %rbx cmp %rax, 0x130(%rsp) jbe f98 <_calculateVerticesAndNormals+0x918> shl $0x4, %rax mov %rax, 0x168(%rsp) movss 0x10(%rbx), %xmm10 add $0x1, %r15d movss 0x14(%rbx), %xmm11 mulss %xmm10, %xmm7 mov 0x140(%rsp), %rax mulss %xmm11, %xmm8 movss 0x18(%rbx), %xmm9 mulss %xmm11, %xmm5 mulss %xmm10, %xmm4 mulss %xmm11, %xmm2 add 0x168(%rsp), %rax addq $0x1, 0x100(%rsp) addss %xmm7, %xmm8 addq $0x2, 0x120(%rsp) addss %xmm4, %xmm5 mulss %xmm10, %xmm1 mulss %xmm9, %xmm6 movl $0x0, 0xc(%rax) mulss %xmm9, %xmm3 mulss %xmm9, %xmm0 addss %xmm1, %xmm2 addss %xmm6, %xmm8 addss %xmm3, %xmm5 addss %xmm0, %xmm2 movss %xmm8, (%rax) movss %xmm5, 0x4(%rax) movss %xmm2, 0x8(%rax) mov 0x100(%rsp), %rax cmp %rax, 0x128(%rsp) je 1317 <_calculateVerticesAndNormals+0xc97> movslq %r15d, %r12 mov %rax, 0x108(%rsp) cmp %r12, 0xf0(%rsp) ja 798 <_calculateVerticesAndNormals+0x118> mov $0x5d, %edx mov $0x6, %edi mov $0x0, %esi movq $0x6, 0x1a0(%rsp) movq $0x0, 0x1a8(%rsp) callq f49 <_calculateVerticesAndNormals+0x8c9> jmpq 7a8 <_calculateVerticesAndNormals+0x128> xchg %ax, %ax mov $0x5f, %edx mov $0x6, %edi mov $0x0, %esi movss %xmm9, 0x90(%rsp) movq $0x6, 0x1b0(%rsp) movq $0x0, 0x1b8(%rsp) callq f86 <_calculateVerticesAndNormals+0x906> movss 0x90(%rsp), %xmm9 jmpq 7e4 <_calculateVerticesAndNormals+0x164> nopl (%rax) mov $0x69, %edx mov $0x6, %edi mov $0x0, %esi movss %xmm0, (%rsp) movss %xmm1, 0x20(%rsp) movss %xmm2, 0x10(%rsp) movss %xmm3, 0x30(%rsp) movss %xmm4, 0x50(%rsp) movss %xmm5, 0x40(%rsp) movss %xmm6, 0x60(%rsp) movss %xmm7, 0x80(%rsp) movss %xmm8, 0x70(%rsp) movq $0x6, 0x210(%rsp) movq $0x0, 0x218(%rsp) callq ffd <_calculateVerticesAndNormals+0x97d> movss 0x70(%rsp), %xmm8 movss 0x80(%rsp), %xmm7 movss 0x60(%rsp), %xmm6 movss 0x40(%rsp), %xmm5 movss 0x50(%rsp), %xmm4 movss 0x30(%rsp), %xmm3 movss 0x10(%rsp), %xmm2 movss 0x20(%rsp), %xmm1 movss (%rsp), %xmm0 jmpq e59 <_calculateVerticesAndNormals+0x7d9> nopl 0x0(%rax, %rax, 1) mov $0x69, %edx mov $0x6, %edi mov $0x0, %esi movss %xmm0, (%rsp) movss %xmm1, 0x20(%rsp) movss %xmm2, 0x10(%rsp) movss %xmm3, 0x30(%rsp) movss %xmm4, 0x50(%rsp) movss %xmm5, 0x40(%rsp) movss %xmm6, 0x60(%rsp) movss %xmm7, 0x80(%rsp) movss %xmm8, 0x70(%rsp) movq $0x6, 0x200(%rsp) movq $0x0, 0x208(%rsp) callq 10a5 <_calculateVerticesAndNormals+0xa25> movss 0x70(%rsp), %xmm8 movss 0x80(%rsp), %xmm7 movss 0x60(%rsp), %xmm6 movss 0x40(%rsp), %xmm5 movss 0x50(%rsp), %xmm4 movss 0x30(%rsp), %xmm3 movss 0x10(%rsp), %xmm2 movss 0x20(%rsp), %xmm1 movss (%rsp), %xmm0 jmpq e27 <_calculateVerticesAndNormals+0x7a7> nopl 0x0(%rax, %rax, 1) mov $0x68, %edx mov $0x6, %edi mov $0x0, %esi movss %xmm0, (%rsp) movss %xmm1, 0x20(%rsp) movss %xmm2, 0x10(%rsp) movss %xmm3, 0x30(%rsp) movss %xmm4, 0x50(%rsp) movss %xmm5, 0x40(%rsp) movss %xmm6, 0x60(%rsp) movss %xmm7, 0x80(%rsp) movss %xmm8, 0x70(%rsp) movss %xmm9, 0x90(%rsp) movss %xmm10, 0xa0(%rsp) movss %xmm11, 0xb0(%rsp) movq $0x6, 0x1f0(%rsp) movq $0x0, 0x1f8(%rsp) callq 116b <_calculateVerticesAndNormals+0xaeb> movss 0x70(%rsp), %xmm8 movss 0xb0(%rsp), %xmm11 movss 0xa0(%rsp), %xmm10 movss 0x90(%rsp), %xmm9 movss 0x80(%rsp), %xmm7 movss 0x60(%rsp), %xmm6 movss 0x40(%rsp), %xmm5 movss 0x50(%rsp), %xmm4 movss 0x30(%rsp), %xmm3 movss 0x10(%rsp), %xmm2 movss 0x20(%rsp), %xmm1 movss (%rsp), %xmm0 jmpq d3a <_calculateVerticesAndNormals+0x6ba> nopw 0x0(%rax, %rax, 1) mov $0x68, %edx mov $0x6, %edi mov $0x0, %esi movss %xmm0, (%rsp) movss %xmm1, 0x20(%rsp) movss %xmm2, 0x10(%rsp) movss %xmm3, 0x30(%rsp) movss %xmm4, 0x50(%rsp) movss %xmm5, 0x40(%rsp) movss %xmm6, 0x60(%rsp) movss %xmm7, 0x80(%rsp) movss %xmm8, 0x70(%rsp) movss %xmm9, 0x90(%rsp) movss %xmm10, 0xa0(%rsp) movss %xmm11, 0xb0(%rsp) movq $0x6, 0x1e0(%rsp) movq $0x0, 0x1e8(%rsp) callq 1253 <_calculateVerticesAndNormals+0xbd3> movss 0x70(%rsp), %xmm8 movss 0xb0(%rsp), %xmm11 movss 0xa0(%rsp), %xmm10 movss 0x90(%rsp), %xmm9 movss 0x80(%rsp), %xmm7 movss 0x60(%rsp), %xmm6 movss 0x40(%rsp), %xmm5 movss 0x50(%rsp), %xmm4 movss 0x30(%rsp), %xmm3 movss 0x10(%rsp), %xmm2 movss 0x20(%rsp), %xmm1 movss (%rsp), %xmm0 jmpq cfd <_calculateVerticesAndNormals+0x67d> mov $0x12, %r8d mov $0x6, %edx mov $0x0, %ecx mov $0x9, %edi mov $0x0, %esi movss %xmm9, 0x90(%rsp) movq $0x6, 0x220(%rsp) movq $0x0, 0x228(%rsp) movq $0x9, 0x230(%rsp) movq $0x0, 0x238(%rsp) callq 1308 <_calculateVerticesAndNormals+0xc88> movss 0x90(%rsp), %xmm9 jmpq 7fa <_calculateVerticesAndNormals+0x17a> add $0x268, %rsp pop %rbx pop %rbp pop %r12 pop %r13 pop %r14 pop %r15 retq nopl 0x0(%rax) Bye, bearophile
Aug 04 2011
parent reply Adam Ruppe <destructionator gmail.com> writes:
 But what's the purpose of those callq? They seem to call the
 successive asm instruct

I find AT&T syntax to be almost impossible to read, but it looks like they are comparing the instruction pointer for some reason. call works by pushing the instruction pointer on the stack, then jumping to the new address. By calling the next thing, you can then pop the instruction pointer off the stack and continue on where you left off. I don't know why they want this though. That AT&T syntax really messes with my brain...
Aug 04 2011
parent Don <nospam nospam.com> writes:
Adam Ruppe wrote:
 But what's the purpose of those callq? They seem to call the
 successive asm instruct

I find AT&T syntax to be almost impossible to read, but it looks like they are comparing the instruction pointer for some reason. call works by pushing the instruction pointer on the stack, then jumping to the new address. By calling the next thing, you can then pop the instruction pointer off the stack and continue on where you left off.

They do that to implement Position Independent Code: you need to know the instruction pointer, to be able to access your data. Actually it has a terrible effect on performance, because it destroys the processor's return prediction mechanism (it guarantees multiple mispredictions). But it seems to be unavoidable -- I don't think it's possible to generate decent code for PIC on x86-32. But there should never be more than one call in a function.
 I don't know why they want this though. That AT&T syntax really
 messes with my brain...

Aug 05 2011
prev sibling next sibling parent reply Trass3r <un known.com> writes:
------------m2ppbAqWZxQNFetByPwXsp
Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes
Content-Transfer-Encoding: 7bit

 are you willing and able to show me the asm before it gets assembled?  
 (with gcc you do it with the -S switch). (I also suggest to use only the  
 C standard library, with time() and printf() to produce a smaller asm  
 output: http://codepad.org/12EUo16J ).

Content-Disposition: attachment; filename=dver.s Content-Type: application/octet-stream; name=dver.s Content-Transfer-Encoding: Base64 CS5maWxlCSJkdmVyLmQiCgkuaW50ZWxfc3ludGF4IG5vcHJlZml4CgkudGV4dAoJ LnAyYWxpZ24gNCwsMTUKCS5nbG9ibAlfRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rv ck1GTmNmZmZmWlM0ZHZlcjEwQ2FsVmVjdG9yNAoJLnR5cGUJX0Q0ZHZlcjEwQ2Fs VmVjdG9yNDZfX2N0b3JNRk5jZmZmZlpTNGR2ZXIxMENhbFZlY3RvcjQsIEBmdW5j dGlvbgpfRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rvck1GTmNmZmZmWlM0ZHZlcjEw Q2FsVmVjdG9yNDoKLkxGQjA6CgkuY2ZpX3N0YXJ0cHJvYwoJdW5wY2tscHMJeG1t MiwgeG1tMwoJdW5wY2tscHMJeG1tMCwgeG1tMQoJbW92bGhwcwl4bW0wLCB4bW0y Cgltb3YJcmF4LCByZGkKCW1vdmxwcwlRV09SRCBQVFIgW3JkaV0sIHhtbTAKCW1v dmhwcwlRV09SRCBQVFIgW3JkaSs4XSwgeG1tMAoJcmV0CgkuY2ZpX2VuZHByb2MK LkxGRTA6Cgkuc2l6ZQlfRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rvck1GTmNmZmZm WlM0ZHZlcjEwQ2FsVmVjdG9yNCwgLi1fRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rv ck1GTmNmZmZmWlM0ZHZlcjEwQ2FsVmVjdG9yNAoJLnNlY3Rpb24JLnJvZGF0YQou TEMwOgoJLnN0cmluZwkiZHZlci5kIgouTEMxOgoJLnN0cmluZwkibnVsbCB0aGlz IgoJLnRleHQKCS5wMmFsaWduIDQsLDE1CgkuZ2xvYmwJX0Q0ZHZlcjEzQm9uZVRy YW5zZm9ybTVzY2FsZU1GS1M0ZHZlcjEzQm9uZVRyYW5zZm9ybWZadgoJLnR5cGUJ X0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTVzY2FsZU1GS1M0ZHZlcjEzQm9uZVRyYW5z Zm9ybWZadiwgQGZ1bmN0aW9uCl9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm01c2NhbGVN RktTNGR2ZXIxM0JvbmVUcmFuc2Zvcm1mWnY6Ci5MRkIxOgoJLmNmaV9zdGFydHBy b2MKCXB1c2gJcmJwCgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDE2CgkuY2ZpX29mZnNl dCA2LCAtMTYKCW1vdglyYnAsIHJzaQoJcHVzaAlyYngKCS5jZmlfZGVmX2NmYV9v ZmZzZXQgMjQKCS5jZmlfb2Zmc2V0IDMsIC0yNAoJbW92CXJieCwgcmRpCglzdWIJ cnNwLCA1NgoJLmNmaV9kZWZfY2ZhX29mZnNldCA4MAoJdGVzdAlyZGksIHJkaQoJ amUJLkw1Ci5MMzoKCW1vdnNzCXhtbTEsIERXT1JEIFBUUiBbcmJ4XQoJbXVsc3MJ eG1tMSwgeG1tMAoJbW92c3MJRFdPUkQgUFRSIFtyYnArMF0sIHhtbTEKCW1vdnNz CXhtbTEsIERXT1JEIFBUUiBbcmJ4KzRdCgltdWxzcwl4bW0xLCB4bW0wCgltb3Zz cwlEV09SRCBQVFIgW3JicCs0XSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRS IFtyYngrOF0KCW11bHNzCXhtbTEsIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcmJw KzhdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JieCsxMl0KCW11bHNz CXhtbTEsIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcmJwKzEyXSwgeG1tMQoJbW92 c3MJeG1tMSwgRFdPUkQgUFRSIFtyYngrMTZdCgltdWxzcwl4bW0xLCB4bW0wCglt b3ZzcwlEV09SRCBQVFIgW3JicCsxNl0sIHhtbTEKCW1vdnNzCXhtbTEsIERXT1JE IFBUUiBbcmJ4KzIwXQoJbXVsc3MJeG1tMSwgeG1tMAoJbW92c3MJRFdPUkQgUFRS IFtyYnArMjBdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JieCsyNF0K CW11bHNzCXhtbTEsIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcmJwKzI0XSwgeG1t MQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyYngrMjhdCgltdWxzcwl4bW0xLCB4 bW0wCgltb3ZzcwlEV09SRCBQVFIgW3JicCsyOF0sIHhtbTEKCW1vdnNzCXhtbTEs IERXT1JEIFBUUiBbcmJ4KzMyXQoJbXVsc3MJeG1tMSwgeG1tMAoJbW92c3MJRFdP UkQgUFRSIFtyYnArMzJdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3Ji eCszNl0KCW11bHNzCXhtbTEsIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcmJwKzM2 XSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyYngrNDBdCgltdWxzcwl4 bW0xLCB4bW0wCgltdWxzcwl4bW0wLCBEV09SRCBQVFIgW3JieCs0NF0KCW1vdnNz CURXT1JEIFBUUiBbcmJwKzQwXSwgeG1tMQoJbW92c3MJRFdPUkQgUFRSIFtyYnAr NDRdLCB4bW0wCglhZGQJcnNwLCA1NgoJLmNmaV9yZW1lbWJlcl9zdGF0ZQoJLmNm aV9kZWZfY2ZhX29mZnNldCAyNAoJcG9wCXJieAoJLmNmaV9kZWZfY2ZhX29mZnNl dCAxNgoJcG9wCXJicAoJLmNmaV9kZWZfY2ZhX29mZnNldCA4CglyZXQKCS5wMmFs aWduIDQsLDEwCgkucDJhbGlnbiAzCi5MNToKCS5jZmlfcmVzdG9yZV9zdGF0ZQoJ bW92CXI4ZCwgMTgKCW1vdgllZHgsIDYKCW1vdgllY3gsIE9GRlNFVCBGTEFUOi5M QzAKCW1vdgllZGksIDkKCW1vdgllc2ksIE9GRlNFVCBGTEFUOi5MQzEKCW1vdnNz CURXT1JEIFBUUiBbcnNwXSwgeG1tMAoJbW92CVFXT1JEIFBUUiBbcnNwKzE2XSwg NgoJbW92CVFXT1JEIFBUUiBbcnNwKzI0XSwgT0ZGU0VUIEZMQVQ6LkxDMAoJbW92 CVFXT1JEIFBUUiBbcnNwKzMyXSwgOQoJbW92CVFXT1JEIFBUUiBbcnNwKzQwXSwg T0ZGU0VUIEZMQVQ6LkxDMQoJY2FsbAlfZF9hc3NlcnRfbXNnCgltb3Zzcwl4bW0w LCBEV09SRCBQVFIgW3JzcF0KCWptcAkuTDMKCS5jZmlfZW5kcHJvYwouTEZFMToK CS5zaXplCV9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm01c2NhbGVNRktTNGR2ZXIxM0Jv bmVUcmFuc2Zvcm1mWnYsIC4tX0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTVzY2FsZU1G S1M0ZHZlcjEzQm9uZVRyYW5zZm9ybWZadgoJLnAyYWxpZ24gNCwsMTUKCS5nbG9i bAlfRDRkdmVyMTNCb25lVHJhbnNmb3JtOWFkZFNjYWxlZE1GS1M0ZHZlcjEzQm9u ZVRyYW5zZm9ybWZadgoJLnR5cGUJX0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTlhZGRT Y2FsZWRNRktTNGR2ZXIxM0JvbmVUcmFuc2Zvcm1mWnYsIEBmdW5jdGlvbgpfRDRk dmVyMTNCb25lVHJhbnNmb3JtOWFkZFNjYWxlZE1GS1M0ZHZlcjEzQm9uZVRyYW5z Zm9ybWZadjoKLkxGQjI6CgkuY2ZpX3N0YXJ0cHJvYwoJcHVzaAlyYnAKCS5jZmlf ZGVmX2NmYV9vZmZzZXQgMTYKCS5jZmlfb2Zmc2V0IDYsIC0xNgoJbW92CXJicCwg cmRpCglwdXNoCXJieAoJLmNmaV9kZWZfY2ZhX29mZnNldCAyNAoJLmNmaV9vZmZz ZXQgMywgLTI0Cgltb3YJcmJ4LCByc2kKCXN1Yglyc3AsIDU2CgkuY2ZpX2RlZl9j ZmFfb2Zmc2V0IDgwCgl0ZXN0CXJkaSwgcmRpCglqZQkuTDgKLkw3OgoJbW92c3MJ eG1tMSwgRFdPUkQgUFRSIFtyYnArMF0KCW11bHNzCXhtbTEsIHhtbTAKCWFkZHNz CXhtbTEsIERXT1JEIFBUUiBbcmJ4XQoJbW92c3MJRFdPUkQgUFRSIFtyYnhdLCB4 bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JicCs0XQoJbXVsc3MJeG1tMSwg eG1tMAoJYWRkc3MJeG1tMSwgRFdPUkQgUFRSIFtyYngrNF0KCW1vdnNzCURXT1JE IFBUUiBbcmJ4KzRdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JicCs4 XQoJbXVsc3MJeG1tMSwgeG1tMAoJYWRkc3MJeG1tMSwgRFdPUkQgUFRSIFtyYngr OF0KCW1vdnNzCURXT1JEIFBUUiBbcmJ4KzhdLCB4bW0xCgltb3Zzcwl4bW0xLCBE V09SRCBQVFIgW3JicCsxMl0KCW11bHNzCXhtbTEsIHhtbTAKCWFkZHNzCXhtbTEs IERXT1JEIFBUUiBbcmJ4KzEyXQoJbW92c3MJRFdPUkQgUFRSIFtyYngrMTJdLCB4 bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JicCsxNl0KCW11bHNzCXhtbTEs IHhtbTAKCWFkZHNzCXhtbTEsIERXT1JEIFBUUiBbcmJ4KzE2XQoJbW92c3MJRFdP UkQgUFRSIFtyYngrMTZdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3Ji cCsyMF0KCW11bHNzCXhtbTEsIHhtbTAKCWFkZHNzCXhtbTEsIERXT1JEIFBUUiBb cmJ4KzIwXQoJbW92c3MJRFdPUkQgUFRSIFtyYngrMjBdLCB4bW0xCgltb3Zzcwl4 bW0xLCBEV09SRCBQVFIgW3JicCsyNF0KCW11bHNzCXhtbTEsIHhtbTAKCWFkZHNz CXhtbTEsIERXT1JEIFBUUiBbcmJ4KzI0XQoJbW92c3MJRFdPUkQgUFRSIFtyYngr MjRdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JicCsyOF0KCW11bHNz CXhtbTEsIHhtbTAKCWFkZHNzCXhtbTEsIERXT1JEIFBUUiBbcmJ4KzI4XQoJbW92 c3MJRFdPUkQgUFRSIFtyYngrMjhdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQ VFIgW3JicCszMl0KCW11bHNzCXhtbTEsIHhtbTAKCWFkZHNzCXhtbTEsIERXT1JE IFBUUiBbcmJ4KzMyXQoJbW92c3MJRFdPUkQgUFRSIFtyYngrMzJdLCB4bW0xCglt b3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JicCszNl0KCW11bHNzCXhtbTEsIHhtbTAK CWFkZHNzCXhtbTEsIERXT1JEIFBUUiBbcmJ4KzM2XQoJbW92c3MJRFdPUkQgUFRS IFtyYngrMzZdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JicCs0MF0K CW11bHNzCXhtbTEsIHhtbTAKCW11bHNzCXhtbTAsIERXT1JEIFBUUiBbcmJwKzQ0 XQoJYWRkc3MJeG1tMSwgRFdPUkQgUFRSIFtyYngrNDBdCglhZGRzcwl4bW0wLCBE V09SRCBQVFIgW3JieCs0NF0KCW1vdnNzCURXT1JEIFBUUiBbcmJ4KzQwXSwgeG1t MQoJbW92c3MJRFdPUkQgUFRSIFtyYngrNDRdLCB4bW0wCglhZGQJcnNwLCA1NgoJ LmNmaV9yZW1lbWJlcl9zdGF0ZQoJLmNmaV9kZWZfY2ZhX29mZnNldCAyNAoJcG9w CXJieAoJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgoJcG9wCXJicAoJLmNmaV9kZWZf Y2ZhX29mZnNldCA4CglyZXQKCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5M ODoKCS5jZmlfcmVzdG9yZV9zdGF0ZQoJbW92CXI4ZCwgMzUKCW1vdgllZHgsIDYK CW1vdgllY3gsIE9GRlNFVCBGTEFUOi5MQzAKCW1vdgllZGksIDkKCW1vdgllc2ks IE9GRlNFVCBGTEFUOi5MQzEKCW1vdnNzCURXT1JEIFBUUiBbcnNwXSwgeG1tMAoJ bW92CVFXT1JEIFBUUiBbcnNwKzE2XSwgNgoJbW92CVFXT1JEIFBUUiBbcnNwKzI0 XSwgT0ZGU0VUIEZMQVQ6LkxDMAoJbW92CVFXT1JEIFBUUiBbcnNwKzMyXSwgOQoJ bW92CVFXT1JEIFBUUiBbcnNwKzQwXSwgT0ZGU0VUIEZMQVQ6LkxDMQoJY2FsbAlf ZF9hc3NlcnRfbXNnCgltb3Zzcwl4bW0wLCBEV09SRCBQVFIgW3JzcF0KCWptcAku TDcKCS5jZmlfZW5kcHJvYwouTEZFMjoKCS5zaXplCV9ENGR2ZXIxM0JvbmVUcmFu c2Zvcm05YWRkU2NhbGVkTUZLUzRkdmVyMTNCb25lVHJhbnNmb3JtZlp2LCAuLV9E NGR2ZXIxM0JvbmVUcmFuc2Zvcm05YWRkU2NhbGVkTUZLUzRkdmVyMTNCb25lVHJh bnNmb3JtZlp2CgkucDJhbGlnbiA0LCwxNQoJLmdsb2JsCV9ENGR2ZXIxM0JvbmVU cmFuc2Zvcm0xNHRyYW5zZm9ybVBvaW50TUZLUzRkdmVyMTBDYWxWZWN0b3I0S1M0 ZHZlcjEwQ2FsVmVjdG9yNFp2CgkudHlwZQlfRDRkdmVyMTNCb25lVHJhbnNmb3Jt MTR0cmFuc2Zvcm1Qb2ludE1GS1M0ZHZlcjEwQ2FsVmVjdG9yNEtTNGR2ZXIxMENh bFZlY3RvcjRadiwgQGZ1bmN0aW9uCl9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm0xNHRy YW5zZm9ybVBvaW50TUZLUzRkdmVyMTBDYWxWZWN0b3I0S1M0ZHZlcjEwQ2FsVmVj dG9yNFp2OgouTEZCMzoKCS5jZmlfc3RhcnRwcm9jCgltb3YJUVdPUkQgUFRSIFty c3AtMjRdLCByYngKCW1vdglyYngsIHJkaQoJLmNmaV9vZmZzZXQgMywgLTMyCglt b3YJUVdPUkQgUFRSIFtyc3AtMTZdLCByYnAKCW1vdglyYnAsIHJzaQoJLmNmaV9v ZmZzZXQgNiwgLTI0Cgltb3YJUVdPUkQgUFRSIFtyc3AtOF0sIHIxMgoJc3ViCXJz cCwgNTYKCS5jZmlfZGVmX2NmYV9vZmZzZXQgNjQKCS5jZmlfb2Zmc2V0IDEyLCAt MTYKCXRlc3QJcmRpLCByZGkKCW1vdglyMTIsIHJkeAoJamUJLkwxMQouTDEwOgoJ bW92c3MJeG1tMiwgRFdPUkQgUFRSIFtyMTJdCgltb3Zzcwl4bW00LCBEV09SRCBQ VFIgW3IxMis0XQoJbW92c3MJeG1tMCwgRFdPUkQgUFRSIFtyYngrMzJdCgltb3Zz cwl4bW0xLCBEV09SRCBQVFIgW3JieCszNl0KCW11bHNzCXhtbTAsIHhtbTIKCW1v dnNzCXhtbTMsIERXT1JEIFBUUiBbcjEyKzhdCgltdWxzcwl4bW0xLCB4bW00Cglt b3Zzcwl4bW01LCBEV09SRCBQVFIgW3JieCsyMF0KCW11bHNzCXhtbTUsIHhtbTQK CW11bHNzCXhtbTQsIERXT1JEIFBUUiBbcmJ4KzRdCglhZGRzcwl4bW0wLCB4bW0x Cgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JieCs0MF0KCW11bHNzCXhtbTEsIHht bTMKCWFkZHNzCXhtbTAsIERXT1JEIFBUUiBbcmJ4KzQ0XQoJYWRkc3MJeG1tMCwg eG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyYngrMTZdCgltdWxzcwl4bW0x LCB4bW0yCgltdWxzcwl4bW0yLCBEV09SRCBQVFIgW3JieF0KCWFkZHNzCXhtbTEs IHhtbTUKCW1vdnNzCXhtbTUsIERXT1JEIFBUUiBbcmJ4KzI0XQoJYWRkc3MJeG1t MiwgeG1tNAoJbXVsc3MJeG1tNSwgeG1tMwoJbXVsc3MJeG1tMywgRFdPUkQgUFRS IFtyYngrOF0KCWFkZHNzCXhtbTEsIERXT1JEIFBUUiBbcmJ4KzI4XQoJYWRkc3MJ eG1tMiwgRFdPUkQgUFRSIFtyYngrMTJdCgltb3ZzcwlEV09SRCBQVFIgW3JicCs4 XSwgeG1tMAoJbW92CURXT1JEIFBUUiBbcmJwKzEyXSwgMHgwMDAwMDAwMAoJYWRk c3MJeG1tMSwgeG1tNQoJYWRkc3MJeG1tMiwgeG1tMwoJbW92c3MJRFdPUkQgUFRS IFtyYnArNF0sIHhtbTEKCW1vdnNzCURXT1JEIFBUUiBbcmJwKzBdLCB4bW0yCglt b3YJcmJ4LCBRV09SRCBQVFIgW3JzcCszMl0KCW1vdglyYnAsIFFXT1JEIFBUUiBb cnNwKzQwXQoJbW92CXIxMiwgUVdPUkQgUFRSIFtyc3ArNDhdCglhZGQJcnNwLCA1 NgoJLmNmaV9yZW1lbWJlcl9zdGF0ZQoJLmNmaV9kZWZfY2ZhX29mZnNldCA4Cgly ZXQKCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5MMTE6CgkuY2ZpX3Jlc3Rv cmVfc3RhdGUKCW1vdglyOGQsIDUyCgltb3YJZWR4LCA2Cgltb3YJZWN4LCBPRkZT RVQgRkxBVDouTEMwCgltb3YJZWRpLCA5Cgltb3YJZXNpLCBPRkZTRVQgRkxBVDou TEMxCgltb3YJUVdPUkQgUFRSIFtyc3BdLCA2Cgltb3YJUVdPUkQgUFRSIFtyc3Ar OF0sIE9GRlNFVCBGTEFUOi5MQzAKCW1vdglRV09SRCBQVFIgW3JzcCsxNl0sIDkK CW1vdglRV09SRCBQVFIgW3JzcCsyNF0sIE9GRlNFVCBGTEFUOi5MQzEKCWNhbGwJ X2RfYXNzZXJ0X21zZwoJam1wCS5MMTAKCS5jZmlfZW5kcHJvYwouTEZFMzoKCS5z aXplCV9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm0xNHRyYW5zZm9ybVBvaW50TUZLUzRk dmVyMTBDYWxWZWN0b3I0S1M0ZHZlcjEwQ2FsVmVjdG9yNFp2LCAuLV9ENGR2ZXIx M0JvbmVUcmFuc2Zvcm0xNHRyYW5zZm9ybVBvaW50TUZLUzRkdmVyMTBDYWxWZWN0 b3I0S1M0ZHZlcjEwQ2FsVmVjdG9yNFp2CgkucDJhbGlnbiA0LCwxNQoJLmdsb2Js CV9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm0xNXRyYW5zZm9ybVZlY3Rvck1GS1M0ZHZl cjEwQ2FsVmVjdG9yNEtTNGR2ZXIxMENhbFZlY3RvcjRadgoJLnR5cGUJX0Q0ZHZl cjEzQm9uZVRyYW5zZm9ybTE1dHJhbnNmb3JtVmVjdG9yTUZLUzRkdmVyMTBDYWxW ZWN0b3I0S1M0ZHZlcjEwQ2FsVmVjdG9yNFp2LCBAZnVuY3Rpb24KX0Q0ZHZlcjEz Qm9uZVRyYW5zZm9ybTE1dHJhbnNmb3JtVmVjdG9yTUZLUzRkdmVyMTBDYWxWZWN0 b3I0S1M0ZHZlcjEwQ2FsVmVjdG9yNFp2OgouTEZCNDoKCS5jZmlfc3RhcnRwcm9j Cgltb3YJUVdPUkQgUFRSIFtyc3AtMjRdLCByYngKCW1vdglyYngsIHJkaQoJLmNm aV9vZmZzZXQgMywgLTMyCgltb3YJUVdPUkQgUFRSIFtyc3AtMTZdLCByYnAKCW1v dglyYnAsIHJzaQoJLmNmaV9vZmZzZXQgNiwgLTI0Cgltb3YJUVdPUkQgUFRSIFty c3AtOF0sIHIxMgoJc3ViCXJzcCwgNTYKCS5jZmlfZGVmX2NmYV9vZmZzZXQgNjQK CS5jZmlfb2Zmc2V0IDEyLCAtMTYKCXRlc3QJcmRpLCByZGkKCW1vdglyMTIsIHJk eAoJamUJLkwxNAouTDEzOgoJbW92c3MJeG1tNCwgRFdPUkQgUFRSIFtyMTJdCglt b3Zzcwl4bW0yLCBEV09SRCBQVFIgW3IxMis0XQoJbW92c3MJeG1tMCwgRFdPUkQg UFRSIFtyYngrMzZdCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JieCszMl0KCW11 bHNzCXhtbTAsIHhtbTIKCW1vdnNzCXhtbTMsIERXT1JEIFBUUiBbcjEyKzhdCglt dWxzcwl4bW0xLCB4bW00Cgltb3Zzcwl4bW01LCBEV09SRCBQVFIgW3JieCsxNl0K CW11bHNzCXhtbTUsIHhtbTQKCW11bHNzCXhtbTQsIERXT1JEIFBUUiBbcmJ4XQoJ YWRkc3MJeG1tMCwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyYngrNDBd CgltdWxzcwl4bW0xLCB4bW0zCglhZGRzcwl4bW0wLCB4bW0xCgltb3Zzcwl4bW0x LCBEV09SRCBQVFIgW3JieCsyMF0KCW11bHNzCXhtbTEsIHhtbTIKCW11bHNzCXht bTIsIERXT1JEIFBUUiBbcmJ4KzRdCglhZGRzcwl4bW0xLCB4bW01Cgltb3Zzcwl4 bW01LCBEV09SRCBQVFIgW3JieCsyNF0KCWFkZHNzCXhtbTIsIHhtbTQKCW11bHNz CXhtbTUsIHhtbTMKCW11bHNzCXhtbTMsIERXT1JEIFBUUiBbcmJ4KzhdCgltb3Zz cwlEV09SRCBQVFIgW3JicCs4XSwgeG1tMAoJbW92CURXT1JEIFBUUiBbcmJwKzEy XSwgMHgwMDAwMDAwMAoJYWRkc3MJeG1tMSwgeG1tNQoJYWRkc3MJeG1tMiwgeG1t MwoJbW92c3MJRFdPUkQgUFRSIFtyYnArNF0sIHhtbTEKCW1vdnNzCURXT1JEIFBU UiBbcmJwKzBdLCB4bW0yCgltb3YJcmJ4LCBRV09SRCBQVFIgW3JzcCszMl0KCW1v dglyYnAsIFFXT1JEIFBUUiBbcnNwKzQwXQoJbW92CXIxMiwgUVdPUkQgUFRSIFty c3ArNDhdCglhZGQJcnNwLCA1NgoJLmNmaV9yZW1lbWJlcl9zdGF0ZQoJLmNmaV9k ZWZfY2ZhX29mZnNldCA4CglyZXQKCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAz Ci5MMTQ6CgkuY2ZpX3Jlc3RvcmVfc3RhdGUKCW1vdglyOGQsIDYwCgltb3YJZWR4 LCA2Cgltb3YJZWN4LCBPRkZTRVQgRkxBVDouTEMwCgltb3YJZWRpLCA5Cgltb3YJ ZXNpLCBPRkZTRVQgRkxBVDouTEMxCgltb3YJUVdPUkQgUFRSIFtyc3BdLCA2Cglt b3YJUVdPUkQgUFRSIFtyc3ArOF0sIE9GRlNFVCBGTEFUOi5MQzAKCW1vdglRV09S RCBQVFIgW3JzcCsxNl0sIDkKCW1vdglRV09SRCBQVFIgW3JzcCsyNF0sIE9GRlNF VCBGTEFUOi5MQzEKCWNhbGwJX2RfYXNzZXJ0X21zZwoJam1wCS5MMTMKCS5jZmlf ZW5kcHJvYwouTEZFNDoKCS5zaXplCV9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm0xNXRy YW5zZm9ybVZlY3Rvck1GS1M0ZHZlcjEwQ2FsVmVjdG9yNEtTNGR2ZXIxMENhbFZl Y3RvcjRadiwgLi1fRDRkdmVyMTNCb25lVHJhbnNmb3JtMTV0cmFuc2Zvcm1WZWN0 b3JNRktTNGR2ZXIxMENhbFZlY3RvcjRLUzRkdmVyMTBDYWxWZWN0b3I0WnYKCS5w MmFsaWduIDQsLDE1CgkuZ2xvYmwJX0Q0ZHZlcjI3Y2FsY3VsYXRlVmVydGljZXNB bmROb3JtYWxzRkFTNGR2ZXIxM0JvbmVUcmFuc2Zvcm1pQVM0ZHZlcjZWZXJ0ZXhB UzRkdmVyOUluZmx1ZW5jZUFTNGR2ZXIxMENhbFZlY3RvcjRadgoJLnR5cGUJX0Q0 ZHZlcjI3Y2FsY3VsYXRlVmVydGljZXNBbmROb3JtYWxzRkFTNGR2ZXIxM0JvbmVU cmFuc2Zvcm1pQVM0ZHZlcjZWZXJ0ZXhBUzRkdmVyOUluZmx1ZW5jZUFTNGR2ZXIx MENhbFZlY3RvcjRadiwgQGZ1bmN0aW9uCl9ENGR2ZXIyN2NhbGN1bGF0ZVZlcnRp Y2VzQW5kTm9ybWFsc0ZBUzRkdmVyMTNCb25lVHJhbnNmb3JtaUFTNGR2ZXI2VmVy dGV4QVM0ZHZlcjlJbmZsdWVuY2VBUzRkdmVyMTBDYWxWZWN0b3I0WnY6Ci5MRkI1 OgoJLmNmaV9zdGFydHByb2MKCXB1c2gJcjE1CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0 IDE2CgkuY2ZpX29mZnNldCAxNSwgLTE2CglwdXNoCXIxNAoJLmNmaV9kZWZfY2Zh X29mZnNldCAyNAoJLmNmaV9vZmZzZXQgMTQsIC0yNAoJcHVzaAlyMTMKCS5jZmlf ZGVmX2NmYV9vZmZzZXQgMzIKCS5jZmlfb2Zmc2V0IDEzLCAtMzIKCXB1c2gJcjEy CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDQwCgkuY2ZpX29mZnNldCAxMiwgLTQwCglw dXNoCXJicAoJLmNmaV9kZWZfY2ZhX29mZnNldCA0OAoJLmNmaV9vZmZzZXQgNiwg LTQ4CglwdXNoCXJieAoJLmNmaV9kZWZfY2ZhX29mZnNldCA1NgoJLmNmaV9vZmZz ZXQgMywgLTU2CglzdWIJcnNwLCA2MTYKCS5jZmlfZGVmX2NmYV9vZmZzZXQgNjcy Cgltb3YJcmF4LCBRV09SRCBQVFIgW3JzcCs2NzJdCgltb3YJUVdPUkQgUFRSIFty c3ArMjMyXSwgcmRpCgltb3YJUVdPUkQgUFRSIFtyc3ArMjI0XSwgcnNpCgltb3YJ UVdPUkQgUFRSIFtyc3ArMjk2XSwgcmN4Cgltb3YJUVdPUkQgUFRSIFtyc3ArMzEy XSwgcjgKCW1vdglRV09SRCBQVFIgW3JzcCsyNDBdLCByYXgKCW1vdglyYXgsIFFX T1JEIFBUUiBbcnNwKzY4MF0KCW1vdglRV09SRCBQVFIgW3JzcCszODRdLCByZGkK CW1vdglRV09SRCBQVFIgW3JzcCszOTJdLCByc2kKCW1vdglRV09SRCBQVFIgW3Jz cCszNjhdLCByY3gKCW1vdglRV09SRCBQVFIgW3JzcCsyNDhdLCByYXgKCW1vdgly YXgsIFFXT1JEIFBUUiBbcnNwKzY4OF0KCW1vdglRV09SRCBQVFIgW3JzcCszNzZd LCByOAoJbW92CVFXT1JEIFBUUiBbcnNwKzMwNF0sIHJheAoJbW92CXJheCwgUVdP UkQgUFRSIFtyc3ArNjk2XQoJbW92CVFXT1JEIFBUUiBbcnNwKzMyMF0sIHJheAoJ bW92CXJheCwgcmN4CglhZGQJcmF4LCByYXgKCWNtcAlyYXgsIFFXT1JEIFBUUiBb cnNwKzMwNF0KCWplCS5MMTYKCW1vdgllZHgsIDg3Cgltb3YJZWRpLCA2Cgltb3YJ ZXNpLCBPRkZTRVQgRkxBVDouTEMwCgltb3YJUVdPUkQgUFRSIFtyc3ArNDAwXSwg NgoJbW92CVFXT1JEIFBUUiBbcnNwKzQwOF0sIE9GRlNFVCBGTEFUOi5MQzAKCWNh bGwJX2RfYXNzZXJ0Ci5MMTY6CgljbXAJUVdPUkQgUFRSIFtyc3ArMjk2XSwgMAoJ amUJLkwxNQoJbW92CVFXT1JEIFBUUiBbcnNwKzI4OF0sIDEKCXhvcglyMTVkLCBy MTVkCgltb3YJUVdPUkQgUFRSIFtyc3ArMjU2XSwgMAoJbW92c3gJcjEyLCByMTVk CgljbXAJUVdPUkQgUFRSIFtyc3ArMjQwXSwgcjEyCgltb3YJUVdPUkQgUFRSIFty c3ArMjY0XSwgMAoJamJlCS5MMTgKCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAz Ci5MNDQ6CglsZWEJcmF4LCBbcjEyK3IxMioyXQoJc2FsCXJheCwgMgoJbW92CVFX T1JEIFBUUiBbcnNwKzMyOF0sIHJheAouTDE5OgoJbW92CXJheCwgUVdPUkQgUFRS IFtyc3ArMjQ4XQoJYWRkCXJheCwgUVdPUkQgUFRSIFtyc3ArMzI4XQoJbW92c3MJ eG1tOSwgRFdPUkQgUFRSIFtyYXgrNF0KCW1vdnp4CXIxM2QsIEJZVEUgUFRSIFty YXgrOF0KCW1vdnN4CXJheCwgRFdPUkQgUFRSIFtyYXhdCgljbXAJcmF4LCBRV09S RCBQVFIgW3JzcCsyMzJdCglqYWUJLkwyMAoJbGVhCXJheCwgW3JheCtyYXgqMl0K CXNhbAlyYXgsIDQKCW1vdglRV09SRCBQVFIgW3JzcCsyNzJdLCByYXgKLkwyMToK CW1vdglyYngsIFFXT1JEIFBUUiBbcnNwKzIyNF0KCWFkZAlyYngsIFFXT1JEIFBU UiBbcnNwKzI3Ml0KCWplCS5MNDEKLkwyMjoKCW1vdnNzCXhtbTcsIERXT1JEIFBU UiBbcmJ4XQoJdGVzdAlyMTNiLCByMTNiCgltb3Zzcwl4bW04LCBEV09SRCBQVFIg W3JieCs0XQoJbW92c3MJeG1tNiwgRFdPUkQgUFRSIFtyYngrOF0KCW11bHNzCXht bTcsIHhtbTkKCW1vdnNzCXhtbTExLCBEV09SRCBQVFIgW3JieCsxMl0KCW11bHNz CXhtbTgsIHhtbTkKCW1vdnNzCXhtbTQsIERXT1JEIFBUUiBbcmJ4KzE2XQoJbXVs c3MJeG1tNiwgeG1tOQoJbW92c3MJeG1tNSwgRFdPUkQgUFRSIFtyYngrMjBdCglt dWxzcwl4bW0xMSwgeG1tOQoJbW92c3MJeG1tMywgRFdPUkQgUFRSIFtyYngrMjRd CgltdWxzcwl4bW00LCB4bW05Cgltb3Zzcwl4bW0xMCwgRFdPUkQgUFRSIFtyYngr MjhdCgltdWxzcwl4bW01LCB4bW05Cgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3Ji eCszMl0KCW11bHNzCXhtbTMsIHhtbTkKCW1vdnNzCXhtbTIsIERXT1JEIFBUUiBb cmJ4KzM2XQoJbXVsc3MJeG1tMTAsIHhtbTkKCW1vdnNzCXhtbTAsIERXT1JEIFBU UiBbcmJ4KzQwXQoJbXVsc3MJeG1tMSwgeG1tOQoJbXVsc3MJeG1tMiwgeG1tOQoJ bXVsc3MJeG1tMCwgeG1tOQoJbXVsc3MJeG1tOSwgRFdPUkQgUFRSIFtyYngrNDRd CglqbmUJLkwyMwoJYWRkCXIxMiwgMQoJbW92CXJheCwgcjE0CglsZWEJcjEzLCBb cjEyK3IxMioyXQoJc2FsCXIxMywgMgoJam1wCS5MMjgKCS5wMmFsaWduIDQsLDEw CgkucDJhbGlnbiAzCi5MMzg6Cgltb3YJcmF4LCByMTMKLkwyNDoKCW1vdglyZHgs IFFXT1JEIFBUUiBbcnNwKzI0OF0KCWFkZAlyZHgsIHJheAoJbW92c3MJeG1tMTIs IERXT1JEIFBUUiBbcmR4KzRdCgltb3Z6eAlyMTRkLCBCWVRFIFBUUiBbcmR4Kzhd Cgltb3ZzeAlyZHgsIERXT1JEIFBUUiBbcmR4XQoJY21wCVFXT1JEIFBUUiBbcnNw KzIzMl0sIHJkeAoJamJlCS5MMjUKCW1vdglyYngsIFFXT1JEIFBUUiBbcnNwKzIy NF0KCWxlYQlyYnAsIFtyZHgrcmR4KjJdCglzYWwJcmJwLCA0CglhZGQJcmJ4LCBy YnAKCWplCS5MNDIKLkwyNzoKCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JieF0K CWFkZAlyMTIsIDEKCWFkZAlyMTMsIDEyCgl0ZXN0CXIxNGIsIHIxNGIKCW11bHNz CXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1tNywgeG1tMTMKCW1vdnNzCXhtbTEzLCBE V09SRCBQVFIgW3JieCs0XQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW04 LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmJ4KzhdCgltdWxzcwl4 bW0xMywgeG1tMTIKCWFkZHNzCXhtbTYsIHhtbTEzCgltb3Zzcwl4bW0xMywgRFdP UkQgUFRSIFtyYngrMTJdCgltdWxzcwl4bW0xMywgeG1tMTIKCWFkZHNzCXhtbTEx LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmJ4KzE2XQoJbXVsc3MJ eG1tMTMsIHhtbTEyCglhZGRzcwl4bW00LCB4bW0xMwoJbW92c3MJeG1tMTMsIERX T1JEIFBUUiBbcmJ4KzIwXQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW01 LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmJ4KzI0XQoJbXVsc3MJ eG1tMTMsIHhtbTEyCglhZGRzcwl4bW0zLCB4bW0xMwoJbW92c3MJeG1tMTMsIERX T1JEIFBUUiBbcmJ4KzI4XQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW0x MCwgeG1tMTMKCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JieCszMl0KCW11bHNz CXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1tMSwgeG1tMTMKCW1vdnNzCXhtbTEzLCBE V09SRCBQVFIgW3JieCszNl0KCW11bHNzCXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1t MiwgeG1tMTMKCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JieCs0MF0KCW11bHNz CXhtbTEzLCB4bW0xMgoJbXVsc3MJeG1tMTIsIERXT1JEIFBUUiBbcmJ4KzQ0XQoJ YWRkc3MJeG1tMCwgeG1tMTMKCWFkZHNzCXhtbTksIHhtbTEyCglqbmUJLkw0Mwou TDI4OgoJYWRkCXIxNWQsIDEKCWNtcAlRV09SRCBQVFIgW3JzcCsyNDBdLCByMTIK CWphCS5MMzgKCW1vdgllZHgsIDk5Cgltb3YJZWRpLCA2Cgltb3YJZXNpLCBPRkZT RVQgRkxBVDouTEMwCgltb3YJUVdPUkQgUFRSIFtyc3ArMjAwXSwgcmF4Cgltb3Zz cwlEV09SRCBQVFIgW3JzcF0sIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzMy XSwgeG1tMQoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTZdLCB4bW0yCgltb3ZzcwlE V09SRCBQVFIgW3JzcCs0OF0sIHhtbTMKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzgw XSwgeG1tNAoJbW92c3MJRFdPUkQgUFRSIFtyc3ArNjRdLCB4bW01Cgltb3ZzcwlE V09SRCBQVFIgW3JzcCs5Nl0sIHhtbTYKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzEy OF0sIHhtbTcKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzExMl0sIHhtbTgKCW1vdnNz CURXT1JEIFBUUiBbcnNwKzE0NF0sIHhtbTkKCW1vdnNzCURXT1JEIFBUUiBbcnNw KzE2MF0sIHhtbTEwCgltb3ZzcwlEV09SRCBQVFIgW3JzcCsxNzZdLCB4bW0xMQoJ bW92CVFXT1JEIFBUUiBbcnNwKzQ0OF0sIDYKCW1vdglRV09SRCBQVFIgW3JzcCs0 NTZdLCBPRkZTRVQgRkxBVDouTEMwCgljYWxsCV9kX2FycmF5X2JvdW5kcwoJbW92 CXJheCwgUVdPUkQgUFRSIFtyc3ArMjAwXQoJbW92c3MJeG1tMCwgRFdPUkQgUFRS IFtyc3BdCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JzcCszMl0KCW1vdnNzCXht bTIsIERXT1JEIFBUUiBbcnNwKzE2XQoJbW92c3MJeG1tMywgRFdPUkQgUFRSIFty c3ArNDhdCgltb3Zzcwl4bW00LCBEV09SRCBQVFIgW3JzcCs4MF0KCW1vdnNzCXht bTUsIERXT1JEIFBUUiBbcnNwKzY0XQoJbW92c3MJeG1tNiwgRFdPUkQgUFRSIFty c3ArOTZdCgltb3Zzcwl4bW03LCBEV09SRCBQVFIgW3JzcCsxMjhdCgltb3Zzcwl4 bW04LCBEV09SRCBQVFIgW3JzcCsxMTJdCgltb3Zzcwl4bW05LCBEV09SRCBQVFIg W3JzcCsxNDRdCgltb3Zzcwl4bW0xMCwgRFdPUkQgUFRSIFtyc3ArMTYwXQoJbW92 c3MJeG1tMTEsIERXT1JEIFBUUiBbcnNwKzE3Nl0KCWptcAkuTDI0CgkucDJhbGln biA0LCwxMAoJLnAyYWxpZ24gMwouTDI1OgoJbW92CWVkeCwgMTAxCgltb3YJZWRp LCA2Cgltb3YJZXNpLCBPRkZTRVQgRkxBVDouTEMwCgltb3YJUVdPUkQgUFRSIFty c3ArMjAwXSwgcmF4Cgltb3ZzcwlEV09SRCBQVFIgW3JzcF0sIHhtbTAKCW1vdnNz CURXT1JEIFBUUiBbcnNwKzMyXSwgeG1tMQoJbW92c3MJRFdPUkQgUFRSIFtyc3Ar MTZdLCB4bW0yCgltb3ZzcwlEV09SRCBQVFIgW3JzcCs0OF0sIHhtbTMKCW1vdnNz CURXT1JEIFBUUiBbcnNwKzgwXSwgeG1tNAoJbW92c3MJRFdPUkQgUFRSIFtyc3Ar NjRdLCB4bW01Cgltb3ZzcwlEV09SRCBQVFIgW3JzcCs5Nl0sIHhtbTYKCW1vdnNz CURXT1JEIFBUUiBbcnNwKzEyOF0sIHhtbTcKCW1vdnNzCURXT1JEIFBUUiBbcnNw KzExMl0sIHhtbTgKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzE0NF0sIHhtbTkKCW1v dnNzCURXT1JEIFBUUiBbcnNwKzE2MF0sIHhtbTEwCgltb3ZzcwlEV09SRCBQVFIg W3JzcCsxNzZdLCB4bW0xMQoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMjA4XSwgeG1t MTIKCW1vdglRV09SRCBQVFIgW3JzcCs0NjRdLCA2Cgltb3YJUVdPUkQgUFRSIFty c3ArNDcyXSwgT0ZGU0VUIEZMQVQ6LkxDMAoJY2FsbAlfZF9hcnJheV9ib3VuZHMK CW1vdglyYngsIFFXT1JEIFBUUiBbcnNwKzIyNF0KCW1vdnNzCXhtbTEyLCBEV09S RCBQVFIgW3JzcCsyMDhdCgltb3Zzcwl4bW0xMSwgRFdPUkQgUFRSIFtyc3ArMTc2 XQoJbW92c3MJeG1tMTAsIERXT1JEIFBUUiBbcnNwKzE2MF0KCWFkZAlyYngsIHJi cAoJbW92c3MJeG1tOCwgRFdPUkQgUFRSIFtyc3ArMTEyXQoJbW92c3MJeG1tOSwg RFdPUkQgUFRSIFtyc3ArMTQ0XQoJbW92c3MJeG1tNywgRFdPUkQgUFRSIFtyc3Ar MTI4XQoJbW92c3MJeG1tNiwgRFdPUkQgUFRSIFtyc3ArOTZdCgltb3Zzcwl4bW01 LCBEV09SRCBQVFIgW3JzcCs2NF0KCW1vdnNzCXhtbTQsIERXT1JEIFBUUiBbcnNw KzgwXQoJbW92c3MJeG1tMywgRFdPUkQgUFRSIFtyc3ArNDhdCgltb3Zzcwl4bW0y LCBEV09SRCBQVFIgW3JzcCsxNl0KCW1vdnNzCXhtbTEsIERXT1JEIFBUUiBbcnNw KzMyXQoJbW92c3MJeG1tMCwgRFdPUkQgUFRSIFtyc3BdCgltb3YJcmF4LCBRV09S RCBQVFIgW3JzcCsyMDBdCglqbmUJLkwyNwouTDQyOgoJbW92CXI4ZCwgMzUKCW1v dgllZHgsIDYKCW1vdgllY3gsIE9GRlNFVCBGTEFUOi5MQzAKCW1vdgllZGksIDkK CW1vdgllc2ksIE9GRlNFVCBGTEFUOi5MQzEKCW1vdnNzCURXT1JEIFBUUiBbcnNw XSwgeG1tMAoJbW92CVFXT1JEIFBUUiBbcnNwKzIwMF0sIHJheAoJbW92c3MJRFdP UkQgUFRSIFtyc3ArMzJdLCB4bW0xCgltb3ZzcwlEV09SRCBQVFIgW3JzcCsxNl0s IHhtbTIKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzQ4XSwgeG1tMwoJbW92c3MJRFdP UkQgUFRSIFtyc3ArODBdLCB4bW00Cgltb3ZzcwlEV09SRCBQVFIgW3JzcCs2NF0s IHhtbTUKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzk2XSwgeG1tNgoJbW92c3MJRFdP UkQgUFRSIFtyc3ArMTI4XSwgeG1tNwoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTEy XSwgeG1tOAoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTQ0XSwgeG1tOQoJbW92c3MJ RFdPUkQgUFRSIFtyc3ArMTYwXSwgeG1tMTAKCW1vdnNzCURXT1JEIFBUUiBbcnNw KzE3Nl0sIHhtbTExCgltb3ZzcwlEV09SRCBQVFIgW3JzcCsyMDhdLCB4bW0xMgoJ bW92CVFXT1JEIFBUUiBbcnNwKzU3Nl0sIDYKCW1vdglRV09SRCBQVFIgW3JzcCs1 ODRdLCBPRkZTRVQgRkxBVDouTEMwCgltb3YJUVdPUkQgUFRSIFtyc3ArNTkyXSwg OQoJbW92CVFXT1JEIFBUUiBbcnNwKzYwMF0sIE9GRlNFVCBGTEFUOi5MQzEKCWNh bGwJX2RfYXNzZXJ0X21zZwoJbW92c3MJeG1tOCwgRFdPUkQgUFRSIFtyc3ArMTEy XQoJbW92c3MJeG1tMTIsIERXT1JEIFBUUiBbcnNwKzIwOF0KCW1vdnNzCXhtbTEx LCBEV09SRCBQVFIgW3JzcCsxNzZdCgltb3Zzcwl4bW0xMCwgRFdPUkQgUFRSIFty c3ArMTYwXQoJbW92c3MJeG1tOSwgRFdPUkQgUFRSIFtyc3ArMTQ0XQoJbW92c3MJ eG1tNywgRFdPUkQgUFRSIFtyc3ArMTI4XQoJbW92c3MJeG1tNiwgRFdPUkQgUFRS IFtyc3ArOTZdCgltb3Zzcwl4bW01LCBEV09SRCBQVFIgW3JzcCs2NF0KCW1vdnNz CXhtbTQsIERXT1JEIFBUUiBbcnNwKzgwXQoJbW92c3MJeG1tMywgRFdPUkQgUFRS IFtyc3ArNDhdCgltb3Zzcwl4bW0yLCBEV09SRCBQVFIgW3JzcCsxNl0KCW1vdnNz CXhtbTEsIERXT1JEIFBUUiBbcnNwKzMyXQoJbW92c3MJeG1tMCwgRFdPUkQgUFRS IFtyc3BdCgltb3YJcmF4LCBRV09SRCBQVFIgW3JzcCsyMDBdCglqbXAJLkwyNwoJ LnAyYWxpZ24gNCwsMTAKCS5wMmFsaWduIDMKLkw0MzoKCW1vdglyMTQsIHJheAou TDIzOgoJbW92CXJheCwgUVdPUkQgUFRSIFtyc3ArMjY0XQoJY21wCVFXT1JEIFBU UiBbcnNwKzI5Nl0sIHJheAoJamJlCS5MMjkKCXNhbAlyYXgsIDUKCW1vdglRV09S RCBQVFIgW3JzcCszMzZdLCByYXgKLkwzMDoKCW1vdglyYXgsIFFXT1JEIFBUUiBb cnNwKzI1Nl0KCW1vdglyYngsIFFXT1JEIFBUUiBbcnNwKzMxMl0KCWFkZAlyYXgs IHJheAoJYWRkCXJieCwgUVdPUkQgUFRSIFtyc3ArMzM2XQoJY21wCVFXT1JEIFBU UiBbcnNwKzMwNF0sIHJheAoJamJlCS5MMzEKCW1vdglyYXgsIFFXT1JEIFBUUiBb cnNwKzI1Nl0KCXNhbAlyYXgsIDUKCW1vdglRV09SRCBQVFIgW3JzcCszNDRdLCBy YXgKLkwzMjoKCW1vdnNzCXhtbTEyLCBEV09SRCBQVFIgW3JieCs4XQoJbW92YXBz CXhtbTE1LCB4bW04Cgltb3Zzcwl4bW0xNCwgRFdPUkQgUFRSIFtyYnhdCgltb3Zz cwlEV09SRCBQVFIgW3JzcCsyODRdLCB4bW0xMgoJbW92c3MJeG1tMTMsIERXT1JE IFBUUiBbcmJ4KzRdCgltb3ZhcHMJeG1tMTIsIHhtbTcKCW11bHNzCXhtbTEyLCB4 bW0xNAoJbW92CXJheCwgUVdPUkQgUFRSIFtyc3ArMzIwXQoJbXVsc3MJeG1tMTUs IHhtbTEzCglhZGQJcmF4LCBRV09SRCBQVFIgW3JzcCszNDRdCglhZGRzcwl4bW0x MiwgeG1tMTUKCWFkZHNzCXhtbTEyLCB4bW0xMQoJbW92CURXT1JEIFBUUiBbcmF4 KzEyXSwgMHgwMDAwMDAwMAoJbW92c3MJeG1tMTEsIERXT1JEIFBUUiBbcnNwKzI4 NF0KCW11bHNzCXhtbTExLCB4bW02CglhZGRzcwl4bW0xMiwgeG1tMTEKCW1vdmFw cwl4bW0xMSwgeG1tNAoJbXVsc3MJeG1tMTEsIHhtbTE0CgltdWxzcwl4bW0xNCwg eG1tMQoJbW92c3MJRFdPUkQgUFRSIFtyYXhdLCB4bW0xMgoJbW92YXBzCXhtbTEy LCB4bW01CgltdWxzcwl4bW0xMiwgeG1tMTMKCW11bHNzCXhtbTEzLCB4bW0yCglh ZGRzcwl4bW0xMSwgeG1tMTIKCWFkZHNzCXhtbTE0LCB4bW0xMwoJYWRkc3MJeG1t MTEsIHhtbTEwCgltb3Zzcwl4bW0xMCwgRFdPUkQgUFRSIFtyc3ArMjg0XQoJYWRk c3MJeG1tMTQsIHhtbTkKCW1vdnNzCXhtbTksIERXT1JEIFBUUiBbcnNwKzI4NF0K CW11bHNzCXhtbTEwLCB4bW0zCgltdWxzcwl4bW05LCB4bW0wCglhZGRzcwl4bW0x MSwgeG1tMTAKCWFkZHNzCXhtbTE0LCB4bW05Cgltb3ZzcwlEV09SRCBQVFIgW3Jh eCs0XSwgeG1tMTEKCW1vdnNzCURXT1JEIFBUUiBbcmF4KzhdLCB4bW0xNAoJbW92 CXJheCwgUVdPUkQgUFRSIFtyc3ArMjY0XQoJY21wCVFXT1JEIFBUUiBbcnNwKzI5 Nl0sIHJheAoJamJlCS5MMzMKCXNhbAlyYXgsIDUKCW1vdglRV09SRCBQVFIgW3Jz cCszNTJdLCByYXgKLkwzNDoKCW1vdglyYngsIFFXT1JEIFBUUiBbcnNwKzMxMl0K CW1vdglyYXgsIFFXT1JEIFBUUiBbcnNwKzI4OF0KCWFkZAlyYngsIFFXT1JEIFBU UiBbcnNwKzM1Ml0KCWNtcAlRV09SRCBQVFIgW3JzcCszMDRdLCByYXgKCWpiZQku TDM1CglzYWwJcmF4LCA0Cgltb3YJUVdPUkQgUFRSIFtyc3ArMzYwXSwgcmF4Ci5M MzY6Cgltb3Zzcwl4bW0xMCwgRFdPUkQgUFRSIFtyYngrMTZdCglhZGQJcjE1ZCwg MQoJbW92c3MJeG1tMTEsIERXT1JEIFBUUiBbcmJ4KzIwXQoJbXVsc3MJeG1tNywg eG1tMTAKCW1vdglyYXgsIFFXT1JEIFBUUiBbcnNwKzMyMF0KCW11bHNzCXhtbTgs IHhtbTExCgltb3Zzcwl4bW05LCBEV09SRCBQVFIgW3JieCsyNF0KCW11bHNzCXht bTUsIHhtbTExCgltdWxzcwl4bW00LCB4bW0xMAoJbXVsc3MJeG1tMiwgeG1tMTEK CWFkZAlyYXgsIFFXT1JEIFBUUiBbcnNwKzM2MF0KCWFkZAlRV09SRCBQVFIgW3Jz cCsyNTZdLCAxCglhZGRzcwl4bW04LCB4bW03CglhZGQJUVdPUkQgUFRSIFtyc3Ar Mjg4XSwgMgoJYWRkc3MJeG1tNSwgeG1tNAoJbXVsc3MJeG1tMSwgeG1tMTAKCW11 bHNzCXhtbTYsIHhtbTkKCW1vdglEV09SRCBQVFIgW3JheCsxMl0sIDB4MDAwMDAw MDAKCW11bHNzCXhtbTMsIHhtbTkKCW11bHNzCXhtbTAsIHhtbTkKCWFkZHNzCXht bTIsIHhtbTEKCWFkZHNzCXhtbTgsIHhtbTYKCWFkZHNzCXhtbTUsIHhtbTMKCWFk ZHNzCXhtbTIsIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcmF4XSwgeG1tOAoJbW92 c3MJRFdPUkQgUFRSIFtyYXgrNF0sIHhtbTUKCW1vdnNzCURXT1JEIFBUUiBbcmF4 KzhdLCB4bW0yCgltb3YJcmF4LCBRV09SRCBQVFIgW3JzcCsyNTZdCgljbXAJUVdP UkQgUFRSIFtyc3ArMjk2XSwgcmF4CglqZQkuTDE1Cgltb3ZzeAlyMTIsIHIxNWQK CW1vdglRV09SRCBQVFIgW3JzcCsyNjRdLCByYXgKCWNtcAlRV09SRCBQVFIgW3Jz cCsyNDBdLCByMTIKCWphCS5MNDQKLkwxODoKCW1vdgllZHgsIDkzCgltb3YJZWRp LCA2Cgltb3YJZXNpLCBPRkZTRVQgRkxBVDouTEMwCgltb3YJUVdPUkQgUFRSIFty c3ArNDE2XSwgNgoJbW92CVFXT1JEIFBUUiBbcnNwKzQyNF0sIE9GRlNFVCBGTEFU Oi5MQzAKCWNhbGwJX2RfYXJyYXlfYm91bmRzCglqbXAJLkwxOQoJLnAyYWxpZ24g NCwsMTAKCS5wMmFsaWduIDMKLkwyMDoKCW1vdgllZHgsIDk1Cgltb3YJZWRpLCA2 Cgltb3YJZXNpLCBPRkZTRVQgRkxBVDouTEMwCgltb3ZzcwlEV09SRCBQVFIgW3Jz cCsxNDRdLCB4bW05Cgltb3YJUVdPUkQgUFRSIFtyc3ArNDMyXSwgNgoJbW92CVFX T1JEIFBUUiBbcnNwKzQ0MF0sIE9GRlNFVCBGTEFUOi5MQzAKCWNhbGwJX2RfYXJy YXlfYm91bmRzCgltb3Zzcwl4bW05LCBEV09SRCBQVFIgW3JzcCsxNDRdCglqbXAJ LkwyMQoJLnAyYWxpZ24gNCwsMTAKCS5wMmFsaWduIDMKLkwzNToKCW1vdgllZHgs IDEwNQoJbW92CWVkaSwgNgoJbW92CWVzaSwgT0ZGU0VUIEZMQVQ6LkxDMAoJbW92 c3MJRFdPUkQgUFRSIFtyc3BdLCB4bW0wCgltb3ZzcwlEV09SRCBQVFIgW3JzcCsz Ml0sIHhtbTEKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzE2XSwgeG1tMgoJbW92c3MJ RFdPUkQgUFRSIFtyc3ArNDhdLCB4bW0zCgltb3ZzcwlEV09SRCBQVFIgW3JzcCs4 MF0sIHhtbTQKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzY0XSwgeG1tNQoJbW92c3MJ RFdPUkQgUFRSIFtyc3ArOTZdLCB4bW02Cgltb3ZzcwlEV09SRCBQVFIgW3JzcCsx MjhdLCB4bW03Cgltb3ZzcwlEV09SRCBQVFIgW3JzcCsxMTJdLCB4bW04Cgltb3YJ UVdPUkQgUFRSIFtyc3ArNTI4XSwgNgoJbW92CVFXT1JEIFBUUiBbcnNwKzUzNl0s IE9GRlNFVCBGTEFUOi5MQzAKCWNhbGwJX2RfYXJyYXlfYm91bmRzCgltb3Zzcwl4 bW04LCBEV09SRCBQVFIgW3JzcCsxMTJdCgltb3Zzcwl4bW03LCBEV09SRCBQVFIg W3JzcCsxMjhdCgltb3Zzcwl4bW02LCBEV09SRCBQVFIgW3JzcCs5Nl0KCW1vdnNz CXhtbTUsIERXT1JEIFBUUiBbcnNwKzY0XQoJbW92c3MJeG1tNCwgRFdPUkQgUFRS IFtyc3ArODBdCgltb3Zzcwl4bW0zLCBEV09SRCBQVFIgW3JzcCs0OF0KCW1vdnNz CXhtbTIsIERXT1JEIFBUUiBbcnNwKzE2XQoJbW92c3MJeG1tMSwgRFdPUkQgUFRS IFtyc3ArMzJdCgltb3Zzcwl4bW0wLCBEV09SRCBQVFIgW3JzcF0KCWptcAkuTDM2 CgkucDJhbGlnbiA0LCwxMAoJLnAyYWxpZ24gMwouTDMzOgoJbW92CWVkeCwgMTA1 Cgltb3YJZWRpLCA2Cgltb3YJZXNpLCBPRkZTRVQgRkxBVDouTEMwCgltb3ZzcwlE V09SRCBQVFIgW3JzcF0sIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzMyXSwg eG1tMQoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTZdLCB4bW0yCgltb3ZzcwlEV09S RCBQVFIgW3JzcCs0OF0sIHhtbTMKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzgwXSwg eG1tNAoJbW92c3MJRFdPUkQgUFRSIFtyc3ArNjRdLCB4bW01Cgltb3ZzcwlEV09S RCBQVFIgW3JzcCs5Nl0sIHhtbTYKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzEyOF0s IHhtbTcKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzExMl0sIHhtbTgKCW1vdglRV09S RCBQVFIgW3JzcCs1MTJdLCA2Cgltb3YJUVdPUkQgUFRSIFtyc3ArNTIwXSwgT0ZG U0VUIEZMQVQ6LkxDMAoJY2FsbAlfZF9hcnJheV9ib3VuZHMKCW1vdnNzCXhtbTgs IERXT1JEIFBUUiBbcnNwKzExMl0KCW1vdnNzCXhtbTcsIERXT1JEIFBUUiBbcnNw KzEyOF0KCW1vdnNzCXhtbTYsIERXT1JEIFBUUiBbcnNwKzk2XQoJbW92c3MJeG1t NSwgRFdPUkQgUFRSIFtyc3ArNjRdCgltb3Zzcwl4bW00LCBEV09SRCBQVFIgW3Jz cCs4MF0KCW1vdnNzCXhtbTMsIERXT1JEIFBUUiBbcnNwKzQ4XQoJbW92c3MJeG1t MiwgRFdPUkQgUFRSIFtyc3ArMTZdCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3Jz cCszMl0KCW1vdnNzCXhtbTAsIERXT1JEIFBUUiBbcnNwXQoJam1wCS5MMzQKCS5w MmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5MMzE6Cgltb3YJZWR4LCAxMDQKCW1v dgllZGksIDYKCW1vdgllc2ksIE9GRlNFVCBGTEFUOi5MQzAKCW1vdnNzCURXT1JE IFBUUiBbcnNwXSwgeG1tMAoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMzJdLCB4bW0x Cgltb3ZzcwlEV09SRCBQVFIgW3JzcCsxNl0sIHhtbTIKCW1vdnNzCURXT1JEIFBU UiBbcnNwKzQ4XSwgeG1tMwoJbW92c3MJRFdPUkQgUFRSIFtyc3ArODBdLCB4bW00 Cgltb3ZzcwlEV09SRCBQVFIgW3JzcCs2NF0sIHhtbTUKCW1vdnNzCURXT1JEIFBU UiBbcnNwKzk2XSwgeG1tNgoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTI4XSwgeG1t NwoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTEyXSwgeG1tOAoJbW92c3MJRFdPUkQg UFRSIFtyc3ArMTQ0XSwgeG1tOQoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTYwXSwg eG1tMTAKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzE3Nl0sIHhtbTExCgltb3YJUVdP UkQgUFRSIFtyc3ArNDk2XSwgNgoJbW92CVFXT1JEIFBUUiBbcnNwKzUwNF0sIE9G RlNFVCBGTEFUOi5MQzAKCWNhbGwJX2RfYXJyYXlfYm91bmRzCgltb3Zzcwl4bW04 LCBEV09SRCBQVFIgW3JzcCsxMTJdCgltb3Zzcwl4bW0xMSwgRFdPUkQgUFRSIFty c3ArMTc2XQoJbW92c3MJeG1tMTAsIERXT1JEIFBUUiBbcnNwKzE2MF0KCW1vdnNz CXhtbTksIERXT1JEIFBUUiBbcnNwKzE0NF0KCW1vdnNzCXhtbTcsIERXT1JEIFBU UiBbcnNwKzEyOF0KCW1vdnNzCXhtbTYsIERXT1JEIFBUUiBbcnNwKzk2XQoJbW92 c3MJeG1tNSwgRFdPUkQgUFRSIFtyc3ArNjRdCgltb3Zzcwl4bW00LCBEV09SRCBQ VFIgW3JzcCs4MF0KCW1vdnNzCXhtbTMsIERXT1JEIFBUUiBbcnNwKzQ4XQoJbW92 c3MJeG1tMiwgRFdPUkQgUFRSIFtyc3ArMTZdCgltb3Zzcwl4bW0xLCBEV09SRCBQ VFIgW3JzcCszMl0KCW1vdnNzCXhtbTAsIERXT1JEIFBUUiBbcnNwXQoJam1wCS5M MzIKCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5MMjk6Cgltb3YJZWR4LCAx MDQKCW1vdgllZGksIDYKCW1vdgllc2ksIE9GRlNFVCBGTEFUOi5MQzAKCW1vdnNz CURXT1JEIFBUUiBbcnNwXSwgeG1tMAoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMzJd LCB4bW0xCgltb3ZzcwlEV09SRCBQVFIgW3JzcCsxNl0sIHhtbTIKCW1vdnNzCURX T1JEIFBUUiBbcnNwKzQ4XSwgeG1tMwoJbW92c3MJRFdPUkQgUFRSIFtyc3ArODBd LCB4bW00Cgltb3ZzcwlEV09SRCBQVFIgW3JzcCs2NF0sIHhtbTUKCW1vdnNzCURX T1JEIFBUUiBbcnNwKzk2XSwgeG1tNgoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTI4 XSwgeG1tNwoJbW92c3MJRFdPUkQgUFRSIFtyc3ArMTEyXSwgeG1tOAoJbW92c3MJ RFdPUkQgUFRSIFtyc3ArMTQ0XSwgeG1tOQoJbW92c3MJRFdPUkQgUFRSIFtyc3Ar MTYwXSwgeG1tMTAKCW1vdnNzCURXT1JEIFBUUiBbcnNwKzE3Nl0sIHhtbTExCglt b3YJUVdPUkQgUFRSIFtyc3ArNDgwXSwgNgoJbW92CVFXT1JEIFBUUiBbcnNwKzQ4 OF0sIE9GRlNFVCBGTEFUOi5MQzAKCWNhbGwJX2RfYXJyYXlfYm91bmRzCgltb3Zz cwl4bW04LCBEV09SRCBQVFIgW3JzcCsxMTJdCgltb3Zzcwl4bW0xMSwgRFdPUkQg UFRSIFtyc3ArMTc2XQoJbW92c3MJeG1tMTAsIERXT1JEIFBUUiBbcnNwKzE2MF0K CW1vdnNzCXhtbTksIERXT1JEIFBUUiBbcnNwKzE0NF0KCW1vdnNzCXhtbTcsIERX T1JEIFBUUiBbcnNwKzEyOF0KCW1vdnNzCXhtbTYsIERXT1JEIFBUUiBbcnNwKzk2 XQoJbW92c3MJeG1tNSwgRFdPUkQgUFRSIFtyc3ArNjRdCgltb3Zzcwl4bW00LCBE V09SRCBQVFIgW3JzcCs4MF0KCW1vdnNzCXhtbTMsIERXT1JEIFBUUiBbcnNwKzQ4 XQoJbW92c3MJeG1tMiwgRFdPUkQgUFRSIFtyc3ArMTZdCgltb3Zzcwl4bW0xLCBE V09SRCBQVFIgW3JzcCszMl0KCW1vdnNzCXhtbTAsIERXT1JEIFBUUiBbcnNwXQoJ am1wCS5MMzAKLkw0MToKCW1vdglyOGQsIDE4Cgltb3YJZWR4LCA2Cgltb3YJZWN4 LCBPRkZTRVQgRkxBVDouTEMwCgltb3YJZWRpLCA5Cgltb3YJZXNpLCBPRkZTRVQg RkxBVDouTEMxCgltb3ZzcwlEV09SRCBQVFIgW3JzcCsxNDRdLCB4bW05Cgltb3YJ UVdPUkQgUFRSIFtyc3ArNTQ0XSwgNgoJbW92CVFXT1JEIFBUUiBbcnNwKzU1Ml0s IE9GRlNFVCBGTEFUOi5MQzAKCW1vdglRV09SRCBQVFIgW3JzcCs1NjBdLCA5Cglt b3YJUVdPUkQgUFRSIFtyc3ArNTY4XSwgT0ZGU0VUIEZMQVQ6LkxDMQoJY2FsbAlf ZF9hc3NlcnRfbXNnCgltb3Zzcwl4bW05LCBEV09SRCBQVFIgW3JzcCsxNDRdCglq bXAJLkwyMgouTDE1OgoJYWRkCXJzcCwgNjE2CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0 IDU2Cglwb3AJcmJ4CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDQ4Cglwb3AJcmJwCgku Y2ZpX2RlZl9jZmFfb2Zmc2V0IDQwCglwb3AJcjEyCgkuY2ZpX2RlZl9jZmFfb2Zm c2V0IDMyCglwb3AJcjEzCgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDI0Cglwb3AJcjE0 CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDE2Cglwb3AJcjE1CgkuY2ZpX2RlZl9jZmFf b2Zmc2V0IDgKCXJldAoJLmNmaV9lbmRwcm9jCi5MRkU1OgoJLnNpemUJX0Q0ZHZl cjI3Y2FsY3VsYXRlVmVydGljZXNBbmROb3JtYWxzRkFTNGR2ZXIxM0JvbmVUcmFu c2Zvcm1pQVM0ZHZlcjZWZXJ0ZXhBUzRkdmVyOUluZmx1ZW5jZUFTNGR2ZXIxMENh bFZlY3RvcjRadiwgLi1fRDRkdmVyMjdjYWxjdWxhdGVWZXJ0aWNlc0FuZE5vcm1h bHNGQVM0ZHZlcjEzQm9uZVRyYW5zZm9ybWlBUzRkdmVyNlZlcnRleEFTNGR2ZXI5 SW5mbHVlbmNlQVM0ZHZlcjEwQ2FsVmVjdG9yNFp2Cgkuc2VjdGlvbgkucm9kYXRh CgkuYWxpZ24gOAouTEM4OgoJLnN0cmluZwkiU2tpbm5lZCB2ZXJ0aWNlcyBwZXIg c2Vjb25kOiAlZFxuIgoJLnNlY3Rpb24JLnRleHQuc3RhcnR1cCwiYXgiLEBwcm9n Yml0cwoJLnAyYWxpZ24gNCwsMTUKCS5nbG9ibAlfRG1haW4KCS50eXBlCV9EbWFp biwgQGZ1bmN0aW9uCl9EbWFpbjoKLkxGQjY6CgkuY2ZpX3N0YXJ0cHJvYwoJcHVz aAlyMTUKCS5jZmlfZGVmX2NmYV9vZmZzZXQgMTYKCS5jZmlfb2Zmc2V0IDE1LCAt MTYKCXB1c2gJcjE0CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDI0CgkuY2ZpX29mZnNl dCAxNCwgLTI0CglwdXNoCXIxMwoJLmNmaV9kZWZfY2ZhX29mZnNldCAzMgoJLmNm aV9vZmZzZXQgMTMsIC0zMgoJcHVzaAlyMTIKCS5jZmlfZGVmX2NmYV9vZmZzZXQg NDAKCS5jZmlfb2Zmc2V0IDEyLCAtNDAKCXB1c2gJcmJwCgkuY2ZpX2RlZl9jZmFf b2Zmc2V0IDQ4CgkuY2ZpX29mZnNldCA2LCAtNDgKCXB1c2gJcmJ4CgkuY2ZpX2Rl Zl9jZmFfb2Zmc2V0IDU2CgkuY2ZpX29mZnNldCAzLCAtNTYKCXN1Yglyc3AsIDQ0 MDE1MgoJLmNmaV9kZWZfY2ZhX29mZnNldCA0NDAyMDgKCWxlYQlyYnAsIFtyc3Ar NDhdCgltb3ZhcHMJeG1tMCwgWE1NV09SRCBQVFIgLkxDM1tyaXBdCglsZWEJcmR4 LCBbcmJwKzMyMDAwMF0KCW1vdglyYXgsIHJicAoJLnAyYWxpZ24gNCwsMTAKCS5w MmFsaWduIDMKLkw0NjoKCW1vdmFwcwlYTU1XT1JEIFBUUiBbcmF4XSwgeG1tMAoJ bW92YXBzCVhNTVdPUkQgUFRSIFtyYXgrMTZdLCB4bW0wCglhZGQJcmF4LCAzMgoJ Y21wCXJheCwgcmR4CglqbmUJLkw0NgoJbGVhCXIxMiwgW3JzcCszMjAwNDhdCgls ZWEJcmR4LCBbcjEyKzEyMDAwMF0KCW1vdglyYXgsIHIxMgoJLnAyYWxpZ24gNCws MTAKCS5wMmFsaWduIDMKLkw0NzoKCW1vdglRV09SRCBQVFIgW3JheF0sIDAKCW1v dglEV09SRCBQVFIgW3JheCs4XSwgMAoJbW92CURXT1JEIFBUUiBbcmF4KzRdLCAw eDdmYTAwMDAwCglhZGQJcmF4LCAxMgoJY21wCXJheCwgcmR4CglqbmUJLkw0NwoJ eG9yCWVkeCwgZWR4CgkucDJhbGlnbiA0LCwxMAoJLnAyYWxpZ24gMwouTDQ4OgoJ bW92CXJheCwgcmR4CglzYWwJcmF4LCA1CglhZGQJcmF4LCByYnAKCW1vdglEV09S RCBQVFIgW3JheF0sIDB4M2Y4MDAwMDAKCW1vdglEV09SRCBQVFIgW3JheCs0XSwg MHg0MDAwMDAwMAoJbW92CURXT1JEIFBUUiBbcmF4KzhdLCAweDQwNDAwMDAwCglt b3YJRFdPUkQgUFRSIFtyYXgrMTJdLCAweDAwMDAwMDAwCgltb3YJRFdPUkQgUFRS IFtyYXgrMTZdLCAweDAwMDAwMDAwCgltb3YJRFdPUkQgUFRSIFtyYXgrMjBdLCAw eDAwMDAwMDAwCgltb3YJRFdPUkQgUFRSIFtyYXgrMjRdLCAweDNmODAwMDAwCglt b3YJRFdPUkQgUFRSIFtyYXgrMjhdLCAweDAwMDAwMDAwCglsZWEJcmF4LCBbcmR4 K3JkeCoyXQoJYWRkCXJkeCwgMQoJbGVhCXJheCwgW3IxMityYXgqNF0KCWNtcAly ZHgsIDEwMDAwCgltb3YJRFdPUkQgUFRSIFtyYXhdLCAwCgltb3YJRFdPUkQgUFRS IFtyYXgrNF0sIDB4M2Y4MDAwMDAKCW1vdglCWVRFIFBUUiBbcmF4KzhdLCAxCglq bmUJLkw0OAoJbW92CWVzaSwgMQoJbW92CWVkaSwgT0ZGU0VUIEZMQVQ6X0QzMVR5 cGVJbmZvX0FTNGR2ZXIxM0JvbmVUcmFuc2Zvcm02X19pbml0WgoJbW92CXIxNWQs IDEwMAoJY2FsbAlfZF9uZXdhcnJheWlUCgltb3YJZXNpLCAyMDAwMAoJbW92CWVk aSwgT0ZGU0VUIEZMQVQ6X0QyOFR5cGVJbmZvX0FTNGR2ZXIxMENhbFZlY3RvcjQ2 X19pbml0WgoJbW92CVFXT1JEIFBUUiBbcnNwKzMyXSwgcmF4Cgltb3YJUVdPUkQg UFRSIFtyc3ArNDBdLCByZHgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwODBdLCBy YXgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwODhdLCByZHgKCW1vdglRV09SRCBQ VFIgW3JzcCs0NDAwNDhdLCByYXgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwNTZd LCByZHgKCWNhbGwJX2RfbmV3YXJyYXlpVAoJbW92CVFXT1JEIFBUUiBbcnNwKzMy XSwgcmF4Cgltb3YJUVdPUkQgUFRSIFtyc3ArNDBdLCByZHgKCW1vdglRV09SRCBQ VFIgW3JzcCs0NDAwOTZdLCByYXgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAxMDRd LCByZHgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwNjRdLCByYXgKCW1vdglRV09S RCBQVFIgW3JzcCs0NDAwNzJdLCByZHgKCS5wMmFsaWduIDQsLDEwCgkucDJhbGln biAzCi5MNTE6CgljYWxsCWNsb2NrCgl4b3IJZWJ4LCBlYngKCWxlYQlyMTMsIFty YXgrOTk5OTk5XQoJbW92CXIxNCwgcmF4CglqbXAJLkw1MAoJLnAyYWxpZ24gNCws MTAKCS5wMmFsaWduIDMKLkw1NjoKCW1vdglyYXgsIFFXT1JEIFBUUiBbcnNwKzQ0 MDA2NF0KCW1vdgllY3gsIDEwMDAwCgltb3YJcjgsIHJicAoJbW92CXJkaSwgUVdP UkQgUFRSIFtyc3ArNDQwMDQ4XQoJbW92CWVkeCwgMTAwMDAKCW1vdglRV09SRCBQ VFIgW3JzcCs4XSwgcjEyCgltb3YJcnNpLCBRV09SRCBQVFIgW3JzcCs0NDAwNTZd Cgltb3YJUVdPUkQgUFRSIFtyc3ArNDQwMTIwXSwgcjEyCglhZGQJcmJ4LCAxMDAw MAoJbW92CVFXT1JEIFBUUiBbcnNwKzQ0MDExMl0sIDEwMDAwCgltb3YJUVdPUkQg UFRSIFtyc3ArMTZdLCByYXgKCW1vdglyYXgsIFFXT1JEIFBUUiBbcnNwKzQ0MDA3 Ml0KCW1vdglRV09SRCBQVFIgW3JzcCs0NDAxMjhdLCAxMDAwMAoJbW92CVFXT1JE IFBUUiBbcnNwKzQ0MDEzNl0sIHJicAoJbW92CVFXT1JEIFBUUiBbcnNwXSwgMTAw MDAKCW1vdglRV09SRCBQVFIgW3JzcCsyNF0sIHJheAoJY2FsbAlfRDRkdmVyMjdj YWxjdWxhdGVWZXJ0aWNlc0FuZE5vcm1hbHNGQVM0ZHZlcjEzQm9uZVRyYW5zZm9y bWlBUzRkdmVyNlZlcnRleEFTNGR2ZXI5SW5mbHVlbmNlQVM0ZHZlcjEwQ2FsVmVj dG9yNFp2Ci5MNTA6CgljYWxsCWNsb2NrCgljbXAJcmF4LCByMTMKCWpsZQkuTDU2 CgkucDJhbGlnbiA0LCw1CgljYWxsCWNsb2NrCgltb3YJZWRpLCBPRkZTRVQgRkxB VDouTEM4Cgltb3YJcmN4LCByYXgKCWltdWwJcmF4LCByYngsIDEwMDAwMDAKCXN1 YglyY3gsIHIxNAoJbW92CXJkeCwgcmF4CglzYXIJcmR4LCA2MwoJaWRpdglyY3gK CW1vdgllc2ksIGVheAoJeG9yCWVheCwgZWF4CgljYWxsCXByaW50ZgoJc3ViCXIx NWQsIDEKCWpuZQkuTDUxCglhZGQJcnNwLCA0NDAxNTIKCS5jZmlfZGVmX2NmYV9v ZmZzZXQgNTYKCXhvcgllYXgsIGVheAoJcG9wCXJieAoJLmNmaV9kZWZfY2ZhX29m ZnNldCA0OAoJcG9wCXJicAoJLmNmaV9kZWZfY2ZhX29mZnNldCA0MAoJcG9wCXIx MgoJLmNmaV9kZWZfY2ZhX29mZnNldCAzMgoJcG9wCXIxMwoJLmNmaV9kZWZfY2Zh X29mZnNldCAyNAoJcG9wCXIxNAoJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgoJcG9w CXIxNQoJLmNmaV9kZWZfY2ZhX29mZnNldCA4CglyZXQKCS5jZmlfZW5kcHJvYwou TEZFNjoKCS5zaXplCV9EbWFpbiwgLi1fRG1haW4KCS5wMmFsaWduIDQsLDE1Cgku dHlwZQlfRDRkdmVyOV9fbW9kaW5pdEZadiwgQGZ1bmN0aW9uCl9ENGR2ZXI5X19t b2Rpbml0Rlp2OgouTEZCNzoKCS5jZmlfc3RhcnRwcm9jCgltb3YJcmF4LCBRV09S RCBQVFIgX0Rtb2R1bGVfcmVmW3JpcF0KCW1vdglRV09SRCBQVFIgX0Rtb2R1bGVf cmVmW3JpcF0sIE9GRlNFVCBGTEFUOl9fbW9kX3JlZi4yMTQ3Cgltb3YJUVdPUkQg UFRSIF9fbW9kX3JlZi4yMTQ3W3JpcF0sIHJheAoJcmV0CgkuY2ZpX2VuZHByb2MK LkxGRTc6Cgkuc2l6ZQlfRDRkdmVyOV9fbW9kaW5pdEZadiwgLi1fRDRkdmVyOV9f bW9kaW5pdEZadgoJLnNlY3Rpb24JLmN0b3JzLCJhdyIsQHByb2diaXRzCgkuYWxp Z24gOAoJLnF1YWQJX0Q0ZHZlcjlfX21vZGluaXRGWnYKCS5nbG9ibAlfRDRkdmVy MTJfX01vZHVsZUluZm9aCgkuZGF0YQoJLmFsaWduIDE2CgkudHlwZQlfRDRkdmVy MTJfX01vZHVsZUluZm9aLCBAb2JqZWN0Cgkuc2l6ZQlfRDRkdmVyMTJfX01vZHVs ZUluZm9aLCAxNgpfRDRkdmVyMTJfX01vZHVsZUluZm9aOgoJLmxvbmcJLTIxNDc0 ODM2NDQKCS5sb25nCTAKCS5zdHJpbmcJImR2ZXIiCgkuemVybwkzCgkudGxzX2Nv bW1vbglfdGxzZW5kLDQsNAoJLmdsb2JsCV90bHNzdGFydAoJLnNlY3Rpb24JLnRk YXRhLCJhd1QiLEBwcm9nYml0cwoJLmFsaWduIDQKCS50eXBlCV90bHNzdGFydCwg QG9iamVjdAoJLnNpemUJX3Rsc3N0YXJ0LCA0Cl90bHNzdGFydDoKCS5sb25nCTMK CS53ZWFrCV9EMjhUeXBlSW5mb19BUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFoK CS5zZWN0aW9uCS5kYXRhLl9EMjhUeXBlSW5mb19BUzRkdmVyMTBDYWxWZWN0b3I0 Nl9faW5pdFosImF3RyIsQHByb2diaXRzLF9EMjhUeXBlSW5mb19BUzRkdmVyMTBD YWxWZWN0b3I0Nl9faW5pdFosY29tZGF0CgkuYWxpZ24gMTYKCS50eXBlCV9EMjhU eXBlSW5mb19BUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFosIEBnbnVfdW5pcXVl X29iamVjdAoJLnNpemUJX0QyOFR5cGVJbmZvX0FTNGR2ZXIxMENhbFZlY3RvcjQ2 X19pbml0WiwgMjQKX0QyOFR5cGVJbmZvX0FTNGR2ZXIxMENhbFZlY3RvcjQ2X19p bml0WjoKCS5xdWFkCV9EMTRUeXBlSW5mb19BcnJheTZfX3Z0YmxaCgkucXVhZAkw CgkucXVhZAlfRDI3VHlwZUluZm9fUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFoK CS53ZWFrCV9EMzFUeXBlSW5mb19BUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9faW5p dFoKCS5zZWN0aW9uCS5kYXRhLl9EMzFUeXBlSW5mb19BUzRkdmVyMTNCb25lVHJh bnNmb3JtNl9faW5pdFosImF3RyIsQHByb2diaXRzLF9EMzFUeXBlSW5mb19BUzRk dmVyMTNCb25lVHJhbnNmb3JtNl9faW5pdFosY29tZGF0CgkuYWxpZ24gMTYKCS50 eXBlCV9EMzFUeXBlSW5mb19BUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9faW5pdFos IEBnbnVfdW5pcXVlX29iamVjdAoJLnNpemUJX0QzMVR5cGVJbmZvX0FTNGR2ZXIx M0JvbmVUcmFuc2Zvcm02X19pbml0WiwgMjQKX0QzMVR5cGVJbmZvX0FTNGR2ZXIx M0JvbmVUcmFuc2Zvcm02X19pbml0WjoKCS5xdWFkCV9EMTRUeXBlSW5mb19BcnJh eTZfX3Z0YmxaCgkucXVhZAkwCgkucXVhZAlfRDMwVHlwZUluZm9fUzRkdmVyMTNC b25lVHJhbnNmb3JtNl9faW5pdFoKCS5nbG9ibAlfRDRkdmVyNlZlcnRleDZfX2lu aXRaCgkuc2VjdGlvbgkucm9kYXRhCgkuYWxpZ24gMzIKCS50eXBlCV9ENGR2ZXI2 VmVydGV4Nl9faW5pdFosIEBvYmplY3QKCS5zaXplCV9ENGR2ZXI2VmVydGV4Nl9f aW5pdFosIDMyCl9ENGR2ZXI2VmVydGV4Nl9faW5pdFo6CgkubG9uZwkyMTQxMTky MTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwky MTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgku bG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkud2VhawlfRDIyVHlw ZUluZm9fUzRkdmVyNlZlcnRleDZfX2luaXRaCgkuc2VjdGlvbgkuZGF0YS5fRDIy VHlwZUluZm9fUzRkdmVyNlZlcnRleDZfX2luaXRaLCJhd0ciLEBwcm9nYml0cyxf RDIyVHlwZUluZm9fUzRkdmVyNlZlcnRleDZfX2luaXRaLGNvbWRhdAoJLmFsaWdu IDMyCgkudHlwZQlfRDIyVHlwZUluZm9fUzRkdmVyNlZlcnRleDZfX2luaXRaLCBA Z251X3VuaXF1ZV9vYmplY3QKCS5zaXplCV9EMjJUeXBlSW5mb19TNGR2ZXI2VmVy dGV4Nl9faW5pdFosIDEzNgpfRDIyVHlwZUluZm9fUzRkdmVyNlZlcnRleDZfX2lu aXRaOgoJLnF1YWQJX0QxNVR5cGVJbmZvX1N0cnVjdDZfX3Z0YmxaCgkucXVhZAkw CgkucXVhZAkxMQoJLnF1YWQJX0QyMlR5cGVJbmZvX1M0ZHZlcjZWZXJ0ZXg2X19p bml0WisxMzYKCS5xdWFkCTMyCgkucXVhZAlfRDRkdmVyNlZlcnRleDZfX2luaXRa CgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgku cXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAk0CgkucXVhZAkwCgkucXVh ZAkwCgkuc3RyaW5nCSJkdmVyLlZlcnRleCIKCS5nbG9ibAlfRDRkdmVyOUluZmx1 ZW5jZTZfX2luaXRaCgkuc2VjdGlvbgkucm9kYXRhCgkuYWxpZ24gNAoJLnR5cGUJ X0Q0ZHZlcjlJbmZsdWVuY2U2X19pbml0WiwgQG9iamVjdAoJLnNpemUJX0Q0ZHZl cjlJbmZsdWVuY2U2X19pbml0WiwgMTIKX0Q0ZHZlcjlJbmZsdWVuY2U2X19pbml0 WjoKCS5sb25nCTAKCS5sb25nCTIxNDExOTIxOTIKCS5ieXRlCTAKCS56ZXJvCTMK CS53ZWFrCV9EMjVUeXBlSW5mb19TNGR2ZXI5SW5mbHVlbmNlNl9faW5pdFoKCS5z ZWN0aW9uCS5kYXRhLl9EMjVUeXBlSW5mb19TNGR2ZXI5SW5mbHVlbmNlNl9faW5p dFosImF3RyIsQHByb2diaXRzLF9EMjVUeXBlSW5mb19TNGR2ZXI5SW5mbHVlbmNl Nl9faW5pdFosY29tZGF0CgkuYWxpZ24gMzIKCS50eXBlCV9EMjVUeXBlSW5mb19T NGR2ZXI5SW5mbHVlbmNlNl9faW5pdFosIEBnbnVfdW5pcXVlX29iamVjdAoJLnNp emUJX0QyNVR5cGVJbmZvX1M0ZHZlcjlJbmZsdWVuY2U2X19pbml0WiwgMTM2Cl9E MjVUeXBlSW5mb19TNGR2ZXI5SW5mbHVlbmNlNl9faW5pdFo6CgkucXVhZAlfRDE1 VHlwZUluZm9fU3RydWN0Nl9fdnRibFoKCS5xdWFkCTAKCS5xdWFkCTE0CgkucXVh ZAlfRDI1VHlwZUluZm9fUzRkdmVyOUluZmx1ZW5jZTZfX2luaXRaKzEzNgoJLnF1 YWQJMTIKCS5xdWFkCV9ENGR2ZXI5SW5mbHVlbmNlNl9faW5pdFoKCS5xdWFkCTAK CS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5x dWFkCTAKCS5xdWFkCTAKCS5xdWFkCTQKCS5xdWFkCTAKCS5xdWFkCTAKCS5zdHJp bmcJImR2ZXIuSW5mbHVlbmNlIgoJLmdsb2JsCV9ENGR2ZXIxM0JvbmVUcmFuc2Zv cm02X19pbml0WgoJLnNlY3Rpb24JLnJvZGF0YQoJLmFsaWduIDMyCgkudHlwZQlf RDRkdmVyMTNCb25lVHJhbnNmb3JtNl9faW5pdFosIEBvYmplY3QKCS5zaXplCV9E NGR2ZXIxM0JvbmVUcmFuc2Zvcm02X19pbml0WiwgNDgKX0Q0ZHZlcjEzQm9uZVRy YW5zZm9ybTZfX2luaXRaOgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5 MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJ MjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJ LmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5 MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLndlYWsJ X0QzMFR5cGVJbmZvX1M0ZHZlcjEzQm9uZVRyYW5zZm9ybTZfX2luaXRaCgkuc2Vj dGlvbgkuZGF0YS5fRDMwVHlwZUluZm9fUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9f aW5pdFosImF3RyIsQHByb2diaXRzLF9EMzBUeXBlSW5mb19TNGR2ZXIxM0JvbmVU cmFuc2Zvcm02X19pbml0Wixjb21kYXQKCS5hbGlnbiAzMgoJLnR5cGUJX0QzMFR5 cGVJbmZvX1M0ZHZlcjEzQm9uZVRyYW5zZm9ybTZfX2luaXRaLCBAZ251X3VuaXF1 ZV9vYmplY3QKCS5zaXplCV9EMzBUeXBlSW5mb19TNGR2ZXIxM0JvbmVUcmFuc2Zv cm02X19pbml0WiwgMTM2Cl9EMzBUeXBlSW5mb19TNGR2ZXIxM0JvbmVUcmFuc2Zv cm02X19pbml0WjoKCS5xdWFkCV9EMTVUeXBlSW5mb19TdHJ1Y3Q2X192dGJsWgoJ LnF1YWQJMAoJLnF1YWQJMTgKCS5xdWFkCV9EMzBUeXBlSW5mb19TNGR2ZXIxM0Jv bmVUcmFuc2Zvcm02X19pbml0WisxMzYKCS5xdWFkCTQ4CgkucXVhZAlfRDRkdmVy MTNCb25lVHJhbnNmb3JtNl9faW5pdFoKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFk CTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAK CS5xdWFkCTQKCS5xdWFkCTAKCS5xdWFkCTAKCS5zdHJpbmcJImR2ZXIuQm9uZVRy YW5zZm9ybSIKCS5nbG9ibAlfRDRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFoKCS5z ZWN0aW9uCS5yb2RhdGEKCS5hbGlnbiAxNgoJLnR5cGUJX0Q0ZHZlcjEwQ2FsVmVj dG9yNDZfX2luaXRaLCBAb2JqZWN0Cgkuc2l6ZQlfRDRkdmVyMTBDYWxWZWN0b3I0 Nl9faW5pdFosIDE2Cl9ENGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0WjoKCS5sb25n CTIxNDExOTIxOTIKCS5sb25nCTIxNDExOTIxOTIKCS5sb25nCTIxNDExOTIxOTIK CS5sb25nCTIxNDExOTIxOTIKCS53ZWFrCV9EMjdUeXBlSW5mb19TNGR2ZXIxMENh bFZlY3RvcjQ2X19pbml0WgoJLnNlY3Rpb24JLmRhdGEuX0QyN1R5cGVJbmZvX1M0 ZHZlcjEwQ2FsVmVjdG9yNDZfX2luaXRaLCJhd0ciLEBwcm9nYml0cyxfRDI3VHlw ZUluZm9fUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFosY29tZGF0CgkuYWxpZ24g MzIKCS50eXBlCV9EMjdUeXBlSW5mb19TNGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0 WiwgQGdudV91bmlxdWVfb2JqZWN0Cgkuc2l6ZQlfRDI3VHlwZUluZm9fUzRkdmVy MTBDYWxWZWN0b3I0Nl9faW5pdFosIDEzNgpfRDI3VHlwZUluZm9fUzRkdmVyMTBD YWxWZWN0b3I0Nl9faW5pdFo6CgkucXVhZAlfRDE1VHlwZUluZm9fU3RydWN0Nl9f dnRibFoKCS5xdWFkCTAKCS5xdWFkCTE1CgkucXVhZAlfRDI3VHlwZUluZm9fUzRk dmVyMTBDYWxWZWN0b3I0Nl9faW5pdForMTM2CgkucXVhZAkxNgoJLnF1YWQJX0Q0 ZHZlcjEwQ2FsVmVjdG9yNDZfX2luaXRaCgkucXVhZAkwCgkucXVhZAkwCgkucXVh ZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkw CgkucXVhZAk0CgkucXVhZAkwCgkucXVhZAkwCgkuc3RyaW5nCSJkdmVyLkNhbFZl Y3RvcjQiCgkuZGF0YQoJLmFsaWduIDE2CgkudHlwZQlfX21vZF9yZWYuMjE0Nywg QG9iamVjdAoJLnNpemUJX19tb2RfcmVmLjIxNDcsIDE2Cl9fbW9kX3JlZi4yMTQ3 OgoJLnF1YWQJMAoJLnF1YWQJX0Q0ZHZlcjEyX19Nb2R1bGVJbmZvWgoJLnNlY3Rp b24JLnJvZGF0YS5jc3QxNiwiYU0iLEBwcm9nYml0cywxNgoJLmFsaWduIDE2Ci5M QzM6CgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwky MTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkuaWRlbnQJIkdDQzogKEdOVSkg NC42LjEgMjAxMTA2MjcgKGdkYyAwLjMwLCB1c2luZyBkbWQgMi4wNTQpIgoJLnNl Y3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cwo= ------------m2ppbAqWZxQNFetByPwXsp--
Aug 05 2011
parent bearophile <bearophileHUGS lycos.com> writes:
Trass3r:

 are you willing and able to show me the asm before it gets assembled?  
 (with gcc you do it with the -S switch). (I also suggest to use only the  
 C standard library, with time() and printf() to produce a smaller asm  
 output: http://codepad.org/12EUo16J ).


You are a person of few words :-) Thank you for the asm. Apparently the program was not compiled in release mode (or with nobounds. With DMD it's the same thing, maybe with gdc it's not the same thing). It contains the calls, but they aren't to the next line, they were for the array bounds: call _d_assert call _d_array_bounds call _d_array_bounds call _d_assert_msg call _d_array_bounds call _d_array_bounds call _d_array_bounds call _d_array_bounds call _d_array_bounds call _d_array_bounds call _d_assert_msg But I think this doesn't fully explain the low performance, I have seen too many instructions like: movss DWORD PTR [rsp+32], xmm1 movss DWORD PTR [rsp+16], xmm2 movss DWORD PTR [rsp+48], xmm3 If you want to go on with this exploration, then I suggest you to find a way to disable bound tests. Bye, bearophile
Aug 05 2011
prev sibling next sibling parent Trass3r <un known.com> writes:
 If you want to go on with this exploration, then I suggest you to find a  
 way to disable bound tests.

Ok, now I get up to 32930000 skinned vertices per second. Still a bit worse than LDC.
Aug 05 2011
prev sibling next sibling parent reply Trass3r <un known.com> writes:
Am 04.08.2011, 04:07 Uhr, schrieb Trass3r <un known.com>:

 C++:
 Skinned vertices per second: 48660000

 C++ no SIMD:
 Skinned vertices per second: 42420000


 D dmd:
 Skinned vertices per second: 159046

 D gdc:
 Skinned vertices per second: 23450000

D ldc: Skinned vertices per second: 37910000 ldc2 -O3 -release -enable-inlining dver.d

D gdc with added -frelease -fno-bounds-check: Skinned vertices per second: 37710000
Aug 05 2011
parent bearophile <bearophileHUGS lycos.com> writes:
Trass3r:

 C++ no SIMD:
 Skinned vertices per second: 42420000


D gdc with added -frelease -fno-bounds-check: Skinned vertices per second: 37710000

I'd like to know why the GCC back-end is able to produce a more efficient binary from the C++ code (compared to the D code), but now the problem is not large, as before. It seems I've found a benchmark coming from real-world code that's a worst case for DMD (GDC here produces code about 237 times faster than DMD). Bye, bearophile
Aug 05 2011
prev sibling next sibling parent Trass3r <un known.com> writes:
------------xMywv6oCsHku66IxcFGqcv
Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes
Content-Transfer-Encoding: 7bit

 I'd like to know why the GCC back-end is able to produce a more  
 efficient binary from the C++ code (compared to the D code), but now the  
 problem is not large, as before.

I attached both asm versions ;) ------------xMywv6oCsHku66IxcFGqcv Content-Disposition: attachment; filename=cppver.s Content-Type: application/octet-stream; name=cppver.s Content-Transfer-Encoding: Base64 CS5maWxlCSJjcHB2ZXIuY3BwIgoJLmludGVsX3N5bnRheCBub3ByZWZpeAoJLnRl eHQKCS5wMmFsaWduIDQsLDE1Ci5nbG9ibCBfWjMxY2FsY3VsYXRlVmVydGljZXNB bmROb3JtYWxzX3g4N1BLMTNCb25lVHJhbnNmb3JtaVBLNlZlcnRleFBLOUluZmx1 ZW5jZVAxMENhbFZlY3RvcjQKCS50eXBlCV9aMzFjYWxjdWxhdGVWZXJ0aWNlc0Fu ZE5vcm1hbHNfeDg3UEsxM0JvbmVUcmFuc2Zvcm1pUEs2VmVydGV4UEs5SW5mbHVl bmNlUDEwQ2FsVmVjdG9yNCwgQGZ1bmN0aW9uCl9aMzFjYWxjdWxhdGVWZXJ0aWNl c0FuZE5vcm1hbHNfeDg3UEsxM0JvbmVUcmFuc2Zvcm1pUEs2VmVydGV4UEs5SW5m bHVlbmNlUDEwQ2FsVmVjdG9yNDoKLkxGQjE0MTQ6CgkuY2ZpX3N0YXJ0cHJvYwoJ dGVzdAllc2ksIGVzaQoJamUJLkwxCglkZWMJZXNpCglzYWwJcnNpLCA1CglsZWEJ cnNpLCBbcmR4K3JzaV0KCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5MNToK CW1vdnNzCXhtbTksIERXT1JEIFBUUiBbcmN4KzRdCgltb3YJZWF4LCBEV09SRCBQ VFIgW3JjeF0KCWxlYQlyYXgsIFtyYXgrcmF4KjJdCglzYWwJcmF4LCA0CglsZWEJ cmF4LCBbcmRpK3JheF0KCW1vdnNzCXhtbTcsIERXT1JEIFBUUiBbcmF4XQoJbW92 c3MJeG1tOCwgRFdPUkQgUFRSIFtyYXgrNF0KCW1vdnNzCXhtbTYsIERXT1JEIFBU UiBbcmF4KzhdCgltb3Zzcwl4bW0xMSwgRFdPUkQgUFRSIFtyYXgrMTJdCgltb3Zz cwl4bW00LCBEV09SRCBQVFIgW3JheCsxNl0KCW1vdnNzCXhtbTUsIERXT1JEIFBU UiBbcmF4KzIwXQoJbW92c3MJeG1tMywgRFdPUkQgUFRSIFtyYXgrMjRdCgltb3Zz cwl4bW0xMCwgRFdPUkQgUFRSIFtyYXgrMjhdCgltb3Zzcwl4bW0xLCBEV09SRCBQ VFIgW3JheCszMl0KCW1vdnNzCXhtbTIsIERXT1JEIFBUUiBbcmF4KzM2XQoJbW92 c3MJeG1tMCwgRFdPUkQgUFRSIFtyYXgrNDBdCgltdWxzcwl4bW03LCB4bW05Cglt dWxzcwl4bW04LCB4bW05CgltdWxzcwl4bW02LCB4bW05CgltdWxzcwl4bW0xMSwg eG1tOQoJbXVsc3MJeG1tNCwgeG1tOQoJbXVsc3MJeG1tNSwgeG1tOQoJbXVsc3MJ eG1tMywgeG1tOQoJbXVsc3MJeG1tMTAsIHhtbTkKCW11bHNzCXhtbTEsIHhtbTkK CW11bHNzCXhtbTIsIHhtbTkKCW11bHNzCXhtbTAsIHhtbTkKCW11bHNzCXhtbTks IERXT1JEIFBUUiBbcmF4KzQ0XQoJbW92CWVheCwgRFdPUkQgUFRSIFtyY3grOF0K CWFkZAlyY3gsIDEyCgl0ZXN0CWVheCwgZWF4CglqbmUJLkwzCgkucDJhbGlnbiA0 LCwxMAoJLnAyYWxpZ24gMwouTDY6Cgltb3Zzcwl4bW0xMiwgRFdPUkQgUFRSIFty Y3grNF0KCW1vdgllYXgsIERXT1JEIFBUUiBbcmN4XQoJbGVhCXJheCwgW3JheCty YXgqMl0KCXNhbAlyYXgsIDQKCWxlYQlyYXgsIFtyZGkrcmF4XQoJbW92c3MJeG1t MTMsIERXT1JEIFBUUiBbcmF4XQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4 bW03LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzRdCgltdWxz cwl4bW0xMywgeG1tMTIKCWFkZHNzCXhtbTgsIHhtbTEzCgltb3Zzcwl4bW0xMywg RFdPUkQgUFRSIFtyYXgrOF0KCW11bHNzCXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1t NiwgeG1tMTMKCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JheCsxMl0KCW11bHNz CXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1tMTEsIHhtbTEzCgltb3Zzcwl4bW0xMywg RFdPUkQgUFRSIFtyYXgrMTZdCgltdWxzcwl4bW0xMywgeG1tMTIKCWFkZHNzCXht bTQsIHhtbTEzCgltb3Zzcwl4bW0xMywgRFdPUkQgUFRSIFtyYXgrMjBdCgltdWxz cwl4bW0xMywgeG1tMTIKCWFkZHNzCXhtbTUsIHhtbTEzCgltb3Zzcwl4bW0xMywg RFdPUkQgUFRSIFtyYXgrMjRdCgltdWxzcwl4bW0xMywgeG1tMTIKCWFkZHNzCXht bTMsIHhtbTEzCgltb3Zzcwl4bW0xMywgRFdPUkQgUFRSIFtyYXgrMjhdCgltdWxz cwl4bW0xMywgeG1tMTIKCWFkZHNzCXhtbTEwLCB4bW0xMwoJbW92c3MJeG1tMTMs IERXT1JEIFBUUiBbcmF4KzMyXQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4 bW0xLCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzM2XQoJbXVs c3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW0yLCB4bW0xMwoJbW92c3MJeG1tMTMs IERXT1JEIFBUUiBbcmF4KzQwXQoJbXVsc3MJeG1tMTMsIHhtbTEyCgltdWxzcwl4 bW0xMiwgRFdPUkQgUFRSIFtyYXgrNDRdCglhZGRzcwl4bW0wLCB4bW0xMwoJbW92 CWVheCwgRFdPUkQgUFRSIFtyY3grOF0KCWFkZHNzCXhtbTksIHhtbTEyCglhZGQJ cmN4LCAxMgoJdGVzdAllYXgsIGVheAoJamUJLkw2Ci5MMzoKCW1vdnNzCXhtbTE0 LCBEV09SRCBQVFIgW3JkeF0KCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JkeCs0 XQoJbW92YXBzCXhtbTEyLCB4bW03Cgltb3ZhcHMJeG1tMTUsIHhtbTgKCW11bHNz CXhtbTEyLCB4bW0xNAoJbXVsc3MJeG1tMTUsIHhtbTEzCgljbXAJcmR4LCByc2kK CWFkZHNzCXhtbTEyLCB4bW0xNQoJYWRkc3MJeG1tMTIsIHhtbTExCgltb3Zzcwl4 bW0xMSwgRFdPUkQgUFRSIFtyZHgrOF0KCW11bHNzCXhtbTExLCB4bW02CglhZGRz cwl4bW0xMiwgeG1tMTEKCW1vdmFwcwl4bW0xMSwgeG1tNAoJbW92c3MJRFdPUkQg UFRSIFtyOF0sIHhtbTEyCgltdWxzcwl4bW0xMSwgeG1tMTQKCW1vdmFwcwl4bW0x MiwgeG1tNQoJbXVsc3MJeG1tMTQsIHhtbTEKCW11bHNzCXhtbTEyLCB4bW0xMwoJ bXVsc3MJeG1tNywgRFdPUkQgUFRSIFtyZHgrMTZdCgltdWxzcwl4bW0xMywgeG1t MgoJYWRkc3MJeG1tMTEsIHhtbTEyCglhZGRzcwl4bW0xNCwgeG1tMTMKCWFkZHNz CXhtbTExLCB4bW0xMAoJYWRkc3MJeG1tMTQsIHhtbTkKCW1vdnNzCXhtbTEwLCBE V09SRCBQVFIgW3JkeCs4XQoJbW92c3MJeG1tOSwgRFdPUkQgUFRSIFtyZHgrOF0K CW11bHNzCXhtbTEwLCB4bW0zCgltdWxzcwl4bW05LCB4bW0wCglhZGRzcwl4bW0x MSwgeG1tMTAKCWFkZHNzCXhtbTE0LCB4bW05Cgltb3ZzcwlEV09SRCBQVFIgW3I4 KzRdLCB4bW0xMQoJbW92c3MJRFdPUkQgUFRSIFtyOCs4XSwgeG1tMTQKCW1vdnNz CXhtbTEwLCBEV09SRCBQVFIgW3JkeCsyMF0KCW1vdnNzCXhtbTksIERXT1JEIFBU UiBbcmR4KzI0XQoJbXVsc3MJeG1tOCwgeG1tMTAKCW11bHNzCXhtbTYsIHhtbTkK CWFkZHNzCXhtbTgsIHhtbTcKCW11bHNzCXhtbTUsIHhtbTEwCglhZGRzcwl4bW04 LCB4bW02CgltdWxzcwl4bW0zLCB4bW05Cgltb3ZzcwlEV09SRCBQVFIgW3I4KzE2 XSwgeG1tOAoJbXVsc3MJeG1tMCwgeG1tOQoJbW92c3MJeG1tNiwgRFdPUkQgUFRS IFtyZHgrMTZdCgltdWxzcwl4bW00LCB4bW02CgltdWxzcwl4bW0xLCB4bW02Cglh ZGRzcwl4bW01LCB4bW00CglhZGRzcwl4bW01LCB4bW0zCgltb3ZzcwlEV09SRCBQ VFIgW3I4KzIwXSwgeG1tNQoJbXVsc3MJeG1tMiwgRFdPUkQgUFRSIFtyZHgrMjBd CglhZGRzcwl4bW0yLCB4bW0xCglhZGRzcwl4bW0yLCB4bW0wCgltb3ZzcwlEV09S RCBQVFIgW3I4KzI0XSwgeG1tMgoJamUJLkwxCglhZGQJcmR4LCAzMgoJYWRkCXI4 LCAzMgoJam1wCS5MNQouTDE6CglyZXAKCXJldAoJLmNmaV9lbmRwcm9jCi5MRkUx NDE0OgoJLnNpemUJX1ozMWNhbGN1bGF0ZVZlcnRpY2VzQW5kTm9ybWFsc194ODdQ SzEzQm9uZVRyYW5zZm9ybWlQSzZWZXJ0ZXhQSzlJbmZsdWVuY2VQMTBDYWxWZWN0 b3I0LCAuLV9aMzFjYWxjdWxhdGVWZXJ0aWNlc0FuZE5vcm1hbHNfeDg3UEsxM0Jv bmVUcmFuc2Zvcm1pUEs2VmVydGV4UEs5SW5mbHVlbmNlUDEwQ2FsVmVjdG9yNAoJ LnNlY3Rpb24JLnJvZGF0YS5zdHIxLjgsImFNUyIsQHByb2diaXRzLDEKCS5hbGln biA4Ci5MQzM6Cgkuc3RyaW5nCSJTa2lubmVkIHZlcnRpY2VzIHBlciBzZWNvbmQ6 ICVkLCBibGFoPSVmXG4iCgkudGV4dAoJLnAyYWxpZ24gNCwsMTUKLmdsb2JsIG1h aW4KCS50eXBlCW1haW4sIEBmdW5jdGlvbgptYWluOgouTEZCMTQxODoKCS5jZmlf c3RhcnRwcm9jCglwdXNoCXIxNQoJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgoJeG9y cHMJeG1tMCwgeG1tMAoJcHVzaAlyMTQKCS5jZmlfZGVmX2NmYV9vZmZzZXQgMjQK CXB1c2gJcjEzCgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDMyCglwdXNoCXIxMgoJLmNm aV9kZWZfY2ZhX29mZnNldCA0MAoJcHVzaAlyYnAKCS5jZmlfZGVmX2NmYV9vZmZz ZXQgNDgKCXB1c2gJcmJ4CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDU2CglzdWIJcnNw LCA3NjAwNzIKCS5jZmlfZGVmX2NmYV9vZmZzZXQgNzYwMTI4CglsZWEJcmF4LCBb cnNwKzMyMDAxNl0KCW1vdmFwcwl4bW0xLCBYTU1XT1JEIFBUUiAuTEMwW3JpcF0K CW1vdglyZHgsIHJheAoJYWRkCXJkeCwgMzIwMDAwCgkucDJhbGlnbiA0LCwxMAoJ LnAyYWxpZ24gMwouTDEwOgoJbW92YXBzCVhNTVdPUkQgUFRSIFtyYXhdLCB4bW0x Cgltb3ZhcHMJWE1NV09SRCBQVFIgW3JheCsxNl0sIHhtbTAKCWFkZAlyYXgsIDMy CgljbXAJcmR4LCByYXgKCWpuZQkuTDEwCgkuY2ZpX29mZnNldCAzLCAtNTYKCS5j Zmlfb2Zmc2V0IDYsIC00OAoJLmNmaV9vZmZzZXQgMTIsIC00MAoJLmNmaV9vZmZz ZXQgMTMsIC0zMgoJLmNmaV9vZmZzZXQgMTQsIC0yNAoJLmNmaV9vZmZzZXQgMTUs IC0xNgoJbGVhCXJkeCwgW3JzcCs3NjAwMTZdCglsZWEJcmF4LCBbcnNwKzY0MDAx Nl0KCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5MMTE6Cgltb3YJRFdPUkQg UFRSIFtyYXhdLCAtMQoJbW92CURXT1JEIFBUUiBbcmF4KzRdLCAweDAwMDAwMDAw Cgltb3YJRFdPUkQgUFRSIFtyYXgrOF0sIDAKCWFkZAlyYXgsIDEyCgljbXAJcmF4 LCByZHgKCWpuZQkuTDExCglsZWEJcmF4LCBbcnNwKzMyMDAzMl0KCWxlYQlyZHgs IFtyc3ArNjQwMDE2XQoJbGVhCXJjeCwgW3JzcCs2NDAwMzJdCgkucDJhbGlnbiA0 LCwxMAoJLnAyYWxpZ24gMwouTDEyOgoJbW92CURXT1JEIFBUUiBbcmF4LTRdLCAw eDNmODAwMDAwCgltb3YJRFdPUkQgUFRSIFtyYXhdLCAweDAwMDAwMDAwCgltb3YJ RFdPUkQgUFRSIFtyYXgrNF0sIDB4MDAwMDAwMDAKCW1vdglEV09SRCBQVFIgW3Jh eCs4XSwgMHgzZjgwMDAwMAoJbW92CURXT1JEIFBUUiBbcmF4KzEyXSwgMHgwMDAw MDAwMAoJbW92CURXT1JEIFBUUiBbcmR4XSwgMAoJbW92CURXT1JEIFBUUiBbcmR4 KzRdLCAweDNmODAwMDAwCgltb3YJRFdPUkQgUFRSIFtyZHgrOF0sIDEKCWFkZAly YXgsIDMyCglhZGQJcmR4LCAxMgoJY21wCXJheCwgcmN4CglqbmUJLkwxMgoJeG9y CWVheCwgZWF4CglsZWEJcmJwLCBbcnNwKzE2XQoJbGVhCXJieCwgW3JzcCs3NjAw MTZdCgltb3YJZWN4LCAxMgoJbW92CXJkaSwgcmJ4Cgltb3YJcjEyLCByYnAKCXJl cCBzdG9zZAoJYWRkCXIxMiwgMzIwMDAwCgltb3YJcmF4LCByYnAKCXhvcnBzCXht bTAsIHhtbTAKCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5MMTM6Cgltb3Zh cHMJWE1NV09SRCBQVFIgW3JheF0sIHhtbTAKCWFkZAlyYXgsIDE2CgljbXAJcmF4 LCByMTIKCWpuZQkuTDEzCgljYWxsCWNsb2NrCgl4b3IJcjE0ZCwgcjE0ZAoJbW92 CXIxNSwgcmF4Cgltb3YJUVdPUkQgUFRSIFtyc3ArOF0sIHJheAoJYWRkCXIxNSwg OTk5OTk5CgljYWxsCWNsb2NrCglsZWEJcjEzLCBbcnNwKzYzOTk4NF0KCWNtcAly YXgsIHIxNQoJamcJLkwxOAouTDI5OgoJbGVhCXJzaSwgW3JzcCsxNl0KCWxlYQly Y3gsIFtyc3ArMzIwMDE2XQoJbGVhCXJkeCwgW3JzcCs2NDAwMTZdCgkucDJhbGln biA0LCwxMAoJLnAyYWxpZ24gMwouTDE5OgoJbW92c3MJeG1tOSwgRFdPUkQgUFRS IFtyZHgrNF0KCW1vdgllYXgsIERXT1JEIFBUUiBbcmR4XQoJbGVhCXJheCwgW3Jh eCtyYXgqMl0KCXNhbAlyYXgsIDQKCWxlYQlyYXgsIFtyYngrcmF4XQoJbW92c3MJ eG1tNywgRFdPUkQgUFRSIFtyYXhdCgltb3Zzcwl4bW04LCBEV09SRCBQVFIgW3Jh eCs0XQoJbW92c3MJeG1tNiwgRFdPUkQgUFRSIFtyYXgrOF0KCW1vdnNzCXhtbTEx LCBEV09SRCBQVFIgW3JheCsxMl0KCW1vdnNzCXhtbTQsIERXT1JEIFBUUiBbcmF4 KzE2XQoJbW92c3MJeG1tNSwgRFdPUkQgUFRSIFtyYXgrMjBdCgltb3Zzcwl4bW0z LCBEV09SRCBQVFIgW3JheCsyNF0KCW1vdnNzCXhtbTEwLCBEV09SRCBQVFIgW3Jh eCsyOF0KCW1vdnNzCXhtbTEsIERXT1JEIFBUUiBbcmF4KzMyXQoJbW92c3MJeG1t MiwgRFdPUkQgUFRSIFtyYXgrMzZdCgltb3Zzcwl4bW0wLCBEV09SRCBQVFIgW3Jh eCs0MF0KCW11bHNzCXhtbTcsIHhtbTkKCW11bHNzCXhtbTgsIHhtbTkKCW11bHNz CXhtbTYsIHhtbTkKCW11bHNzCXhtbTExLCB4bW05CgltdWxzcwl4bW00LCB4bW05 CgltdWxzcwl4bW01LCB4bW05CgltdWxzcwl4bW0zLCB4bW05CgltdWxzcwl4bW0x MCwgeG1tOQoJbXVsc3MJeG1tMSwgeG1tOQoJbXVsc3MJeG1tMiwgeG1tOQoJbXVs c3MJeG1tMCwgeG1tOQoJbXVsc3MJeG1tOSwgRFdPUkQgUFRSIFtyYXgrNDRdCglt b3YJZWF4LCBEV09SRCBQVFIgW3JkeCs4XQoJYWRkCXJkeCwgMTIKCXRlc3QJZWF4 LCBlYXgKCWpuZQkuTDE1CgkucDJhbGlnbiA0LCwxMAoJLnAyYWxpZ24gMwouTDIx OgoJbW92c3MJeG1tMTIsIERXT1JEIFBUUiBbcmR4KzRdCgltb3YJZWF4LCBEV09S RCBQVFIgW3JkeF0KCWxlYQlyYXgsIFtyYXgrcmF4KjJdCglzYWwJcmF4LCA0Cgls ZWEJcmF4LCBbcmJ4K3JheF0KCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JheF0K CW11bHNzCXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1tNywgeG1tMTMKCW1vdnNzCXht bTEzLCBEV09SRCBQVFIgW3JheCs0XQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRz cwl4bW04LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzhdCglt dWxzcwl4bW0xMywgeG1tMTIKCWFkZHNzCXhtbTYsIHhtbTEzCgltb3Zzcwl4bW0x MywgRFdPUkQgUFRSIFtyYXgrMTJdCgltdWxzcwl4bW0xMywgeG1tMTIKCWFkZHNz CXhtbTExLCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzE2XQoJ bXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW00LCB4bW0xMwoJbW92c3MJeG1t MTMsIERXT1JEIFBUUiBbcmF4KzIwXQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRz cwl4bW01LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzI0XQoJ bXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW0zLCB4bW0xMwoJbW92c3MJeG1t MTMsIERXT1JEIFBUUiBbcmF4KzI4XQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRz cwl4bW0xMCwgeG1tMTMKCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JheCszMl0K CW11bHNzCXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1tMSwgeG1tMTMKCW1vdnNzCXht bTEzLCBEV09SRCBQVFIgW3JheCszNl0KCW11bHNzCXhtbTEzLCB4bW0xMgoJYWRk c3MJeG1tMiwgeG1tMTMKCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JheCs0MF0K CW11bHNzCXhtbTEzLCB4bW0xMgoJbXVsc3MJeG1tMTIsIERXT1JEIFBUUiBbcmF4 KzQ0XQoJYWRkc3MJeG1tMCwgeG1tMTMKCW1vdgllYXgsIERXT1JEIFBUUiBbcmR4 KzhdCglhZGRzcwl4bW05LCB4bW0xMgoJYWRkCXJkeCwgMTIKCXRlc3QJZWF4LCBl YXgKCWplCS5MMjEKLkwxNToKCW1vdnNzCXhtbTE0LCBEV09SRCBQVFIgW3JjeF0K CW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JjeCs0XQoJbW92YXBzCXhtbTEyLCB4 bW03Cgltb3ZhcHMJeG1tMTUsIHhtbTgKCW11bHNzCXhtbTEyLCB4bW0xNAoJbXVs c3MJeG1tMTUsIHhtbTEzCgljbXAJcmN4LCByMTMKCWFkZHNzCXhtbTEyLCB4bW0x NQoJYWRkc3MJeG1tMTIsIHhtbTExCgltb3Zzcwl4bW0xMSwgRFdPUkQgUFRSIFty Y3grOF0KCW11bHNzCXhtbTExLCB4bW02CglhZGRzcwl4bW0xMiwgeG1tMTEKCW1v dmFwcwl4bW0xMSwgeG1tNAoJbW92c3MJRFdPUkQgUFRSIFtyc2ldLCB4bW0xMgoJ bXVsc3MJeG1tMTEsIHhtbTE0Cgltb3ZhcHMJeG1tMTIsIHhtbTUKCW11bHNzCXht bTE0LCB4bW0xCgltdWxzcwl4bW0xMiwgeG1tMTMKCW11bHNzCXhtbTEzLCB4bW0y CglhZGRzcwl4bW0xMSwgeG1tMTIKCWFkZHNzCXhtbTE0LCB4bW0xMwoJYWRkc3MJ eG1tMTEsIHhtbTEwCglhZGRzcwl4bW0xNCwgeG1tOQoJbW92c3MJeG1tMTAsIERX T1JEIFBUUiBbcmN4KzhdCgltb3Zzcwl4bW05LCBEV09SRCBQVFIgW3JjeCs4XQoJ bXVsc3MJeG1tMTAsIHhtbTMKCW11bHNzCXhtbTksIHhtbTAKCWFkZHNzCXhtbTEx LCB4bW0xMAoJYWRkc3MJeG1tMTQsIHhtbTkKCW1vdnNzCXhtbTEwLCBEV09SRCBQ VFIgW3JjeCsxNl0KCW1vdnNzCURXT1JEIFBUUiBbcnNpKzRdLCB4bW0xMQoJbW92 c3MJRFdPUkQgUFRSIFtyc2krOF0sIHhtbTE0Cgltb3Zzcwl4bW0xMSwgRFdPUkQg UFRSIFtyY3grMjBdCgltb3Zzcwl4bW05LCBEV09SRCBQVFIgW3JjeCsyNF0KCW11 bHNzCXhtbTgsIHhtbTExCgltdWxzcwl4bW03LCB4bW0xMAoJbXVsc3MJeG1tNiwg eG1tOQoJYWRkc3MJeG1tOCwgeG1tNwoJbXVsc3MJeG1tNSwgeG1tMTEKCWFkZHNz CXhtbTgsIHhtbTYKCW11bHNzCXhtbTQsIHhtbTEwCgltdWxzcwl4bW0zLCB4bW05 CglhZGRzcwl4bW01LCB4bW00CgltdWxzcwl4bW0yLCB4bW0xMQoJYWRkc3MJeG1t NSwgeG1tMwoJbXVsc3MJeG1tMSwgeG1tMTAKCW11bHNzCXhtbTAsIHhtbTkKCWFk ZHNzCXhtbTIsIHhtbTEKCW1vdnNzCURXT1JEIFBUUiBbcnNpKzE2XSwgeG1tOAoJ YWRkc3MJeG1tMiwgeG1tMAoJbW92c3MJRFdPUkQgUFRSIFtyc2krMjBdLCB4bW01 Cgltb3ZzcwlEV09SRCBQVFIgW3JzaSsyNF0sIHhtbTIKCWplCS5MMjgKCWFkZAly Y3gsIDMyCglhZGQJcnNpLCAzMgoJam1wCS5MMTkKLkwyODoKCWFkZAlyMTQsIDEw MDAwCgljYWxsCWNsb2NrCgljbXAJcmF4LCByMTUKCWpsZQkuTDI5Ci5MMTg6Cglj YWxsCWNsb2NrCgl4b3Jwcwl4bW01LCB4bW01Cgltb3YJcmN4LCByYXgKCXN1Ygly Y3gsIFFXT1JEIFBUUiBbcnNwKzhdCgkucDJhbGlnbiA0LCwxMAoJLnAyYWxpZ24g MwouTDIwOgoJbW92YXBzCXhtbTMsIFhNTVdPUkQgUFRSIFtyYnArMTZdCgltb3Zh cHMJeG1tMCwgWE1NV09SRCBQVFIgW3JicCs0OF0KCW1vdmFwcwl4bW0yLCBYTU1X T1JEIFBUUiBbcmJwKzBdCgltb3ZhcHMJeG1tMSwgWE1NV09SRCBQVFIgW3JicCsz Ml0KCW1vdmFwcwl4bW00LCB4bW0yCglhZGQJcmJwLCA2NAoJc2h1ZnBzCXhtbTQs IHhtbTMsIDEzNgoJc2h1ZnBzCXhtbTIsIHhtbTMsIDIyMQoJbW92YXBzCXhtbTYs IHhtbTQKCW1vdmFwcwl4bW0zLCB4bW0xCgljbXAJcjEyLCByYnAKCXNodWZwcwl4 bW0zLCB4bW0wLCAxMzYKCXNodWZwcwl4bW0xLCB4bW0wLCAyMjEKCXNodWZwcwl4 bW02LCB4bW0zLCAxMzYKCW1vdmFwcwl4bW0wLCB4bW0yCglzaHVmcHMJeG1tNCwg eG1tMywgMjIxCglzaHVmcHMJeG1tMCwgeG1tMSwgMTM2CglzaHVmcHMJeG1tMiwg eG1tMSwgMjIxCglhZGRwcwl4bW0wLCB4bW02CglhZGRwcwl4bW0wLCB4bW00Cglh ZGRwcwl4bW0wLCB4bW0yCglhZGRwcwl4bW01LCB4bW0wCglqbmUJLkwyMAoJaW11 bAlyYXgsIHIxNCwgMTAwMDAwMAoJaGFkZHBzCXhtbTUsIHhtbTUKCW1vdglyZHgs IHJheAoJaGFkZHBzCXhtbTUsIHhtbTUKCXNhcglyZHgsIDYzCgltb3ZhcHMJeG1t MCwgeG1tNQoJaWRpdglyY3gKCWN2dHNzMnNkCXhtbTAsIHhtbTAKCW1vdgllZHgs IGVheAoJbW92CWVzaSwgT0ZGU0VUIEZMQVQ6LkxDMwoJbW92CWVkaSwgMQoJbW92 CWVheCwgMQoJY2FsbAlfX3ByaW50Zl9jaGsKCWFkZAlyc3AsIDc2MDA3MgoJLmNm aV9kZWZfY2ZhX29mZnNldCA1NgoJeG9yCWVheCwgZWF4Cglwb3AJcmJ4CgkuY2Zp X2RlZl9jZmFfb2Zmc2V0IDQ4Cglwb3AJcmJwCgkuY2ZpX2RlZl9jZmFfb2Zmc2V0 IDQwCglwb3AJcjEyCgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDMyCglwb3AJcjEzCgku Y2ZpX2RlZl9jZmFfb2Zmc2V0IDI0Cglwb3AJcjE0CgkuY2ZpX2RlZl9jZmFfb2Zm c2V0IDE2Cglwb3AJcjE1CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDgKCXJldAoJLmNm aV9lbmRwcm9jCi5MRkUxNDE4OgoJLnNpemUJbWFpbiwgLi1tYWluCgkuc2VjdGlv bgkucm9kYXRhLmNzdDE2LCJhTSIsQHByb2diaXRzLDE2CgkuYWxpZ24gMTYKLkxD MDoKCS5sb25nCTAKCS5sb25nCTAKCS5sb25nCTAKCS5sb25nCTEwNjUzNTMyMTYK CS5pZGVudAkiR0NDOiAoVWJ1bnR1L0xpbmFybyA0LjUuMi04dWJ1bnR1NCkgNC41 LjIiCgkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCg== ------------xMywv6oCsHku66IxcFGqcv Content-Disposition: attachment; filename=dver.s Content-Type: application/octet-stream; name=dver.s Content-Transfer-Encoding: Base64 CS5maWxlCSJkdmVyLmQiCgkuaW50ZWxfc3ludGF4IG5vcHJlZml4CgkudGV4dAoJ LnAyYWxpZ24gNCwsMTUKCS5nbG9ibAlfRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rv ck1GTmNmZmZmWlM0ZHZlcjEwQ2FsVmVjdG9yNAoJLnR5cGUJX0Q0ZHZlcjEwQ2Fs VmVjdG9yNDZfX2N0b3JNRk5jZmZmZlpTNGR2ZXIxMENhbFZlY3RvcjQsIEBmdW5j dGlvbgpfRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rvck1GTmNmZmZmWlM0ZHZlcjEw Q2FsVmVjdG9yNDoKLkxGQjA6CgkuY2ZpX3N0YXJ0cHJvYwoJdW5wY2tscHMJeG1t MiwgeG1tMwoJdW5wY2tscHMJeG1tMCwgeG1tMQoJbW92bGhwcwl4bW0wLCB4bW0y Cgltb3YJcmF4LCByZGkKCW1vdmxwcwlRV09SRCBQVFIgW3JkaV0sIHhtbTAKCW1v dmhwcwlRV09SRCBQVFIgW3JkaSs4XSwgeG1tMAoJcmV0CgkuY2ZpX2VuZHByb2MK LkxGRTA6Cgkuc2l6ZQlfRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rvck1GTmNmZmZm WlM0ZHZlcjEwQ2FsVmVjdG9yNCwgLi1fRDRkdmVyMTBDYWxWZWN0b3I0Nl9fY3Rv ck1GTmNmZmZmWlM0ZHZlcjEwQ2FsVmVjdG9yNAoJLnAyYWxpZ24gNCwsMTUKCS5n bG9ibAlfRDRkdmVyMTNCb25lVHJhbnNmb3JtNXNjYWxlTUZLUzRkdmVyMTNCb25l VHJhbnNmb3JtZlp2CgkudHlwZQlfRDRkdmVyMTNCb25lVHJhbnNmb3JtNXNjYWxl TUZLUzRkdmVyMTNCb25lVHJhbnNmb3JtZlp2LCBAZnVuY3Rpb24KX0Q0ZHZlcjEz Qm9uZVRyYW5zZm9ybTVzY2FsZU1GS1M0ZHZlcjEzQm9uZVRyYW5zZm9ybWZadjoK LkxGQjE6CgkuY2ZpX3N0YXJ0cHJvYwoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFty ZGldCgltdWxzcwl4bW0xLCB4bW0wCgltb3ZzcwlEV09SRCBQVFIgW3JzaV0sIHht bTEKCW1vdnNzCXhtbTEsIERXT1JEIFBUUiBbcmRpKzRdCgltdWxzcwl4bW0xLCB4 bW0wCgltb3ZzcwlEV09SRCBQVFIgW3JzaSs0XSwgeG1tMQoJbW92c3MJeG1tMSwg RFdPUkQgUFRSIFtyZGkrOF0KCW11bHNzCXhtbTEsIHhtbTAKCW1vdnNzCURXT1JE IFBUUiBbcnNpKzhdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JkaSsx Ml0KCW11bHNzCXhtbTEsIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcnNpKzEyXSwg eG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrMTZdCgltdWxzcwl4bW0x LCB4bW0wCgltb3ZzcwlEV09SRCBQVFIgW3JzaSsxNl0sIHhtbTEKCW1vdnNzCXht bTEsIERXT1JEIFBUUiBbcmRpKzIwXQoJbXVsc3MJeG1tMSwgeG1tMAoJbW92c3MJ RFdPUkQgUFRSIFtyc2krMjBdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIg W3JkaSsyNF0KCW11bHNzCXhtbTEsIHhtbTAKCW1vdnNzCURXT1JEIFBUUiBbcnNp KzI0XSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrMjhdCgltdWxz cwl4bW0xLCB4bW0wCgltb3ZzcwlEV09SRCBQVFIgW3JzaSsyOF0sIHhtbTEKCW1v dnNzCXhtbTEsIERXT1JEIFBUUiBbcmRpKzMyXQoJbXVsc3MJeG1tMSwgeG1tMAoJ bW92c3MJRFdPUkQgUFRSIFtyc2krMzJdLCB4bW0xCgltb3Zzcwl4bW0xLCBEV09S RCBQVFIgW3JkaSszNl0KCW11bHNzCXhtbTEsIHhtbTAKCW1vdnNzCURXT1JEIFBU UiBbcnNpKzM2XSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrNDBd CgltdWxzcwl4bW0xLCB4bW0wCgltdWxzcwl4bW0wLCBEV09SRCBQVFIgW3JkaSs0 NF0KCW1vdnNzCURXT1JEIFBUUiBbcnNpKzQwXSwgeG1tMQoJbW92c3MJRFdPUkQg UFRSIFtyc2krNDRdLCB4bW0wCglyZXQKCS5jZmlfZW5kcHJvYwouTEZFMToKCS5z aXplCV9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm01c2NhbGVNRktTNGR2ZXIxM0JvbmVU cmFuc2Zvcm1mWnYsIC4tX0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTVzY2FsZU1GS1M0 ZHZlcjEzQm9uZVRyYW5zZm9ybWZadgoJLnAyYWxpZ24gNCwsMTUKCS5nbG9ibAlf RDRkdmVyMTNCb25lVHJhbnNmb3JtOWFkZFNjYWxlZE1GS1M0ZHZlcjEzQm9uZVRy YW5zZm9ybWZadgoJLnR5cGUJX0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTlhZGRTY2Fs ZWRNRktTNGR2ZXIxM0JvbmVUcmFuc2Zvcm1mWnYsIEBmdW5jdGlvbgpfRDRkdmVy MTNCb25lVHJhbnNmb3JtOWFkZFNjYWxlZE1GS1M0ZHZlcjEzQm9uZVRyYW5zZm9y bWZadjoKLkxGQjI6CgkuY2ZpX3N0YXJ0cHJvYwoJbW92c3MJeG1tMSwgRFdPUkQg UFRSIFtyZGldCgltdWxzcwl4bW0xLCB4bW0wCglhZGRzcwl4bW0xLCBEV09SRCBQ VFIgW3JzaV0KCW1vdnNzCURXT1JEIFBUUiBbcnNpXSwgeG1tMQoJbW92c3MJeG1t MSwgRFdPUkQgUFRSIFtyZGkrNF0KCW11bHNzCXhtbTEsIHhtbTAKCWFkZHNzCXht bTEsIERXT1JEIFBUUiBbcnNpKzRdCgltb3ZzcwlEV09SRCBQVFIgW3JzaSs0XSwg eG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrOF0KCW11bHNzCXhtbTEs IHhtbTAKCWFkZHNzCXhtbTEsIERXT1JEIFBUUiBbcnNpKzhdCgltb3ZzcwlEV09S RCBQVFIgW3JzaSs4XSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkr MTJdCgltdWxzcwl4bW0xLCB4bW0wCglhZGRzcwl4bW0xLCBEV09SRCBQVFIgW3Jz aSsxMl0KCW1vdnNzCURXT1JEIFBUUiBbcnNpKzEyXSwgeG1tMQoJbW92c3MJeG1t MSwgRFdPUkQgUFRSIFtyZGkrMTZdCgltdWxzcwl4bW0xLCB4bW0wCglhZGRzcwl4 bW0xLCBEV09SRCBQVFIgW3JzaSsxNl0KCW1vdnNzCURXT1JEIFBUUiBbcnNpKzE2 XSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrMjBdCgltdWxzcwl4 bW0xLCB4bW0wCglhZGRzcwl4bW0xLCBEV09SRCBQVFIgW3JzaSsyMF0KCW1vdnNz CURXT1JEIFBUUiBbcnNpKzIwXSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRS IFtyZGkrMjRdCgltdWxzcwl4bW0xLCB4bW0wCglhZGRzcwl4bW0xLCBEV09SRCBQ VFIgW3JzaSsyNF0KCW1vdnNzCURXT1JEIFBUUiBbcnNpKzI0XSwgeG1tMQoJbW92 c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrMjhdCgltdWxzcwl4bW0xLCB4bW0wCglh ZGRzcwl4bW0xLCBEV09SRCBQVFIgW3JzaSsyOF0KCW1vdnNzCURXT1JEIFBUUiBb cnNpKzI4XSwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrMzJdCglt dWxzcwl4bW0xLCB4bW0wCglhZGRzcwl4bW0xLCBEV09SRCBQVFIgW3JzaSszMl0K CW1vdnNzCURXT1JEIFBUUiBbcnNpKzMyXSwgeG1tMQoJbW92c3MJeG1tMSwgRFdP UkQgUFRSIFtyZGkrMzZdCgltdWxzcwl4bW0xLCB4bW0wCglhZGRzcwl4bW0xLCBE V09SRCBQVFIgW3JzaSszNl0KCW1vdnNzCURXT1JEIFBUUiBbcnNpKzM2XSwgeG1t MQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrNDBdCgltdWxzcwl4bW0xLCB4 bW0wCgltdWxzcwl4bW0wLCBEV09SRCBQVFIgW3JkaSs0NF0KCWFkZHNzCXhtbTEs IERXT1JEIFBUUiBbcnNpKzQwXQoJYWRkc3MJeG1tMCwgRFdPUkQgUFRSIFtyc2kr NDRdCgltb3ZzcwlEV09SRCBQVFIgW3JzaSs0MF0sIHhtbTEKCW1vdnNzCURXT1JE IFBUUiBbcnNpKzQ0XSwgeG1tMAoJcmV0CgkuY2ZpX2VuZHByb2MKLkxGRTI6Cgku c2l6ZQlfRDRkdmVyMTNCb25lVHJhbnNmb3JtOWFkZFNjYWxlZE1GS1M0ZHZlcjEz Qm9uZVRyYW5zZm9ybWZadiwgLi1fRDRkdmVyMTNCb25lVHJhbnNmb3JtOWFkZFNj YWxlZE1GS1M0ZHZlcjEzQm9uZVRyYW5zZm9ybWZadgoJLnAyYWxpZ24gNCwsMTUK CS5nbG9ibAlfRDRkdmVyMTNCb25lVHJhbnNmb3JtMTR0cmFuc2Zvcm1Qb2ludE1G S1M0ZHZlcjEwQ2FsVmVjdG9yNEtTNGR2ZXIxMENhbFZlY3RvcjRadgoJLnR5cGUJ X0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTE0dHJhbnNmb3JtUG9pbnRNRktTNGR2ZXIx MENhbFZlY3RvcjRLUzRkdmVyMTBDYWxWZWN0b3I0WnYsIEBmdW5jdGlvbgpfRDRk dmVyMTNCb25lVHJhbnNmb3JtMTR0cmFuc2Zvcm1Qb2ludE1GS1M0ZHZlcjEwQ2Fs VmVjdG9yNEtTNGR2ZXIxMENhbFZlY3RvcjRadjoKLkxGQjM6CgkuY2ZpX3N0YXJ0 cHJvYwoJbW92c3MJeG1tMiwgRFdPUkQgUFRSIFtyZHhdCgltb3Zzcwl4bW00LCBE V09SRCBQVFIgW3JkeCs0XQoJbW92c3MJeG1tMCwgRFdPUkQgUFRSIFtyZGkrMzJd Cgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JkaSszNl0KCW11bHNzCXhtbTAsIHht bTIKCW1vdnNzCXhtbTMsIERXT1JEIFBUUiBbcmR4KzhdCgltdWxzcwl4bW0xLCB4 bW00Cgltb3Zzcwl4bW01LCBEV09SRCBQVFIgW3JkaSsyMF0KCW11bHNzCXhtbTUs IHhtbTQKCW11bHNzCXhtbTQsIERXT1JEIFBUUiBbcmRpKzRdCglhZGRzcwl4bW0w LCB4bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JkaSs0MF0KCW11bHNzCXht bTEsIHhtbTMKCWFkZHNzCXhtbTAsIERXT1JEIFBUUiBbcmRpKzQ0XQoJYWRkc3MJ eG1tMCwgeG1tMQoJbW92c3MJeG1tMSwgRFdPUkQgUFRSIFtyZGkrMTZdCgltdWxz cwl4bW0xLCB4bW0yCgltdWxzcwl4bW0yLCBEV09SRCBQVFIgW3JkaV0KCWFkZHNz CXhtbTEsIHhtbTUKCW1vdnNzCXhtbTUsIERXT1JEIFBUUiBbcmRpKzI0XQoJYWRk c3MJeG1tMiwgeG1tNAoJbXVsc3MJeG1tNSwgeG1tMwoJbXVsc3MJeG1tMywgRFdP UkQgUFRSIFtyZGkrOF0KCWFkZHNzCXhtbTEsIERXT1JEIFBUUiBbcmRpKzI4XQoJ YWRkc3MJeG1tMiwgRFdPUkQgUFRSIFtyZGkrMTJdCgltb3ZzcwlEV09SRCBQVFIg W3JzaSs4XSwgeG1tMAoJbW92CURXT1JEIFBUUiBbcnNpKzEyXSwgMHgwMDAwMDAw MAoJYWRkc3MJeG1tMSwgeG1tNQoJYWRkc3MJeG1tMiwgeG1tMwoJbW92c3MJRFdP UkQgUFRSIFtyc2krNF0sIHhtbTEKCW1vdnNzCURXT1JEIFBUUiBbcnNpXSwgeG1t MgoJcmV0CgkuY2ZpX2VuZHByb2MKLkxGRTM6Cgkuc2l6ZQlfRDRkdmVyMTNCb25l VHJhbnNmb3JtMTR0cmFuc2Zvcm1Qb2ludE1GS1M0ZHZlcjEwQ2FsVmVjdG9yNEtT NGR2ZXIxMENhbFZlY3RvcjRadiwgLi1fRDRkdmVyMTNCb25lVHJhbnNmb3JtMTR0 cmFuc2Zvcm1Qb2ludE1GS1M0ZHZlcjEwQ2FsVmVjdG9yNEtTNGR2ZXIxMENhbFZl Y3RvcjRadgoJLnAyYWxpZ24gNCwsMTUKCS5nbG9ibAlfRDRkdmVyMTNCb25lVHJh bnNmb3JtMTV0cmFuc2Zvcm1WZWN0b3JNRktTNGR2ZXIxMENhbFZlY3RvcjRLUzRk dmVyMTBDYWxWZWN0b3I0WnYKCS50eXBlCV9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm0x NXRyYW5zZm9ybVZlY3Rvck1GS1M0ZHZlcjEwQ2FsVmVjdG9yNEtTNGR2ZXIxMENh bFZlY3RvcjRadiwgQGZ1bmN0aW9uCl9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm0xNXRy YW5zZm9ybVZlY3Rvck1GS1M0ZHZlcjEwQ2FsVmVjdG9yNEtTNGR2ZXIxMENhbFZl Y3RvcjRadjoKLkxGQjQ6CgkuY2ZpX3N0YXJ0cHJvYwoJbW92c3MJeG1tNCwgRFdP UkQgUFRSIFtyZHhdCgltb3Zzcwl4bW0yLCBEV09SRCBQVFIgW3JkeCs0XQoJbW92 c3MJeG1tMCwgRFdPUkQgUFRSIFtyZGkrMzZdCgltb3Zzcwl4bW0xLCBEV09SRCBQ VFIgW3JkaSszMl0KCW11bHNzCXhtbTAsIHhtbTIKCW1vdnNzCXhtbTMsIERXT1JE IFBUUiBbcmR4KzhdCgltdWxzcwl4bW0xLCB4bW00Cgltb3Zzcwl4bW01LCBEV09S RCBQVFIgW3JkaSsxNl0KCW11bHNzCXhtbTUsIHhtbTQKCW11bHNzCXhtbTQsIERX T1JEIFBUUiBbcmRpXQoJYWRkc3MJeG1tMCwgeG1tMQoJbW92c3MJeG1tMSwgRFdP UkQgUFRSIFtyZGkrNDBdCgltdWxzcwl4bW0xLCB4bW0zCglhZGRzcwl4bW0wLCB4 bW0xCgltb3Zzcwl4bW0xLCBEV09SRCBQVFIgW3JkaSsyMF0KCW11bHNzCXhtbTEs IHhtbTIKCW11bHNzCXhtbTIsIERXT1JEIFBUUiBbcmRpKzRdCglhZGRzcwl4bW0x LCB4bW01Cgltb3Zzcwl4bW01LCBEV09SRCBQVFIgW3JkaSsyNF0KCWFkZHNzCXht bTIsIHhtbTQKCW11bHNzCXhtbTUsIHhtbTMKCW11bHNzCXhtbTMsIERXT1JEIFBU UiBbcmRpKzhdCgltb3ZzcwlEV09SRCBQVFIgW3JzaSs4XSwgeG1tMAoJbW92CURX T1JEIFBUUiBbcnNpKzEyXSwgMHgwMDAwMDAwMAoJYWRkc3MJeG1tMSwgeG1tNQoJ YWRkc3MJeG1tMiwgeG1tMwoJbW92c3MJRFdPUkQgUFRSIFtyc2krNF0sIHhtbTEK CW1vdnNzCURXT1JEIFBUUiBbcnNpXSwgeG1tMgoJcmV0CgkuY2ZpX2VuZHByb2MK LkxGRTQ6Cgkuc2l6ZQlfRDRkdmVyMTNCb25lVHJhbnNmb3JtMTV0cmFuc2Zvcm1W ZWN0b3JNRktTNGR2ZXIxMENhbFZlY3RvcjRLUzRkdmVyMTBDYWxWZWN0b3I0WnYs IC4tX0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTE1dHJhbnNmb3JtVmVjdG9yTUZLUzRk dmVyMTBDYWxWZWN0b3I0S1M0ZHZlcjEwQ2FsVmVjdG9yNFp2CgkucDJhbGlnbiA0 LCwxNQoJLmdsb2JsCV9ENGR2ZXIyN2NhbGN1bGF0ZVZlcnRpY2VzQW5kTm9ybWFs c0ZBUzRkdmVyMTNCb25lVHJhbnNmb3JtaUFTNGR2ZXI2VmVydGV4QVM0ZHZlcjlJ bmZsdWVuY2VBUzRkdmVyMTBDYWxWZWN0b3I0WnYKCS50eXBlCV9ENGR2ZXIyN2Nh bGN1bGF0ZVZlcnRpY2VzQW5kTm9ybWFsc0ZBUzRkdmVyMTNCb25lVHJhbnNmb3Jt aUFTNGR2ZXI2VmVydGV4QVM0ZHZlcjlJbmZsdWVuY2VBUzRkdmVyMTBDYWxWZWN0 b3I0WnYsIEBmdW5jdGlvbgpfRDRkdmVyMjdjYWxjdWxhdGVWZXJ0aWNlc0FuZE5v cm1hbHNGQVM0ZHZlcjEzQm9uZVRyYW5zZm9ybWlBUzRkdmVyNlZlcnRleEFTNGR2 ZXI5SW5mbHVlbmNlQVM0ZHZlcjEwQ2FsVmVjdG9yNFp2OgouTEZCNToKCS5jZmlf c3RhcnRwcm9jCglwdXNoCXJicAoJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgoJLmNm aV9vZmZzZXQgNiwgLTE2Cgl0ZXN0CXJjeCwgcmN4CglwdXNoCXJieAoJLmNmaV9k ZWZfY2ZhX29mZnNldCAyNAoJLmNmaV9vZmZzZXQgMywgLTI0Cgltb3YJUVdPUkQg UFRSIFtyc3AtMTZdLCByZGkKCW1vdglyYngsIFFXT1JEIFBUUiBbcnNwKzMyXQoJ bW92CVFXT1JEIFBUUiBbcnNwLThdLCByc2kKCW1vdglyMTAsIFFXT1JEIFBUUiBb cnNwKzQ4XQoJbW92CVFXT1JEIFBUUiBbcnNwLTMyXSwgcmN4Cgltb3YJUVdPUkQg UFRSIFtyc3AtMjRdLCByOAoJamUJLkw2CglhZGQJcmN4LCAxCgltb3YJcjExZCwg MQoJeG9yCWVicCwgZWJwCgl4b3IJZWRpLCBlZGkKCS5wMmFsaWduIDQsLDEwCgku cDJhbGlnbiAzCi5MMTA6Cgltb3ZzeAlyZHgsIGVkaQoJbGVhCXJheCwgW3JkeCty ZHgqMl0KCWxlYQlyOSwgW3JieCtyYXgqNF0KCW1vdnN4CXJheCwgRFdPUkQgUFRS IFtyOV0KCW1vdnNzCXhtbTksIERXT1JEIFBUUiBbcjkrNF0KCWxlYQlyYXgsIFty YXgrcmF4KjJdCglzYWwJcmF4LCA0CglhZGQJcmF4LCByc2kKCWNtcAlCWVRFIFBU UiBbcjkrOF0sIDAKCW1vdnNzCXhtbTcsIERXT1JEIFBUUiBbcmF4XQoJbW92c3MJ eG1tOCwgRFdPUkQgUFRSIFtyYXgrNF0KCW1vdnNzCXhtbTYsIERXT1JEIFBUUiBb cmF4KzhdCgltdWxzcwl4bW03LCB4bW05Cgltb3Zzcwl4bW0xMSwgRFdPUkQgUFRS IFtyYXgrMTJdCgltdWxzcwl4bW04LCB4bW05Cgltb3Zzcwl4bW00LCBEV09SRCBQ VFIgW3JheCsxNl0KCW11bHNzCXhtbTYsIHhtbTkKCW1vdnNzCXhtbTUsIERXT1JE IFBUUiBbcmF4KzIwXQoJbXVsc3MJeG1tMTEsIHhtbTkKCW1vdnNzCXhtbTMsIERX T1JEIFBUUiBbcmF4KzI0XQoJbXVsc3MJeG1tNCwgeG1tOQoJbW92c3MJeG1tMTAs IERXT1JEIFBUUiBbcmF4KzI4XQoJbXVsc3MJeG1tNSwgeG1tOQoJbW92c3MJeG1t MSwgRFdPUkQgUFRSIFtyYXgrMzJdCgltdWxzcwl4bW0zLCB4bW05Cgltb3Zzcwl4 bW0yLCBEV09SRCBQVFIgW3JheCszNl0KCW11bHNzCXhtbTEwLCB4bW05Cgltb3Zz cwl4bW0wLCBEV09SRCBQVFIgW3JheCs0MF0KCW11bHNzCXhtbTEsIHhtbTkKCW11 bHNzCXhtbTIsIHhtbTkKCW11bHNzCXhtbTAsIHhtbTkKCW11bHNzCXhtbTksIERX T1JEIFBUUiBbcmF4KzQ0XQoJam5lCS5MOAoJbGVhCXJheCwgW3JkeCszK3JkeCoy XQoJbGVhCXJkeCwgW3JieCtyYXgqNF0KCS5wMmFsaWduIDQsLDEwCgkucDJhbGln biAzCi5MOToKCW1vdnN4CXJheCwgRFdPUkQgUFRSIFtyZHhdCgltb3YJcjksIHJk eAoJYWRkCWVkaSwgMQoJbW92c3MJeG1tMTIsIERXT1JEIFBUUiBbcmR4KzRdCglh ZGQJcmR4LCAxMgoJbGVhCXJheCwgW3JheCtyYXgqMl0KCXNhbAlyYXgsIDQKCWFk ZAlyYXgsIHJzaQoJY21wCUJZVEUgUFRSIFtyOSs4XSwgMAoJbW92c3MJeG1tMTMs IERXT1JEIFBUUiBbcmF4XQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW03 LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzRdCgltdWxzcwl4 bW0xMywgeG1tMTIKCWFkZHNzCXhtbTgsIHhtbTEzCgltb3Zzcwl4bW0xMywgRFdP UkQgUFRSIFtyYXgrOF0KCW11bHNzCXhtbTEzLCB4bW0xMgoJYWRkc3MJeG1tNiwg eG1tMTMKCW1vdnNzCXhtbTEzLCBEV09SRCBQVFIgW3JheCsxMl0KCW11bHNzCXht bTEzLCB4bW0xMgoJYWRkc3MJeG1tMTEsIHhtbTEzCgltb3Zzcwl4bW0xMywgRFdP UkQgUFRSIFtyYXgrMTZdCgltdWxzcwl4bW0xMywgeG1tMTIKCWFkZHNzCXhtbTQs IHhtbTEzCgltb3Zzcwl4bW0xMywgRFdPUkQgUFRSIFtyYXgrMjBdCgltdWxzcwl4 bW0xMywgeG1tMTIKCWFkZHNzCXhtbTUsIHhtbTEzCgltb3Zzcwl4bW0xMywgRFdP UkQgUFRSIFtyYXgrMjRdCgltdWxzcwl4bW0xMywgeG1tMTIKCWFkZHNzCXhtbTMs IHhtbTEzCgltb3Zzcwl4bW0xMywgRFdPUkQgUFRSIFtyYXgrMjhdCgltdWxzcwl4 bW0xMywgeG1tMTIKCWFkZHNzCXhtbTEwLCB4bW0xMwoJbW92c3MJeG1tMTMsIERX T1JEIFBUUiBbcmF4KzMyXQoJbXVsc3MJeG1tMTMsIHhtbTEyCglhZGRzcwl4bW0x LCB4bW0xMwoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzM2XQoJbXVsc3MJ eG1tMTMsIHhtbTEyCglhZGRzcwl4bW0yLCB4bW0xMwoJbW92c3MJeG1tMTMsIERX T1JEIFBUUiBbcmF4KzQwXQoJbXVsc3MJeG1tMTMsIHhtbTEyCgltdWxzcwl4bW0x MiwgRFdPUkQgUFRSIFtyYXgrNDRdCglhZGRzcwl4bW0wLCB4bW0xMwoJYWRkc3MJ eG1tOSwgeG1tMTIKCWplCS5MOQouTDg6Cgltb3YJcmF4LCByYnAKCW1vdmFwcwl4 bW0xNSwgeG1tOAoJYWRkCWVkaSwgMQoJc2FsCXJheCwgNQoJYWRkCXJheCwgcjgK CW1vdnNzCXhtbTEyLCBEV09SRCBQVFIgW3JheCs4XQoJbW92c3MJeG1tMTQsIERX T1JEIFBUUiBbcmF4XQoJbW92c3MJeG1tMTMsIERXT1JEIFBUUiBbcmF4KzRdCglt b3ZzcwlEV09SRCBQVFIgW3JzcC0zNl0sIHhtbTEyCgltb3ZhcHMJeG1tMTIsIHht bTcKCW11bHNzCXhtbTEyLCB4bW0xNAoJbW92CURXT1JEIFBUUiBbcjEwKzEyXSwg MHgwMDAwMDAwMAoJbXVsc3MJeG1tMTUsIHhtbTEzCglhZGRzcwl4bW0xMiwgeG1t MTUKCWFkZHNzCXhtbTEyLCB4bW0xMQoJbW92c3MJeG1tMTEsIERXT1JEIFBUUiBb cnNwLTM2XQoJbXVsc3MJeG1tMTEsIHhtbTYKCWFkZHNzCXhtbTEyLCB4bW0xMQoJ bW92YXBzCXhtbTExLCB4bW00CgltdWxzcwl4bW0xMSwgeG1tMTQKCW11bHNzCXht bTE0LCB4bW0xCgltb3ZzcwlEV09SRCBQVFIgW3IxMF0sIHhtbTEyCgltb3ZhcHMJ eG1tMTIsIHhtbTUKCW11bHNzCXhtbTEyLCB4bW0xMwoJbXVsc3MJeG1tMTMsIHht bTIKCWFkZHNzCXhtbTExLCB4bW0xMgoJYWRkc3MJeG1tMTQsIHhtbTEzCglhZGRz cwl4bW0xMSwgeG1tMTAKCW1vdnNzCXhtbTEwLCBEV09SRCBQVFIgW3JzcC0zNl0K CWFkZHNzCXhtbTE0LCB4bW05Cgltb3Zzcwl4bW05LCBEV09SRCBQVFIgW3JzcC0z Nl0KCW11bHNzCXhtbTEwLCB4bW0zCgltdWxzcwl4bW05LCB4bW0wCglhZGRzcwl4 bW0xMSwgeG1tMTAKCWFkZHNzCXhtbTE0LCB4bW05Cgltb3ZzcwlEV09SRCBQVFIg W3IxMCs0XSwgeG1tMTEKCW1vdnNzCURXT1JEIFBUUiBbcjEwKzhdLCB4bW0xNAoJ bW92c3MJeG1tMTAsIERXT1JEIFBUUiBbcmF4KzE2XQoJbW92c3MJeG1tMTEsIERX T1JEIFBUUiBbcmF4KzIwXQoJbXVsc3MJeG1tNywgeG1tMTAKCW1vdnNzCXhtbTks IERXT1JEIFBUUiBbcmF4KzI0XQoJbW92CURXT1JEIFBUUiBbcjEwKzI4XSwgMHgw MDAwMDAwMAoJbXVsc3MJeG1tOCwgeG1tMTEKCW11bHNzCXhtbTUsIHhtbTExCglt dWxzcwl4bW00LCB4bW0xMAoJbXVsc3MJeG1tMiwgeG1tMTEKCW11bHNzCXhtbTEs IHhtbTEwCglhZGRzcwl4bW04LCB4bW03CgltdWxzcwl4bW02LCB4bW05CgltdWxz cwl4bW0zLCB4bW05CglhZGRzcwl4bW01LCB4bW00CgltdWxzcwl4bW0wLCB4bW05 CglhZGRzcwl4bW0yLCB4bW0xCglsZWEJcmF4LCBbcjExKzFdCglhZGRzcwl4bW04 LCB4bW02CglhZGRzcwl4bW01LCB4bW0zCglhZGRzcwl4bW0yLCB4bW0wCgltb3Zz cwlEV09SRCBQVFIgW3IxMCsxNl0sIHhtbTgKCW1vdnNzCURXT1JEIFBUUiBbcjEw KzIwXSwgeG1tNQoJbW92c3MJRFdPUkQgUFRSIFtyMTArMjRdLCB4bW0yCglhZGQJ cjEwLCAzMgoJY21wCXJheCwgcmN4CglqZQkuTDYKCW1vdglyYnAsIHIxMQoJbW92 CXIxMSwgcmF4CglqbXAJLkwxMAouTDY6Cglwb3AJcmJ4CgkuY2ZpX2RlZl9jZmFf b2Zmc2V0IDE2Cglwb3AJcmJwCgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDgKCXJldAoJ LmNmaV9lbmRwcm9jCi5MRkU1OgoJLnNpemUJX0Q0ZHZlcjI3Y2FsY3VsYXRlVmVy dGljZXNBbmROb3JtYWxzRkFTNGR2ZXIxM0JvbmVUcmFuc2Zvcm1pQVM0ZHZlcjZW ZXJ0ZXhBUzRkdmVyOUluZmx1ZW5jZUFTNGR2ZXIxMENhbFZlY3RvcjRadiwgLi1f RDRkdmVyMjdjYWxjdWxhdGVWZXJ0aWNlc0FuZE5vcm1hbHNGQVM0ZHZlcjEzQm9u ZVRyYW5zZm9ybWlBUzRkdmVyNlZlcnRleEFTNGR2ZXI5SW5mbHVlbmNlQVM0ZHZl cjEwQ2FsVmVjdG9yNFp2Cgkuc2VjdGlvbgkucm9kYXRhCgkuYWxpZ24gOAouTEM2 OgoJLnN0cmluZwkiU2tpbm5lZCB2ZXJ0aWNlcyBwZXIgc2Vjb25kOiAlZFxuIgoJ LnNlY3Rpb24JLnRleHQuc3RhcnR1cCwiYXgiLEBwcm9nYml0cwoJLnAyYWxpZ24g NCwsMTUKCS5nbG9ibAlfRG1haW4KCS50eXBlCV9EbWFpbiwgQGZ1bmN0aW9uCl9E bWFpbjoKLkxGQjY6CgkuY2ZpX3N0YXJ0cHJvYwoJcHVzaAlyMTUKCS5jZmlfZGVm X2NmYV9vZmZzZXQgMTYKCS5jZmlfb2Zmc2V0IDE1LCAtMTYKCXB1c2gJcjE0Cgku Y2ZpX2RlZl9jZmFfb2Zmc2V0IDI0CgkuY2ZpX29mZnNldCAxNCwgLTI0CglwdXNo CXIxMwoJLmNmaV9kZWZfY2ZhX29mZnNldCAzMgoJLmNmaV9vZmZzZXQgMTMsIC0z MgoJcHVzaAlyMTIKCS5jZmlfZGVmX2NmYV9vZmZzZXQgNDAKCS5jZmlfb2Zmc2V0 IDEyLCAtNDAKCXB1c2gJcmJwCgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDQ4CgkuY2Zp X29mZnNldCA2LCAtNDgKCXB1c2gJcmJ4CgkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDU2 CgkuY2ZpX29mZnNldCAzLCAtNTYKCXN1Yglyc3AsIDQ0MDE1MgoJLmNmaV9kZWZf Y2ZhX29mZnNldCA0NDAyMDgKCWxlYQlyYnAsIFtyc3ArNDhdCgltb3ZhcHMJeG1t MCwgWE1NV09SRCBQVFIgLkxDMVtyaXBdCglsZWEJcmR4LCBbcmJwKzMyMDAwMF0K CW1vdglyYXgsIHJicAoJLnAyYWxpZ24gNCwsMTAKCS5wMmFsaWduIDMKLkwxNToK CW1vdmFwcwlYTU1XT1JEIFBUUiBbcmF4XSwgeG1tMAoJbW92YXBzCVhNTVdPUkQg UFRSIFtyYXgrMTZdLCB4bW0wCglhZGQJcmF4LCAzMgoJY21wCXJheCwgcmR4Cglq bmUJLkwxNQoJbGVhCXIxMiwgW3JzcCszMjAwNDhdCglsZWEJcmR4LCBbcjEyKzEy MDAwMF0KCW1vdglyYXgsIHIxMgoJLnAyYWxpZ24gNCwsMTAKCS5wMmFsaWduIDMK LkwxNjoKCW1vdglRV09SRCBQVFIgW3JheF0sIDAKCW1vdglEV09SRCBQVFIgW3Jh eCs4XSwgMAoJbW92CURXT1JEIFBUUiBbcmF4KzRdLCAweDdmYTAwMDAwCglhZGQJ cmF4LCAxMgoJY21wCXJheCwgcmR4CglqbmUJLkwxNgoJeG9yCWVkeCwgZWR4Cgku cDJhbGlnbiA0LCwxMAoJLnAyYWxpZ24gMwouTDE3OgoJbW92CXJheCwgcmR4Cglz YWwJcmF4LCA1CglhZGQJcmF4LCByYnAKCW1vdglEV09SRCBQVFIgW3JheF0sIDB4 M2Y4MDAwMDAKCW1vdglEV09SRCBQVFIgW3JheCs0XSwgMHg0MDAwMDAwMAoJbW92 CURXT1JEIFBUUiBbcmF4KzhdLCAweDQwNDAwMDAwCgltb3YJRFdPUkQgUFRSIFty YXgrMTJdLCAweDAwMDAwMDAwCgltb3YJRFdPUkQgUFRSIFtyYXgrMTZdLCAweDAw MDAwMDAwCgltb3YJRFdPUkQgUFRSIFtyYXgrMjBdLCAweDAwMDAwMDAwCgltb3YJ RFdPUkQgUFRSIFtyYXgrMjRdLCAweDNmODAwMDAwCgltb3YJRFdPUkQgUFRSIFty YXgrMjhdLCAweDAwMDAwMDAwCglsZWEJcmF4LCBbcmR4K3JkeCoyXQoJYWRkCXJk eCwgMQoJbGVhCXJheCwgW3IxMityYXgqNF0KCWNtcAlyZHgsIDEwMDAwCgltb3YJ RFdPUkQgUFRSIFtyYXhdLCAwCgltb3YJRFdPUkQgUFRSIFtyYXgrNF0sIDB4M2Y4 MDAwMDAKCW1vdglCWVRFIFBUUiBbcmF4KzhdLCAxCglqbmUJLkwxNwoJbW92CWVz aSwgMQoJbW92CWVkaSwgT0ZGU0VUIEZMQVQ6X0QzMVR5cGVJbmZvX0FTNGR2ZXIx M0JvbmVUcmFuc2Zvcm02X19pbml0WgoJbW92CXIxNWQsIDEwMAoJY2FsbAlfZF9u ZXdhcnJheWlUCgltb3YJZXNpLCAyMDAwMAoJbW92CWVkaSwgT0ZGU0VUIEZMQVQ6 X0QyOFR5cGVJbmZvX0FTNGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0WgoJbW92CVFX T1JEIFBUUiBbcnNwKzMyXSwgcmF4Cgltb3YJUVdPUkQgUFRSIFtyc3ArNDBdLCBy ZHgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwODBdLCByYXgKCW1vdglRV09SRCBQ VFIgW3JzcCs0NDAwODhdLCByZHgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwNDhd LCByYXgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwNTZdLCByZHgKCWNhbGwJX2Rf bmV3YXJyYXlpVAoJbW92CVFXT1JEIFBUUiBbcnNwKzMyXSwgcmF4Cgltb3YJUVdP UkQgUFRSIFtyc3ArNDBdLCByZHgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAwOTZd LCByYXgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAxMDRdLCByZHgKCW1vdglRV09S RCBQVFIgW3JzcCs0NDAwNjRdLCByYXgKCW1vdglRV09SRCBQVFIgW3JzcCs0NDAw NzJdLCByZHgKCS5wMmFsaWduIDQsLDEwCgkucDJhbGlnbiAzCi5MMjA6CgljYWxs CWNsb2NrCgl4b3IJZWJ4LCBlYngKCWxlYQlyMTMsIFtyYXgrOTk5OTk5XQoJbW92 CXIxNCwgcmF4CglqbXAJLkwxOQoJLnAyYWxpZ24gNCwsMTAKCS5wMmFsaWduIDMK LkwyNToKCW1vdglyYXgsIFFXT1JEIFBUUiBbcnNwKzQ0MDA2NF0KCW1vdgllY3gs IDEwMDAwCgltb3YJcjgsIHJicAoJbW92CXJkaSwgUVdPUkQgUFRSIFtyc3ArNDQw MDQ4XQoJbW92CWVkeCwgMTAwMDAKCW1vdglRV09SRCBQVFIgW3JzcCs4XSwgcjEy Cgltb3YJcnNpLCBRV09SRCBQVFIgW3JzcCs0NDAwNTZdCgltb3YJUVdPUkQgUFRS IFtyc3ArNDQwMTIwXSwgcjEyCglhZGQJcmJ4LCAxMDAwMAoJbW92CVFXT1JEIFBU UiBbcnNwKzQ0MDExMl0sIDEwMDAwCgltb3YJUVdPUkQgUFRSIFtyc3ArMTZdLCBy YXgKCW1vdglyYXgsIFFXT1JEIFBUUiBbcnNwKzQ0MDA3Ml0KCW1vdglRV09SRCBQ VFIgW3JzcCs0NDAxMjhdLCAxMDAwMAoJbW92CVFXT1JEIFBUUiBbcnNwKzQ0MDEz Nl0sIHJicAoJbW92CVFXT1JEIFBUUiBbcnNwXSwgMTAwMDAKCW1vdglRV09SRCBQ VFIgW3JzcCsyNF0sIHJheAoJY2FsbAlfRDRkdmVyMjdjYWxjdWxhdGVWZXJ0aWNl c0FuZE5vcm1hbHNGQVM0ZHZlcjEzQm9uZVRyYW5zZm9ybWlBUzRkdmVyNlZlcnRl eEFTNGR2ZXI5SW5mbHVlbmNlQVM0ZHZlcjEwQ2FsVmVjdG9yNFp2Ci5MMTk6Cglj YWxsCWNsb2NrCgljbXAJcjEzLCByYXgKCWpnZQkuTDI1CgkucDJhbGlnbiA0LCw1 CgljYWxsCWNsb2NrCgltb3YJZWRpLCBPRkZTRVQgRkxBVDouTEM2Cgltb3YJcmN4 LCByYXgKCWltdWwJcmF4LCByYngsIDEwMDAwMDAKCXN1YglyY3gsIHIxNAoJbW92 CXJkeCwgcmF4CglzYXIJcmR4LCA2MwoJaWRpdglyY3gKCW1vdgllc2ksIGVheAoJ eG9yCWVheCwgZWF4CgljYWxsCXByaW50ZgoJc3ViCXIxNWQsIDEKCWpuZQkuTDIw CglhZGQJcnNwLCA0NDAxNTIKCS5jZmlfZGVmX2NmYV9vZmZzZXQgNTYKCXhvcgll YXgsIGVheAoJcG9wCXJieAoJLmNmaV9kZWZfY2ZhX29mZnNldCA0OAoJcG9wCXJi cAoJLmNmaV9kZWZfY2ZhX29mZnNldCA0MAoJcG9wCXIxMgoJLmNmaV9kZWZfY2Zh X29mZnNldCAzMgoJcG9wCXIxMwoJLmNmaV9kZWZfY2ZhX29mZnNldCAyNAoJcG9w CXIxNAoJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgoJcG9wCXIxNQoJLmNmaV9kZWZf Y2ZhX29mZnNldCA4CglyZXQKCS5jZmlfZW5kcHJvYwouTEZFNjoKCS5zaXplCV9E bWFpbiwgLi1fRG1haW4KCS5wMmFsaWduIDQsLDE1CgkudHlwZQlfRDRkdmVyOV9f bW9kaW5pdEZadiwgQGZ1bmN0aW9uCl9ENGR2ZXI5X19tb2Rpbml0Rlp2OgouTEZC NzoKCS5jZmlfc3RhcnRwcm9jCgltb3YJcmF4LCBRV09SRCBQVFIgX0Rtb2R1bGVf cmVmW3JpcF0KCW1vdglRV09SRCBQVFIgX0Rtb2R1bGVfcmVmW3JpcF0sIE9GRlNF VCBGTEFUOl9fbW9kX3JlZi4yMDY0Cgltb3YJUVdPUkQgUFRSIF9fbW9kX3JlZi4y MDY0W3JpcF0sIHJheAoJcmV0CgkuY2ZpX2VuZHByb2MKLkxGRTc6Cgkuc2l6ZQlf RDRkdmVyOV9fbW9kaW5pdEZadiwgLi1fRDRkdmVyOV9fbW9kaW5pdEZadgoJLnNl Y3Rpb24JLmN0b3JzLCJhdyIsQHByb2diaXRzCgkuYWxpZ24gOAoJLnF1YWQJX0Q0 ZHZlcjlfX21vZGluaXRGWnYKCS5nbG9ibAlfRDRkdmVyMTJfX01vZHVsZUluZm9a CgkuZGF0YQoJLmFsaWduIDE2CgkudHlwZQlfRDRkdmVyMTJfX01vZHVsZUluZm9a LCBAb2JqZWN0Cgkuc2l6ZQlfRDRkdmVyMTJfX01vZHVsZUluZm9aLCAxNgpfRDRk dmVyMTJfX01vZHVsZUluZm9aOgoJLmxvbmcJLTIxNDc0ODM2NDQKCS5sb25nCTAK CS5zdHJpbmcJImR2ZXIiCgkuemVybwkzCgkudGxzX2NvbW1vbglfdGxzZW5kLDQs NAoJLmdsb2JsCV90bHNzdGFydAoJLnNlY3Rpb24JLnRkYXRhLCJhd1QiLEBwcm9n Yml0cwoJLmFsaWduIDQKCS50eXBlCV90bHNzdGFydCwgQG9iamVjdAoJLnNpemUJ X3Rsc3N0YXJ0LCA0Cl90bHNzdGFydDoKCS5sb25nCTMKCS53ZWFrCV9EMjhUeXBl SW5mb19BUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFoKCS5zZWN0aW9uCS5kYXRh Ll9EMjhUeXBlSW5mb19BUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFosImF3RyIs QHByb2diaXRzLF9EMjhUeXBlSW5mb19BUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5p dFosY29tZGF0CgkuYWxpZ24gMTYKCS50eXBlCV9EMjhUeXBlSW5mb19BUzRkdmVy MTBDYWxWZWN0b3I0Nl9faW5pdFosIEBnbnVfdW5pcXVlX29iamVjdAoJLnNpemUJ X0QyOFR5cGVJbmZvX0FTNGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0WiwgMjQKX0Qy OFR5cGVJbmZvX0FTNGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0WjoKCS5xdWFkCV9E MTRUeXBlSW5mb19BcnJheTZfX3Z0YmxaCgkucXVhZAkwCgkucXVhZAlfRDI3VHlw ZUluZm9fUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFoKCS53ZWFrCV9EMzFUeXBl SW5mb19BUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9faW5pdFoKCS5zZWN0aW9uCS5k YXRhLl9EMzFUeXBlSW5mb19BUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9faW5pdFos ImF3RyIsQHByb2diaXRzLF9EMzFUeXBlSW5mb19BUzRkdmVyMTNCb25lVHJhbnNm b3JtNl9faW5pdFosY29tZGF0CgkuYWxpZ24gMTYKCS50eXBlCV9EMzFUeXBlSW5m b19BUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9faW5pdFosIEBnbnVfdW5pcXVlX29i amVjdAoJLnNpemUJX0QzMVR5cGVJbmZvX0FTNGR2ZXIxM0JvbmVUcmFuc2Zvcm02 X19pbml0WiwgMjQKX0QzMVR5cGVJbmZvX0FTNGR2ZXIxM0JvbmVUcmFuc2Zvcm02 X19pbml0WjoKCS5xdWFkCV9EMTRUeXBlSW5mb19BcnJheTZfX3Z0YmxaCgkucXVh ZAkwCgkucXVhZAlfRDMwVHlwZUluZm9fUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9f aW5pdFoKCS5nbG9ibAlfRDRkdmVyNlZlcnRleDZfX2luaXRaCgkuc2VjdGlvbgku cm9kYXRhCgkuYWxpZ24gMzIKCS50eXBlCV9ENGR2ZXI2VmVydGV4Nl9faW5pdFos IEBvYmplY3QKCS5zaXplCV9ENGR2ZXI2VmVydGV4Nl9faW5pdFosIDMyCl9ENGR2 ZXI2VmVydGV4Nl9faW5pdFo6CgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQx MTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9u ZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTky CgkubG9uZwkyMTQxMTkyMTkyCgkud2VhawlfRDIyVHlwZUluZm9fUzRkdmVyNlZl cnRleDZfX2luaXRaCgkuc2VjdGlvbgkuZGF0YS5fRDIyVHlwZUluZm9fUzRkdmVy NlZlcnRleDZfX2luaXRaLCJhd0ciLEBwcm9nYml0cyxfRDIyVHlwZUluZm9fUzRk dmVyNlZlcnRleDZfX2luaXRaLGNvbWRhdAoJLmFsaWduIDMyCgkudHlwZQlfRDIy VHlwZUluZm9fUzRkdmVyNlZlcnRleDZfX2luaXRaLCBAZ251X3VuaXF1ZV9vYmpl Y3QKCS5zaXplCV9EMjJUeXBlSW5mb19TNGR2ZXI2VmVydGV4Nl9faW5pdFosIDEz NgpfRDIyVHlwZUluZm9fUzRkdmVyNlZlcnRleDZfX2luaXRaOgoJLnF1YWQJX0Qx NVR5cGVJbmZvX1N0cnVjdDZfX3Z0YmxaCgkucXVhZAkwCgkucXVhZAkxMQoJLnF1 YWQJX0QyMlR5cGVJbmZvX1M0ZHZlcjZWZXJ0ZXg2X19pbml0WisxMzYKCS5xdWFk CTMyCgkucXVhZAlfRDRkdmVyNlZlcnRleDZfX2luaXRaCgkucXVhZAkwCgkucXVh ZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkw CgkucXVhZAkwCgkucXVhZAk0CgkucXVhZAkwCgkucXVhZAkwCgkuc3RyaW5nCSJk dmVyLlZlcnRleCIKCS5nbG9ibAlfRDRkdmVyOUluZmx1ZW5jZTZfX2luaXRaCgku c2VjdGlvbgkucm9kYXRhCgkuYWxpZ24gNAoJLnR5cGUJX0Q0ZHZlcjlJbmZsdWVu Y2U2X19pbml0WiwgQG9iamVjdAoJLnNpemUJX0Q0ZHZlcjlJbmZsdWVuY2U2X19p bml0WiwgMTIKX0Q0ZHZlcjlJbmZsdWVuY2U2X19pbml0WjoKCS5sb25nCTAKCS5s b25nCTIxNDExOTIxOTIKCS5ieXRlCTAKCS56ZXJvCTMKCS53ZWFrCV9EMjVUeXBl SW5mb19TNGR2ZXI5SW5mbHVlbmNlNl9faW5pdFoKCS5zZWN0aW9uCS5kYXRhLl9E MjVUeXBlSW5mb19TNGR2ZXI5SW5mbHVlbmNlNl9faW5pdFosImF3RyIsQHByb2di aXRzLF9EMjVUeXBlSW5mb19TNGR2ZXI5SW5mbHVlbmNlNl9faW5pdFosY29tZGF0 CgkuYWxpZ24gMzIKCS50eXBlCV9EMjVUeXBlSW5mb19TNGR2ZXI5SW5mbHVlbmNl Nl9faW5pdFosIEBnbnVfdW5pcXVlX29iamVjdAoJLnNpemUJX0QyNVR5cGVJbmZv X1M0ZHZlcjlJbmZsdWVuY2U2X19pbml0WiwgMTM2Cl9EMjVUeXBlSW5mb19TNGR2 ZXI5SW5mbHVlbmNlNl9faW5pdFo6CgkucXVhZAlfRDE1VHlwZUluZm9fU3RydWN0 Nl9fdnRibFoKCS5xdWFkCTAKCS5xdWFkCTE0CgkucXVhZAlfRDI1VHlwZUluZm9f UzRkdmVyOUluZmx1ZW5jZTZfX2luaXRaKzEzNgoJLnF1YWQJMTIKCS5xdWFkCV9E NGR2ZXI5SW5mbHVlbmNlNl9faW5pdFoKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFk CTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAK CS5xdWFkCTQKCS5xdWFkCTAKCS5xdWFkCTAKCS5zdHJpbmcJImR2ZXIuSW5mbHVl bmNlIgoJLmdsb2JsCV9ENGR2ZXIxM0JvbmVUcmFuc2Zvcm02X19pbml0WgoJLnNl Y3Rpb24JLnJvZGF0YQoJLmFsaWduIDMyCgkudHlwZQlfRDRkdmVyMTNCb25lVHJh bnNmb3JtNl9faW5pdFosIEBvYmplY3QKCS5zaXplCV9ENGR2ZXIxM0JvbmVUcmFu c2Zvcm02X19pbml0WiwgNDgKX0Q0ZHZlcjEzQm9uZVRyYW5zZm9ybTZfX2luaXRa OgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0 MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxv bmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5 MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLmxvbmcJMjE0 MTE5MjE5MgoJLmxvbmcJMjE0MTE5MjE5MgoJLndlYWsJX0QzMFR5cGVJbmZvX1M0 ZHZlcjEzQm9uZVRyYW5zZm9ybTZfX2luaXRaCgkuc2VjdGlvbgkuZGF0YS5fRDMw VHlwZUluZm9fUzRkdmVyMTNCb25lVHJhbnNmb3JtNl9faW5pdFosImF3RyIsQHBy b2diaXRzLF9EMzBUeXBlSW5mb19TNGR2ZXIxM0JvbmVUcmFuc2Zvcm02X19pbml0 Wixjb21kYXQKCS5hbGlnbiAzMgoJLnR5cGUJX0QzMFR5cGVJbmZvX1M0ZHZlcjEz Qm9uZVRyYW5zZm9ybTZfX2luaXRaLCBAZ251X3VuaXF1ZV9vYmplY3QKCS5zaXpl CV9EMzBUeXBlSW5mb19TNGR2ZXIxM0JvbmVUcmFuc2Zvcm02X19pbml0WiwgMTM2 Cl9EMzBUeXBlSW5mb19TNGR2ZXIxM0JvbmVUcmFuc2Zvcm02X19pbml0WjoKCS5x dWFkCV9EMTVUeXBlSW5mb19TdHJ1Y3Q2X192dGJsWgoJLnF1YWQJMAoJLnF1YWQJ MTgKCS5xdWFkCV9EMzBUeXBlSW5mb19TNGR2ZXIxM0JvbmVUcmFuc2Zvcm02X19p bml0WisxMzYKCS5xdWFkCTQ4CgkucXVhZAlfRDRkdmVyMTNCb25lVHJhbnNmb3Jt Nl9faW5pdFoKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5x dWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTAKCS5xdWFkCTQKCS5xdWFk CTAKCS5xdWFkCTAKCS5zdHJpbmcJImR2ZXIuQm9uZVRyYW5zZm9ybSIKCS5nbG9i bAlfRDRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFoKCS5zZWN0aW9uCS5yb2RhdGEK CS5hbGlnbiAxNgoJLnR5cGUJX0Q0ZHZlcjEwQ2FsVmVjdG9yNDZfX2luaXRaLCBA b2JqZWN0Cgkuc2l6ZQlfRDRkdmVyMTBDYWxWZWN0b3I0Nl9faW5pdFosIDE2Cl9E NGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0WjoKCS5sb25nCTIxNDExOTIxOTIKCS5s b25nCTIxNDExOTIxOTIKCS5sb25nCTIxNDExOTIxOTIKCS5sb25nCTIxNDExOTIx OTIKCS53ZWFrCV9EMjdUeXBlSW5mb19TNGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0 WgoJLnNlY3Rpb24JLmRhdGEuX0QyN1R5cGVJbmZvX1M0ZHZlcjEwQ2FsVmVjdG9y NDZfX2luaXRaLCJhd0ciLEBwcm9nYml0cyxfRDI3VHlwZUluZm9fUzRkdmVyMTBD YWxWZWN0b3I0Nl9faW5pdFosY29tZGF0CgkuYWxpZ24gMzIKCS50eXBlCV9EMjdU eXBlSW5mb19TNGR2ZXIxMENhbFZlY3RvcjQ2X19pbml0WiwgQGdudV91bmlxdWVf b2JqZWN0Cgkuc2l6ZQlfRDI3VHlwZUluZm9fUzRkdmVyMTBDYWxWZWN0b3I0Nl9f aW5pdFosIDEzNgpfRDI3VHlwZUluZm9fUzRkdmVyMTBDYWxWZWN0b3I0Nl9faW5p dFo6CgkucXVhZAlfRDE1VHlwZUluZm9fU3RydWN0Nl9fdnRibFoKCS5xdWFkCTAK CS5xdWFkCTE1CgkucXVhZAlfRDI3VHlwZUluZm9fUzRkdmVyMTBDYWxWZWN0b3I0 Nl9faW5pdForMTM2CgkucXVhZAkxNgoJLnF1YWQJX0Q0ZHZlcjEwQ2FsVmVjdG9y NDZfX2luaXRaCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgku cXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAkwCgkucXVhZAk0CgkucXVh ZAkwCgkucXVhZAkwCgkuc3RyaW5nCSJkdmVyLkNhbFZlY3RvcjQiCgkuZGF0YQoJ LmFsaWduIDE2CgkudHlwZQlfX21vZF9yZWYuMjA2NCwgQG9iamVjdAoJLnNpemUJ X19tb2RfcmVmLjIwNjQsIDE2Cl9fbW9kX3JlZi4yMDY0OgoJLnF1YWQJMAoJLnF1 YWQJX0Q0ZHZlcjEyX19Nb2R1bGVJbmZvWgoJLnNlY3Rpb24JLnJvZGF0YS5jc3Qx NiwiYU0iLEBwcm9nYml0cywxNgoJLmFsaWduIDE2Ci5MQzE6CgkubG9uZwkyMTQx MTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9uZwkyMTQxMTkyMTkyCgkubG9u ZwkyMTQxMTkyMTkyCgkuaWRlbnQJIkdDQzogKEdOVSkgNC42LjEgMjAxMTA2Mjcg KGdkYyAwLjMwLCB1c2luZyBkbWQgMi4wNTQpIgoJLnNlY3Rpb24JLm5vdGUuR05V LXN0YWNrLCIiLEBwcm9nYml0cwo= ------------xMywv6oCsHku66IxcFGqcv--
Aug 05 2011
prev sibling parent Trass3r <un known.com> writes:
 Anyways, I've tweaked the GDC codegen, and program speed meets that of  
 C++ now (on my system).

 Implementation: http://ideone.com/0j0L1

 Command-line:
 gdc -O3 -mfpmath=sse -ffast-math -march=native -frelease
 g++ bench.cc -O3 -mfpmath=sse -ffast-math -march=native

 Best times:
 G++-32bit:  11400000 vps
 GDC-32bit:  11350000 vps


 Regards
 Iain

64Bit: C++: 45010000 44270000 42740000 43900000 44680000 43490000 42390000 GDC: 42900000 44010000 44000000 44010000 44010000 44000000 GDC with -fno-bounds-check: 43280000 44440000 44420000 44340000 44440000 44450000
Aug 07 2011